最近我发布了another thread,答案非常有帮助。从 this reference开始,我尝试编写两个相交圆的代码。
我认为我的代码做错了,结果是它给了我交叉点连接线的中点。我不知道我的代码有什么问题。
我发现很难处理循环。我需要向量的实际长度但是如果我将它写入循环,对于i+1
它会向我显示错误(这是非常自然的,因为我找不到任何'<'运算符:(()
这是我的代码 -
Xs = [150,130];% x coordinates of center of circles
Ys = [100,250];% y coordinates of center of circles
Rs = [100,70];% radius of circles
C=Imread('spinks_map.png');
figure, Imshow(C)
hold on;
simple_draw_circle( Xs, Ys, Rs);
for i=1:length(Xs)-1
dsq(i) = ((Xs(i+1)- Xs(i))^2) + ((Ys(i+1) - Ys(i))^2);
K(i)= (sqrt((((Rs(i)+Rs(i+1))^2)-dsq(i))-(dsq(i)-(Rs(i)-Rs(i+1))^2)))/4;
x(i) = ((Xs(i+1)+Xs(i))/2) + ((Xs(i+1)-Xs(i))*(Rs(i)^2-Rs(i+1)^2)/dsq(i))/2 - 2*(Ys(i+1)-Ys(i))*(K(i)/dsq(i));
y(i) = ((Ys(i+1)+Ys(i))/2) + ((Ys(i+1)-Ys(i))*(Rs(i)^2-Rs(i+1)^2)/dsq(i))/2 +(-2)*(Xs(i+1)-Xs(i))*(K(i)/dsq(i));
end
scatter(x(1),y(1),'filled');
答案 0 :(得分:1)
您使用Heron公式时出错。看看你发布的链接给出了K的计算。在平方根内的两个术语之间应该有一个产品,没有区别:
K(i)= (sqrt((((Rs(i)+Rs(i+1))^2)-dsq(i))*(dsq(i)-(Rs(i)-Rs(i+1))^2)))/4;
另外,关于你的第二个问题。如果我在使用带有“:”的表达式时明确声明操作顺序,我发现这对我来说是最好的做法。
对于你的循环,使用适当的选择
for i=(1:length(Xs))-1
或
for i=1:(length(Xs)-1)
可以减少索引期间的意外行为。这是我从你的帖子中理解的问题。如果是其他内容,那么发布Matlab吐出的错误文本,我会看看它。
有一个“<” Matlab中的运算符。如果您尝试以C等效循环的样式使用它:
for(iter=0;iter++,iter<2){
something();
}
然后查看Matlab while循环的语法。
祝你好运,
安德鲁