2012-09-10 148 views
0

對於WPF和c#中的兩條線或兩條路徑或兩個點列表作爲形狀,是否有人有一個想法如何檢測交叉點並繪製圓形交叉點以使其清楚地看到這兩個線路沒有連接(MS visio)? 我只需要這樣做的原則,但有些代碼會有所幫助。謝謝。線條交叉點

+1

你需要在數學或WPF的幫助? – emesx

+1

你的線條代表了什麼? –

+0

可能的重複:http://stackoverflow.com/questions/563198/how-do-you-detect-where-two-line-segments-intersect – KeithS

回答

1

this related question,基本上你可以認爲你的線段是點和矢量的組合。您可以通過選擇一個作爲「原點」並從另一個點的X和Y中減去X和Y,生成「delta」,從而獲得兩點。對其他線段做同樣的事情。

現在,如果這兩個向量交叉,將會有兩個標量可以應用,每個向量一個,以產生與相應向量共線的較短向量,並將表示X和Y中的增量在原點和交叉點之間。這些標量可以通過兩個向量的叉積的函數來找到;看到相關的問題,確切的數學。最後,爲了使兩條線段相交,相交的矢量必須在其原始定義的長度內完成;也就是說,代表向量交點矢量長度的兩個標量必須是0 < s < 1

1

有一種均勻座標的方法,可以輕鬆獲得您想要的。來表示一個點P1使用Vector3並使z座標等於1.

P1 = [x1, y1, 1] 
P2 = [x2, y2, 1] 

線連接兩點是L12 = CROSS(P1,P2) = [a, b, c]其中CROSS是矢量叉積,並使用該線的方程爲a*x+b*y+c=0

現在,如果你有兩行

L12 = [a,b,c] 
L34 = [e,f,g] 

這兩條線的交叉點Q = CROSS(L12,L34) = [qx,qy,qw]座標

x = qx/qw 
y = qy/qw 

例子:兩行,L12連接點(1,1)(2,8)L34連接點(4,-2)(9,3)。找到兩條線的交點。

L12 = CROSS([1,1,1], [2,8,1]) = [-7, 1, 6]  //eq: -7*x+y+6=0 
L34 = CROSS([4,-2,1], [9,3,1]) = [-5, 5, 30] //eq: -5*x+5*y+30=0 
Q = CROSS([-7,1,6], [-5,5,30]) = [0, 180, -30] 
x = 0/(-30) = 0 
y = 180/(-30) = -6 

GeoGebra截圖: GeoGebra4