Es gibt zwei relativ einfache Ansätze. Der erste Ansatz besteht darin, einen Strahl von dem Punkt zu "unendlich" (tatsächlich zu irgendeinem Punkt außerhalb des Polygons) zu zeichnen und zu zählen, wie viele Seiten des Polygons der Strahl schneidet. Der Punkt ist genau dann innerhalb des Polygons, wenn der Zählwert ungerade ist.
Der zweite Ansatz ist, um das Polygon herum, um zu gehen und für jedes Paar von Ecken v i und v i + 1 (um auf den ersten Scheitelpunkt ggf. Verpackung), um die Menge zu berechnen (x - x i) * (y i + 1 - y i ) - (x i + 1 - x i ) * (y - y i ). Wenn diese Größen alle das gleiche Vorzeichen haben, befindet sich der Punkt innerhalb des Polygons. (Diese Größen sind die Z-Komponente des Kreuzprodukts der Vektoren (v i + 1 - v i) und (p-v i). Die Bedingung, dass sie alle das gleiche Vorzeichen haben, ist dasselbe wie die Bedingung, dass p auf der gleichen Seite (links oder rechts) jeder Kante ist.)
Beide Ansätze müssen mit dem Fall umgehen, dass der Punkt genau an einer Kante oder an einem Scheitel liegt. Sie müssen zuerst entscheiden, ob Sie solche Punkte als innerhalb des Polygons zählen möchten oder nicht. Dann müssen Sie die Tests entsprechend anpassen. Beachten Sie, dass kleine numerische Rundungsfehler eine falsche Antwort liefern können. Es ist nur etwas, mit dem du leben musst.
Da Sie ein konvexes Viereck haben, gibt es einen anderen Ansatz. Wählen Sie drei beliebige Eckpunkte aus und berechnen Sie den barycentric coordinates des Punkts und des vierten Eckpunkts in Bezug auf das Dreieck, das von den drei ausgewählten Eckpunkten gebildet wird. Wenn die baryzentrischen Koordinaten des Punktes alle positiv und alle kleiner als die baryzentrischen Koordinaten des vierten Eckpunkts sind, liegt der Punkt innerhalb des Vierecks.
P.S. Habe gerade eine nette Seite here gefunden, die eine ganze Reihe von Strategien auflistet. Einige von ihnen sind sehr interessant.
Ich versuchte das hier verwendete Inpolygon-Methon [link] (http://stackoverflow.com/questions/5922027/how-to-determine-if-a-point-is-within-a-quadrilateral?rq=1) , aber es funktioniert nicht. Es gibt mir "Kann Methode nicht in Polygon von undefined aufrufen". 'if (Math.inpolygon (5,6, [1,22,13,1], [1,1,21,31])) { Rückgabe" yep "; } ' – Henrik
und warum können Sie nicht einfach Koordinaten vergleichen? Kannst du das Problem näher beschreiben? Was sind Punkte? Ecke? – 4pie0
Ich habe Tonnen von ziemlich zufällig erzeugten Vierecke. Dann muss ich prüfen, ob einige (auch ganz zufällig generierte) Punkte "verfügbar" sind oder bereits von einem Viereck besetzt sind. – Henrik