1. 程式人生 > >計算機與數學 —— 檢測圓與矩形相交的快速判定演算法

計算機與數學 —— 檢測圓與矩形相交的快速判定演算法

這篇部落格介紹瞭如何快速檢測圓與矩形是否相交的演算法。

演算法介紹

首先,對於矩形來說,將座標系原點移到矩形的中心,並且將從原點到第一象限的頂點的向量a求出來。
Image1

其次,無論圓心E在哪一個象限,都將其通過軸對稱轉換到第一象限,並且求出原點到轉換後的圓心E的向量b
Image2

接下來是最關鍵的一步:算出AE的向量c,並且把向量c中的負值全部置為0,得到最終的向量c

  • 兩個分量都大於0

Image3

  • x值小於0

Image4

  • y值小於0

Image5

xy都小於0時,最終的向量為(0,0)

因此最終只要比較半徑r與向量c的模長的大小即可,如果需要在程式碼中實現,則無需開方。

  • c<r,則圓與矩形相交。
  • c=r,則圓與矩形相切。
  • 否則二者相離。

程式碼實現

bool Intersection(float2 c, float2 h, float2 p, float r) 
{
    float2 v = abs(p - c); 
    float2 u = max(v - h, 0); 
    return dot(u, u) < r * r; 
} 

思考

這種演算法可以擴充套件至高維。例如需要判定Box與球形是否相交,則可以依次演算法類推至三維的判定。

這類問題通常都可以轉化為閔可夫斯基和的問題,傳送門