2016-04-14 94 views
0

我最近在stackoverflow上找到了代碼,用於處理多邊形和圓形之間的碰撞,它的工作原理。問題是因爲我不太明白,所以如果有人能夠給我簡單的解釋,我會很感激。libGDX多邊形 - 圓形碰撞

// Check if Polygon intersects Circle 
private boolean isCollision(Polygon p, Circle c) { 
    float[] vertices = p.getTransformedVertices(); 
    Vector2 center = new Vector2(c.x, c.y); 
    float squareRadius = c.radius * c.radius; 
    for (int i = 0; i < vertices.length; i += 2) { 
     if (i == 0) { 
      if (Intersector.intersectSegmentCircle(new Vector2(
        vertices[vertices.length - 2], 
        vertices[vertices.length - 1]), new Vector2(
        vertices[i], vertices[i + 1]), center, squareRadius)) 
       return true; 
     } else { 
      if (Intersector.intersectSegmentCircle(new Vector2(
        vertices[i - 2], vertices[i - 1]), new Vector2(
        vertices[i], vertices[i + 1]), center, squareRadius)) 
       return true; 
     } 
    } 
    return false; 
} 

我沒有得到它的部分是for循環。

+0

確保您檢查圓形是否包含在多邊形內。 http://stackoverflow.com/a/29938608/2900738 –

回答

1

intersectSegmentCircle有效地取一條線段(由前兩個向量參數指定)和一個圓圈(由最後的向量和浮點參數指定),並且如果該線與圓相交,則返回true。

for循環循環遍歷多邊形的頂點(由於頂點由float[] vertices中的兩個值表示,所以遞增2)。對於每個頂點依次考慮通過將該頂點連接到多邊形中的前一個頂點而形成的線段(即,它依次考慮多邊形的每個邊緣)。

如果intersectSegmentCircle找到該段的圓形交點,則該方法返回true。如果到最後找不到交點,則返回false。

for循環中的if/else僅用於第一個頂點 - 在這種情況下,「上一個」頂點實際上是float[] vertices中的最後一個頂點,因爲多邊形循環並將最後一個頂點連接回第一個頂點。

+0

謝謝你的時間:) – Emir