算法:给定三个点,如何找到其对应的弧、圆心、半径和角度

19

给定三个点A,B和C

enter image description here

我如何找到一个起点为A,终点为C且经过B的弧; 它的中心坐标、半径和r和r'的角度?

enter image description here


当所有三个点形成等边三角形时,您将如何解决问题?我不确定问题是否被明确定义。 - Mark Ransom
3
@马克,那么你就有一个弧,它是完整圆的2/3。 - ibrabeicker
1
只要点不在一条直线上,圆就是明确定义的。但你认为哪些点是弧的“起点”和“终点”是任意的。哦,当然 r == r' - Thomas
抱歉,我没有仔细阅读,没有注意到A和C被指定为端点。 - Mark Ransom
6个回答

8

有几种方法可以实现这一点。以下是其中一种算法:

  1. 获取您的 COORDS

    A = {xA,yA}

    B = {xB,yB}

    C = {xC,yC}

    d = {xd,yd}

  2. 计算线段 AB 和 BC 的中点

    mid_AB = { (xA+xB)/2, (yA+yB)/2 }

    mid_BC = { (xB+xC)/2, (yB+yC)/2 }

  3. 找到线段 AB 和 BC 的斜率

    slope_AB = (yB-yA)/(xB-xA)

    slope_BC = (yC-yB)/(xC-xB)

  4. 构造通过 mid_AB 和 mid_BC 垂直于 AB 和 BC 的线段(感谢 Yves 发现错误!)

    Slope_perp_AB = -(slope_AB)^(-1)

    Slope_perp_BC = -(slope_BC)^(-1)

    *** Slope_perp_AB 的线段穿过 mid_AB

    *** Slope_perp_BC 的线段穿过 mid_BC

  5. 将两个方程式设置为相等,解出交点! 这给出了点 d={xd,yd} !!!

使用中心点 d 现在计算半径和角度变得非常简单!

1
注意,垂线的斜率是-1/m,而不是+1/m。你应该更倾向于使用线方程的隐式表达式,因为它们更各向同性且适用于水平/垂直线。 - user1196549
请问您能否写一个证明?也就是定义xA、yA、xB、yB、xC、yC、xd和yd,展示获取xd和yd坐标的所有步骤。我不确定您所说的“Slope_perp”是什么意思,您是在除以-1吗?还是指数为-1?我也不理解“将两个方程式相等”背后的数学原理。 - DarkPh03n1X
你需要进行一个检查以确保斜率被定义。分母可能为零。 - Victor Engel
2
展示三点确定一个圆的方程式的程序相关内容。 - Rémi

8

该圆的中心与给定的三个点等距离:

(X-Xa)^2+(Y-Ya)^2 = (X-Xb)^2+(Y-Yb)^2 = (X-Xc)^2+(Y-Yc)^2

从第二个和第三个成员中减去第一个成员,在重新分组后,我们得到:
2(Xa-Xb) X + 2(Ya-Yb) Y + Xb^2+Yb^2-Xa^2-Ya^2 = 0
2(Xa-Xc) X + 2(Ya-Yc) Y + Xc^2+Yc^2-Xa^2-Ya^2 = 0

这个包含两个未知数的线性方程组可以使用Cramer定则轻松求解。

通过以中心为中心进行笛卡尔坐标系到极坐标系的转换,可以找到半径和角度:

R= Sqrt((Xa-X)^2+(Ya-Y)^2)

Ta= atan2(Ya-Y, Xa-X)
Tc= atan2(Yc-Y, Xc-X)

但你还需要注意一件事:弧的相关部分是什么?小于半圆还是大于半圆?从 TaTb 还是从 Tb2 Pi 再到 Ta+2 Pi,或者其他呢?答案并不像看起来那么明显,你可以尝试一下(因为三个角度 TaTbTc 都不能确定到一个 2 Pi 倍数,所以无法排序)!
提示:考虑三角形 ABC 的面积的符号,即系统行列式的一半。它将告诉你 B 在 AC 的左侧还是右侧。

你写了两个答案。这一个更受欢迎,但它以一个问题结束。你在数学SE上的声誉暗示你知道那个问题的答案。你是因为愚人节写的答案而把它留下来的吗? - pateksan
@pateksan:提示应该足够了。 - user1196549
3
我理解。我的不满在于,Stack Exchange应该是一个“问题回答”网络,而不是一个“问题,半回答和提示”的网络。也许我只是心情不好。 - pateksan
@pateksan:我使用了两种不同的方法给出了两个答案,我包括了OP要求的角度公式(尽管他接受了另一个没有这个公式的答案),并提出了其他人没有解决的问题,并给出了解决方案(虽然只是作为提示,因为它取决于OP将使用的确切约定)。所以是的,我认为你心情不好。 - user1196549

4

步骤1

找到AB和BC的垂直平分线。

步骤2

找到这些线相交的点。

你找到的点将是你所需的圆的中心。

步骤3

计算三个点中任意一个点到你在步骤2中找到的中心的距离。这将是你圆的半径。

注意 点A、B和C不能在同一条直线上。在执行步骤1至3之前,您需要进行检查。


2

解决方法与“非过定系统最佳拟合圆”的解法几乎相同。由于您有三个点恰好位于以(0,0)为圆心的圆弧上(给定),因此可以精确解决该系统,而不需要进行最小二乘逼近。

Finding the Center of a Circle Given 3 Points


Date: 05/25/2000 at 00:14:35
From: Alison Jaworski
Subject: finding the coordinates of the center of a circle

Hi,

Can you help me? If I have the x and y coordinates of 3 points - i.e. 
(x1,y1), (x2,y2) and (x3,y3) - how do I find the coordinates of the 
center of a circle on whose circumference the points lie?

Thank you.


Date: 05/25/2000 at 10:45:58
From: Doctor Rob
Subject: Re: finding the coordinates of the center of a circle

Thanks for writing to Ask Dr. Math, Alison.

Let (h,k) be the coordinates of the center of the circle, and r its 
radius. Then the equation of the circle is:

     (x-h)^2 + (y-k)^2 = r^2

Since the three points all lie on the circle, their coordinates will 
satisfy this equation. That gives you three equations:

     (x1-h)^2 + (y1-k)^2 = r^2
     (x2-h)^2 + (y2-k)^2 = r^2
     (x3-h)^2 + (y3-k)^2 = r^2

in the three unknowns h, k, and r. To solve these, subtract the first 
from the other two. That will eliminate r, h^2, and k^2 from the last 
two equations, leaving you with two simultaneous linear equations in 
the two unknowns h and k. Solve these, and you'll have the coordinates 
(h,k) of the center of the circle. Finally, set:

     r = sqrt[(x1-h)^2+(y1-k)^2]

and you'll have everything you need to know about the circle.

This can all be done symbolically, of course, but you'll get some 
pretty complicated expressions for h and k. The simplest forms of 
these involve determinants, if you know what they are:

         |x1^2+y1^2  y1  1|        |x1  x1^2+y1^2  1|
         |x2^2+y2^2  y2  1|        |x2  x2^2+y2^2  1|
         |x3^2+y3^2  y3  1|        |x3  x3^2+y3^2  1|
     h = ------------------,   k = ------------------
             |x1  y1  1|               |x1  y1  1|
           2*|x2  y2  1|             2*|x2  y2  1|
             |x3  y3  1|               |x3  y3  1|

Example: Suppose a circle passes through the points (4,1), (-3,7), and 
(5,-2). Then we know that:

     (h-4)^2 + (k-1)^2 = r^2
     (h+3)^2 + (k-7)^2 = r^2
     (h-5)^2 + (k+2)^2 = r^2

Subtracting the first from the other two, you get:

     (h+3)^2 - (h-4)^2 + (k-7)^2 - (k-1)^2 = 0
     (h-5)^2 - (h-4)^2 + (k+2)^2 - (k-1)^2 = 0

     h^2+6*h+9 - h^2+8*h-16 + k^2-14*k+49 - k^2+2*k-1 = 0
     h^2-10*h+25 - h^2+8*h-16 + k^2+4*k+4 - k^2+2*k-1 = 0

     14*h - 12*k + 41 = 0
     -2*h + 6*k + 12 = 0

     10*h + 65 = 0
     30*k + 125 = 0

     h = -13/2
     k = -25/6

Then

     r = sqrt[(4+13/2)^2 + (1+25/6)^2]
       = sqrt[4930]/6

Thus the equation of the circle is:

     (x+13/2)^2 + (y+25/6)^2 = 4930/36

- Doctor Rob, The Math Forum
  http://mathforum.org/dr.math/   

参考资料


  1. 给定三个点,求圆心的位置,访问日期2014年04月01日,<http://mathforum.org/library/drmath/view/55239.html>

1
您有三个方程式来确定三个未知数xM、yM和R。
(xA-xM)^2+(yA-yM^2) = R^2

等等。将B和C方程式减去A方程式得到:

2*(xB-xA)*xM+2*(yB-yA)*yM = xB^2-xA^2+yB^2-yA^2
2*(xC-xA)*xM+2*(yC-yA)*yM = xC^2-xA^2+yC^2-yA^2

通过解决这个2x2线性系统,您可以得到圆的中心点,将其插入任何一个原始方程式中即可得到半径。

1

有一个鲜为人知的结果,可以给出通过三个点的圆的隐式方程:

|Z   X   Y   1|
|Za  Xa  Ya  1|
|Zb  Xb  Yb  1| = 0
|Zc  Xc  Yc  1|

为了简洁起见,我们定义 Z:= X^2 + Y^2

计算3x3子式,我们发展成:

M00 Z + M10 X + M20 Y + M30 = 0

在标准化后,我们得到了通常的二次方程式:
X^2 + Y^2 + 2U X + 2V Y + W = 0

这可以被重写为:

这可以被重写为:

(X - U)^2 + (Y - V)^2 = U^2 + V^2 - W

立即给出中心点(U, V) = (-M10/2.M00, -M20/2.M00)和半径R^2 = U^2 + V^2 - M30/M00


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接