2014-01-08 11 views
5

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:

enter image description here

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) enter image description here

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.

+0

GL_TRIANGLE_FAN kann nur [* konvexe * Polygone] zuverlässig zeichnen (http://en.wikipedia.org/wiki/Convex_and_concave_polygons) . – user2864740

Antwort

-3

Keine gute Antwort, aber könnte Ihnen helfen, zu einem Ergebnis zu kommen, einen Blick auf konvexe Hülle Generation nehmen: - http://docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/hull/hull.html

+2

Scheint nicht sofort mit dem Zeichnen von komplexen konkaven Polygonen verwandt. – user2864740

+0

Eine konvexe Hülle ist ein konkaves Polygon, nur gedacht, dass es dich auf den richtigen Weg schicken könnte :) – BenjaminFranklin

+0

Alles klar, ist das irgendwie kombinierbar mit OpenGL? –

2

Da Sie über OpenGL ES sprechen, es ist viel das gleiche wie das iOS Problem hier: OpenGL ES - How to Draw a filled Polygon?

Im obigen Beitrag habe ich 5 Triangulationsbibliotheken von Drittanbietern aufgelistet und getestet, aber keine davon ist befriedigend.

Zum Schluss:

  1. OpenGL ES nicht Triangulation hat, also nicht Zeichnung unterstützt gefüllt konkaven Polygon (nicht Polygon mit Löchern zu erwähnen ...)
  2. auf OpenGL ES Zeichnung zu kleben, Sie müssen ein 3rd-Party lib für die Triangulation finden
  3. Verwenden graphics.Paint (Android)/Core Graphics (iOS) (was nicht einfach ... ist) gefüllt Weg zu zeichnen, aber die Leistung ist niedrig

Ich habe b Sie suchen lange nach einer leichten und freien Triangulationsbibliothek, aber ...

Verwandte Themen