libGDX多边形 - 圆形碰撞

时间:2016-04-14 18:45:31

标签: libgdx polygon collision geometry

我最近在stackoverflow上找到了代码,用于处理多边形和圆之间的碰撞,它可以工作。问题是因为我不太明白它所以如果有人能给我简单的解释我会很高兴。

// 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循环。

1 个答案:

答案 0 :(得分:1)

intersectSegmentCircle有效地获取一个线段(由前两个矢量参数指定)和一个圆(由最后一个矢量和浮点参数指定),如果该线与圆相交,则返回true。 / p>

for循环遍历多边形的顶点(由于顶点由float[] vertices中的两个值表示,因此递增2)。对于每个顶点依次,它考虑通过将该顶点连接到多边形中的前一个顶点而形成的线段(即,它依次考虑多边形的每个边缘)。

如果intersectSegmentCircle找到该段的圆形交叉点,则该方法返回true。如果结尾没有找到交叉点,则返回false。

for循环中的if / else仅用于第一个顶点 - 在这种情况下,'previous'顶点实际上是float[] vertices中的最后一个顶点,因为多边形循环并连接最后一个顶点到第一个。