Puzzlespiel: Abschneiden nicht konvexer Polygone auf den Figuren

7

Ich habe eine Originalfigur in der SVG-Datei. Ich muss es zufällig auf Teile aufteilen, von denen ein Beispiel unten angegeben ist:
Beispielbild
Ich habe eine Idee, die zum Partitionieren des Voronoi-Diagramms (Fortunes Algorithmus) verwendet werden soll. Kann ich dann die Schnittlinie von Figuren ändern, um ihnen eine Krümmung zu geben? Kann erhalten werden, um jede Form als Pfad zu identifizieren? Um ein Spiel zu erstellen, verwende ich cocos2d-x.

Verrücktes D0G
quelle

Antworten:

2

Ich denke, Sie haben die richtige Idee, aber die Ausführung wird eine enorme Herausforderung sein. Ich nehme an, wenn Sie "in einer SVG-Datei" sagen, meinen Sie, dass die Form durch einen (oder mehrere - Ihre Beispielfigur hat ein internes Loch!) Strichpfade definiert wird. Leider können SVG-Pfade mit quadratischen und kubischen Bezier-Kurven und elliptischen Bogensegmenten bemerkenswert kompliziert sein. Der Schnittpunkt einer Linie mit einem dieser Punkte ist ein gelöstes, aber höchst nicht triviales Problem, und selbst die Neuparametrisierung von Bezier-Kurven, um sie am Schnittpunkt in zwei Teile zu teilen, ist ein wenig schwierig - im Grunde genommen was Sie suchen ist komplex genug, um ein kleines Buch zur Beantwortung zu nehmen, keinen Forumsbeitrag! Das heißt, es gibt mehrere ausgezeichnete Referenzen da draußen; der kurze kurzDie Version der Antwort lautet, dass Sie die rekursive Unterteilung zusammen mit der sogenannten "Variationsverringerung" -Eigenschaft der Bezier-Kurve (im Wesentlichen der Eigenschaft, dass eine Bezier-Kurve in der konvexen Hülle ihrer Kontrollpunkte enthalten ist) verwenden möchten, um sie einzugrenzen die möglichen Positionen einer Kreuzung (und beachten Sie, dass eine Linie mehrere Schnittpunkte haben kann, und dies ist ein weiterer Sonderfall, den Sie möglicherweise berücksichtigen müssen). Und wenn Sie das Kreuzungsproblem gelöst haben, haben Sie noch einen langen Weg vor sich - Sie müssen eine Menge Buchhaltung erledigen, um Kurven- und Liniensegmente im Auge zu behalten und sie korrekt in Teile zu unterteilen. Dies soll Sie überhaupt nicht entmutigen; Sei dir nur der Größe dessen bewusst, was du versuchst zu tun!

Glücklicherweise Ihre andere Frage: "Kann ich die Schnittlinie von Figuren ändern, um ihnen eine Krümmung zu geben?" - hat eine einfachere Antwort: absolut. Da Sie sich bereits im SVG-Land befinden, würde ich auch hier Bezier-Kurven verwenden: Wählen Sie zunächst fünf Punkte p1..p5 entlang des Liniensegments aus, das Sie "auskrümmen" möchten, wahrscheinlich etwas zufällig in ungefähr gleichmäßigen Abständen ;; Verschieben Sie sie dann um einen kleinen zufälligen Abstand von der Linie und verwenden Sie sie als Kontrollpunkte für zwei separate Bezier-Kurven, wobei eine die Punkte p0, p1, p2, p3 und die andere die Punkte p3, p4, p5 und p6 verwendet (wobei p0) und p6 sind hier die beiden Endpunkte des ursprünglichen Liniensegments). Sie können auch hier die Konvex-Rumpf-Eigenschaft der Bezier-Kurve nutzen und sicherstellen, dass Ihre verschobenen Punkte nicht angezeigt werden. t zu weit verschieben, sodass die beiden Bereiche zu beiden Seiten der Kurve (n) immer noch einfache Bereiche sind. Dies sollte Ihnen die Art von gekrümmter Grenze geben, nach der Sie suchen.

Steven Stadnicki
quelle
Danke für die Antwort. Ich habe mich für die Verwendung der SVG-Datei entschieden, da SVG-Bilder und ihr Verhalten in XML-Textdateien definiert sind und ich die Abbildung möglicherweise anhand der internen Informationen der Abbildung aufteilen kann. Ich vermute, dass dies nicht die beste Lösung ist, aber dieser Wissensbereich ist für mich neu. Wie wird die Lösung vereinfacht, wenn ich die SVG-Datei durch eine andere ersetze? Vielleicht kennen Sie andere Möglichkeiten, um nicht konvexe Formen mit seitlichen Kurven zu unterteilen?
Crazy D0G
Ich denke, SVG ist als Format in Ordnung - wie Sie bemerken, ist es ein gut definiertes Textformat, das einfach analysiert werden kann. SVG macht das Problem nicht schwierig - es sind die Kernprobleme bei der Arbeit mit Splines und dergleichen. Ich glaube jedoch nicht, dass ein anderes Format Zahlen wie das in Ihrem Beispiel präzise genug ausdrücken kann. Es ist nur ein von Natur aus herausforderndes Problem.
Steven Stadnicki
... das heißt, es ist nicht unüberwindbar; Es ist sogar relativ einfach (obwohl es viele kleine Details gibt, über die man sich Sorgen machen muss). Sie müssen nur eine gute Bezier-Bibliothek erstellen (oder finden). Das einzige Problem, das nicht angesprochen wurde und das vielleicht etwas schwierig ist, ist die Auswahl der Punkte in Ihrer Figur, aus denen das Vornoi-Diagramm erstellt werden soll.
Steven Stadnicki
Die Platzierung von Punkten kann zufällig erfolgen, so dass sie in den Bereich der Figur fallen, oder es können mehrere Linien angegeben und ein zufälliger Punkt darauf gesetzt werden.
Crazy D0G