Re: [運算] 怎算出兩條線有沒有交叉?已回收

看板MATLAB作者 (楓霧)時間15年前 (2011/02/12 10:41), 編輯推噓0(002)
留言2則, 1人參與, 最新討論串4/7 (看更多)
這問題要考慮到滿多方面的 如何不使用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
哇靠認真推,讓我研究一下,感謝這麼仔細還寫code驗證
02/12 16:34, 1F

02/12 16:34, , 2F
m(-_-)m
02/12 16:34, 2F
文章代碼(AID): #1DLVDDze (MATLAB)
討論串 (同標題文章)
文章代碼(AID): #1DLVDDze (MATLAB)