Ich erstelle eine 2D-Openstreetmap-Rendering-Anwendung für Android mit OpenGL ES.Android OpenGL ES - Wie zeichne ein gefülltes konkaves Polygon?
Leider mit Zeichnung konkav Polygonen Ich kämpfe aus etwa 50 oder mehr Punkten. Um zu erreichen, dass mein Polygone gefüllt ist, verwende ich GL10.GL_TRIANGLE_FAN:
gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertBuff); // size = 2 because 2D
gl.glDrawElements(GL10.GL_TRIANGLE_FAN, pointCount, GL10.GL_UNSIGNED_SHORT, indexBuff);
Dieser Ansatz funktioniert gut, solange meine Polygone, zum Beispiel Zeichnen eines Polygons nicht zu komplex ist, wie dies kein Problem ist, überhaupt:
Mein Problem ist, dass GL_TRIANGLE_FAN immer am ersten Punkt beginnt (a in diesem Fall) und verwendet dann zwei weitere Punkte ein Dreieck zu zeichnen, bis die ganze Form abgeschlossen ist.
Wenn ein komplexeres Polygon gezeichnet wird, kann dies zu Problemen führt, wie Sie hier sehen können: (in diesem Beispiel der Fluss, der durch die Stadt fließt, ist ein komplexer Polygon)
Meine Frage ist jetzt, wie man dieses Problem vermeidet, so dass selbst komplexe Polygone korrekt gezeichnet und ausgefüllt werden?
Das Problem liegt in der Zeichnung von konkaven Polygonen.
Bei Verwendung von GL_TRIANGLE_STRIP anstelle von GL_TRIANGLE_FAN werden die Polygone korrekt gezeichnet, aber nur ihre Punkte sind durch Dreiecke miteinander verbunden, das Polygon selbst ist nicht gefüllt.
GL_TRIANGLE_FAN kann nur [* konvexe * Polygone] zuverlässig zeichnen (http://en.wikipedia.org/wiki/Convex_and_concave_polygons) . – user2864740