2016-04-14 6 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は、効果的に線分(最初の2つのベクトル引数で指定)と円(最後のベクトル引数とfloat引数で指定される)をとり、線が円と交差する場合はtrueを返します。

forループは、ポリゴンの頂点をループしています(頂点はfloat[] verticesの2つの値で表されるため、2ずつ増加します)。各頂点について、その頂点をポリゴンの前の頂点に結合することによって形成される線分を考慮する(すなわち、ポリゴンの各エッジを順に考慮する)。

intersectSegmentCircleがそのセグメントの円の交差を検出した場合、このメソッドはtrueを返します。最後に交差が見つからない場合はfalseを返します。

forループのif/elseは、最初の頂点だけです。この場合、 'previous'頂点は実際にはfloat[] verticesの最後の頂点になります。ポリゴンが丸みを帯びて最後の頂点を最初の頂点に戻します。

+0

ありがとうございました。 – Emir