2016-06-10 23 views
-2

在一個2D遊戲中,我需要找到一個對象是在斜線之上還是之下。畫布 - 如何找到一個點是否在斜線之上或之下?

任何人都知道如何做到這一點?

(ⅰ使用createJS框架)

+0

你到目前爲止嘗試過什麼? – element11

+0

@simon guichard比較coordinates.can你從[如何確定二維三角形中的點?](http://jsfiddle.net/PerroAZUL/zdaY8/1/)顯示一個示例點和線 –

+0

[小提琴] ://stackoverflow.com/questions/2049582/how-to-determine-a-point-in-a-2d-triangle) – destoryer

回答

1

好的,廢除我以前的答案,並使用線相交。從點開始直線測試。如果有交點,則點在下面,如果沒有,則該點在線的上方或側面。

爲了避免副案例(無雙關語),使用插值擴展原始線條。

這是一個可以做的功能line intersection。要做到原線的線性插值只需使用一些極端值:

var tx1 = x1 + (x2-x1) * -51000; 
var ty1 = y1 + (y2-y1) * -51000; 

var tx2 = x1 + (x2-x1) * 53200; 
var ty2 = y1 + (y2-y1) * 53200; 

更新今天早上我着急了一點,所以這裏是一個小更新。正如blindman67指出的那樣,如果鏈接相交函數中只有d,並且檢查s/t(如果它們處於標準化範圍內(或者只是使用交叉積 - 請參閱他的回答,認爲它更合適))。

+0

工程就像一個魅力:)謝謝 –

+0

你只需要檢查在交叉線的d值功能。如果在線的左側,它將成爲負數(更好的解決方案就是做線和點的交叉乘積)。你也不需要添加極端值,如果你刪除了兩個界限檢查行截取函數if(s> = 0 && s <= 1)',另一個爲't',因爲這會給出截距該線不是線段。 – Blindman67

1

使用上部座標以創建一個形狀生成的三角形。例如,如果你的線路是這樣的:

line

你可以的,如果使用X2和Y1創建一個形狀:

triangle

現在簡單的三角形添加到路徑,並做了isPointInPath(x, y),如果它是真的,則在上面,如果它是假的,則在下面。

如果您需要檢查下面的相反過程。

result

(WOWA很多箭那裏......但你會得到的想法:)!)

邊緣的情況下(雙關語意):如果點是非常接近的一個結束 - >只是延長線條,或者使多邊形延伸(x1,y1)直到該區域的邊緣。實際上,考慮它:三角形可能不太合適,而是使用畫布的上邊緣作爲多邊形的一部分,然後下一個部分將是垂直線,直到對角線的末端,從對角線開始到畫布左上角的最後一段。我只是懶得重做的圖形,但你明白了......

+0

謝謝K3N,它非常清楚!我不知道isPointInPath()函數,這肯定會有幫助!讓我試試這個對我的情況 –

+0

喜歡箭頭:)) –

+0

@SimonGuichard是的,它很有用。我添加了一個新的答案,但可能更合適。看看:) – K3N

1

使用點和線的叉積。

您需要將整個座標系移至行首,然後獲取行與點的叉積。如果結果是負數,則該點位於該線的左側,如果爲正則該點位於該線的右側,如果爲零,則該點位於該線上。

// the point 
var px = 100; 
var py = 100; 

// the line 
var lx1 = 20; 
var ly1 = 20; 
var lx2 = 320; 
var ly2 = 120; 

// move line end and point so that line start is at 0,0 
lx2 -= lx1; 
ly2 -= ly1; 
px -= lx1; 
py -= ly1; 

// get cross product 
var cross = lx2 * py - ly2 * px; 
if(cross < 0){ // point is to the left (anticlockwise) 
}else if(cross > 0){ // point is to the right (clockwise) 
}else{ // cross must be zero then point is on the line  
} 
相關問題