Java 与Libgdx的圆和多边形碰撞

Java 与Libgdx的圆和多边形碰撞,java,collision-detection,polygon,libgdx,geometry,Java,Collision Detection,Polygon,Libgdx,Geometry,在Libgdx中是否有方法验证多边形和圆之间的碰撞 我看到了Intersector类,但只找到了圆和矩形的碰撞测试。其他多边形呢 如果需要手动操作,那么使用Libgdx的最佳方法是什么?因此,我成功地在圆和多边形之间创建了一个碰撞测试方法。至少,它对我有用 代码如下: public boolean overlaps(Polygon polygon, Circle circle) { float []vertices=polygon.getTransformedVertices();

在Libgdx中是否有方法验证多边形和圆之间的碰撞

我看到了Intersector类,但只找到了圆和矩形的碰撞测试。其他多边形呢


如果需要手动操作,那么使用Libgdx的最佳方法是什么?

因此,我成功地在圆和多边形之间创建了一个碰撞测试方法。至少,它对我有用

代码如下:

public boolean overlaps(Polygon polygon, Circle circle) {
    float []vertices=polygon.getTransformedVertices();
    Vector2 center=new Vector2(circle.x, circle.y);
    float squareRadius=circle.radius*circle.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;
}
公共布尔重叠(多边形、圆){
float[]顶点=多边形。getTransformedAdverties();
矢量2中心=新矢量2(圆x,圆y);
浮点平方半径=圆。半径*圆。半径;

对于(int i=0;i很遗憾,我没有足够的声誉来评论,所以我将添加此作为另一个答案

Cristiano的优秀答案适用于检查圆是否与多边形的一条线段重叠,但是它没有检查圆是否完全包含在多边形内这一更不寻常的情况,如果一个快速移动的小圆与一个大多边形碰撞,可能会发生这种情况

我在下面重新编译了Cristiano的代码,并做了一些小改动来解决这个问题

public static boolean overlaps(Polygon polygon, Circle circle) {
    float []vertices=polygon.getTransformedVertices();
    Vector2 center=new Vector2(circle.x, circle.y);
    float squareRadius=circle.radius*circle.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 polygon.contains(circle.x, circle.y);
}
公共静态布尔重叠(多边形、圆){
float[]顶点=多边形。getTransformedAdverties();
矢量2中心=新矢量2(圆x,圆y);
浮点平方半径=圆。半径*圆。半径;

对于(int i=0;i)…为了跟进Phil Anderson的优秀答案,下面是我的版本,它简单地避免每次检查都创建新的向量2,而是重复使用向量2的静态实例

public class PolygonUtil {

static final Vector2 center = new Vector2();
static final Vector2 vec1 = new Vector2();
static final Vector2 vec2 = new Vector2();

public static boolean overlaps(Polygon polygon, Circle circle) {
    float []vertices=polygon.getTransformedVertices();
    center.set(circle.x, circle.y);
    float squareRadius=circle.radius*circle.radius;
    for (int i=0;i<vertices.length;i+=2){
        if (i==0){
            if (Intersector.intersectSegmentCircle(vec1.set(vertices[vertices.length - 2], vertices[vertices.length - 1]),
                    vec2.set(vertices[i], vertices[i + 1]), center, squareRadius))
                return true;
        } else {
            if (Intersector.intersectSegmentCircle(vec1.set(vertices[i-2], vertices[i-1]), vec2.set(vertices[i], vertices[i+1]), center, squareRadius))
                return true;
        }
    }
    return polygon.contains(circle.x, circle.y);
}
PolygonUtil公共类{
静态最终矢量2中心=新矢量2();
静态最终向量2 vec1=新向量2();
静态最终向量2 vec2=新向量2();
公共静态布尔重叠(多边形、圆){
float[]顶点=多边形。getTransformedAdverties();
中心设置(圆x,圆y);
浮点平方半径=圆。半径*圆。半径;

对于(int i=0;我将此代码用于多段线而不是多边形?抱歉,不知道,因为我在2年前提出了此问题/答案=/我检查了此代码。是的,这是两种变体的工作代码。多边形和多段线啊好的,当时我只需要检查外部碰撞,所以我不知道。感谢更新;)这需要进入libgdx。只需确保不要在方法中创建新的向量,否则使用的内存将快速膨胀。使用类似于
tmpVector2的内容。设置(x,y)
代替
new Vector2(x,y)
(其中
tmpVector2
是一个字段)。