I use the following code to triangulate Voronoi areas:
EarClippingTriangulator triangulator = new EarClippingTriangulator();
ConvexHull hull = new ConvexHull();
final FloatArray rawPoints = voronoiArea.getPoints(factor, factor); // This will get a set of points in no particular order
final FloatArray hullArray = hull.computePolygon(rawPoints, false); // To avoid concave polygons
final Polygon polygon = new Polygon(hullArray.toArray());
final PolygonRegion region = new PolygonRegion(texture, polygon.getVertices(),
triangulator.computeTriangles(polygon.getVertices()).toArray());
final PolygonSprite sprite = new PolygonSprite(region);
This works fine in 95% of the time, but now and then I get invalid polygons - when rendering they appear as regular polygons with 1-2 triangles 'missing'.
Has anyone else had this problem? Can anyone spot a problem with this code?
Edit: Resulting image:
EDIT:
I have done some more testing - I now have a single polygon defined with 10 vertices, and the polygon still renders incorrectly.
The code:
points = new float[] {
34.983868f, 31.306454f, 27.999998f, 40.285713f,
28.0f, 40.285713f, 28.0f, 54.0f,
34.98387f, 31.306452f, 54.0f, 32.76923f,
28.0f, 54.0f, 54.0f, 54.0f,
54.0f, 54.0f, 54.0f, 32.76923f
};
net.dermetfan.utils.math.GeometryUtils.arrangeConvexPolygon(points, true);
for (int i = 0; i < points.length; i++) {
points[i]*=10f;
}
final Polygon p = new Polygon(points);
final float posX = voronoiArea.getCenter().x;
final float posY = voronoiArea.getCenter().y;
p.setOrigin(posX, posY);
final short[] triangles = triangulator.computeTriangles(p.getVertices()).toArray();
final PolygonRegion region = new PolygonRegion(fill[voronoiArea.site.getSiteNum() % 3], p.getVertices(), triangles);
Looking at it now I can see that there are several vertices that are very close to each other - 27.999998f and 28.0f for example - this makes me suspect that the whole problem is because of some rounding errors somewhere...