2010-06-16 9 views
11

Ho una raccolta di punti che descrivono la superficie di una forma che dovrebbe essere approssimativamente sferica, e ho bisogno di un metodo con cui determinare se un altro dato punto si trova all'interno di questa forma. In precedenza ho approssimato la forma come una sfera esatta, ma ciò è risultato troppo impreciso e ho bisogno di un metodo più accurato. La semplicità e la velocità sono favorevoli per una precisione completa, una buona approssimazione sarà sufficiente.Come posso verificare se un punto si trova all'interno di una forma 3d con la sua superficie definita da una nuvola di punti?

Mi sono imbattuto in tecniche per convertire una nuvola di punti in una mesh 3D, ma la maggior parte delle cose che ho trovato sono state molto complicate e sto cercando qualcosa di più semplice possibile.

Qualche idea?

+2

La nuvola è stata riparata? La superficie è convessa? Con quale frequenza hai bisogno di fare i test di punteggio? –

+0

Il cloud non è fisso 'a lungo termine', ma per lo scopo di questi calcoli è, in quanto verranno eseguiti su 'istantanee' del sistema. Non ha bisogno di funzionare in tempo reale come un gioco o altro. I test verranno eseguiti all'incirca ogni 2 secondi. – Ben

risposta

10

cosa succede se si Computerizzata il baricentro della nube, e convertito le sue coordinate ad un sistema polare la cui origine è quella baricentro.

Quindi, convertire il punto che si desidera esaminare per lo stesso sistema di coordinate.

Supponendo che la superficie è rappresentabile da una triangolazione Delaunay, determinare i tre punti con la più piccola differenza di angolo dal punto si sta esaminando.

Proiettare il punto che si sta esaminando sul triangolo determinato da questi tre punti e verificare se la distanza del punto proiettato dal centroide è maggiore della distanza del punto effettivo.

sostanza, si sta costruendo una maglia triangolare convesso, ma al bisogno un triangolo alla volta. Se la velocità di esecuzione è davvero importante, è possibile memorizzare nella cache i triangoli risultanti man mano che si procede.

Steven sudit ha anche suggerito a useful optimization che vi consiglio se si va su questa strada.

+0

Sembra una buona idea, molte grazie! Farò un tentativo ora e vedere se funziona. Ho già elenchi di punti vicini per ciascun punto per l'ottimizzazione di un altro algoritmo, che potrei forse riciclare per accelerare anche questo. – Ben

+0

Ci ho pensato un po 'e ho il sospetto che tre dovrebbero sempre essere sufficienti. Questo si basa sull'idea che la superficie può essere definita in termini di triangoli. Finché il punto si trova sul lato del piano triangolare più vicino al centroide, allora è all'interno dei limiti. Certo, se questa ipotesi è sbagliata - se ci possono essere cavità e strapiombi - allora niente di ciò vale. Poi di nuovo, non so cosa fa; l'aggiunta di più punti non sarà, di per sé, sufficiente. –

+0

O, nella terminologia corretta, presumo che sia uno scafo convesso definibile in termini di triangoli di Delaunay. –

7

Penso metodo di Bill Carey è sulla strada giusta, ma io voglio suggerire una possibile ottimizzazione.

Dal momento che la forma è approssimativamente sferica, è possibile pre-calcolare il raggio della sfera da essa vincolata e della sfera che delimita esso. In questo modo, se la distanza del punto è all'interno della sfera più piccola, è un colpo definito e se si trova al di fuori della sfera esterna, è un errore preciso.

Questo dovrebbe permettere di risolvere i casi facili molto rapidamente. Per i più duri, il metodo di Carey prende il sopravvento.

+0

Questa è sicuramente una buona ottimizzazione. Posso aggiungere un riferimento attribuito a questo alla mia risposta? –

+0

@ Bill, penso che tu l'abbia appena fatto. :) –

+0

@ Bill: vedere il link "link" in basso a sinistra di ogni risposta? Puoi usare quello più markup o html per rendere "Vedi la bella ottimizzazione di Steven". tipo di link nel tuo post ... Ecco come faccio abitualmente queste cose. – dmckee

0

Utilizzare un kd-tree.

http://en.wikipedia.org/wiki/Kd-tree

L'articolo fornisce una buona spiegazione.

posso chiarire eventuali ulteriori malintesi.

+0

Un kd-tree è rilevante per la parte relativa alla ricerca dei tre punti più vicini, anche se sembra che Ben abbia altri metodi per farlo. –

+0

Puoi costruire un albero kd in un sistema di coordinate polari? Non ho lavorato con loro abbastanza per sapere. Se è così, potrebbe essere utile. –

+0

@Bill: per quanto ne so, gli alberi kd sono per le coordinate cartesiane. Se è così, puoi sempre convertire. Altrimenti, sarei curioso di vedere come gestiscono il problema delle unità miste (angoli rispetto alla distanza). –

Problemi correlati