2012-04-14 61 views
3

過了一段時間,幾何代碼變得很乏味,但我想完成這個庫,所以這裏。如何阻止一條線段與另一條線段相交?

基本上,移動一個線段A的最有效方法是什麼,以便它不再與另一個線段B相交?

兩條線段都用一個起點(x,y)和一個描述線段如何從該點(eX,eY)延伸的向量來定義。的線段如何描述下面是一個例子:

enter image description here

我正在尋找的是其中的線段被移動(其程度不以任何方式修改)到最近的位置,其中將溶液它不相交。舉個例子:

enter image description here

什麼是最有效的方式來得到這樣的結果?

編輯:人們問我的意思是「移動」 - 我的意思是改變線段起點的(x,y)座標。這將翻譯整個部分。

線段存在於笛卡爾平面上,並且允許任何x/y運動。

+0

你可以在哪些方向移動? – j13r 2012-04-14 20:09:43

+0

移動是什麼意思?改變x,y但是保持ex,ey不變?只要段的長度保持不變,我是否可以更改x,y,ex,ey? – emory 2012-04-14 20:12:52

回答

4

怎麼樣:找到四個向量:紅線的兩個端點垂直於黑線,兩個垂直從紅線到黑線的端點。取這些矢量中最短的一個,並沿着它移動紅線。

+0

這是一個非常好的主意。 – CodeBunny 2012-04-14 20:20:26

0

由於您沒有指定您可以自由移動哪個維度,所以我會認爲沒有問題。

我假設你的紅線的特徵是一個起點(x,y)和一個從那裏到終點(eX,eY)的向量。因此該線上的任何點都是[0,1] *(eX,eY)+(x,y)。

讓我們找到線交叉點。這就是其中一個in [0,1]的a *(eX1,eY1)+(x1,y1)=(eX2,eY2)+(x2,y2)。

如果此交叉存在,則可以移動該線以便它在此交叉點處結束,並且必須移動該長度。

(X1' ,Y1' )=(X1,Y1) - A *(EX1,EY1)

這樣,你移動的起點距離,直到你發現前交叉點的接觸點兩條線。

+0

這種方法的問題在於它不是最短的旅行距離。是的,它解決了碰撞問題,但以非常不理想的方式。 – CodeBunny 2012-04-14 20:19:55