Проблемы с поиском точки пересечения круга - PullRequest
0 голосов
/ 09 марта 2011

Недавно я отправил другую ветку , и ответы были действительно полезны.Из этой ссылки я попытался написать код для двух пересекающихся кругов.

  1. Я думаю, что сделал что-то не так с моим кодом, и в результате он дает мне среднюю точку соединительной линии точек пересечения.Я понятия не имею, что не так с моим кодом.

  2. Мне трудно обрабатывать цикл.Мне нужна фактическая длина векторов, но если я записал ее в цикл, для i+1 она показывает ошибку (что вполне естественно, поскольку я не нахожу оператора '<': (() </p>

Вот мой код -

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');

1 Ответ

1 голос
/ 09 марта 2011

Вы ошиблись при использовании формулы Герона. Посмотрите на ссылку, которую вы разместили, которая дает вычисление для К. Между квадратными корнями должен быть продукт, а не разница:

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 есть оператор "<". Если вы пытаетесь использовать его в стиле цикла C, эквивалентного циклу: </p>

for(iter=0;iter++,iter<2){
     something();
}

Затем посмотрите синтаксис цикла Matlab.

Удачи,

Andrew

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...