求助:已知三角形三顶点坐标,如何求其外接圆圆心坐标?
已知三角形三顶点坐标比如(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)
解方程组可得出圆心的三维坐标。
[解决办法]
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