Frage

Ich habe seit Tagen das Internet durchsucht, konnte aber keine gute Antwort finden (oder zumindest eine, die für mich Sinn machte) auf das, was es scheinbar eine gemeinsame Frage sein sollte. Wie skaliert ein willkürliches Polygon? Insbesondere konkave Polygone. Ich brauche einen Algorithmus, der konkave (definitiv) und selbstinsektierende (wenn möglich) Polygone verarbeiten kann. Der offensichtliche und einfache Algorithmus, den ich verwendet habe, um einfache konvexe Polygone zu verarbeiten, ist die Berechnung des Zentroids des Polygons, übersetzt diesen Schwerpunkt in den Ursprung, die Skalierung aller Scheitelpunkte und die Übersetzung des Polygons an seinen ursprünglichen Ort.

Dieser Ansatz funktioniert nicht für viele (oder vielleicht alle) konkaven Polygone, da der Schwerpunkt häufig außerhalb des Polygons fällt, sodass der Skalierungsbetrieb auch zu einer Übersetzung führt und ich das Polygon ohne das Endergebnis skalieren kann übersetzt werden.

Kennt man sich einer Methode zur Skalierung konkaver Polygone? Oder vielleicht eine Möglichkeit, das "visuelle Zentrum" zu finden, das als Referenzrahmen für den Skalierungsoperation verwendet werden kann?

Nur um zu klären, ich arbeite im 2D -Raum und möchte meine Polygone mithilfe des "visuellen Zentrums" als Referenzrahmen skalieren. Vielleicht wäre es also eine andere Möglichkeit, die Frage zu stellen, wie ich das visuelle Zentrum eines konkaven und/oder selbstinsektierenden Polygons finde?

Vielen Dank!

War es hilfreich?

Lösung

Der Grund, warum Sie keine gute Antwort finden können, ist, dass Sie mit Ihren Anforderungen ungenau sind. Definieren Sie zuerst explizit, was Sie unter "In-Place" meinen. Was wird konstant gehalten?

Sobald Sie das herausgefunden haben, übersetzen Sie den konstanten Punkt in den Ursprung, skalieren Sie das Polygon wie gewohnt und übersetzen Sie zurück.

Andere Tipps

Ich bin mir nicht sicher, was Ihr Problem ist.

Sie arbeiten in einem affinen Raum und suchen nach einer affine Transformation, um Ihr Polygon zu skalieren?

Wenn ich Recht habe, schreiben Sie einfach die Transformationsmatrix:

Und verwandeln Sie Ihr Polygon mit Matrix

Sie können nach affine Transformationsmatrix nachschlagen.

ich hoffe es hilft


BEARBEITEN

Wenn Sie dasselbe "Zentrum" behalten möchten, können Sie einfach eine Homotethy Parameter Lambda mit Mitte G = Barycenter des Polygons durchführen:

Es überprüft:
enter image description here

G wird sich nicht bewegen, da es das Zentrum der Homotethy ist.

Es wird weiterhin die folgende Beziehung überprüfen, sodass es immer noch das Barycenter sein wird. (Sie multiplizieren nur die Beziehung mit Lambda)

In Ihrem Fall ist G leicht zu bestimmen: g (x, y): (Durchschnitt der X -Werte von Punkten, Durchschnitt der Y -Werte von Punkten))

Und es sollte tun, was Sie brauchen

Vielleicht sucht Craig nach einem "Polygon -Offset" -Algorithmus - wobei jede Kante im Polygon durch einen bestimmten Wert ausgeglichen wird. Beispielsweise erhöht bei einem im Uhrzeigersinn orientierten Polygon die Aussetztkanten nach links die Größe des Polygons. Wenn dies das ist, wonach Craig sucht, wurde dies vorher gefragt und beantwortet - Ein Algorithmus zum Aufblasen/Entleeren (Versatz, Pufferung) Polygone.

Wenn Sie auf der Suche nach einer fertigen (OpenSource Freeware) -Lösung suchen, habe ich auch eine Clipping -Bibliothek erstellt (Clipper) Geschrieben in Delphi, C ++ und C#, das eine ziemlich einfache Polygon -Offs -Funktion enthält.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top