📜  给定圆上的三个点时的圆方程(1)

📅  最后修改于: 2023-12-03 15:27:34.718000             🧑  作者: Mango

给定圆上的三个点时的圆方程

在平面直角坐标系中,一个圆可由其圆心的坐标和半径来表示。如果已知圆上三个点的坐标,可以通过这三个点来确定圆心和半径,从而获得圆的方程。

圆的一般方程

圆的一般方程为 $$(x-a)^2+(y-b)^2=r^2$$ 其中,圆心坐标为 $(a,b)$,半径为 $r$。

圆的三点式方程

给定圆上三个点 $P_1(x_1,y_1)$,$P_2(x_2,y_2)$ 和 $P_3(x_3,y_3)$,可以通过以下步骤求得圆的方程:

1. 求取两条垂直平分线方程

圆的半径为 $r$,由于 $P_1$,$P_2$ 和 $P_3$ 在圆上,因此 $P_1$ 和 $P_2$,$P_2$ 和 $P_3$,$P_3$ 和 $P_1$ 之间的距离均为 $r$。

因此,可以分别求取 $P_1$ 和 $P_2$,$P_2$ 和 $P_3$,$P_3$ 和 $P_1$ 之间的垂直平分线方程。例如,对于点 $P_1$ 和 $P_2$,可以通过以下步骤求出其方程:

  1. 求取中心点 $(x_{12},y_{12})$ 坐标:$$x_{12}=\frac{x_1+x_2}{2},y_{12}=\frac{y_1+y_2}{2}$$
  2. 求取斜率 $k_{12}$:$$k_{12}=\begin{cases} -\frac{x_2-x_1}{y_2-y_1},&y_2 \neq y_1\ \text{不存在},&y_2=y_1 \end{cases}$$
  3. 求取方程:$$y-y_{12}=k_{12}(x-x_{12})$$
2. 求取两条垂直平分线交点坐标

圆心一定在 $P_1$ 和 $P_2$,$P_2$ 和 $P_3$,$P_3$ 和 $P_1$ 之间的垂直平分线的交点处。因此,可以求出 $P_1$ 和 $P_2$,$P_2$ 和 $P_3$,$P_3$ 和 $P_1$ 之间的垂直平分线的交点坐标,即可求得圆心坐标 $(a,b)$。

例如,对于 $P_1$ 和 $P_2$,可以通过以下步骤求出其交点坐标 $(x_{12},y_{12})$:

  1. 解方程组:$$ \begin{cases} y-y_{12}=k_{12}(x-x_{12})\ (x-x_{12})^2+(y-y_{12})^2=r^2 \end{cases} $$
  2. 获得交点坐标 $(x_{12},y_{12})$。
3. 求取圆的半径

圆心 $(a,b)$ 与 $P_1$,$P_2$,$P_3$ 之间的距离均为 $r$,因此可以任选其中两个点,求出其距离,即可求得半径 $r$。

例如,可以求出 $P_1$ 和 $P_2$ 之间的距离 $d_{12}$,并将其设为半径 $r$。

4. 求取圆的方程

圆的方程为 $$(x-a)^2+(y-b)^2=r^2$$

将圆心 $(a,b)$ 和半径 $r$ 替换到式子中,即可得到圆的方程。

代码实现

下面是一个求解圆的三点式方程的 Python 代码实现:

from typing import List, Tuple

def circle_equation_from_three_points(points: List[Tuple[float, float]]) -> Tuple[float, float, float]:
    """给定圆上三个点,求圆方程"""
    (x1, y1), (x2, y2), (x3, y3) = points

    # Step 1:求取两条垂直平分线方程
    mid_point_12 = ((x1 + x2) / 2, (y1 + y2) / 2)
    mid_point_23 = ((x2 + x3) / 2, (y2 + y3) / 2)
    k12, k23 = None, None
    if y1 != y2:
        k12 = -(x2 - x1) / (y2 - y1)
    if y2 != y3:
        k23 = -(x3 - x2) / (y3 - y2)

    # Step 2:求取两条垂直平分线交点坐标
    if k12 is None or k23 is None: # 如果存在某条平分线垂直于x轴,则需要单独处理
        if k12 is None:
            x_intersect = mid_point_12[0]
            y_intersect = k23 * (x_intersect - mid_point_23[0]) + mid_point_23[1]
        else:
            x_intersect = mid_point_23[0]
            y_intersect = k12 * (x_intersect - mid_point_12[0]) + mid_point_12[1]
    else:
        x_intersect = (mid_point_23[1] - mid_point_12[1] + k12 * mid_point_12[0] - k23 * mid_point_23[0]) / (k12 - k23)
        y_intersect = k12 * (x_intersect - mid_point_12[0]) + mid_point_12[1]

    # Step 3:求取圆的半径
    r = ((x1 - x2)**2 + (y1 - y2)**2) ** 0.5 / 2

    # Step 4:求取圆的方程
    a, b = x_intersect, y_intersect
    return a, b, r

该代码接受一个点列表,其中每个点表示为二元组 $(x,y)$ 的形式。输出一个三元组 $(a,b,r)$,其中 $a$ 和 $b$ 分别表示圆心的 $x$ 和 $y$ 坐标,$r$ 表示半径。

该程序实现了上述步骤,对于存在某条垂直于 $x$ 轴的平分线的情况,进行了单独的处理。