Wie kann ich feststellen, ob ein 2D-Punkt innerhalb eines Polygons liegt?
Ich versuche zu schaffen, eine schnell 2D-Punkt in polygon-Algorithmus, für den Einsatz in hit-testing (z.B. Polygon.contains(p:Point)
). Vorschläge für effektive Techniken geschätzt werden.
InformationsquelleAutor der Frage Scott Evernden | 2008-10-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zur Grafik würde ich eher nicht bevorzugen, zahlen. Viele Systeme verwenden Ganzzahlen für die UI-Malerei (Pixel sind int-Werte, nachdem alle), aber macOS zum Beispiel nutzt float für alles. macOS kennt nur Punkte und einen Punkt übersetzen kann, um ein pixel, aber je nach monitor Auflösung, könnte es übersetzen, um etwas anderes. Auf retina-screens von einem halben Punkt (0.5/0.5) ist pixel. Trotzdem habe ich nie bemerkt, dass macOS UIs sind deutlich langsamer als andere UIs. Nachdem alle 3D-APIs (OpenGL oder Direct3D) funktioniert auch mit Schwimmern und moderne Grafik-Bibliotheken sehr oft nutzen die GPU-Beschleunigung.
Nun Sie sagte, die Geschwindigkeit ist Ihr Hauptanliegen, okay, let ' s go for speed. Vor dem ausführen einer ausgefeilten Algorithmus, der zuerst einen einfachen test. Erstellen Sie eine Achse ausgerichtet Begrenzungsrahmen um das polygon. Dies ist sehr einfach, schnell und kann bereits sicher, dass Sie eine Menge von Berechnungen. Wie funktioniert das? Iterieren über alle Punkte des Polygons und finden Sie die min/max Werte von X und Y.
E. g. Sie haben die Punkte
(9/1), (4/3), (2/7), (8/2), (3/6)
. Dies bedeutet Xmin 2 Xmax ist 9, Ymin 1 Ymax ist 7. Ein Punkt außerhalb des Rechtecks mit den zwei Kanten (2/1) und (9/7) nicht innerhalb des Polygons.Dies ist der erste test laufen für jeden Punkt. Wie Sie sehen können, dieser test ist ultra schnell, aber es ist auch sehr grob. Behandeln Punkte, die innerhalb der bounding-Rechteck, brauchen wir ein ausgefeilter Algorithmus. Es gibt ein paar Möglichkeiten, wie dieser berechnet werden kann. Die Methode funktioniert, hängt auch von der Tatsache, ob das polygon können Löcher oder immer solide. Hier sind Beispiele von festen, (einen konvexen, einen konkaven):
Und hier ist eine mit einem Loch:
Den grünen hat in der Mitte ein Loch!
Der einfachste Algorithmus kann mit allen drei oben genannten Fälle und ist immer noch ziemlich schnell ist benannt ray-casting. Die Idee des Algorithmus ist ziemlich einfach: Zeichnen Sie einen virtuellen Strahl von irgendwo außerhalb des Polygons zu Ihrem Punkt und zählen Sie, wie oft es schlägt in eine Seite des Polygons. Wenn die Anzahl der Treffer auch ist, es ist außerhalb des Polygons, wenn es seltsam ist, es ist von innen.
Den winding number Algorithmus wäre eine alternative, es ist genauer, für die Punkte sehr nahe in ein polygon-Linie, aber es ist auch viel langsamer. Ray-casting kann fehlschlagen, um die Punkte zu nah, um ein polygon Seite, wegen der begrenzten floating-point-Präzision und Rundung Probleme, aber in Wirklichkeit ist kaum ein problem, da liegt ein Punkt, der in der Nähe einer Seite, ist es oft optisch gar nicht möglich ist-für die Betrachter zu erkennen, wenn es schon innerhalb oder noch außerhalb.
Haben Sie immer noch die bounding box von oben erinnern Sie sich? Wählen Sie einfach einen Punkt außerhalb der bounding-box und verwenden Sie es als Ausgangspunkt für Ihre ray. E. g. der Punkt
(Xmin - e/p.y)
außerhalb des Polygons sicher.Aber was ist
e
? Gut,e
(eigentlich epsilon) gibt die bounding-box einige Polsterung. Als ich sagte, ray-tracing fehl, wenn wir beginnen zu schließen, um eine polygonlinie. Da die bounding-box kann gleich das polygon (wenn das polygon einer Achse ausgerichtet Rechteck die umgebende box ist gleich dem polygon selbst!), wir benötigen eine Polsterung, machen diese sicher, das ist alles. Wie groß sollten Siee
? Nicht zu groß ist. Es hängt vom Koordinatensystem skalieren verwenden Sie für das zeichnen. Wenn Ihr pixel-Schrittweite ist 1.0, dann wählen Sie einfach die 1.0 (noch 0.1 gearbeitet haben würde)Nun, dass wir das ray mit seiner start-und end-Koordinaten, das problem verschiebt sich vom "ist der Punkt innerhalb des Polygons" zu "wie oft kommt der Strahl schneidet ein polygon Seite". Deshalb können wir nicht nur die Arbeit mit dem polygon-Punkte wie vorher, jetzt müssen wir die eigentlichen Seiten. Eine Seite ist immer durch zwei Punkte definiert.
Müssen Sie testen, den ray gegen alle Seiten. Berücksichtigen ray ein Vektor und jeder Seite ein Vektor. Der ray hat zu schlagen jeder Seite genau einmal oder gar nicht. Es kann nicht auf die gleiche Seite zweimal. Zwei Linien im 2D-Raum wird immer schneiden sich genau einmal, wenn Sie parallel sind, in welchem Fall Sie nie kreuzen. Da jedoch die Vektoren haben eine begrenzte Länge, zwei Vektoren kann nicht parallel sein, und noch nie schneiden, weil Sie sind zu kurz, um jemals aufeinander treffen.
Soweit So gut, aber wie wollen Sie testen, ob zwei Vektoren schneiden? Hier sind einige C-code (nicht getestet), das sollte den trick tun:
Werden die Eingangswerte der zwei Endpunkte von Vektor 1 (
v1x1/v1y1
undv1x2/v1y2
) und Vektor 2 (v2x1/v2y1
undv2x2/v2y2
). So haben Sie 2 Vektoren, 4 Punkte, 8 Koordinaten.YES
undNO
sind klar.YES
erhöht KreuzungenNO
nichts.Was KOLLINEAR? Es bedeutet, dass beide Vektoren liegen auf einer unendlichen Linie, abhängig von position und Länge, die Sie nicht schneiden, oder Sie schneiden sich in einer unendlichen Anzahl von Punkten. Ich bin mir nicht absolut sicher, wie in diesem Fall behandeln, würde ich mich nicht verlassen es als Kreuzung oder so. Gut, dieser Fall ist in der Praxis eher selten weil eh von floating-point-Rundungsfehler; es ist besser, code zu haben, würde wahrscheinlich nicht testen
== 0.0f
sondern für so etwas wie< epsilon
wo epsilon ist eine relativ kleine Nummer.Wenn Sie brauchen, um zu testen eine größere Anzahl von Punkten, können Sie sicher Geschwindigkeit bis die ganze Sache ein wenig durch die Beibehaltung der linearen Gleichung die gängigen Formen der polygon-Seiten im Speicher, so dass Sie nicht haben, um neu berechnen, diese jedes mal. Dadurch sparen Sie zwei Fließkomma-Multiplikationen und drei floating-point-Abzüge auf jeden test, den im Austausch für die Speicherung von drei floating-point-Werte pro polygon Seite im Speicher. Es ist eine typische Speicher-vs-Berechnung time-trade-off.
Last but not least: Wenn Sie können, verwenden Sie 3D-hardware, um das problem zu lösen, gibt es eine interessante alternative. Lass einfach die GPU die ganze Arbeit für Sie. Erstellen Sie eine Malerei-Oberfläche, die außerhalb des Bildschirms. Füllen Sie es vollständig mit der Farbe schwarz. Lassen Sie uns nun OpenGL oder Direct3D-malen Sie Ihr polygon (oder sogar alle Ihre Polygone wenn Sie nur wollen, um zu testen, ob der Punkt innerhalb jeder von Ihnen, aber Sie kümmern sich nicht für die one) und füllen Sie das polygon(en) mit einer anderen Farbe, z.B. weiß. Um zu überprüfen, ob ein Punkt innerhalb des Polygons, die Farbe von diesem Punkt aus der Zeichnung der Oberfläche. Dies ist nur ein O(1) Speicher Holen.
Natürlich ist diese Methode nur geeignet, wenn Ihre Zeichenfläche nicht zu groß sein. Wenn es passt nicht in den GPU-Speicher, diese Methode ist langsamer als wenn man es auf die CPU. Wenn es sein müsste, eine riesige und deine GPU unterstützt moderne Shader, können Sie immer noch die GPU durch die Implementierung des ray-casting-oben als ein GPU-shader, das ist absolut möglich. Für eine größere Anzahl von Polygonen oder eine große Anzahl von Punkten zu testen, das wird sich auszahlen, betrachten einige GPUs werden in der Lage sein, um test-64 auf 256 Punkte parallel. Beachten Sie jedoch, dass die übertragung der Daten von der CPU zur GPU und zurück ist immer teurer, so zum testen nur ein paar Punkte, die gegen ein paar einfache Polygone, bei denen entweder die Punkte oder der Polygone sind dynamisch und ändern sich Häufig, eine GPU-Ansatz wird nur selten auszahlen.
InformationsquelleAutor der Antwort Mecki
Denke ich das folgende Stück code ist die beste Lösung (aus hier):
Argumente
Es ist kurz und effizient und arbeitet sowohl für konvexe und konkave Polygone. Als schlug vor, Sie sollten überprüfen Sie das umschließende Rechteck zunächst und Behandlung von polygon-Löcher getrennt.
Die Idee dahinter ist ziemlich einfach. Der Autor beschreibt es wie folgt:
Die variable c ist das Umschalten von 0 auf 1 und 1 auf 0 jedes mal, wenn der horizontale Strahl kreuzt eine Kante. Also im Grunde geht es um nachzuverfolgen, ob die Anzahl der Kanten gekreuzt werden gerade oder ungerade ist. 0 bedeutet, selbst und 1 odd.
InformationsquelleAutor der Antwort nirg
Hier ist ein C# - version der Antwort von nirgdie kommt aus das RPI-professor. Bitte beachten Sie, dass der code aus, dass die RPI-source-erfordert die Quellenangabe.
Einer bounding-box überprüfen, wurde oben Hinzugefügt. Jedoch, als James Brown weist darauf hin, der Haupt-code ist fast so schnell wie die bounding-box prüfen Sie selbst, also die bounding-box prüfen kann tatsächlich verlangsamen den gesamten Vorgang, in dem Fall, dass die meisten der Punkte, die Sie überprüfen, die innerhalb der bounding-box. So könnten Sie verlassen die bounding-box check-out, oder wäre eine alternative vorausberechnen den Begrenzungsrahmen Ihrer Polygone, wenn Sie nicht die Form verändern zu oft.
InformationsquelleAutor der Antwort M Katz
Hier ist eine JavaScript-Variante der Antwort von M. Katz, basierend auf Nirg ' s Ansatz:
InformationsquelleAutor der Antwort Philipp Lenssen
Berechnen Sie die orientierte Summe der Winkel zwischen dem Punkt p und jeweils das polygon apices. Wenn die Summe orientierte Winkel ist 360 Grad, der Punkt ist im inneren. Wenn die Summe 0 ist, wird der Punkt außerhalb.
Diese Methode gefällt mir besser, weil es stabiler und weniger abhängig von der numerischen Genauigkeit.
Methoden, die berechnen die Ebenheit der Anzahl der Kreuzungen sind begrenzt, weil Sie können 'Treffer' eine Spitze bei der Berechnung der Anzahl der Kreuzungen.
EDIT: Übrigens funktioniert diese Methode mit konkaven und konvexen Polygonen.
EDIT: vor kurzem fand ich eine ganze Wikipedia-Artikel auf das Thema.
InformationsquelleAutor der Antwort David S.
Den Eric Haines Artikel zitiert von bobobobo ist wirklich ausgezeichnet. Besonders interessant sind die Tabellen vergleichen die Leistung der algorithmen; die Winkel-summation-Methode ist wirklich schlecht im Vergleich zu den anderen. Interessant ist auch, dass Optimierungen wie die Verwendung einer lookup-Netz weiter zu unterteilen das polygon in "in" und "out" Sektoren der test unglaublich schnell, auch auf Polygone mit > 1000 Seiten.
Sowieso, es ist früh Tage, aber meine Stimme geht an den "Kreuzungen" - Methode, die ist ziemlich viel, was Mecki beschreibt, denke ich. Allerdings fand ich es am meisten succintly beschrieben und kodifiziert durch David Bourke. Ich Liebe, dass es keine wirkliche Trigonometrie erforderlich, und es funktioniert für konvex und konkav, und es schneidet Recht gut ab, wie die Anzahl der Seiten erhöht.
Übrigens, hier ist einer der performance-Tabellen von Eric Haines' Artikel für das Interesse, Tests auf zufällige Polygone.
InformationsquelleAutor der Antwort Gavin
Diese Frage ist so interessant. Ich habe noch eine praktikable Idee unterscheidet sich von anderen Antworten zu diesem Beitrag.
Die Idee ist, die Summe der Winkel, um zu entscheiden, ob das Ziel innerhalb oder außerhalb. Wenn das Ziel ist, innerhalb einer Fläche, die Summe der Winkel bilden, die durch das Ziel und alle zwei Grenzübergängen werden 360. Wenn sich das Ziel außerhalb, wird die Summe nicht 360. Die Winkel für die Richtung hat. Wenn der Winkel rückwärts, der Winkel ist negativ. Diese ist genau wie die Berechnung der Wicklung Anzahl.
Beziehen sich auf dieses Bild, um ein grundlegendes Verständnis der Idee:
Mein Algorithmus übernimmt der im Uhrzeigersinn ist die positive Richtung. Hier ist eine mögliche Eingabe:
Im folgenden ist der python-code implementiert die Idee:
InformationsquelleAutor der Antwort Junbang Huang
Habe ich einige arbeiten auf dieses zurück, wenn ich war eine Wissenschaftlerin, die unter Michael Stonebraker - Sie wissen schon, der professor, kam mit IngresPostgreSQLetc.
Merkten wir, dass der Schnellste Weg war, um zuerst eine bounding-box, weil es SUPER schnell. Wenn es außerhalb der bounding-box, es ist außerhalb. Sonst, Sie machen die härtere Arbeit...
Wenn Sie wollen einen großen Algorithmus, Blick auf das open-source-Projekt PostgreSQL-source-code für die geo die Arbeit...
Will ich darauf hinweisen, wir haben nie irgendeinen Einblick in die rechts vs Links-Händigkeit (auch ausdrückbar als ein "inside" vs "outside" - problem...
UPDATE
BKB ist link eine gute Anzahl von vernünftigen algorithmen. Ich war arbeiten, auf der Erde Wissenschaft Probleme und brauchte deshalb eine Lösung, die funktioniert in Längen - /Breitengrad, und es hat die Besondere Problematik der Händigkeit - ist der Bereich, in dem kleineren Gebiet oder die größere Fläche? Die Antwort ist, dass die "Richtung" der verticies Fragen - es ist entweder Linkshänder oder Rechtshänder und auf diese Weise können Sie angeben, entweder Bereich als "Insider" jede gegebene polygon. Als solche, meine Arbeit verwendete Lösung drei aufgelistet auf dieser Seite.
Darüber hinaus, meine Arbeit verwendet separate Funktionen für "on the line" - tests.
...Da fragte jemand: wir haben herausgefunden, dass die bounding-box-tests waren am besten, wenn die Anzahl der verticies ging über einige Zahl - haben ein sehr kurzer test, bevor Sie den längeren test, wenn notwendig... Eine bounding-box wird erstellt, indem man einfach die größte x, kleinster x, größter y-und kleinsten y und setzen Sie zusammen, um vier Punkte von einem Karton.
Noch ein Tipp für diejenigen, die Folgen: wir haben alle unsere mehr anspruchsvolle und "Licht-Dimmung" computing in einem Rastermaß alle positiven Punkte auf einer Ebene, und dann re-rückprojiziert in die "echte" Längen - /Breitengrad, also die Vermeidung von möglichen Fehlern die Verpackung um, wenn eine gekreuzte Linie 180 Längengrad und beim Umgang mit den polar-Regionen. Hat Super geklappt!
InformationsquelleAutor der Antwort Richard T
Wirklich wie in der Lösung geschrieben von Nirg und bearbeitet von bobobobo. Ich schaffte es gerade noch javascript freundlich und ein wenig besser lesbar ist für meine Verwendung:
InformationsquelleAutor der Antwort Dave Seidman
Swift version des Antwort von nirg:
InformationsquelleAutor der Antwort bzz
David zweiter kolbenringstoss Antwort ist so ziemlich der standard Allgemeine Antwort, und Richard T ist die gemeinsame Optimierung, obwohl therre gibt einige andere. Andere starke Optimierungen basieren auf weniger Allgemeine Lösungen. Zum Beispiel, wenn Sie gehen, um zu überprüfen, das gleiche polygon mit der Menge der Punkte, die triangulation des Polygons kann die Dinge beschleunigen enorm, da gibt es eine Reihe von sehr schnellen ZINN-Suche-algorithmen. Ein anderes ist, wenn das polygon und die Punkte werden auf einer begrenzten Ebene mit niedriger Auflösung, beispielsweise eine Bildschirm-Anzeige, können Sie die Farbe des Polygons auf eine memory-mapped display-Puffer in einer bestimmten Farbe, und überprüfen Sie die Farbe eines bestimmten pixels, um zu sehen, ob es liegt in den Polygonen.
Wie viele Optimierungen, diese basieren auf spezifischen statt Allgemeinen Fällen und Ertrag beneifits basierend auf fortgeführten Zeit eher als einmaligen Verwendung.
In diesem Bereich zu arbeiten, fand ich Joeseph O ' Rourke 'Berechnung der Geometrie in C' ISBN 0-521-44034-3 eine große Hilfe.
InformationsquelleAutor der Antwort Shane MacLaughlin
Die triviale Lösung wäre, teilen Sie das polygon in Dreiecke und hit test die Dreiecke wie beschrieben hier
Wenn Ihr polygon KONVEX es möglicherweise ein besserer Ansatz, wenn. Blick auf das polygon als eine Sammlung von unendlichen Linien. Jede Zeile teilt den Raum in zwei. für jeden Punkt, es ist einfach zu sagen, wenn Ihr auf der einen Seite oder der anderen Seite der Linie. Wenn ein Punkt auf der gleichen Seite von allen Linien, dann ist es innerhalb des Polygons.
InformationsquelleAutor der Antwort shoosh
Ich weiß, das ist alt, aber hier ist ein ray-casting-Algorithmus implementiert, in Kakao, falls es jemanden interessiert. Nicht sicher, es ist der effizienteste Weg, Dinge zu tun, aber es kann jemand helfen.
InformationsquelleAutor der Antwort diatrevolo
Obj-C version von nirg Antwort mit Beispiel-Methode zum testen Punkte. Nirg ' s Antwort gut für mich gearbeitet.
InformationsquelleAutor der Antwort Jon
Auch ich dachte 360 addieren funktioniert nur für konvexe Polygone, aber das ist nicht wahr.
Diese Website hat ein nettes Diagramm zeigt genau das, und eine gute Erklärung auf Treffer testen:
Gamasutra - Absturz in das Neue Jahr: Collision Detection
InformationsquelleAutor der Antwort
C# - version von nirg ' s Antwort ist hier: ich werde nur teilen Sie den code. Es kann jemand retten einige Zeit.
InformationsquelleAutor der Antwort Uğur Gümüşhan
Java-Version:
InformationsquelleAutor der Antwort YongJiang Zhang
.Net port:
InformationsquelleAutor der Antwort Aladar
Gibt es nichts mehr wunderschöne als eine induktive definition eines Problems. Der Vollständigkeit halber hier haben Sie eine version im prolog, die sich vielleicht auch klären, die thoughs hinter ray-casting:
Basiert auf der simulation der Einfachheit Algorithmus in http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
Einige Helfer Prädikate:
Die Gleichung der Linie, angegeben 2 Punkte A und B (Zeile(A,B)) ist:
Ist es wichtig, dass die Drehrichtung für die Linie ist
setted clock-wise für Grenzen und anti-clock-wise für Löcher.
Werden wir zu prüfen, ob der Punkt (X,Y), ich.e der getestete Punkt ist auf der linken Seite
halbebene, die von unserer Linie (es ist eine Frage des Geschmacks ist, könnte es auch sein
der rechten Seite, sondern auch die Richtung der Grenzen, die Zeilen geändert werden in
diesem Fall), ist dieses Projekt der Strahl von dem Punkt nach rechts (oder Links)
und bestätigen Sie die Kreuzung mit der Linie. Wir haben uns entschieden Projekt
der Strahl in der horizontalen Richtung (wieder ist es eine Frage des Geschmacks,
es könnte auch getan werden, in der vertikalen mit ähnlichen Einschränkungen), so haben wir:
Nun müssen wir wissen, wenn der Punkt auf der linken (oder rechten) Seite von
das Liniensegment, nicht die gesamte Ebene, also müssen wir
Schränken Sie die Suche nur auf dieses segment, aber das ist einfach da
im segment mit nur einem Punkt in die Linie kann höher sein
als Y in der vertikalen Achse. Da dies eine stärkere Einschränkung es
muss der erste sein zu überprüfen, also nehmen wir zuerst nur die Zeilen
die Erfüllung dieser Forderung und dann überprüfen Sie seine Position. Der Jordan
Kurve theorem jede ray projiziert, um ein polygon muss sich in ein
noch Anzahl der Zeilen. So wir sind fertig, wir werfen den Strahl auf die
die Rechte und dann jedesmal, wenn es kreuzt eine Linie, wechseln Ihren Zustand.
Aber in unserer Umsetzung sind wir goint zu prüfen, die Länge der
die Tasche von Lösungen, treffen die gegebenen Beschränkungen und entscheiden
innership auf. für jede Zeile in der polygon dies zu tun.
InformationsquelleAutor der Antwort jdavid_1385
VBA VERSION:
Hinweis: denken Sie Daran, dass, wenn Ihr polygon ist ein Bereich innerhalb einer Karte, Breitengrad/Längengrad Y/X-Werte im Gegensatz zu X/Y " (Latitude = Y, Länge = X) aufgrund von dem, was ich verstehe, sind die historischen Implikationen von Weg zurück, wenn die Länge war nicht eine Messung.
KLASSE MODUL: CPoint
MODUL:
InformationsquelleAutor der Antwort Colin Stadig
Heres ein point-in-polygon-test in C, die nicht mit ray-casting. Und es kann für überlappende Bereiche (selbst-Kreuzungen), sehen die
use_holes
argument.Hinweis: dies ist eine der weniger optimalen Methoden, denn es enthält eine Menge Anrufe zu
atan2f
aber es kann von Interesse sein, die Entwickler Lesen dieses Threads (in meinen tests hat seine ~23x langsamer, dann über den line-intersection-Methode).InformationsquelleAutor der Antwort ideasman42
Zur Erkennung Treffer auf Polygon müssen wir testen zwei Dinge:
InformationsquelleAutor der Antwort V.J.
Umzugehen, mit den folgenden besonderen Fällen in Ray-casting-Algorithmus:
Überprüfen Die Bestimmung, Ob Ein Punkt In Einem Komplexen Polygon. Der Artikel bietet eine einfache Möglichkeit, Sie zu lösen, so gibt es keine Besondere Behandlung erforderlich, für die genannten Fälle.
InformationsquelleAutor der Antwort Justin
Können Sie dies tun, indem Sie prüfen, ob der Bereich, gebildet durch das verbinden der gewünschten Stelle, um die Eckpunkte Ihres Polygons entspricht der Fläche des Polygons selbst.
Oder Sie könnten überprüfen, ob die Summe der inneren Winkel, aus Ihrer Sicht, um jedes paar von zwei aufeinanderfolgenden polygon-Eckpunkte Ihrer check point-Summen 360, aber ich habe das Gefühl, dass die erste option ist schneller, da es sich nicht um Divisionen noch Berechnungen von inversen trigonometrischen Funktionen.
Ich weiß nicht, was passiert, wenn das polygon ein Loch im inneren, aber es scheint mir, dass die Grundidee angepasst werden kann, um diese situation
Kann man auch das posten der Frage in einem Mathe-community. Ich Wette, Sie haben eine million Möglichkeiten,
InformationsquelleAutor der Antwort user9589
Wenn Sie auf der Suche für ein java-script-Bibliothek gibt es ein javascript, google-maps-v3-Erweiterung für die Polygon-Klasse zu erkennen, ob ein Punkt innerhalb wohnt.
Google Extention Github
InformationsquelleAutor der Antwort shana
Bei qt (Qt 4.3+), kann man QPolygon die Funktion containsPoint
InformationsquelleAutor der Antwort Peter
Die Antwort hängt davon ab, ob die einfache oder komplexe Polygone. Einfache Polygone dürfen keine Liniensegmente Schnittpunkte. So können Sie die Löcher, aber die Linien nicht kreuzen einander. Komplexe Regionen kann die Linie Schnittpunkte - so können Sie die überlappenden Regionen, oder von Regionen, die einander berühren, nur durch einen einzigen Punkt.
Für einfache Polygone, den besten Algorithmus ist Ray casting (Crossing number) - Algorithmus. Für komplexe Polygone der Algorithmus erkennt nicht die Punkte, die innerhalb der überlappenden Regionen. Also für komplexe Polygone verwenden Sie die Winding number Algorithmus.
Hier ist ein exzellenter Artikel mit C Implementierung von algorithmen. Ich versuchte Sie, und Sie funktionieren gut.
http://geomalgorithms.com/a03-_inclusion.html
InformationsquelleAutor der Antwort Timmy_A
Scala-version der Lösung von nirg (meint bounding rectangle pre-check erfolgt GESONDERT):
InformationsquelleAutor der Antwort Michael-7
Habe ich eine Python-Implementierung von nirg ' s c++ code:
Eingänge
bounding_box_positions: Kandidaten Punkte zu filtern. (In meiner Implementierung erstellt von der bounding-box.
(Die Eingänge Listen, Tupel im format:
[(xcord, ycord), ...]
)Gibt
Wieder, die Idee stammt aus hier
InformationsquelleAutor der Antwort Noresourses
Dies funktioniert nur für konvexe Formen, aber Minkowski Portal-Refinement, GJK sind auch große Möglichkeiten für die Prüfung, ob ein Punkt in einem polygon. Sie verwenden minkowski-Subtraktion, subtrahieren Sie den Punkt aus dem polygon, dann laufen diese algorithmen, um zu sehen, wenn das polygon enthält den Ursprung.
Auch, interessanterweise beschreiben Sie Ihre Formen ein bisschen mehr implizit verwenden von support-Funktionen, die einen Richtungsvektor als Eingabe und spuckt den entferntesten Punkt zusammen, dass Vektor. Dadurch können Sie beschreiben eine konvexe Form.. gebogen, aus Polygonen, oder gemischt. Sie können auch die Vorgänge kombinieren, die Ergebnisse der einfachen support-Funktionen, um komplexere Formen.
Mehr info:
http://xenocollide.snethen.com/mpr2d.html
Auch, game programming gems 7 spricht darüber, wie dies in 3d (:
InformationsquelleAutor der Antwort Alan Wolfe