Re: [運算] 怎算出兩條線有沒有交叉?已回收
這問題要考慮到滿多方面的
如何不使用for迴圈
有沒有平行 二點是否在同一側
二點不同側時有無和另一線段交叉到
是否有線段垂直x軸
我的程式有驗證上述狀況
計算結果是正確的
My Program:
%Col 1為P1的x座標;Col 2為P1的y座標 以下類推 共四個點
%P1和P2連成一線;P3和P4連成一線
%測試資料(以下7筆測試資料)
P =[1 1 1 4 1 1 2 4;
1 2 2 3 4 1 2 2;
1 2 2 3 4 1 0 4;
1 2 2 3 4 1 0 5;
1 2 2 3 4 1 0 6;
1 2 1 4 4 1 2 2;
1 2 1 2 4 1 2 2];
row = size(P,1);
Out = zeros(row,3);
%計算交點(重疊或平行不計算)
u = (P(:,1)-P(:,3)).*(P(:,6)-P(:,8))-...
(P(:,2)-P(:,4)).*(P(:,5)-P(:,7));
loc = find(u~=0);
a = (P(loc,1).*P(loc,4)-P(loc,2).*P(loc,3)).*(P(loc,5)-P(loc,7))-...
(P(loc,5).*P(loc,8)-P(loc,6).*P(loc,7)).*(P(loc,1)-P(loc,3));
b = (P(loc,1).*P(loc,4)-P(loc,2).*P(loc,3)).*(P(loc,6)-P(loc,8))-...
(P(loc,5).*P(loc,8)-P(loc,6).*P(loc,7)).*(P(loc,2)-P(loc,4));
Out(loc,1) = loc;
Out(loc,2) = a./u(loc);
Out(loc,3) = b./u(loc);
%兩點在同一側須刪除
same =
(P(:,6)-((P(:,4)-P(:,2))./(P(:,3)-P(:,1)).*(P(:,5)-P(:,1))+P(:,2))).*...
(P(:,8)-((P(:,4)-P(:,2))./(P(:,3)-P(:,1)).*(P(:,7)-P(:,1))+P(:,2)));
Out(sign(same)==1,1) = 0;
%交點在非線段內需刪除
check = sqrt((Out(loc,2)-P(loc,1)).^2+(Out(loc,3)-P(loc,2)).^2)+...
sqrt((Out(loc,2)-P(loc,3)).^2+(Out(loc,3)-P(loc,4)).^2)-...
sqrt((P(loc,1)-P(loc,3)).^2+(P(loc,2)-P(loc,4)).^2);
Out(check>0,1) = 0;
Out(Out(:,1)==0,:) = [];
%1:有交點row 2:交點x座標 3:交點y座標
disp(Out);
計算結果:
第幾筆資料有交點 交點x座標 交點y座標
1.0000 1.0000 1.0000
3.0000 1.7143 2.7143
4.0000 2.0000 3.0000
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.170.26.75
※ 編輯: maplefog 來自: 118.170.26.75 (02/12 10:48)
→
02/12 16:34, , 1F
02/12 16:34, 1F
→
02/12 16:34, , 2F
02/12 16:34, 2F
討論串 (同標題文章)
完整討論串 (本文為第 4 之 7 篇):