2016-06-29 9 views
0

Ich versuche, Solid-Color-Logikgatter für einen schematischen Designgenerator mit libGDX zu zeichnen. OR-Tore sind aufgrund ihrer unregelmäßigen Form besonders schwierig. Ich habe großen Erfolg beim Zeichnen dieser Tore mit der ShapeRenderer.curve Funktion, aber das kann nur Linien zeichnen, nicht ausgefüllt. Ich versuche, mit arcs zu zeichnen, aber das Endergebnis ist zu rund. Irgendwelche Vorschläge?Zeichnen von Logikgattern in libGDX

Antwort

0

Ich habe mit Pixmaps (im Gegensatz zu ShapeRenderer) zum Zeichnen von benutzerdefinierten Formen mit großem Erfolg gearbeitet. Leider ist es ein komplizierter Prozess, aber es bietet viel Flexibilität, um beliebige Formen zeichnen zu können.

Wenn Sie mit dem Zeichenstift-Werkzeug in Photoshop vertraut sind (Zeichnen von Kurven mit Kontrollpunkten), funktioniert die BSpline-Klasse in LibGDX auf die gleiche Weise. In meiner Frage habe ich einen Beispielcode zur Verfügung gestellt, der eine einfache Kurve mit BSpline zeichnet.

BSpline derivativeAt() method does not return correct value

Dann, wenn Sie Ihre vollständige Form gezeichnet haben, können Sie einen ‚flood fill‘ Algorithmus in der Form zu füllen, verwenden. Grundsätzlich wählen Sie einen Punkt, der sich irgendwo in der Mitte der Form befindet, und dann verwendet der Algorithmus die Rekursion, um nach außen zu füllen, bis er den Rand der Form erreicht. Hier ist mein Flood-Füllcode, den ich aus meiner größeren Klasse entfernte, nicht verwandten Code herausholte und alles in eine Methode packte. Dieser isolierte Code ist ungetestet und hoffentlich habe ich ihn dabei nicht gebrochen ... aber das sollte die Idee ergeben, wie es gemacht wird.

public void floodFillShape(Pixmap shapePixmap, int x, int y){ 
    Array<Vector2> queue = new Array<Vector2>(Vector2.class); 
    Color tempColor = new Color(); 
    Vector2 point; 
    queue.add(new Vector2(x, y)); 

    while (queue.size > 0){ 
     point = queue.pop(); 

     if (tempColor.set(shapePixmap.getPixel((int)point.x, (int)point.y)).a == 0){     
      shapePixmap.drawPixel((int)point.x, (int)point.y);    
      queue.add(new Vector2((int)point.x+1, (int)point.y)); 
      queue.add(new Vector2((int)point.x-1, (int)point.y)); 
      queue.add(new Vector2((int)point.x, (int)point.y+1)); 
      queue.add(new Vector2((int)point.x, (int)point.y-1)); 
     } 
    } 
} 
+0

Wow, danke! Ich habe mit dem Code gearbeitet, den Sie in der BSpline-Frage angegeben haben, und mir ist nicht klar, was der für BSpline.set erforderliche Grad ist. Ich bin vertraut mit dem Zeichnen von Kurven in diesem Stil (ShapeRenderer.curve tut es ziemlich ähnlich). Ich habe eingerichtet, was ich denke, sollte funktionieren, basierend auf Ihrem Beispiel, aber die BSpline scheint nicht Pixel richtig zu zeichnen. Die von Ihnen bereitgestellte Schleife scheint zu funktionieren, da bei der fehlerhaften anfänglichen Pfadzeichnung die Schleife unendlich weiterging. Sollte es dann nicht wieder aufhören, wenn es zu jedem Pixel in der Pixmap zieht? – Pheonix

+0

LibGDX BSpline funktioniert zur Zeit nur mit Grad 3. Die Änderung des Grades ändert die mathematischen Gleichungen, die zur Erstellung der Kurve verwendet wurden und nur die Gleichungen für Grad 3 wurden bisher in BSpline implementiert. Die Definition für Grad "n" bedeutet, dass es "n + 1" Kontrollpunkte für jede Bezier-Kurve gibt (da BSpline mehrere miteinander verknüpfte Bezier-Kurven sind). Für Grad 3 hat jede Kurve 4 Kontrollpunkte (2 Endpunkte und 2, die die Kurve biegen). Wenn die Flutfüllschleife unbegrenzt läuft, muss eine Lücke in der Form vorhanden sein. Versuchen Sie, die Form ohne die Flutfüllung zu zeichnen, sehen Sie Lücken darin? – Tekkerue

+0

Danke nochmal! Meine Gruppe muss sich zu diesem Zeitpunkt auf andere Funktionen konzentrieren, also muss ich dies jetzt auf Eis legen. – Pheonix