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
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));
}
}
}
- 1. Zeichnen von Formen nach Pixel in libgdx
- 2. Wie zu zeichnen Kreise libgdx
- 3. Gewölbtes benutzerdefiniertes Objekt in LIBGDX zeichnen?
- 4. Durch eine Sequenz von gruppierten Logikgattern gehen
- 5. Zeichnen schöne Linie mit programmatisch Libgdx
- 6. Zeichnen und Speichern eines Touchpfads eines Benutzers in libgdx
- 7. libGDX: Beste Möglichkeit, viele kleine Bilder in LibGDX für schnelles Zeichnen zu speichern
- 8. Zeichnen einer Gruppe über die andere in libgdx (gleiche Stufe)
- 9. DebugDrawing in libGDX
- 10. libgdx: Eine Textur beim Zeichnen mit Sprite-Batch drehen
- 11. Render Svg-Datei in LibGDX
- 12. Zeichnen Sie eine glatte Linie
- 13. Libgdx - maximale Sprites
- 14. Libgdx Hinzufügen von Sprites zum Array und Zeichnen sie zum Bildschirm
- 15. Anti-Aliasing gefüllte Formen in libgdx
- 16. Speicherauslastung in LibGdx
- 17. Pause TimeUtils in libgdx
- 18. LibGDX in Android-Aktivität
- 19. Code bei der Verwendung von Bildschirmen in Libgdx wiederverwenden
- 20. java Themen in libGDX
- 21. Libgdx mehrere Akteure in einer Tabellenzelle Bildlauffenster
- 22. LibGDX SpriteBatch Multitexture möglich?
- 23. Ausrichten von Text links in libgdx TextButton
- 24. Verwendung von getSpectrum() in Libgdx Bibliothek
- 25. Assets in Libgdx
- 26. richtige Handhabung von LibGDX AssetManager
- 27. Zeichnung Tabelle Grenzen in libgdx 0.9.7
- 28. LibGDX ShapeRenderer Kreiszeichnung
- 29. Zeichnen von Grafiken in Django
- 30. Zeichnen von Graphen in PHP
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
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
Danke nochmal! Meine Gruppe muss sich zu diesem Zeitpunkt auf andere Funktionen konzentrieren, also muss ich dies jetzt auf Eis legen. – Pheonix