2012-04-03 17 views
10
Birisi burada

Bezier Curves paralel Hatlarında "Kinks" Algılama

Kink in Line Parallel to Bezier Curve

görebileceğiniz gibi bana bir Bezier eğrisi için bir çizgi çizilir paralel karışıklığı tespit etmek için bir hesaplama ucuz yöntem anlamaya yardım edeceğini umuyordum

Yapmak istediğim, kinkin kesişme noktasını, kesişmeden önce bir başlangıç ​​noktası olan segmenti ve kıvrımdan sonra bir bitiş noktasına sahip olan birinci segmenti belirleyebilecektir. Bu sayede gereksiz parçaları kolayca kaldırabilir ve kesişme noktasında buluşacak ilk ve son segmentleri ayarlayabilirim.

Yanlış terimleri kullanıyorum özür dilerim. Ama anladığım kadarıyla, bu segmentleri yerleştirme şeklim, Bezier eğrisi (sarı) için parçaların birim vektörünü belirleyerek ve ofsetle çarparak ve iki yeni başlangıç ​​ve bitiş noktası oluşturmak için normal vektörü bulmakla ofset segmenti için (beyaz).

Matematik benim güçlü takımım değil, bu yüzden birisinin bana doğru yönde bir itme gücü vermesini umuyorum.

DÜZENLEME: Eğer burada bahsettiğimi görünce zor anlar yaşıyorsanız eğer öyleyse görüntü aslında HTML tarafından yeniden boyutlandırılmıştır doğrudan bağlantı var: bir ilk yaklaşım olarak http://i.stack.imgur.com/xtils.png

+0

Güzel diyagram. Bezier'in kendini geçtiği durumda ne yapmak istersiniz? –

+1

Bu gibi durumlarda özel bir şeye ihtiyacım yok. –

+0

math.stackexchange.com adresindeki çocuklar bu konuda size yardımcı olmak için daha donanımlı olabilirler. –

cevap

5

ait radius of curvature hesaplamak senin Bezier curve. Ofset, eğrilik yarıçapına eşit veya daha büyükse, bir bükülme aramalısınız.

Spesifik olarak, kontrol noktaları P0, P1, P2, P3 ile bir Bezier: Ne imzalı biçimde kavis yarıçapı yazılmıştır

B(t) = P0 * (1-t)^3 + P1 * 3*t*(1-t)^2 + P2 * 3*t^2*(1-t) + P3 * t^3 
-> B'(t) = (P1-P0) * 3*(1-t)^2 + (P2-P1) * 6*t*(1-t) + (P3-P2) * 3*t^2 
-> B''(t) = (P2+P0-2*P1) * 6*(1-t) + (P3+P1-2*P2) * 6*t 

let: cross2d(p, q) = p.x*q.y - p.y*q.x 
then, radius of curvature = |B'(t)|^3/cross2d(B'(t), B''(t)) 

; işaret, eğriyi bekleyebileceğiniz eğri tarafını göstermelidir.

Not: sıfır eğrilik yarıçapına veya sonsuz eğrilik yarıçapına sahip olabilirsiniz; Bunun yerine 'u signed_offset * cross2d(B'(t), B''(t)) ile karşılaştırmak daha iyi olabilir.

+0

Müthiş. Bu işe yarayacak gibi görünüyor. Bir deneyeyim ve sana geri döneceğim. Beni bir süre alabilir.:) +1 –

+0

Bu aptalca bir soru ise beni affet ama matematik gibi benim güçlü takımım değil. Cross2d (p, q) fonksiyonunuz, P puanımın x ve y koordinasyonlarının B, B 've B' fonksiyonlarının olmadığını not eder. Bu, her bir eksen için bunları bir kez çalıştırdığım anlamına mı geliyor? –

+0

'B (t) ',' B '(t) ve' B' '(t)' 2-B hemen P0', 'P1',' 'P2' gibi vektörler ve 'P3' olmalıdır . Ayrıca, '| B' (t) | '2-D vektörünün uzunluğunu alması gerektiğini unutmayın. Bu bir 'Vector2' yapıya (veya şu anda 2-B noktaları için kullandığınız varolan herhangi bir yapı) kullanmak için muhtemelen en iyi, yani Bezier ağırlıkları birden çok kez yeniden hesaplamak için gerekmez. Ancak, skaler fonksiyonlar yazabilir ve isterseniz her bir eksen için çalıştırabilirsiniz. Vektör uzunluğunu ve cross2d() değerini hesaplarken tekrar birleştirmeniz gerektiğini unutmayın. – comingstorm