Re: [運算] 怎算出兩條線有沒有交叉?已回收
沒錯 這是錯的
上次手邊沒資料憑印象打的
因為前幾年解這問題時 畫了很多個三角形 所以前置作業忘了
事實上分個部分
AB CD有無焦點
先看 角ACD 跟 角ACB 比較
若 角ACD 比 角ACB 大 或兩者 一正一負(角度的實是一正負)
則沒有焦點
反之則可能有焦點
此時再用上篇說的三角形的判定方法
當時因為有一堆AB線段跟一個CD線段辦定
所以程式碼如下
function out=ifcross(a,b,c,d)
%ab線段和cd線段是否相交 若有回傳1 若無回傳0
%若ab為向量(多個線段)則回傳 cd間經過ab幾次 若有回傳次數 若無回傳0
ca = a-c;
cb = b-c;
cd = d-c;
p = angle(cd./ca)./angle(cb./ca);%判斷夾角的狀況
p = (p>=0).*(p<=1);
Aabc=p.*abs(ca).*abs(cb).*abs(sin(angle(cb./ca)));% 三角形ABC的面積
Aacd=p.*abs(ca).*abs(cd).*abs(sin(angle(cd./ca)));
Abcd=p.*abs(cd).*abs(cb).*abs(sin(angle(cb./cd)));
out = sum((Aacd+Abcd) > Aabc); %若相接或重疊也算的話是 >=
※ 引述《Leon (Achilles)》之銘言:
: ※ 引述《bridge23 (橋)》之銘言:
: : 這個問題我之前遇過
: : 後來自己想了一個方法
: : 用三角形的面積判斷
: : 假設AB連 CD連
: : 那 三角形ABC+三角形ABD > 三角形ACD 則表示有相交
: : 反之 三角形ABC+三角形ABD < 三角形ACD 則表示沒有相交
: 這不可能是對的.
: Consider AB, CD, equal and parallel.
: Tri(ABC) = Tri(ABD) = Tri(ACD)
: 但 AB, CD 沒有相交.
: : 若等於的話表示 剛好碰到
: : 這方法自認為還算單純
: 就我所知用投影判斷比較簡單. 去查演算法的課本應該有更好的做法
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.132.151.18
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 7 之 7 篇):