Libgdx多边形三角剖分

Libgdx多边形三角剖分,libgdx,polygon,triangulation,convex,concave,Libgdx,Polygon,Triangulation,Convex,Concave,好的,我有一个多边形(简单但凹面),我试图将其切割成三角形,使其与另一个多边形碰撞 我知道我的polygone是凹面的,所以我决定用LibGDX耳剪三角板将它切割成三角形 通过这段代码,我得到了三角形的顶点: public void triangulate() { 向量三角形顶点=新向量(); ShortArray pointsCoords=新的ShortArray(); EarClippingTriangulator三角剖分器=新的EarClippingTriangulator(); //切成

好的,我有一个多边形(简单但凹面),我试图将其切割成三角形,使其与另一个多边形碰撞

我知道我的polygone是凹面的,所以我决定用LibGDX耳剪三角板将它切割成三角形

通过这段代码,我得到了三角形的顶点:

public void triangulate()
{
向量三角形顶点=新向量();
ShortArray pointsCoords=新的ShortArray();
EarClippingTriangulator三角剖分器=新的EarClippingTriangulator();
//切成三角形
pointsCoords=triangulator.computeTriangles(this.getTransformerAdverties());
//做三角形
对于(int i=0;i
但当我试着画我刚画的三角形时, 他们只是在0,0坐标上叠加。。 所有的三角形看起来几乎都一样,这正常吗?我的意思是它们都有相同的方向

对于libgdx的这种转换使用,我没有找到太多的信息 你能帮忙吗

(对不起我的英语我是法国人,对不起没有照片,我在这里太年轻了)

编辑:这是我的多边形(在CCW中)

hitbox.setVertices(新浮点[]{
这个.getX()+13,这个.getY()-60,
这个.getX()+16,这个.getY()-74,
这个.getX()+39,这个.getY()-74,
这个.getX()+45,这个.getY()-105,
这个.getX()+81,这个.getY()-105,
这个.getX()+88,这个.getY()-74,
这个.getX()+108,这个.getY()-74,
这个.getX()+114,这个.getY()-61,
this.getX()+106,this.getY()-30,//右上角
这个.getX()+101,这个.getY()-29,
这个.getX()+101,这个.getY()-57,
这个.getX()+83,这个.getY()-62,
这个.getX()+75,这个.getY()-50,
this.getX()+65,this.getY()-4,//顶部中间
this.getX()+62,this.getY()-4,//Top-mid
这个.getX()+52,这个.getY()-50,
这个.getX()+44,这个.getY()-62,
这个.getX()+25,这个.getY()-56,
这个.getX()+25,这个.getY()-30,
this.getX()+19,this.getY()-30,//左上角
});
EDIT2:现在我得到了足够的点来显示多边形


问题在于您的循环:

        // Make triangles
        for (int i = 0; i < pointsCoords.size / 6; i++)
        {
            trianglesVertices.add(new float[] {
                    pointsCoords.get(i), pointsCoords.get(i+1),
                    pointsCoords.get(i+2), pointsCoords.get(i+3),
                    pointsCoords.get(i+4), pointsCoords.get(i+5),
            });
            Polygon triangle = new Polygon(trianglesVertices.get(i));
            triangles.add(triangle);
        }

这里的问题是,
earcippingtriangulator.computeTriangles
返回的输出与您预期的不同。它返回一个索引数组,其中每个索引表示最初传入的数组中的一个顶点。因此,如果你传入一个大小为8的数组,它将代表4个顶点;返回的数组大小为6(三角形1为3个顶点,三角形2为3个顶点)

假设有一个2x3的矩形,左下角为(5,5)。您的顶点将是:

  • 顶点0:(5,5)
  • 顶点1:(7,5)
  • 顶点2:(7,10)
  • 顶点3:(5,10)
您可以将它们展平为一个数组,并将它们传递到
computeTriangles
中,如下所示:

[5,5,7,5,7,10,5,10]

返回的数组如下所示:

[0,3,2,2,1,0]

返回数组中三个索引的每个集合形成一个三角形。这些值中的每一个都表示传入数据中顶点的索引。在本例中,输出将告诉您使用以下顶点:

  • 三角形1:顶点0、顶点3、顶点2
  • 三角形2:顶点2、顶点1、顶点0
所以你需要画这些三角形:

  • 三角形1:(5,5)->(5,10)->(7,10)
  • 三角形2:(7,10)->(7,5)->(5,5)
请注意,这不一定是我提供的输入的实际输出,它只是一个示例,旨在说明如何使用返回的数据

下面是我最后使用的代码,它将正确地绘制
多边形
实例,尽管您可以对任何正确制定的顶点数组执行相同的操作:

private void drawFilledPolygon(Polygon polygon, Color color) {
    shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
    shapeRenderer.setColor(color);

    float[] vertices = polygon.getTransformedVertices();

    // NOTE: you probably don't want to create a new EarClippingTriangulator each frame
    ShortArray triangleIndices = new EarClippingTriangulator().computeTriangles(vertices);
    for (int i = 0; i < triangleIndices.size; i += 3) {
        shapeRenderer.triangle(
            vertices[triangleIndices.get(i) * 2], vertices[triangleIndices.get(i) * 2 + 1],
            vertices[triangleIndices.get(i + 1) * 2], vertices[triangleIndices.get(i + 1) * 2 + 1],
            vertices[triangleIndices.get(i + 2) * 2], vertices[triangleIndices.get(i + 2) * 2 + 1]
        );
    }

    shapeRenderer.end();
}
private void drawFilled多边形(多边形,颜色){
开始(shaperender.ShapeType.Filled);
设置颜色(颜色);
float[]顶点=多边形。getTransformedAdverties();
//注意:您可能不希望在每个帧中创建新的EarClippingTriangulator
ShortArray triangleIndices=新的EarClippingTriangulator().computeTriangles(顶点);
对于(int i=0;i
你能带上你有问题的多边形吗?我只是加了一个,事实上这是一个船坞你说得对,三角测量现在很好。唯一剩下的一个问题是它们的位置,我从多边形的变换顶点进行三角剖分,但三角形仍然在坐标0,0处,即使在平移之后是的,我最终没有使用耳剪裁三角剖分器。我自己把船切割成凸多边形,然后检查是否有碰撞。For exe
private void drawFilledPolygon(Polygon polygon, Color color) {
    shapeRenderer.begin(ShapeRenderer.ShapeType.Filled);
    shapeRenderer.setColor(color);

    float[] vertices = polygon.getTransformedVertices();

    // NOTE: you probably don't want to create a new EarClippingTriangulator each frame
    ShortArray triangleIndices = new EarClippingTriangulator().computeTriangles(vertices);
    for (int i = 0; i < triangleIndices.size; i += 3) {
        shapeRenderer.triangle(
            vertices[triangleIndices.get(i) * 2], vertices[triangleIndices.get(i) * 2 + 1],
            vertices[triangleIndices.get(i + 1) * 2], vertices[triangleIndices.get(i + 1) * 2 + 1],
            vertices[triangleIndices.get(i + 2) * 2], vertices[triangleIndices.get(i + 2) * 2 + 1]
        );
    }

    shapeRenderer.end();
}