求购算法:已知3个不在一直线的点(TPoint类型),求到这3个点相同距离的点,也就是圆心?(50分)

  • 主题发起人 主题发起人 linglingfa
  • 开始时间 开始时间
L

linglingfa

Unregistered / Unconfirmed
GUEST, unregistred user!
最好给出现成的函数!!!
 
找个高三的学生一问就知道了。
 
这个很象是考试题?
你有没有学解析几何?
数学都这种水平的话还学什么编程?
 
我猜是:
A=(2*(X2-X1)*(Y3-Y1)-2*(X3-X1)*(Y2-Y1))/(X2-X1);
B=(X3*X3-X1*X1)+(Y3*Y3-Y1*Y1)-(X3-X1)/(X2-X1)*((X2*X2-X1*X1)+(Y2*Y2-Y1*Y1))
Y=B/A X=......
吧,不知道有没有错 :)
 
解析几何搞定
 
AB的垂直平分线与BC的垂直平分线的交点。(初二几何)
 
这是数学问题,不是计算机问题。
 
var
x1,y1,x2,y2,x3,y3,a,a1,a2:double;

a:=(y2-y3)*(x2-x1)-(y2-y1)*(x2-x3);
a1:=(x1+x2)*(x2-x1)+(y2-y1)*(y1+y2);
a2:=(x2+x3)*(x2-x3)+(y2-y3)*(y2+y3);

c_cx:=round((a1*(y2-y3)-a2*(y2-y1))/a/2); circle centor x coordinary
c_cy:=round((a2*(x2-x1)-a1*(x2-x3))/a/2); circle centor ycoordinary
c_r:=anedge.p1.Distance(c_cx,c_cy); R

 
更正:
c_r:=sqrt(sqr(c_cx-x1)+sqr(c_cy-y1))
 
to ye peng:哇,我的那条式子都算复杂了。原来还有更复杂的…… :),我是三点用确定的
三条半径相等建立两条方程解出来的,请问你是用什么方法做的?是学数学的朋友吗?//hand
 
实际上解决此问题的算法很多,几何法,代数法,逼进法......
 
其实这种问题是数学上的问题,没有必要在大富问,正好我手里有我所做的程序,正好
贴出来:
FUNCTION QJABC(A1,B1,C1,A2,B2,C2:REAL;VAR X,Y:REAL):BOOLEAN;
//该函数求二条直线的交点,直线1的参数为A1,B1,C1,直线2的参数为A2,B2,C2
//交点为X,Y,如果两直线无交点,则返回值为FALSE
BEGIN
IF ((ABS(A1)<EX) AND (ABS(A2)<EX)) OR ((ABS(B1)<EX)AND(ABS(B2)<EX))
OR ((ABS(A1)<EX) AND (ABS(B1)<EX)) OR ((ABS(A2)<EX) AND (ABS(B2)<EX)) THEN
BEGIN
QJABC:=FALSE;
EXIT
END;
IF ABS(A1)<EX THEN
BEGIN
Y:=(0-C1)/B1;
X:=(0-C2-B2*Y)/A2;
END
ELSE
IF ABS(B1)<EX THEN
BEGIN
X:=(0-C1)/A1;
Y:=(0-C2-A2*X)/B2
END
ELSE
IF ABS(A2)<EX THEN
BEGIN
Y:=(0-C2)/B2;
X:=(0-C1-B1*Y)/A1
END
ELSE
IF ABS(B2)<EX THEN
BEGIN
X:=(0-C2)/A2;
Y:=(0-C1-A1*X)/B1
END
ELSE
BEGIN
if abs(a2*b1-a1*b2)<ex then
begin
qjabc:=false;
exit
end;
y:=(a1*c2-a2*c1)/(a2*b1-a1*b2);
x:=(0-c1-b1*y)/a1;
end;
qjabc:=true;
END;

function sqppp(PP,PP1,PP2:TPoint;VAR X,Y,R:REAL):boolean;
//过任意三点作圆,如成功返回TRUE否则返回FALSE;
var a,b,c,d,e,f,g,h,i,j:real;
begin
a:=pp2^.x+pp1^.x;
b:=pp2^.x-pp1^.x;
c:=pp2^.y+pp1^.y;
d:=pp2^.y-pp1^.y;
e:=pp^.x+pp1^.x;
f:=pp^.x-pp1^.x;
g:=pp^.y+pp1^.y;
h:=pp^.y-pp1^.y;
i:=(0-A*B-C*D)/2;
j:=(0-E*F-G*H)/2;
if not qjabc(b,d,i,f,h,j,x,y) then
begin
Result:=false;
exit
end;
R:=Sqrt((X-PP^.X)*(X-PP^.X)+(Y-PP^.Y)*(Y-PP^.Y));
Result:=True;
end;





 
多人接受答案了。
 
后退
顶部