Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

08.06.2015, 14:29

Kontur eines Polygons nachzeichnen/verkleinern

Hallo,

ich habe ein 2D-Polygon, dessen Kontur ich innen nachzeichnen will. Der Abstand "L" der neuen Linien des inneren Polygons zu den Ursprungslinien des äußeren Polygons ist dabei fix. Das sieht dann z.B. so aus (sorry für die Qualität, ich habe es versehentlich als JPG gespeichert):


(Link)


Das mache ich derzeit so, dass ich anhand der Winkel zwischen den Linien ermittele, wo "innen" ist, dann die einzelnen Linien dupliziere und um die Entfernung "L" nach innen verschiebe. Anschließend ermittele ich, wo sich benachbarte Linien kreuzen - dass muss deren neue gemeinsame Koordinate sein (sprich eine Ecke des inneren Polygons). Der Vorteil dieser Methode: ich muss mich nicht drum kümmern, ob die inneren Linien kürzer oder länger werden, deren Kreuzungspunkt legt die Länge der Linien implizit fest.

Der Nachteil: es gibt irgendwann Stellen, an denen so eine Linie komplett verschwinden würde und sich statt dessen nur noch ihre beiden benachbarten Linien kreuzen (so wie im oberen Bild beim innersten Polygon, dort tritt das Problem ganz links oben in der Ecke auf und führt dort zu einem falschen Ergebnis).

Mein Problem jetzt: wie ermittele ich, ob eine Linie nicht mehr existiert und ich statt dessen den Schnittpunkt ihrer Nachbarlinien verwenden muss?

Danke :-)

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

08.06.2015, 14:46

Ein Ansatz wäre, sich die Positionen der Streckenendpunkte zu merken und nach der Transformation zu überprüfen, ob Punkt A' auf einmal links von B' liegt, obwohl A rechts von B lag (selbes Prinzip für y-Achse). In dem Fall kann man dann den Schnittpunkt berechnen.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

08.06.2015, 14:46

Wenn sich ihre Laufrichtung ändert. Sprich per Normale im Eckpunkt z.B. Die ändert in Z dabei ihr Vorzeichen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

08.06.2015, 14:53

Sprich per Normale im Eckpunkt z.B. Die ändert in Z dabei ihr Vorzeichen.


Hm, klingt gut aber ich verstehe es nicht. Momentan habe ich nur 2D Koordinaten. Da könnte ich jetzt zwar jeweils ein Z=0 dazuzaubern - aber was bringt mir das? Wie kriege ich da eine Drehrichtung raus?

Danke!

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

08.06.2015, 14:57

Du hast Eckpunkte. Diese Eckpunkte haben eine Laufrichtung. Zum Beispiel ist das Polygon im Urzeigersinn definiert. Kommt es zu Deinem Problemfall, so ändert sich die Richtung. Eben z.B. gegen den Uhrzeigersinn. Mit einem Kreusprodukt ließe sich das z.B. bestimmen (eben über die im Kreuzprodukt entstehende Z-Richtung). Selbst wenn Du Z auf Null setzt (weil ja kein Z da ist), hast Du nach dem Kreuzprodukt ein Z. Eben positiv oder negativ.

Alternativ kannst Du einen Polygonmittelpunkt bestimmen und dann die Winkel zwischen zwei Punkten berechnen. Die Vorzeichen des Normalfalls und des Problemfalls werden sich hier ebenfalls unterscheiden - geht vermutlich nicht mit jedem Polygon in jedem Fall. Ist es konvex, geht's aber immer.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (08.06.2015, 15:03)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

08.06.2015, 15:22

Du solltest übrigens auch den Fall berücksichtigen, dass mehr als nur 1 Eckpunkt "verschwindet". Im schlimmsten Fall wird dein gesamtes Polygon durch das Verkleinern auf einen Punkt reduziert bzw. komplett ausgelöscht.

7

09.06.2015, 07:55

Es geht sogar noch schlimmer: bei bestimmten Polygonformen würde sich das innere Polygon irgendwann auch mal teilen und mehrere kleinere Polygone übrig bleiben...wie ich das machen soll, weiß ich auch noch nicht so recht :-/

8

09.06.2015, 08:12

Das Problem ist das selbe, was NC-Kerne lösen müssen, wenn die Werkzeugkorrektur eingeschaltet ist.
Vllt. Kann man den Algorithmus aus ner OpenSource CNC Software übernehmen.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

9

09.06.2015, 19:56

Wenn du etwas fertiges suchst:
Clipper sollte das können.

10

10.06.2015, 09:22

Wenn du etwas fertiges suchst:
Clipper sollte das können.


Tatsächlich, da versteckt sich auch eine Funktion ClipperOffset, die das richtig gut macht! Danke für den Tipp, da kann ich mein eigenes Geschreibsel echt in die Tonne kloppen :-)

Werbeanzeige