将 Java.awt.Polygon 转换为 LibGDX 多边形时出现 OutOfBoundsException

问题描述 投票:0回答:1

简介

我一直在尝试使用 LibGDX 的 ShapeRenderer 绘制填充多边形,方法是将 Java.awt.Polygon 转换为浮点数组,然后将它们传递到 ShapeRenderer 的 Polygon(float[]) 方法中。我注意到,对于具有大量 n 点(在本例中为 4370)的多边形,我不断收到 IndexOutOfBoundsException。对于较小尺寸的多边形,不会发生这种情况。

在这里,我迭代具有自己的多边形的省份对象,从中收集 x、y 和 n 点并创建一个浮点数组。

for (Province p : map.getProvinces()) { shapeRenderer.setColor(p.getColor());
    // Convert the Polygon's vertices to a float array
    int[] xpoints = p.getPolygon().xpoints;
    int[] ypoints = p.getPolygon().ypoints;
    float[] verticesArray = new float[p.getPolygon().npoints * 2];
    
    for (int i = 0; i < p.getPolygon().npoints; i++) {
        verticesArray[i * 2] = xpoints[i];
        verticesArray[i * 2 + 1] = ypoints[i];
    }
    
    shapeRenderer.polygon(verticesArray); //IndexOutOfBoundsException: tried accessing index 20003 but bound is 20000
}

我尝试过的事情

我一直在使用打印语句来查看我到底传递到多边形方法中的内容:

Npoints: 550
Xpoints: [3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049, 3050,... etc]
Ypoints: [1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068, 1068,... etc]
id: 1
rgb: -32769

Npoints: 449
Xpoints:[...etc]
Ypoints:[...etc]
id: 2
rgb: -49153

Npoints: 515
Xpoints:[...etc]
Ypoints:[...etc]
id: 3
rgb: -16385

Npoints: 4370
Xpoints:[...etc]
Ypoints:[...etc]
id: 4
rgb: -1

// Exception 

正如前面提到的,这里唯一值得注意的事情(至少对我来说)是最后一个多边形的大量 N 点,导致了我在简介中的描述。我实际上不确定这是否是问题的原因,或者是否完全无关。

我决定深入挖掘并查看调用堆栈。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 20003 out of bounds for length 20000
    at com.badlogic.gdx.graphics.glutils.ImmediateModeRenderer20.color(ImmediateModeRenderer20.java:121)
    at com.badlogic.gdx.graphics.glutils.ShapeRenderer.polygon(ShapeRenderer.java:1132)
    at com.badlogic.gdx.graphics.glutils.ShapeRenderer.polygon(ShapeRenderer.java:1141)
    at com.mygdx.game.Actor.draw(Actor.java:66)

然后我决定查看 ImmediateModeRenderer20.java 的第 121 行,我发现:

public void color (float colorBits) {
     vertices[vertexIdx + colorOffset] = colorBits;
}

然后我通过删除“+ colorOffset”来修改此源代码,因为我认为这个值可能是 3 (20000 + 3)。不,同样的错误。

我想一个更普遍的问题是,如何转换java多边形以便可以用LibGDX绘制它们,因为也许我错误地处理了这个问题。

java libgdx indexoutofboundsexception
1个回答
0
投票

事实证明,我传递的浮点数组没有问题。 Shaperenderer 使用默认顶点值 5000 初始化 ImmediateModeRenderer20 实例。此时,我注意到 Shaperenderer 有替代构造函数,带有手动设置限制的参数。我刚刚做了

Shaperenderer sr = new Shaperenderer(10000000) 

这解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.