圆是2次曲线,平面上所有到定点距离相等的点的轨迹是圆形.

圆是圆锥曲线,用平行于圆锥底面的平面截取得到.

求两个圆的交点

两个圆如果相交,会有两个交点.如果相切,会有一个交点.

交点可以通关联两个圆的方程组求解得到,但是这个方法比较费劲.可以利用相交圆的性质便捷的求出交点.

切点

两个圆相切时有一个交点,根据相切的性质,两个圆的切线点位于两个圆心连线上,切线垂直于圆心连线

如上图: o1 , o2 是圆心, D 是切点.

那么已知条件有 o1 , o2 坐标, o1D = o1.r, o2D = o2.r , λ = o1D / Do2 = o1.r / o2.r

这就可以使用定比分点公式求出 D 的坐标.

    x = (x1 + λ * x2) / (1 + λ)

    y = (y1 + λ * y2) / (1 + λ)

交点

两个圆相交,会有2个交点,其连线是两个圆共有的一条弦.

根据公共弦的性质,圆心连线垂直平分公共弦.

以上图推导计算交点坐标的公式,这是个特例,圆心的连线与 X 轴平行.且原点是 o1 .

    // 设 
    o1o2 = M , o1D = x , AD = y , o1.r = r1 , o2.r = r2

    // 由于 AB 垂直 o1o2,且被 o1o2 平分.所以 AD = DB
    // 根据直角三角形 a^2 + b^2 = c^2 有
    x^2 = r1^2 - y^2
    (M - x)^2 = r2^2 - y^2

    // 解出 x
    x = (r1^2 - r2^2 + M^2) / 2M

    // 带入第一个方程解出 y , y 和 -y 就是两个点的 y 坐标.

    // 这个公式计算出的坐标值,是以 r1 为原点,o1o2 为 X 轴正方向的坐标系的.
    // 注意,作为原点的 r1 需要是 r1,r2 圆心的 x 坐标值较小的那个,
    // 如果r1,r1圆心的 x 值相同,那么 r1 是 y 坐标值较小的那个.

    // 公式计算出的坐标值,要换算回原来的坐标系值,需要做一次旋转变换,和平移变换.
    // 旋转变换角度就是 o1o2 的斜率对应角度,如果是垂直 X 轴的,角度是 -Math.PI/2
    // 平移变换就是 r1 的圆心为参考点.

得到坐标后,根据坐标系变换公式,再求出其在原坐标系的坐标.

虽然要变换坐标系,但是比起解两个圆的方程,计算要简便.

经过测试,在以下情况结果都正确