我一直在尝试使用 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绘制它们,因为也许我错误地处理了这个问题。
事实证明,我传递的浮点数组没有问题。 Shaperenderer 使用默认顶点值 5000 初始化 ImmediateModeRenderer20 实例。此时,我注意到 Shaperenderer 有替代构造函数,带有手动设置限制的参数。我刚刚做了
Shaperenderer sr = new Shaperenderer(10000000)
这解决了问题。