Ordina una nuvola di punti rispetto a una mesh non strutturata di celle esaedriche


11

Domanda

Come classificheresti una nuvola di punti rispetto a una maglia non strutturata di celle esaedriche?

Ogni cella ha un centro e un'etichetta unica per rappresentarla. Fondamentalmente ci sono due punti di nuvola (nuvola di punti originale e una nuvola di punti dei centri di celle), ma le informazioni sulla geometria delle celle (riquadro di delimitazione) potrebbero essere utili, non ne sono sicuro.

risultati

Ho fatto un po 'di domande e ricerche nella letteratura:

se la mesh è hexahedral e non strutturata, il problema si riduce a una ricerca di intervallo ortogonale. A tale scopo, gli alberi kd vengono utilizzati più spesso. Se la mesh viene perfezionata in base a una struttura di dati octree, l'algoritmo di ricerca dell'intervallo può essere costruito attorno ad essa. L'obiettivo è evitare di occuparsi della geometria della mesh diretta e concentrarsi sulla nuvola di punti A - relazione tra nuvole di punti B. Nuvola di punti A: punti di interrogazione, nuvola di punti B: centri di celle di mesh.


Puoi chiarire cosa intendi quando dici "ordina rispetto a (qualsiasi tipo di) mesh"? Stai cercando un algoritmo di binning, (quanti punti ci sono in ogni cella)?
Szabolcs,

Non capisco bene la tua domanda, qual è l'obiettivo di ordinare i punti? Ti piace rendere la mesh più regolare?
Shuhao Cao,

C'è una nuvola di punti separata sparsa attraverso la mesh di volume non strutturata. Devo comunicare i dati dai centri cellulari alla nuvola di punti e viceversa.
Tmaric,

1
@ tomislav-maric: potresti per favore scrivere la tua soluzione come risposta e poi accettare la tua risposta? Questa procedura è generalmente la pratica accettata per rispondere efficacemente alla propria domanda, piuttosto che aggiungere il tag "[RISOLTO]" alla domanda; inoltre, ti farà guadagnare più reputazione, perché le persone possono votare la tua risposta.
Geoff Oxberry

Risposte:


8

Nota importante: questa risposta non risponde alla domanda effettiva, ma è stata lasciata libera per ogni richiesta. Imbarazzantemente ho confuso hexahedral ed hexagonal. La domanda riguarda l'ordinamento dei punti in celle hexahedral arbitrarie in 3D, mentre questa soluzione ordina i punti in normali celle esagonali in 2D o irregolari che corrispondono ad alcune tessellazioni Voronoi in qualsiasi dimensione. Questo metodo è applicabile solo se la mesh è stata generata in primo luogo come una tassellatura Voronoi (che sembra essere un approccio usato occasionalmente ).


Non sono sicuro di cosa intendi per ordinamento qui, ma presumo che tu voglia ordinare il punto in bidoni esagonali sul piano.

Mathematica è quello che so, quindi ti mostrerò come farlo in Mathematica, ma il metodo può essere portato su altri sistemi. L'idea è che un reticolo esagonale è il doppio di uno triangolare: può essere generato come il diagramma di Voronoi di un punto in una disposizione triangolare. Un punto dalla nuvola appartiene a un dato esagono se è più vicino al centro di quell'esagono che al centro di qualsiasi altro esagono.

Questo metodo funzionerà anche per maglie di forme diverse, purché possano essere generate come il diagramma Voronoi di una disposizione dei punti. (Ad esempio, gli esagoni non devono essere regolari.)


Generiamo la mesh. Questo è un reticolo a triangolo:

pts = Join @@ Table[{x, Sqrt[3] y}, {x, 0, 4}, {y, 0, 2}];

points = Join[pts, TranslationTransform[{1/2, Sqrt[3]/2}] /@ pts];

Needs["ComputationalGeometry`"]
PlanarGraphPlot[points, LabelPoints -> False]

Grafica Mathematica

Il suo doppio è quello esagonale a cui siamo interessati:

DiagramPlot[points, LabelPoints -> False]

Grafica Mathematica

Questo crea una funzione nfche trova l'indice del centro esagonale a cui è più vicino un punto nuvola. È la chiave del metodo:

nf = Nearest[N[points] -> Range@Length[points]];

Ora generiamo una nuvola di 1000 punti casuali e ordiniamoli con nf:

cloud = RandomReal[{-1/2, 5}, {1000, 2}];

indices = First /@ nf /@ cloud;

indicescontiene gli indici dei centri a cui è più vicino ogni punto nuvola. Questa è l'informazione di cui avevamo bisogno. Ora possiamo ricavarne un istogramma ...

Histogram[indices]

Grafica Mathematica

... o colora ciascuno di essi ...

Show[
 DiagramPlot[points, LabelPoints -> False],
 Graphics@MapThread[{ColorData[3][#1], Point[#2]} &, {indices, cloud}],
 PlotRange -> All, AspectRatio -> Automatic
 ]

Grafica Mathematica

... o fare qualsiasi tipo di visualizzazione di fantasia che vogliamo.

tally = Tally[indices];

ListDensityPlot[Join[points, List /@ Sort[tally][[All, 2]], 2], 
 InterpolationOrder -> 0, 
 Epilog -> (Text[#2, points[[#1]]] & @@@ tally), 
 PlotRange -> {{-.5, 5}, {-.5, 5}}, Mesh -> All, 
 ColorFunction -> (ColorData["BeachColors"][1 - #] &)]

Grafica Mathematica


Il punto chiave qui era la funzione che trova il punto più vicino a qualcosa ( Nearest). Mathematica ha questo integrato, ma c'è una possibilità che il tuo sistema non ha. In tal caso, vedere questa domanda su come implementare in modo efficiente una tale funzione (o semplicemente seguire l'implementazione del tempo lineare ingenuo se non si ha una grande quantità di punti da elaborare).


Molte grazie! Fondamentalmente quello di cui ho bisogno è una relazione che mostri una connessione tra ogni punto e un "bin" come lo hai chiamato (scatola hexahedral tridimensionale). Quello che suggerisci sembra molto interessante, ma ho a che fare con maglie di milioni di scatole e centinaia di migliaia di punti potenzialmente .. La domanda è cosa costa di più: la creazione di doppie maglie o lavorare con i riquadri di delimitazione dei "bin" e usare un kd albero per la ricerca. Sono molto nuovo su questo argomento, quindi non voglio davvero andare nella direzione sbagliata.
Tmaric,

k

Non eliminarlo definitivamente, qualcuno potrebbe trovarlo utile! :) Potrebbe diventare broncio per essere la soluzione al problema, è solo che non posso ancora accettarlo fino a quando non lo leggo.
Tmaric,

E grazie per una risposta così dettagliata, se potessi ti darei più punti! :)
tmaric,

@ tomislav-maric Guardando i voti, sono preoccupato che la mia risposta diminuisca la possibilità che tu ne abbia uno utile o contribuisca al malinteso. Penso che sia più produttivo se cancello.
Szabolcs,
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.