读书人

已知三角形三顶点坐标怎么求其外接圆

发布时间: 2012-01-14 20:02:35 作者: rapoo

求助:已知三角形三顶点坐标,如何求其外接圆圆心坐标?
已知三角形三顶点坐标比如(x0,y0,z0),(x1,y1,z1),(x2,y2,z2),如何来求其外接圆圆心坐标?这是在三维空间的 急! 先谢谢了

[解决办法]
化成2维来求吧
[解决办法]
求P0P1的垂直平分线P01和P0P2的垂直平分线P02,然后求P01和P02的交点,该交点即为外接圆圆心。
具体求P01和P02或者P12的方法如下:
三点形成的平面,可以求得其平面法向,求得平面法向即可确定每条边的垂直平分线的法向(即斜率),进而得到每边的垂直平分线的方程。联立任意两方程求解即得外接圆圆心。

[解决办法]
这个很好求, 记3角形的定点为(Ax, Ay), (Bx, By), (Cx, Cy),
外接圆的圆心为(Rx,Ry),

由于圆心到3个定点的距离相等. 因此有
: (Ax-Rx)^2 + (Ay-Ry)^2 = (Bx-Rx)^2 + (By-Ry)^2 (1)
(Ax-Rx)^2 + (Ay-Ry)^2 = (Cx-Rx)^2 + (Cy-Ry)^2 (2)
由(1)式得:Ax^2 + Ay^2 - 2*Ax*Rx - 2*Ay*Ry = Bx^2 + By^2 - 2*Bx*Rx - 2*By*Ry (3)
由(2)式得:Ax^2 + Ay^2 - 2*Ax*Rx - 2*Ay*Ry = Cx^2 + Cy^2 - 2*Cx*Rx - 2*Cy*Ry (4)
由(3)式得:Rx = (Ax^2 + Ay^2 - Bx^2 - By^2 + 2*(By-Ay) * y)/(2*(Ax-Bx))
代入(4)得:
Rx = 此处省略30字
Ry = 此处省略30字
总值是个简单的2元一次方程.

[解决办法]
将空间三点坐标变换到平面上,然后利用二维园的方程解出它的半径和圆心后在将圆心变换回去。
[解决办法]
给你提供两个方法:
1.一个程序直接求

/* 用 途:求不共线的三点确定一个圆
输 入:三个点p1,p2,p3
返回值:如果三点共线,返回false;反之,返回true。圆心由q返回,半径由r返回
*/
bool cocircle(POINT p1,POINT p2,POINT p3,POINT &q,double &r)
{
double x12=p2.x-p1.x;
double y12=p2.y-p1.y;
double x13=p3.x-p1.x;
double y13=p3.y-p1.y;
double z2=x12*(p1.x+p2.x)+y12*(p1.y+p2.y);
double z3=x13*(p1.x+p3.x)+y13*(p1.y+p3.y);
double d=2.0*(x12*(p3.y-p2.y)-y12*(p3.x-p2.x));
if(abs(d) <EP) //共线,圆不存在
return false;
q.x=(y13*z2-y12*z3)/d;
q.y=(x12*z3-x13*z2)/d;
r=dist(p1,q);
return true;
}
[解决办法]
2.我苦心研究平面三角形面积公式的成果。

定义:设平面上的三点A(x1,y1),B(x2,y2),C(x3,y3),定义
S(A,B,C) = (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3)

已知三角形的三个顶点为A(x1,y1),B(x2,y2),C(x3,y3),则该三角形的外心为:
S((x1*x1+y1*y1, y1), (x2*x2+y2*y2, y2), (x3*x3+y3*y3, y3))
x0 = -----------------------
2*S(A,B,C)

S((x1,x1*x1+y1*y1), (x2, x2*x2+y2*y2), (x3, x3*x3+y3*y3))
y0 = -----------------------
2*S(A,B,C)
[解决办法]
发上去就变乱了,
x0 = S((x1*x1+y1*y1, y1), (x2*x2+y2*y2, y2), (x3*x3+y3*y3, y3)) / (2*S(A,B,C))

y0 = S((x1,x1*x1+y1*y1), (x2, x2*x2+y2*y2), (x3, x3*x3+y3*y3)) / (2*S(A,B,C))

[解决办法]
A:(x0,y0,z0),B:(x1,y1,z1),C:(x2,y2,z2)
先分别求出以AB、AC为法向量,过AB、AC中点的两个平面方程:

(x1-x0)(x-(x1-x0)/2)+(y1-y0)(y-(y1-y0)/2)+(z1-z0)(z-(z1-z0)/2)=0 (1)
(x2-x0)(x-(x2-x0)/2)+(y2-y0)(y-(y2-y0)/2)+(z2-z0)(z-(z2-z0)/2)=0 (2)

| i j k |
ABC的法向量n= |(x1-x0) (y1-y0) (z1-z0) |
|(x2-x0) (y2-y0) (z2-z0) |

ABC的平面方程为 n * (x-x0, y-y0, z-z0)T=0 (3)

解方程组可得出圆心的三维坐标。




[解决办法]

探讨
2.我苦心研究平面三角形面积公式的成果。

定义:设平面上的三点A(x1,y1),B(x2,y2),C(x3,y3),定义


          S(A,B,C)   =   (x1-x3)*(y2-y3)   -   (y1-y3)*(x2-x3)

已知三角形的三个顶点为A(x1,y1),B(x2,y2),C(x3,y3),则该三角形的外心为:
                          S((x1*x1+y1*y1,   y1),   (x2*x2+y2*y2,   y2),   (x3*x3+y3*y3,   y3))
        x0   =   -----------------------
                                                                  2*S(A,B,C)

                          S((x1,x1*x1+y1*y1),   (x2,   x2*x2+y2*y2),   (x3,   x3*x3+y3*y3))
        y0   =   -----------------------
                                                                  2*S(A,B,C)


[解决办法]
C/C++ code
Option ExplicitConst MAXPOINT = 10Private Type mypoint    x As Double    y As DoubleEnd TypeDim p(0 To MAXPOINT - 1) As mypointDim mincx As DoubleDim mincy As DoubleDim minr As DoubleDim p1 As LongDim p2 As LongDim maxr As DoubleDim centerx As LongDim centery As LongPrivate Sub Form_Load()    '黑色的比较清楚    Me.BackColor = vbBlack    Me.AutoRedraw = True        Me.Width = 800 * Screen.TwipsPerPixelX    Me.Height = 600 * Screen.TwipsPerPixelY        '所有图形都进行平移,多少无所谓,是一个数值就行    centerx = Me.ScaleWidth / 2 - 2000    centery = Me.ScaleHeight / 2 - 2000        Command1.Left = Me.ScaleWidth - Command1.Width    Command1.Top = Me.ScaleHeight - Command1.HeightEnd SubPrivate Function equ(ByVal a As Double, ByVal b As Double) As Boolean    If Abs(a - b) < 0.000001 Then        equ = True    Else        equ = False    End IfEnd FunctionPrivate Function Is_Three_Point_In_A_Line(ByVal x1 As Double, ByVal y1 As Double, ByVal x2 As Double, ByVal y2 As Double, ByVal x3 As Double, ByVal y3 As Double) As Boolean    Dim a As Double, b As Double, e As Double        a = (x1 + x2) * (x1 - x2) + (y1 + y2) * (y1 - y2)    b = (x3 + x2) * (x3 - x2) + (y3 + y2) * (y3 - y2)    e = (x1 - x2) * (y3 - y2) - (x2 - x3) * (y2 - y1)    Is_Three_Point_In_A_Line = equ(e, 0)End FunctionPrivate Sub Calc_TPC(ByVal x1 As Double, ByVal y1 As Double, ByVal x2 As Double, ByVal y2 As Double, ByVal x3 As Double, ByVal y3 As Double, cx As Double, cy As Double, r As Double)    Dim a As Double, b As Double, e As Double    a = (x1 + x2) * (x1 - x2) + (y1 + y2) * (y1 - y2)    b = (x3 + x2) * (x3 - x2) + (y3 + y2) * (y3 - y2)    e = (x1 - x2) * (y3 - y2) - (x2 - x3) * (y2 - y1)    cx = (a * (y3 - y2) + b * (y2 - y1)) / (2 * e)    cy = (a * (x2 - x3) + b * (x1 - x2)) / (2 * e)    r = Sqr((x1 - cx) * (x1 - cx) + (y1 - cy) * (y1 - cy))        End SubPrivate Function incircle(ByVal cx As Double, ByVal cy As Double, ByVal r As Double, ByVal px As Double, ByVal py As Double) As Boolean    Dim l1 As Double, l2 As Double    Dim a As Double        l1 = px - cx    l2 = py - cy        a = (l1 ^ 2 + l2 ^ 2)    If a <= (r ^ 2) + 0.1 Then        incircle = True    Else        incircle = False    End If    End FunctionPrivate Sub Command1_Click()    Me.FillStyle = vbTransparent    Me.FillColor = 0    Cls        Randomize Timer        '开始时将minr都置成很大,很重要    minr = 1E+90    maxr = 0        Dim i As Long, j As Long, k As Long    Dim l As Long    Dim xxx As Double    Dim cx As Double, cy As Double, r As Double    Dim count As Long        '先生成50个点    For i = 0 To MAXPOINT - 1        p(i).x = Rnd * 4000        p(i).y = Rnd * 4000    Next i        '先求 两个距离最远点,如果求出来,计算所形成的圆是否能够包含所有的点    '如果不能包含,就再用穷举的方法    For i = 0 To MAXPOINT - 1        For j = 0 To MAXPOINT - 1            '求两点的距离,找出最大的            xxx = Sqr((p(i).x - p(j).x) ^ 2 + (p(i).y - p(j).y) ^ 2)            cx = (p(i).x + p(j).x) / 2            cy = (p(i).y + p(j).y) / 2            r = Sqr((p(i).x - cx) ^ 2 + (p(i).y - cy) ^ 2)                        If r > maxr Then                p1 = i                p2 = j                maxr = r            End If        Next j    Next i        '计算所有的点是否在圆内    cx = (p(p1).x + p(p2).x) / 2    cy = (p(p1).y + p(p2).y) / 2    r = Sqr((p(p1).x - cx) ^ 2 + (p(p1).y - cy) ^ 2)    count = 0    For l = 0 To MAXPOINT - 1        If incircle(cx, cy, r, p(l).x, p(l).y) Then            count = count + 1        End If    Next l    If count = MAXPOINT Then        '所有的点都在圆内        '画出最大的圆        cx = (p(p1).x + p(p2).x) / 2        cy = (p(p1).y + p(p2).y) / 2        r = Sqr((p(p1).x - cx) ^ 2 + (p(p1).y - cy) ^ 2)                Circle (cx + centerx, cy + centery), r, vbBlue    Else        '计算所有的圆        For i = 0 To MAXPOINT - 1            For j = 0 To MAXPOINT - 1                For k = 0 To MAXPOINT - 1                    If Not Is_Three_Point_In_A_Line(p(i).x, p(i).y, p(j).x, p(j).y, p(k).x, p(k).y) Then                        '三点可求圆                                                '求圆                        Calc_TPC p(i).x, p(i).y, p(j).x, p(j).y, p(k).x, p(k).y, cx, cy, r                                                '计算所有的点是否在圆内                        count = 0                        For l = 0 To MAXPOINT - 1                            If incircle(cx, cy, r, p(l).x, p(l).y) Then                                count = count + 1                            End If                        Next l                                                If count = MAXPOINT Then                            '所有的点都在圆内                            If r < minr Then                                mincx = cx                                mincy = cy                                minr = r                            End If                        End If                    End If                Next k            Next j        Next i                '画出最小的圆        Circle (mincx + centerx, mincy + centery), minr, vbGreen    End If        '将50个点显示在屏幕上    Me.FillStyle = vbSolid    Me.FillColor = vbRed    For i = 0 To MAXPOINT - 1        Me.Circle (p(i).x + centerx, p(i).y + centery), 30, vbRed    Next iEnd Sub 

读书人网 >VC/MFC

热点推荐