Altı yüzlü hücrelerin yapılandırılmamış ağına göre bir puan bulutunu sıralayın


11

Soru

Yapılandırılmamış altı yüzlü hücre ağına göre bir puan bulutunu nasıl sıralarsınız?

Her hücrenin bir merkezi ve onu temsil eden benzersiz bir etiketi vardır. Temelde iki bulut noktası vardır (orijinal nokta bulutu ve hücre merkezlerinin bir nokta bulutu), ancak hücre geometrisi bilgileri (sınırlama kutusu) kullanımda olabilir, emin değilim.

Sonuçlar

Bazı soruları sordum ve literatürü araştırdım:

ağ altı yüzlü ve yapılandırılmamışsa, sorun dikey bir aramaya indirgenir. Bu amaçla, çoğunlukla kd ağaçları kullanılır. Mesh, bir oktree veri yapısına dayanarak rafine edilirse, aralık arama algoritması onun etrafında oluşturulabilir. Amaç, doğrudan kafes geometrisi ile uğraşmaktan kaçınmak ve nokta bulutu A - noktası bulut ilişkisi B üzerinde yoğunlaşmaktır. Nokta bulutu A: sorgu noktaları, nokta bulutu B: kafes hücre merkezleri.


"Her türlü örgü ile ilgili sıralama" derken ne demek istediğinizi açıklayabilir misiniz? Bir binning algoritması mı arıyorsunuz (her hücrede kaç nokta var)?
Szabolcs

Sorunuzu tam olarak anlayamıyorum, puanları sıralamanın amacı nedir? Örgüyü daha düzenli yapmak gibi mi?
Shuhao Cao

Yapılandırılmamış hacim ağının karşısında dağılmış ayrı bir nokta bulutu vardır. Hücre merkezlerinden nokta buluta ve tersi yönde veri aktarmam gerekiyor.
tmaric

1
@ tomislav-maric: Lütfen çözümünüzü bir cevap olarak yazıp kendi cevabınızı kabul eder misiniz? Bu prosedür, soruya "[SOLVED]" etiketini eklemek yerine kendi sorunuzu etkili bir şekilde cevaplamak için kabul edilen uygulamadır; ayrıca, size daha fazla itibar kazandıracaktır, çünkü insanlar cevabınızı yükseltebilir.
Geoff Oxberry

Yanıtlar:


8

Önemli not: Bu cevap vermez değil gerçek soruya cevap ama sol istek başına silinmemiş edildi. Utanç verici bir şekilde altı yüzlü ve altıgen karıştı. Soru, noktaları 3B'de rastgele altı yüzlü hücrelere ayırmakla ilgilidir , bu çözüm, 2B'de normal altıgen hücrelere veya herhangi bir boyuttaki bazı Voronoi tesselasyonuna karşılık gelen düzensiz hücrelere işaret eder. Bu yöntem yalnızca ağ ilk etapta bir Voronoi tesselasyonu olarak üretildiyse uygulanabilir (ki bu nadiren kullanılan bir yaklaşım gibi görünüyor ).


Burada sıralayarak ne demek istediğinizden emin değilim, ama noktayı uçaktaki altıgen kutulara ayırmak istediğinizi varsayıyorum.

Mathematica bildiğim şey, bu yüzden size Mathematica'da nasıl yapılacağını göstereceğim, ancak yöntem diğer sistemlere taşınabilir. Fikir, altıgen bir kafesin üçgen olanın ikisidir: üçgen düzenlemede bir noktanın Voronoi diyagramı olarak üretilebilir. Buluttaki bir nokta, herhangi bir altıgenin ortasına diğer altıgenin ortasından daha yakınsa belirli bir altıgene aittir.

Bu yöntem, bir nokta düzenlemesinin Voronoi diyagramı olarak üretilebildiği sürece farklı şekillerdeki kafesler için de çalışacaktır. (Örneğin altıgenlerin düzenli olması gerekmez.)


Kafes oluşturalım. Bu bir üçgen kafes:

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]

Mathematica grafikleri

İkili, ilgilendiğimiz altıgentir:

DiagramPlot[points, LabelPoints -> False]

Mathematica grafikleri

Bu, bir nfbulut noktasının en yakın olduğu altıgen merkezin dizinini bulan bir işlev oluşturur . Yöntemin anahtarıdır:

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

Şimdi 1000 rastgele noktadan oluşan bir bulut oluşturalım ve bunları şu şekilde sıralayalım nf:

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

indices = First /@ nf /@ cloud;

indicesher bulut noktasının en yakın olduğu merkezlerin endekslerini içerir. İhtiyacımız olan bilgiler bu. Şimdi onlardan bir histogram yapabiliriz ...

Histogram[indices]

Mathematica grafikleri

... ya da her birini boyayın ...

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

Mathematica grafikleri

... ya da istediğimiz her türlü fantezi görselleştirmeyi yapabiliriz.

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

Mathematica grafikleri


Burada kilit nokta, bir şeye ( Nearest) en yakın noktayı bulan işlevdi . Mathematica'da yerleşik olarak bulunur, ancak sisteminizin bulunma ihtimali vardır. Bu durumda, lütfen böyle bir işlevi etkili bir şekilde nasıl uygulayacağınızla ilgili bu soruya bakın (veya sadece işlenecek çok fazla puanınız yoksa naif doğrusal zaman uygulamasına geçin).


Çok teşekkürler! Temelde ne gerek her nokta ve "bin" olarak adlandırılan (3 boyutlu altı yüzlü kutusu) arasında bir bağlantı gösteren bir ilişkidir. Ne önermek çok ilginç görünüyor, ama ben milyonlarca kutu ve potansiyel olarak yüz binlerce nokta örgü ile ilgileniyorum .. Soru daha pahalı olduğunu: çift örgü oluşturma veya "kutuları" sınırlama kutuları ile çalışma ve bir kd kullanma ağaç arıyor. Bu konuda çok yeniyim, bu yüzden gerçekten yanlış yöne gitmek istemiyorum.
tmaric

k

Kesinlikle silmeyin, birisi yararlı bulabilir! :) Sorunun çözümü için pout dönüşebilir, sadece ben okuyana kadar kabul edemem.
tmaric

Ve bu kadar ayrıntılı bir cevap için teşekkürler, eğer yapabilseydim sana daha fazla puan verirdim! :)
tmaric

@ tomislav-maric Oylara baktığımda, cevabımın faydalı bir cevap alma şansınızı azaltacağından ya da yanlış anlaşılmaya katkıda bulunacağından endişeleniyorum. Ben silersem daha verimli olur diye düşünüyorum.
Szabolcs
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.