Urutkan awan poin sehubungan dengan mesh sel heksahedral yang tidak terstruktur

11

Pertanyaan

Bagaimana Anda mengurutkan awan poin sehubungan dengan mesh sel heksahedral yang tidak terstruktur?

Setiap sel memiliki pusat dan label unik untuk mewakilinya. Ada dua titik awan pada dasarnya (titik awan asli, dan titik awan pusat sel), tetapi informasi geometri sel (kotak pembatas) mungkin berguna, saya tidak yakin.

Hasil

Saya telah melakukan beberapa pertanyaan di sekitar, dan mencari melalui literatur:

jika mesh heksahedral dan tidak terstruktur, masalahnya dikurangi menjadi pencarian rentang ortogonal. Untuk tujuan ini, pohon kd paling sering digunakan. Jika mesh disempurnakan berdasarkan pada struktur data octree, algoritma pencarian rentang dapat dibangun di sekitarnya. Tujuannya adalah untuk menghindari berurusan dengan geometri mesh langsung dan berkonsentrasi pada cloud titik A - hubungan cloud titik B. Cloud titik A: titik kueri, awan titik B: pusat sel mesh.

tmaric
sumber
Bisakah Anda mengklarifikasi apa yang Anda maksud ketika mengatakan "menyortir sehubungan dengan (apa pun) mesh" Apakah Anda mencari algoritma binning, (berapa banyak poin di setiap sel)?
Szabolcs
Saya tidak mengerti pertanyaan Anda dengan jelas, apa tujuan dari menyortir poin? Seperti membuat mesh lebih teratur?
Shuhao Cao
Ada titik awan terpisah yang tersebar di jala volume yang tidak terstruktur. Saya perlu mengkomunikasikan data dari pusat sel ke cloud titik dan sebaliknya.
tmaric
1
@ tomislav-maric: Bisakah Anda menulis solusi Anda sebagai jawaban, dan kemudian menerima jawaban Anda sendiri? Prosedur ini umumnya merupakan praktik yang diterima untuk menjawab pertanyaan Anda secara efektif, daripada menambahkan tag "[ASK]" ke pertanyaan; juga, itu akan memberi Anda lebih banyak reputasi, karena orang-orang dapat meningkatkan jawaban Anda.
Geoff Oxberry

Jawaban:

8

Catatan penting: Jawaban ini tidak menjawab pertanyaan aktual, tetapi dibiarkan tidak terhapus per permintaan. Dengan malu saya bingung heksahedral dan heksagonal. Pertanyaannya adalah tentang menyortir titik menjadi sel heksahedral sewenang-wenang dalam 3D sementara solusi ini mengurutkan poin menjadi sel heksagonal biasa dalam 2D, atau yang tidak teratur yang sesuai dengan beberapa tesselation Voronoi di dimensi apa pun. Metode ini hanya berlaku jika mesh yang dihasilkan sebagai Voronoi tesselation di tempat pertama (yang tampaknya merupakan pendekatan yang sering digunakan ).


Saya tidak yakin apa yang Anda maksud dengan menyortir di sini, tapi saya berasumsi Anda ingin menyortir titik menjadi tempat sampah heksagonal di pesawat.

Mathematica adalah apa yang saya ketahui, jadi saya akan menunjukkan kepada Anda bagaimana melakukannya di Mathematica, tetapi metode ini dapat diangkut ke sistem lain. Idenya adalah bahwa kisi heksagonal adalah ganda dari yang segitiga: itu dapat dihasilkan sebagai diagram Voronoi dari suatu titik dalam pengaturan segitiga. Suatu titik dari awan adalah milik segi enam yang diberikan jika lebih dekat ke pusat segi enam itu daripada ke pusat segi enam lainnya.

Metode ini akan bekerja untuk jerat dengan bentuk yang berbeda juga, asalkan mereka dapat dihasilkan sebagai diagram Voronoi dari beberapa pengaturan titik. (Misalnya, segi enam tidak perlu teratur.)


Mari kita hasilkan mesh. Ini adalah kisi segitiga:

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]

Grafik Mathematica

Dual adalah hexagonal yang kami tertarik:

DiagramPlot[points, LabelPoints -> False]

Grafik Mathematica

Ini membangun fungsi nfyang menemukan indeks pusat segi enam yang paling dekat dengan titik cloud. Ini adalah kunci dari metode ini:

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

Sekarang mari kita buat cloud 1000 poin acak dan urutkan dengan nf:

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

indices = First /@ nf /@ cloud;

indicesberisi indeks pusat yang paling dekat dengan setiap titik cloud. Ini adalah informasi yang kami butuhkan. Sekarang kita bisa membuat histogram dari mereka ...

Histogram[indices]

Grafik Mathematica

... atau warna masing-masing ...

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

Grafik Mathematica

... atau lakukan visualisasi mewah apa pun yang kita inginkan.

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 - #] &)]

Grafik Mathematica


Titik kunci di sini adalah fungsi yang menemukan titik terdekat dengan sesuatu ( Nearest). Mathematica memiliki ini bawaan, tetapi ada kemungkinan sistem Anda tidak. Jika ini masalahnya, lihat pertanyaan ini tentang cara menerapkan fungsi seperti itu secara efisien (atau ikuti saja penerapan waktu linear yang naif jika Anda tidak memiliki banyak poin untuk diproses).

Szabolcs
sumber
Terima kasih banyak! Pada dasarnya yang saya butuhkan adalah hubungan yang menunjukkan koneksi antara setiap titik dan "bin" seperti yang Anda sebut (kotak heksahedral 3 dimensi). Apa yang Anda sarankan nampak sangat menarik, tetapi saya berurusan dengan jerat jutaan kotak dan ratusan ribu poin yang berpotensi .. Pertanyaannya adalah berapa biayanya lebih tinggi: pembuatan mesh ganda atau bekerja dengan kotak pembatas "tempat sampah" dan menggunakan kd pohon untuk pencarian. Saya sangat baru dalam topik ini, jadi saya benar-benar tidak ingin pergi ke arah yang salah.
tmaric
k
Jangan benar-benar menghapusnya, seseorang mungkin merasa berguna! :) Ini mungkin berubah menjadi solusi untuk masalah, hanya saja saya belum bisa menerimanya sampai saya membacanya.
tmaric
Dan terima kasih atas jawaban terinci seperti itu, jika saya bisa, saya akan memberi Anda lebih banyak poin! :)
tmaric
@ tomislav-maric Melihat suara, saya khawatir jawaban saya akan mengurangi kemungkinan Anda mendapatkan yang berguna, atau akan berkontribusi pada kesalahpahaman. Saya pikir ini lebih produktif jika saya hapus.
Szabolcs