2016-06-21 125 views
0

我想知道一條線(與x1,y1,x2和y2)是否碰撞一個對象(如果線的任何部分觸及或在該對象內)。對象可以是矩形(帶有x,y,寬度和高度)或圓形(帶有x,y和半徑)。線條觸摸或矩形或圓形

我想要兩個JavaScript代碼示例,每個函數,一個用於線矩形碰撞(lineX1,lineY1,lineX2,lineY2,rectangleX,rectangleY,rectangeWidth,rectangleHeight),另一個用於線圈碰撞(lineX1,lineY1,lineX2,lineY2,circleX,circleY,circleRadius)

這樣做的最有效的方法將不勝感激。

+0

也許你可以嘗試獲取所有形狀的公式(如果我記得,line =(ax + b),circle =(degree/180 * Pi),deb從0到360. – Julqas

+0

難道你不知道意思是一條線段? –

回答

1

的線段有參數方程

X = X0 + t (X1 - X0) 
Y = Y0 + t (Y1 - Y0) 

和一個圓有隱式

(X - Xc)² + (Y - Yc)² = R² 

代在最後一節的第一個表達式爲您提供了t具有

一元二次方程
  • 沒有根,那就沒有路口了;
  • 一個或兩個根,它給你一個圈內的區間t;您需要檢查此間隔與[0, 1]的交集,以查看該段是否有內部部分。

爲了針對一個軸對齊矩形的線段,可以編寫不等式的系統

Xa <= X0 + t (X1 - X0) <= Xb 
Ya <= Y0 + t (Y1 - Y0) <= Yb 

如果t係數爲負時,您可以交換X0 < =>X1Xa < = >Xb(與Y相同)以使其爲正值。

然後不等式成爲

(Xa - X0)/(X1 - X0) <= t <= (Xb - X0)/(X1 - X0) 
(Ya - Y0)/(Y1 - Y0) <= t <= (Yb - Y0)/(Y1 - Y0) 

向其中添加段

0 <= t <= 1. 

這是一件容易的事,以檢查是否這些bracketings是兼容的限制。

對於圓形和矩形,您都可以從一個直線邊界框測試開始。

+0

原始問題提出一條線,而不是一條線段,在這種情況下,區間[0,1]是否有任何意義? –

+0

@ this-vidor:我詢問了OP對此的澄清。例如,我的答案是「最強大的」,並且可以忽略[0,1]約束條件 –

+0

老實說,我不明白這一點(把它當作讚美)。你的意思是線條而不是線條,JavaScript代碼會很棒(我已經編輯了這個問題) –