Re: [運算] 怎算出兩條線有沒有交叉? 交點已回收
冷飯熱炒一下
在眾多討論怎麼沒人覺得我的方法最簡單勒@@ (程式po在上一篇)
這邊說明一下概念
如果有點 a b c d ,要判斷線段 ab , cd 是否有交點
只要判斷
1. ab 是否在直線cd 同側
2. cd 是否在直線ab 同側
上面1&2 只要有一項符合 則線段 ab 和 線段cd無交點
--
演算法如下
step1 用 abcd 點座標,公式解直線ab和直線cd係數
得直線 ab = p1*x + p2*y + p3
直線 cd = q1*x + q2*y + q3
step2 判斷兩點 c d 是否在直線ab同側
根據直線性質,把直線同側的點代入直線方程式,會得到相同正負結果
ex c(1,0) d(0,1) ab = x+y
c 和 d 代入 x+y 均為 1>0 同號 => c,d 在直線ab同側
反之異號則不同側
所以這步只判斷 點c,d座標代入直線ab的結果是否 > 0 (同號)
點a,b座標代入直線cd的結果是否 > 0
即可得知兩線段是否相交
綜合兩個步驟,全部都只要簡單的加減乘除...
--
寫完上面手癢
直接 function code都補上好了,input(a,b,c,d)為點座標
function cross=test(a,b,c,d)
p1 = b(2)-a(2);
p2 = a(1)-b(1);
p3 = b(1)*a(2)-a(1)*b(2);
q1 = d(2)-c(2);
q2 = c(1)-d(1);
q3 = d(1)*c(2)-c(1)*d(2);
sign1 = ( p1*c(1)+p2*c(2)+p3 ) * ( p1*d(1)+p2*d(2)+p3 );
sign2 = ( q1*a(1)+q2*a(2)+q3 ) * ( q1*b(1)+q2*b(2)+q3 );
% cross = sign1*sign2<0; 修改此行
cross = (sign1 < 0 && sign2 < 0)
end
Example:
a = rand(1,2);b = rand(1,2);c = rand(1,2);d = rand(1,2);
test(a,b,c,d)
plot([a(1) b(1)] , [a(2) b(2)],'o-'); hold on;
plot([c(1) d(1)] , [c(2) d(2)],'o-r'); hold off;
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.208.41
推
02/14 17:29, , 1F
02/14 17:29, 1F
→
02/14 17:40, , 2F
02/14 17:40, 2F
修改最後的判斷跟繪圖 感謝版友指正~
※ 編輯: Roronoa 來自: 140.113.208.41 (02/14 18:09)
推
02/14 21:04, , 3F
02/14 21:04, 3F
推
02/19 18:18, , 4F
02/19 18:18, 4F
討論串 (同標題文章)
完整討論串 (本文為第 3 之 3 篇):