Ich versuche das auch zu lösen. Ich habe meinen Polygonen die Bedingung auferlegt, dass sie keine sich kreuzenden Linien haben dürfen, die in das eingehen, was ich beschreiben werde.
Mein Ansatz verwendet also Triangulation. Nehmen Sie einen zufälligen Scheitelpunkt (möglicherweise nehmen Sie einen Scheitelpunkt am äußersten Punkt N, E, W oder S, um die Dinge zu vereinfachen).
Zeichnen Sie von diesem Scheitelpunkt Linien zu dem einen Scheitelpunkt entfernten Scheitelpunkt, dh wenn Ihr Scheitelpunkt Scheitelpunkt 3 ist, schauen Sie auf Scheitelpunkt 3 + 2.
Konstruieren Sie eine Linie von Ihrem ursprünglichen Scheitelpunkt zu diesem Scheitelpunkt. Wenn die konstruierte Linie:
- kreuzt keine andere Linie und
- sein Mittelpunkt liegt nicht außerhalb des Polygons
Dann haben Sie ein Dreieck konstruiert, das sich innerhalb des Polygons befindet. Wenn der erfolgreiche Eckpunkt n + 2 war, ist Ihr Dreieck {n, n + 1, n + 2}, was wir als {v, v1, v2} bezeichnen. Wenn nicht, versuchen Sie es mit dem nächsten Scheitelpunkt und fahren Sie fort, bis alle Scheitelpunkte ausprobiert wurden.
Wenn Sie ein Dreieck finden, ermitteln Sie dessen Mittelpunkt, indem Sie eine Linie vom Scheitelpunkt v zum Mittelpunkt von v1 und v2 ziehen. Der Mittelpunkt dieser Linie liegt garantiert innerhalb des Dreiecks und innerhalb des Polygons.
Ich habe dies noch nicht codiert, aber ich kann sehen, wie ich darüber nachdenke, dass ein Polygon mit sich kreuzenden Linien tatsächlich einige exotische Zustände hervorruft, bei denen dies nicht funktioniert. Wenn dies die Art von Polygonen ist, die Sie haben, müssen Sie jedes Liniensegment auf dem Polygon testen und sicherstellen, dass es nicht gekreuzt wird. Überspringen Sie Liniensegmente, die gekreuzt sind, und ich denke, es wird funktionieren.