Wie finde ich die nächstgelegenen Punkte (wodurch ein Polygon gebildet wird), die einen bestimmten Punkt einschließen? (Siehe Bild)

8

Ich arbeite mit einer Spiel-Engine und meine Aufgabe ist es, Code zum Simulieren des Bruchs starrer Netze hinzuzufügen.

Im Moment arbeite ich nur daran, einen Würfel zu zerbrechen.

Ich verwende den Voronoi-Algorithmus, um einen (realistischen) gebrochenen Splitter herzustellen, und ich verwende die Halbebenenmethode, um eine Voronoi-Zelle zu erzeugen.

um die nächsten (rot eingekreisten) Punkte um den Voronoi (lila Punkt) zu finden

Jetzt mache ich das für jeden Startpunkt. Ich erstelle Ebenen, die senkrechte Winkelhalbierende sind (die geraden schwarzen Linien im Bild), mit den restlichen Startpunkten und berechne die Schnittpunkte all dieser Ebenen, um mir unterschiedliche Punkte zu geben ( alle orangefarbenen Punkte).

Ich bin so weit gekommen.

Von all diesen berechneten Schnittpunkten benötige ich nur diejenigen, die am nächsten liegen und den Startpunkt einschließen (die rot eingekreisten Punkte), und ich muss den Rest verwerfen.

Informationen, die ich habe:

1) Ebenengleichungen aller Ebenen (definiert durch normalisierte Normalenvektoren und deren Abstand vom Ursprung)

2) Schnittpunkte (die ich berechnet habe)

Kann mir jemand helfen, herauszufinden, wie ich die rot eingekreisten Punkte finden kann?

Nilspin
quelle
Keine Antwort, aber das ist ein interessantes Problem!
Tim Holt

Antworten:

4

Nach der Halbebenenmethode haben Sie die Liniensegmente zu jedem anderen Punkt und die senkrechten Winkelhalbierenden von jedem dieser Punkte gefunden

Schritt 1: Liniensegmente Schritt 2: senkrechte Winkelhalbierende

die Sie dann geschnitten haben, um mögliche Eckpunkte der Voronoi-Zelle zu finden.

Nun möchten Sie diejenigen ausschließen, die eine der von den Winkelhalbierenden gebildeten "entfernten" Halbebenen schneiden.

Zwei übereinstimmende Kreuzungen, eine nicht übereinstimmende

Ich habe die "entfernten" Halbebenen zur Klarheit durchscheinend blau gefärbt.

Hier bestehen die beiden eingekreisten roten Punkte den Test: Sie befinden sich nicht in einer Halbebene. Der nicht eingekreiste rote Punkt geht nicht durch, da er sich innerhalb der Halbebene befindet, die zum Punkt oben rechts hin gebildet ist.

Dies bedeutet effektiv zu testen, ob sich jeder Punkt auf der anderen Seite jeder Halbierungslinie befindet (relativ zur Voronoi-Stelle) und diejenigen zu verwerfen, die sich befinden. (Vorsicht vor Rundungsfehlern.)

Anko
quelle
Diese Antwort war sehr nützlich. Um zu überprüfen, ob beide Punkte auf derselben Seite der Ebene liegen, habe ich die Vektoren in Ebenengleichungen eingesetzt und auf ihre Vorzeichen geachtet. Wenn beide positiv / negativ waren, sind sie auf der gleichen Seite. Sonst sind sie auf der gegenüberliegenden Seite. Das funktioniert! Mein Code scheint endlich korrekte Eckpunkte für Voronoi-Shards zu erzeugen!
Nilspin
Mit welchem ​​Programm haben Sie diese Bilder in Ihrer Antwort generiert?
Nilspin
@nilspin Inkscape .
Anko
3

Sie können einfach über Kanten iterieren und alle Scheitelpunkte herausfiltern, die sich nicht in derselben Halbebene mit dem interessierenden Punkt befinden.

Iterieren Sie zur Optimierung von den nächsten bis zu den am weitesten entfernten Kanten. Ich denke, Sie können sogar Scheitelpunkte filtern, während Sie Slices generieren.

Es ist, als würde man mit einem endlosen Messer Kuchen schneiden, bis nur noch ein kleines Stück Kirsche übrig ist. Wenn Sie Analogien mögen. Schneiden Sie einfach und sehen Sie, welches Teil genommen und welches weggeworfen wird.

Schatten im Regen
quelle