【问题标题】:libGDX polygon - circle collisionlibGDX 多边形 - 圆碰撞
【发布时间】:2016-04-14 18:45:31
【问题描述】:

我最近在 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 循环。

【问题讨论】:

标签: libgdx polygon collision geometry


【解决方案1】:

intersectSegmentCircle 有效地采用一条线段(由前两个向量参数指定)和一个圆(由最后一个向量和浮点参数指定),如果线与圆相交,则返回 true。

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

如果intersectSegmentCircle 找到该段的圆交点,则该方法返回true。如果最后没有找到交点,则返回 false。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多