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]
Il suo doppio è quello esagonale a cui siamo interessati:
DiagramPlot[points, LabelPoints -> False]
Questo crea una funzione nf
che 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;
indices
contiene 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]
... o colora ciascuno di essi ...
Show[
DiagramPlot[points, LabelPoints -> False],
Graphics@MapThread[{ColorData[3][#1], Point[#2]} &, {indices, cloud}],
PlotRange -> All, AspectRatio -> Automatic
]
... 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 - #] &)]
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).