Bir eğri parçasının düzlüğünü ölçme (bir çoklu çizgi olarak gösterilir)


11

Ben bir otomatik yükseklik kontur etiketleme algoritması üzerinde çalışıyorum ve ben etiketleri pozisyonları karar verirken dikkate almak istediğiniz faktörlerden biri nasıl bir konturun belirli bir segment "düz" olmasıdır. Ne kadar düz olursa, etiketi o segmente yerleştirmek için kullanılması daha olasıdır.

Her kontur bir çoklu çizgi ile temsil edilir (ancak çıplak göze bir eğri gibi görünecek şekilde birbirine yakın noktaları olan). Daha sonra sabit bir uzunluğa (bir etiketin genişliği), örneğin 100 piksele sahibim. Rastgele (veya başka türlü) 100 piksel genişliğinde bir kontur segmenti seçersem, düzlüğünün sayısal bir nicel değerini elde etmek istiyorum (tamamen düz bir kontur segmenti için sıfır deyin, bir değer için sıfırdan büyük bir değer böylece düz segment ve çarpıklık arttıkça bu değer artar).

Yanıtları araştırdım ama gerçekten kullanışlı bir şey bulamadım. İşaretçiler için minnettar olurum.

Yanıtlar:


9

Cevap bağlama bağlıdır : yalnızca az sayıda (sınırlı) segmenti araştıracaksanız, hesaplamalı olarak pahalı bir çözüm elde edebilirsiniz. Bununla birlikte, bu hesaplamayı iyi etiket noktaları için bir tür arama içine dahil etmek isteyeceksiniz gibi görünüyor. Eğer öyleyse, aday hat segmenti biraz değiştiğinde, hesaplama açısından hızlı olan veya bir çözümün hızlı bir şekilde güncellenmesine izin veren bir çözüme sahip olmak büyük avantaj sağlar.

Örneğin, sistematik bir arama yapmak istediğinizi varsayalımP (0), P (1), ..., P (n) noktalarının bir sırası olarak temsil edilen bir konturun tüm bağlı bir bileşeni boyunca. Bu, bir işaretçi (diziye dizin) s = 0 ("başlangıç" için "s") ve başka bir işaretçi f ("bitiş" için) hangi mesafe (P (f), P (s))> = 100 ve sonra s (P (f), P (s + 1))> = 100 kadar ilerledikçe. Bu, bir aday çoklu hat (P (s), P (s +) üretir. 1) ..., P (f-1), P (f)) değerlendirme için. Bir etiketi desteklemek için "uygunluğunu" değerlendirdikten sonra, s'yi 1 (s = s + 1) arttırır ve f değerini (') f' ve s 's'ye bir kez daha minimum adayın üzerine çıkana kadar artırmaya devam edersiniz. 100 aralığı üretilir, (P (s '), ... P (f), P (f + 1), ..., P (f')) olarak temsil edilir. Bunu yaparken, P (s) köşeleri ... P (s ' Kondisyonun sadece düşürülen ve eklenen köşe noktaları bilgisinden hızla güncellenmesi son derece arzu edilir. (Bu tarama prosedürü s = n olana kadar sürdürülecektir; her zamanki gibi, f'nin işlemde n'den 0'a "sarılmasına" izin verilmelidir.)

Bu düşünce , aksi halde cazip olabilecek birçok olası fitness önlemini ( sinuosity , tortuosity , vb.) L2 tabanlı önlemleri tercih etmemize neden olur , çünkü temeldeki veriler biraz değiştiğinde genellikle hızlı bir şekilde güncellenebilir. İle bir analoji alınması Ana Bileşen Analizi (daha iyi olduğu küçük istendiği gibi), aşağıdaki ölçü eğlendirmek önerir: iki daha küçük olanı kullanır özdeğerler ve kovaryans matrisinokta koordinatları. Geometrik olarak, bu, çoklu çizginin aday bölümü içindeki köşelerin "tipik" yan yana sapmasının bir ölçüsüdür. (Bir yorum, karekökünün, çok çizginin köşelerinin ikinci atalet momentlerini temsil eden elipsin daha küçük yarı ekseni olmasıdır .) Yalnızca eşdoğrusal köşe kümeleri için sıfıra eşit olacaktır; aksi takdirde sıfırı aşıyor. Bir çizginin başlangıcı ve bitişi tarafından oluşturulan 100 piksel taban çizgisine göre ortalama bir yan yana sapmayı ölçer ve böylece basit bir yorumu vardır.

Kovaryans matrisi sadece 2 x 2 olduğu için, özdeğerler tek bir kuadratik denklem çözülerek hızla bulunur. Ayrıca, kovaryans matrisi, bir çoklu çizgideki köşelerin her birinden gelen katkıların toplamıdır. Bu nedenle, noktalar atıldığında veya eklendiğinde hızlı bir şekilde güncellenir , bu da n-nokta konturu için bir O (n) algoritmasına yol açar: bu, uygulamada öngörülen oldukça ayrıntılı konturlara iyi ölçeklenecektir.

İşte bu algoritmanın sonucuna bir örnek. Siyah noktalar konturun köşeleridir. Kesintisiz kırmızı çizgi, bu kontur dahilinde uçtan uca uzunluğun en iyi aday çokgen segmentidir. (Sağ üstteki görsel olarak belirgin aday yeterince uzun değil.)

şekil


Vay canına, beni orada kaybettin :). Sistematik arama konusunda haklısın, zaten her bir çoklu çizgi / poligon tepe noktasının tanjantını elde etmek için bunu yapmak zorundayım (yatay etiketler dikey olanlara tercih edilir), bu yüzden teoride bu aramayı diğer ölçümleri kapsayacak şekilde genişletebilirim. BTW: Örnek bir grafiği gerçek bir algoritma kullanarak mı yoksa manuel olarak mı ürettiniz?
Igor Brejc

1
Çizim gerçektir, ancak kullandığım uygulama kovaryans güncelleme prosedürünü kullanmaz ve bu nedenle hesaplama açısından optimal değildir.
whuber

2

2
Igor, etiket yönünün serbest olduğunu söylemeliyim: elipsin ana ekseninin (daha büyük özdeğerle ilişkili özvektör) yönü ile verilir. Bu nedenle, etiket yönelimi ve kontur bölümü doğrusallığının en iyi kombinasyonunu eşzamanlı olarak verimli bir şekilde arayabilirsiniz.
whuber

3

Bilgisayar grafikleri topluluğunda, genellikle bir nesnenin etrafında bir sınırlayıcı kutu bulmak gerekir. Sonuç olarak, bu hızlı algoritmalar ile iyi çalışılmış bir sorundur. Örneğin, Wikipedia'nın Minimum sınırlama kutusu algoritmaları makalesine bakın . Çoklu çizginizi çevreleyen minimum alan dikdörtgenini bulabilir ve daha sonra dikdörtgenin en boy oranını, yükseklik / uzunluğunu kullanabilirsiniz. Daha kesin bir ölçü almak için, çoklu çizginin bu sınırlayıcı dikdörtgenin merkez çizgisinden sapmasına bakabilirsiniz.


1
Min kullanmayı düşündüm. ancak iki problem görüyorum: a) gerçekten minimum (ve böylece döndürülmüş) bir kutu hesaplamanın hesaplama karmaşıklığı, b) aynı en boy oranına sahip iki eğri parça çok farklı bir eğriliğe sahip olabilir (sinüzoidal düşünün aynı genlik ancak farklı dalga dönemleri ile eğri).
Igor Brejc

1
Sizi burada CBS sayfalarında görmek güzel Joseph!
whuber

1
Evet, şu anda
elimdeki

1
Hoşgeldiniz için teşekkürler, herkes! :-) Benim önerimin ideal bir önlem olmadığını, ancak kodlamanın hazır olduğunu (doğru rafa sahipseniz) anlıyorum. Bu tür bir sorun, işlenmiş bir parçanın kalitesini ölçmeleri gereken imalat bağlamlarında biraz çalışılmıştır.
Joseph O'Rourke

3

Bunun yardımcı olup olmadığını bilmiyorum, ya da bir cevap olarak sayılsa bile, burada otururken az önce gönderdiğim soruyu düşünürken, bir düşüncem vardı:

Kontur çizginize belirli bir yarıçapa sahip bir daire yerleştirirseniz ne olur? Bu daire en az iki yerden kontur çizgisiyle kesişecektir. Çizgi ne kadar düz olursa, iki kavşak noktası arasındaki kontur çizgisi boyunca mesafe o kadar kısa olur. Kontur çizgisi boyunca kesişim noktaları arasındaki mesafe ne kadar uzun olursa, çizgi o kadar kıvrımlı olur. İkiden fazla kesişme noktası varsa, kontur çizgisi çok kıvrımlıdır.

Hangi uzunluğun en iyi doğruluk göstergesini vereceğini anlayabilir ve her kontur çizgisi boyunca adım atmak için bir rutin oluşturabilir ve yeterince düz olduğu yere etiketi yerleştirebilirsiniz.

Eminim bu çok yardımcı olmaz ve kullandığınız programlama dilinde İngilizce olarak söylediğim çok daha zordur, ancak bir başlangıç ​​olabilir mi?


İlginç fikir. Daha basit hale getirmek için, bir taraftaki parçanın uzunluğu ile başlangıç ​​ve bitiş noktaları arasındaki mesafe arasındaki oranı hesaplayabilirsiniz. O kadar kesin değil, ama hesaplaması hızlı. Ve bir daire kullanma fikriniz, düzlüğün daha kesin bir şekilde hesaplanmasını sağlayacaktır.
Igor Brejc

3

Düşünebildiğim en kolay yaklaşım, başlangıç ​​ve bitiş arasındaki gerçek yol uzunluğu ile başlangıçtan bitiş noktasına en kısa mesafe (düz çizgi) arasındaki orandır. Düz çizgiler bire yakın oranlara sahip olurken, çok eğri çizgiler çok yüksek bir orana sahip olacaktır.

Bunun uygulanması gerçekten kolay bir çözüm olmalıdır.


Güncelleme: Mike'ın fark ettiği gibi, bu Sinuosity'ye eşit olacaktır .

resim açıklamasını buraya girin


Rex'in cevabını okuduktan sonra aklıma ne geldi :)
Igor Brejc

4
temelde sinuosity
Mike T

aynen :) ....
underdark

2
Bunu uygulamak kolay olacaksınız, çünkü uzunluğun etikete uygun segmentleri ararken güncellenmesi, birbirini izleyen köşeler arasında uzunluk eklemek ve çıkarmak kadar basittir. Bununla birlikte, sinuosite, bir eğrinin doğrusallıktan ayrılabileceği duygusunu etkili bir şekilde yakalamaz. Örneğin, 100 çaplı bir yarım daireyi, 1 çaplı bir yarım daire biçimli doğrusal bir sekansla karşılaştırın : her iki eğri de aynı sinüoziteye sahiptir, ancak ilkinin yan yana sapması, ikincinin 100 katıdır (bu güzel bir temel olacaktır) etiket için).
whuber

Çoklu çizginiz bir daire çiziyorsa, bu yöntemin size istenen sonuç olmayan sonsuz bir sinuosite vereceğini dikkate alın.
obchardon

1

"Eğrilik" ve "çoklu çizgi" yi arayarak, bu bilgiyi aldım Bir çoklu çizginin eğriliğini nasıl bulabilirim? . Orada eğrilik tanımına geri dönmeyi önerdi - K= DF/Ds. Burada Fkastettiği gibi phi, ya Tda wikipedia'nın gösterimi ( http://en.wikipedia.org/wiki/Curvature ).

Diyelim ki üç puanlık bir diziniz var, p0, p1 ve p2. noktaların birbirine yakın olduğu varsayılarak s, s ( Ds) deltası olan p0 ve p1 arasındaki mesafeyi hesaplayın . Daha sonra DTp0 ve p1 arasındaki birim teğetsel vektörde değişiklik olan T ( ) deltasına ihtiyacınız vardır . Sofistike bir yol olabilir, ancak p0-> p1, p1-> p2 olmak üzere iki bağlayıcı almayı düşünebileceğim ham yöntem, her birinin bir uzunluğa sahip olması için normalleştirin, sonra bu ikisinin vektör çıkarılmasını alın ve ardından büyüklüğü belirleyin. Öyle DT. Bölme bir eğrilik verir K0_1. hesaplamak için p1, p2 ve p3'ü alın K1_2vb.

Eğer konturu bir işlenmiş piksel olarak değil, bir çoklu çizgi olarak alırsanız merak ediyorum. 100 piksel dedin ki beni biraz endişelendirsin.


Bağlantı için teşekkürler, arkasındaki matematik üzerinde çalışmak zorunda kalacağım. 100px'ten bahsettim, işlenen etiket metni belirli bir genişliğe (piksel olarak) sahip olduğundan, 100px sadece bir örnektir.
Igor Brejc

Eğriliği düşünmek güzel bir fikirdir. Yeterli uzunlukta ağır düzleştirilmiş kontur bölümleri boyunca eğrilik uygun olabilir, ancak eğriliğin kendisi uygun değildir: örneğin, tek bir küçük zig-zag çok yüksek eğriliğe sahip olurdu, ancak genel olarak önemsiz olurdu. Böylece, aslında, çoklu çizginin bölümleri arasındaki doğrusallıktan sapmanın bazı istatistiki özetini kullanırsınız. Muhtemel adaylar arasında eğrilik, gerçekleştirilmesi daha karmaşık hesaplamalardan biri olacaktır.
whuber
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.