Matlab符号解决两点之间已知半径的圆

时间:2014-04-10 16:12:02

标签: matlab

我想找到两个点A和B之间的圆心,知道两个点的(x,y)对,以及圆半径。

这应该分别产生两对中心候选者,[Xcenter1,Ycenter1]和[Xcenter2,Ycenter2]。它们对应于段[AB]左侧和右侧的圆心。

我编写了以下符号Matlab脚本:

syms x1 y1 x2 y2 xc yc r
f1 =  (x1-xc)^2 + (y1-yc)^2 - r^2;
f2 =  (x2-xc)^2 + (y2-yc)^2 - r^2;

solve(f1,f2,'xc,yc')

结果是:

ans = 
xc: [2x1 sym]
yc: [2x1 sym]

thread开始,结果如下:

xc1 = x1/2 + x2/2 - (y1*(-(x1^2 - 4*r^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2)/(x1^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2))^(1/2))/2 + (y2*(-(x1^2 - 4*r^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2)/(x1^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2))^(1/2))/2

xc2 = -(2*y1*(y1/2 + y2/2 - (x1*(-(x1^2 - 4*r^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2)/(x1^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2))^(1/2))/2 + (x2*(-(x1^2 - 4*r^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2)/(x1^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2))^(1/2))/2) - 2*y2*(y1/2 + y2/2 - (x1*(-(x1^2 - 4*r^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2)/(x1^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2))^(1/2))/2 + (x2*(-(x1^2 - 4*r^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2)/(x1^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2))^(1/2))/2) - x1^2 + x2^2 - y1^2 + y2^2)/(2*x1 - 2*x2)

yc1 = y1/2 + y2/2 + (x1*(-(x1^2 - 4*r^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2)/(x1^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2))^(1/2))/2 - (x2*(-(x1^2 - 4*r^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2)/(x1^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2))^(1/2))/2

yc2 = y1/2 + y2/2 - (x1*(-(x1^2 - 4*r^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2)/(x1^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2))^(1/2))/2 + (x2*(-(x1^2 - 4*r^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2)/(x1^2 - 2*x1*x2 + x2^2 + y1^2 - 2*y1*y2 + y2^2))^(1/2))/2

我可能做错了什么?提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

如果在不存储输出的情况下调用函数,Matlab会自动将输出存储在名为ans的变量中。该变量不可靠,因为后续调用具有未分配输出的另一个函数可能会覆盖ans的值。

solve的特定情况下,它有一些方法可以访问它的输出(参见documentation)。默认情况下,它返回包含函数变量的结构(在本例中为xcyc)。由于没有分配变量,ans变量存储了此结构。

尝试以这种方式调用solve

[xc,yc] = solve(f1,f2,'xc,yc')

现在您拥有它的输出(xcyc)并可以按预期使用它们。您也可以这样调用函数:

S = solve(f1,f2,'xc,yc')

然后您将S.xcS.yc存储为结构。