2016-01-05 19 views
0

我有很多麻煩提出了一個算法來說明一個小矩形的進展離開一個更大的矩形。我將使用什麼算法來確定退出大矩形邊界的矩形的進度?有沒有這個名字?

的較小矩形中心開始在較大的:

---------- 
|  | 
|  | 
| ---- | 
| | | | 
| | | | 
| ---- | 
|  | 
|  | 
---------- 

作爲遊戲的一部分,用戶可以然後「拋」,它的其中所包含的較大的矩形以外的較小矩形。如果他們完全拋棄它們,他們就會贏。

我想有一個進度表,他們有多接近他們。如果較小的矩形在較大的矩形內沒有點,則將其定義爲「out」。

我知道在這種情況下,進展有些抽象,特別是在方向發揮作用的情況下。我希望它的工作方式基本上是離中心距離的函數。如果他們把它靠近中心,進展會減少,但如果它被帶走,進展會增加。顯然,你也可以得到一個表示速度/軌跡的向量。

如果兩個形狀都是正方形,那麼這將是一個微不足道的算法,因爲沿任何方向移動都會有一個基本上靜態的進展,但是它們都是任何可能大小和長寬比的矩形,不同方向的進度較慢相對於其它的。 (例如在上面的圖中,通過頂部和底部推出它需要比側面更多的移動,所以當它向上或向下移動時它會進展得更慢。)

我在智慧的一端試圖想出這個一出。有沒有可能研究這樣的問題的名稱?我使用點積來確定物體是靠近還是遠離,並且考慮使用三角函數和速度角度,但是我一直在縮短。

+0

解決此問題的唯一方法是使用三角和角度。基本上,給定表示運動方向的角度,需要計算所需的距離,以便x座標或y座標不重疊。您還需要計算迄今爲止的行駛距離。這兩個距離的比例是進步。 – user3386109

+0

您可能使用「軸對齊邊界框」理論。 – user2672165

+0

小矩形的邊與大矩形的邊平行嗎? –

回答

1

如果所有這些值都爲正,小矩形是大的內部(或路口發生)

q = (Big.Right - Small.Left) 
p = (Big.Left - Small.Right) 
r = (Big.Top - Small.Bottom) 
s = (Big.Bottom - Small.Top) 

然後找到這些的最低值 - 他們退出之前的時間:

qT = q/Velocity.X //direction 
pT = p/Velocity.X 
rT = r/Velocity.Y 
sT = s/Velocity.Y 
+0

這些變量究竟代表什麼? –

+0

Big.Right - 較大矩形的右側座標等。qT - 時間參數,表示當較小的矩形以給定的速度(以給定的方向)移動時,會留下較大的矩形。 – MBo

0

在任何時候,你都知道小矩形的座標。另外,更大的是靜態的。

讓較小的矩形表示爲:(x1,y1)(左下角)和(x2,y2)(右上角)。

所以,它的中心將是:((x1 + x2)/2, (y1 + y2)/2) =>(a,b)

類似地,與座標較大的矩形的中心:(X1,Y1)(X2,Y2)將是:((X1 + X2)/2, (Y1 + Y2)/2) =>(A,B)

如果在任何時候:

abs(A-a) >= (x2-x1)/2 + (X2-X1)/2 
      OR 
abs(B-b) >= (y2-y1)/2 + (Y2-Y1)/2 

abs()表示絕對差值。

較小的矩形不在較大的矩形中。 (平等意味着接觸)。