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

11.05.2015, 08:09

Überlappung Linie/Polygon feststellen?

Hi,

folgendes Problem (alles 2D, also alles in einer Ebene): Ich habe ein geschlossenes Polygon sowie eine einzelne Linie (geometrisch korrekt eine Strecke, keine Gerade). Ich möchte jetzt herausfinden, ob diese Linie komplett innerhalb des Polygons liegt, oder in Teilen außerhalb.

Ich könnte jetzt einfach für alle Seiten des Polygons überprüfen, ob die Linie diese schneidet. Diese Lösung gefällt mir aber aus zwei Gründen nicht:
1. erscheint mir diese Variante sehr aufwändig und daher langsam
2. beginnt und endet die Linie immer auf einer Linie des Polygons, d.h. dieser Algorithmus würde in jedem Fall immer Treffer bringen

Deswegen meine Frage: gibt es für dieses Problem irgend eine schnellere Lösung?

Danke!

2

11.05.2015, 08:14

Ist das polygon konkav oder konvex?

3

11.05.2015, 10:52

Beides ist möglich, lediglich wenn sich Linien des Polygons kreuzen, sind undefinierte Ergebnisse erlaubt.

4

11.05.2015, 11:00

Dann wirst du über diese Methode der Schnittpunkt Berechnung nicht herum kommen.
Was das Ganze aber noch ein wenig vereinfacht ist folgendes:

Wenn man sich das Polygon betrachtet und alle Punkte im Uhrzeigersinn zu Strecken zusammen setzt, dann kann man prüfen, ob beide Punkte der zu prüfenden Strecke rechts von der Strecke des Polygons sind. Zusätzlich kann man noch prüfen, ob einer der beiden Punkte der Strecke auf der Strecke des Polygons sitz.
Wenn die beiden Punkte rechts von allen Strecken sind (oder auf der Strecke), dann ist die Strecke innerhalb des Polygons.
Bei konkaven Polygonen wird das schwieriger, da hier tatsächlich geprüft werden muss, ob eine der Teilstrecken geschnitten wird.
Allerdings gleiche Vorgehensweise.
Zuerst checken ob Punkte rechts oder darauf und dann noch prüfen ob sie vollständig geschnitten oder nicht.

Um viele unmögliche Fälle auszuschließen, kannst du dir das bounding Rect des Polygons erstellen und erstmal schauen ob überhaupt beide Punkte innerhalb des Rechtecks liegen.

5

11.05.2015, 12:13

Um viele unmögliche Fälle auszuschließen, kannst du dir das bounding Rect des Polygons erstellen und erstmal schauen ob überhaupt beide Punkte innerhalb des Rechtecks liegen.


Das ist doch mal eine coole Idee :-) Danke!

6

12.05.2015, 10:19

OK, der oben angepsrochene Algorithmus funktioniert für diesen Sonderfall nicht:


(Link)


Das Polygon ist in rot dargestellt. Die blaue Linie ist eine zulässige Linie, die grüne Linie liegt außerhalb des Polygons und ist damit nicht zulässig/soll von dem Algorithmus herausgefunden werden. Beide haben genau zwei Schnittpunkte mit dem Polygon (jeweils an dessen Kanten). Wie kann ich nun für die grüne Linie herausfinden, dass diese außerhalb liegt?

Danke!

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

7

15.05.2015, 05:46

Zusätzliche Informationen über den konkreten Anwendungsfall könnten dabei helfen, eine einfachere Lösung zu finden. Woher kommen die Polygone und Linien, und was stellen diese dar? Sind die Linien der Polygone immer waagerecht und senkrecht oder ist das in dem skizzierten Bild nur zufälligerweise so?

Für konvexe Polygone wäre die Ermittlung relativ einfach: man prüft für beide Punkte der Linie, ob diese rechts oder links von jeder Kante des Polygons liegen (abhängig davon, ob diese im oder gegen den Uhrzeigersinn betrachtet werden).
Hat man mehrere Konvexe Polygone, müssen beide Punkte in irgendwelchen der Polygone liegen und weiterhin darf die Linie sich nur mit Polygonkanten schneiden, die von 2 der Polygone geteilt werden.
Ein Konkaves Polygon kann man durchaus in mehrere Konvexe Polygone aufteilen und die obere Prüfung durchführen. Wie aber bereits geschrieben kann es sein, dass sich das Problem noch einfacher lösen lassen könnte, sollte es für die Polygone oder Linien noch weitere Einschränkungen geben.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

15.05.2015, 08:43

Dieses Problem ist doch nun wirklich ein alter Hut, zu dem man haufenweise Lösungen im Netz findet. Eine kurze Suche bringt einen beispielsweise dorthin: http://stackoverflow.com/questions/44978…-convex-polygon

9

18.05.2015, 09:25

Zusätzliche Informationen über den konkreten Anwendungsfall könnten dabei helfen, eine einfachere Lösung zu finden. Woher kommen die Polygone und Linien, und was stellen diese dar? Sind die Linien der Polygone immer waagerecht und senkrecht oder ist das in dem skizzierten Bild nur zufälligerweise so?


Es geht hier um eine Art CAD-Programm, in dem der Benutzer ein beliebiges Polygon zeichnen kann. Prinzipiell kann das Polygon auch die Outline eines Textes/Buchstabens sein, es sind also konkave und konvexe Polygone möglich als auch Polygonkanten in beliebigen Winkeln. Dann kann der Benutzer festlegen, dass dieses Polygon mit weiteren Linien (ebenfalls in einem beliebigen Winkel) gefüllt wird. Das Füllen mit einzelnen Linien ins kein Problem, aber es gibt auch einen Modus, bei dem die Enden dieser Linien untereinander verbunden sind - dann kann es aber an eben so einer Ecke wie im Bild gezeigt passieren, dass diese zusätzliche Verbindungslinie außerhalb des Polygons liegt.

Zitat

Dieses Problem ist doch nun wirklich ein alter Hut, zu dem man haufenweise Lösungen im Netz findet. Eine kurze Suche bringt einen beispielsweise dorthin: http://stackoverflow.com/questions/44978…-convex-polygon


Mag sein, dass ich was übersehen habe, aber auf mein Problem wird da drin doch gar nicht eingegangen!?

Werbeanzeige