Come trovo i punti più vicini (formando così un poligono) che racchiudono un punto particolare? (Vedi immagine)


8

Sto lavorando con un motore di gioco e il mio compito è aggiungere codice per simulare la frattura di maglie rigide.

In questo momento sto solo lavorando per rompere un cubo.

Sto usando l'algoritmo di Voronoi per creare un frammento (realistico) fratturato e sto usando il metodo a mezzo piano per generare una cellula Voronoi.

per trovare i punti più vicini (cerchiati in rosso) intorno al Voronoi (punto viola)

Ora il modo in cui lo faccio è per ogni punto seme, faccio piani che sono piani bisettrici perpendicolari (le linee nere dritte nell'immagine) con il resto dei punti seme e calcolo le intersezioni di tutti questi piani per darmi punti distinti ( tutti i punti arancioni).

Sono arrivato così lontano.

Di tutti questi punti di intersezione calcolati, ho bisogno solo di quelli più vicini e che racchiudano il punto seme (i punti racchiusi in rosso) e ho bisogno di scartare tutto il resto.

Informazioni che ho:

1) Equazioni di piano di tutti i piani (definite da vettori normali normalizzati e loro distanza dall'origine)

2) Punti di intersezione (che ho calcolato)

Qualcuno può aiutarmi a scoprire come posso trovare i punti racchiusi in rosso?


Nessuna risposta, ma questo è un problema interessante!
Tim Holt,

Risposte:


4

Seguendo il metodo del mezzo piano , avrai trovato i segmenti di linea in ogni altro punto e le bisettrici perpendicolari di ciascuno di questi

passaggio 1: segmenti di linea passaggio 2: bisettrici perpendicolari

che poi hai intersecato per trovare potenziali vertici della cellula Voronoi.

Ora, si desidera escludere quelli che intersecano uno dei semipiani "distanti" formati dalle bisettrici.

Due incroci corrispondenti, uno ineguagliabile

Per chiarezza ho colorato i semipiani "distanti" blu traslucido.

Qui, i due punti rossi cerchiati superano il test: non si trovano in alcun mezzo piano. Il punto rosso non cerchiato non passa, poiché si trova all'interno del semipiano formato verso il punto in alto a destra.

Ciò significa effettivamente verificare se ogni punto si trova dall'altra parte di ogni linea di bisettrice (rispetto al sito Voronoi) e scartare quelli che lo sono. (Attenzione agli errori di arrotondamento.)


Questa risposta è stata molto utile. Per verificare se entrambi i punti si trovano sullo stesso lato del piano ho sostituito i vettori nelle equazioni del piano e ho cercato i loro segni. Se entrambi erano positivi / negativi, allora sono dalla stessa parte. Altrimenti sono dalla parte opposta. Questo funziona! Il mio codice sembra finalmente produrre vertici corretti per i frammenti di Voronoi!
nilspin,

quale programma hai usato per generare quelle immagini nella tua risposta?
nilspin,

@nilspin Inkscape .
Anko,

3

È possibile semplicemente scorrere i bordi e filtrare tutti i vertici che non si trovano nello stesso semipiano con il punto di interesse.

Come ottimizzazione, scorrere dai bordi più vicini a quelli più lontani. Penso che potresti persino filtrare i vertici durante la generazione di sezioni.

È come affettare una torta con un coltello senza fine, fino a quando rimane solo un pezzettino con la ciliegia. Se ti piacciono le analogie. Basta tagliare e vedere quale parte verrà presa e quali verranno scartate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.