Eğri boyunca bir grup düzenlenmemiş nokta sipariş etme


9

Ben bir eğri (yani, bir katı kenarı) ait bir 3D noktaları (sağlam bir gövdenin mozaikleme yapan bir kütüphaneden kurtarmak) bir dizi var. Bu, eğrinin kesinlikle bu noktaların her birinden geçtiği anlamına gelir.

Bununla birlikte, nokta kümesi düzensiz olduğundan, bu eğriyi doğru şekilde çizebilmek için bunları sıralamam gerekir.

Bu tür problemler için bilinen herhangi bir yaklaşım var mı?

Bazı ek bilgiler:

  • Eğriler genel olarak parametriktir (spline / bezier, daire dilimleri ..).
  • Noktalar kayan nokta koordinatları olarak verilmiştir.
  • Noktalar çok yoğun bir şekilde paketlenmiştir (ancak olmasını istediğim kadar yoğun olabilirler). Size bir fikir vermek için, 19 birimde x, 10 birimde x ve 5 birimde z olan bir eğri için, bir eğri segmentindeki bir nokta dizisini alıntılarım: (20.7622, ​​25.8676, 0) (20.6573, 25.856, 0) (20.5529, 25.8444, 0) (20.4489, 25.8329, 0) (20.3454, 25.8213, 0)

Düzeni bilsek bile, noktalara uyan sonsuz sayıda eğriye kadar. Ek kısıtlamalar eklesek bile, açık uçları teğet yönelimleri keyfi olabileceğinden sorunludur. Burada
joojaa

@joojaa Evet, haklısın. Ancak noktaların paketlenmesi çok yoğun olduğu için kesin olmasını beklemiyorum. Doğru sıraya sahip olursam, nokta sırasını bir çoklu çizgi olarak bağlamayı planlıyordum.
andrea.al

Noktaları sipariş etmesi gereken kodda, eğrinin parametrik formunun farkında mısınız? (Değilse, ilk cevabımı silerim, çünkü parametrik formu bilmenizi gerektirir.)
Martin Ender

@ MartinBüttner Evet, gerekirse eğrinin parametrik formuna erişimim var.
andrea.al

1
Lütfen tipik bir nokta seti gösterin!
Yves Daoust

Yanıtlar:


6

Organize olmayan noktalardan eğri rekonstrüksiyonu adı verilen bir sorun örneğiniz var . Şimdi ne arayacağınızı bildiğinize göre kabuk, NN kabuk gibi çeşitli yöntemler bulacaksınız. İşte birkaç bağlantı:

Eğrilerle uğraştığınızdan ve örnekler yoğun olduğundan, bir Öklid minimal yayılan ağaç hesaplamanızı öneririm.


4

Bazı açıklamalardan sonra, eğrinin parametrik biçimini bilmeyi bile gerektirmeyen ve ayrıca potansiyel olarak problemli sayısal minimizasyon adımından kaçınan çok daha iyi bir yaklaşım vardır.

Eğri kendi kendine kesişmiyorsa ve noktalar eğri üzerinde yeterince yoğun bir şekilde paketlenmişse (ve bu nedenle, eğri üzerinde aynı segmente ait olmayan herhangi bir iki noktadan daha yakın olmaları gerekiyorsa , örneğin eğri sarma ile) etrafında), daha sonra her bir numunenin önceki ve sonraki noktasını kolayca belirleyebilirsiniz:

  • Her noktaya en yakın iki komşuyu belirleyin. Bu bir işlemiO(nlogn) .
  • Uç noktalar için özel bir tedavi yapmanız gerekecek. En yakın iki komşuları , her iki tarafta bir tane olmak üzere eğri boyunca sonraki iki nokta olacaktır . Mesafelerin iki komşuya oranı bir eşik değerden farklıysa bunları sezgisel olarak tespit edebilirsiniz (1.5 diyelim, eğrinizin düzgünlüğüne ve noktaların ne kadar yoğun bir şekilde paketlendiğine bağlıdır). Veya en yakın komşu verilerinizi, bitiş noktalarının iki komşusunun birbirine işaret ettiğini (grafikte başka hiçbir yerde olmamalıdır) bir grafik olarak ele alabilirsiniz.
  • Şimdi sadece bir bitiş noktası seçebilir ve eğri boyunca noktaları geçmek için en yakın komşuları (her zaman gelmediğiniz birini seçerek) yürüyebilirsiniz.

Özellikle noktaları çok yoğun hale getirebiliyorsanız, eğri kendiliğinden kesişmediği sürece bu en güvenilir seçenek olmalıdır. Bu durumda bile, kendi kendine kesişim yeterince büyük bir açıda eğrinin yeterince pürüzsüz olması koşuluyla bu yaklaşım kurtarılabilir olabilir (bu durumda, ardışık adımların bir eşik değerden daha büyük bir açı yapamayacağı bir kısıtlamaya dayanarak doğru komşuları seçebilirsiniz. ).θ


3

Noktaların sadece kayan nokta temsillerini aldığınızdan, yuvarlama hataları nedeniyle bunların hala eğri üzerinde bulunduğuna dair bir garanti yoktur. Bu yüzden tek genel yaklaşım, eğri üzerinde numunenize en yakın noktayı bularak, eğrinin neresinde olduklarını tahmin etmektir . Örneğin parametrik eğriniz ise, simge durumuna küçültmeyi deneyebilirsiniz(X,Y,Z)(x(t),y(t),z(t))

(Xx(t))2+(Yy(t))2+(Zz(t))2

ile ilgili olarak . Ne tür bir eğri ile uğraştığınızı biliyorsanız, bunun için güzel analitik çözümler olabilir, aksi takdirde bazı sayısal algoritmalara başvurmanız gerekir. Noktalarınız eğriye çok yakın olması gerektiğinden, eğrinin (neredeyse) tam olarak kesiştiği bir örneğiniz yoksa, bu yöntem güvenilir olmalıdır (minimizasyon algoritması olması şartıyla). Bu durumda yine de şansın yok.t

Her puanınız için bu değerini aldıktan sonra , bunları sıralayabilirsiniz . Eğer puan almak nasıl üzerinde herhangi bir kontrol varsa Tabii ki, dönerek bu sorun her sidestep mümkün olabilir noktanın koordinatları ile birlikte hemen ederken onları üreten.ttt

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.