2012-09-10 17 views
6

Bu sınıfı actioncript içinde oluşturdum, bezerin belirli bir noktasını döndürür. Ve elde etmeye çalıştığım şey, mevcut noktanın açısını elde etmektir. İnternette aradım ama fazla bir şey bulamadım. Bunu nasıl yapabilirim?Bezier eğrisinde belirli bir noktanın açısı?

public static function quadraticBezierPoint(u:Number, anchor1:Point, anchor2:Point, control:Point):Point { 
    var uc:Number = 1 - u; 
    var posx:Number = Math.pow(uc, 2) * anchor1.x + 2 * uc * u * control.x + Math.pow(u, 2) * anchor2.x; 
    var posy:Number = Math.pow(uc, 2) * anchor1.y + 2 * uc * u * control.y + Math.pow(u, 2) * anchor2.y; 
    return new Point(posx, posy); 
} 
+2

, eğimi bulmak için türev? sonra açıyı bulmak için atan2'yi mi aldınız? Beizer eğrilerine çok fazla aşina değil, bu yüzden gerçek bir cevap vermiyor –

cevap

9

verilen: p2

  • kontrol noktası P0, P1,
  • süresi t

B noktası P0, P1 tarafından tarif edilen ikinci dereceden Bezier eğrisi üzerindeki nokta, ve p2 zamanda t.
q0, t zamanında p0 ve p1 tarafından açıklanan doğrusal bezier eğrisindeki noktadır.
q1, t zamanında p1 ve p2 tarafından açıklanan doğrusal bezier eğrisindeki noktadır. Q0 ve q1 arasında
çizgi parçasının Bu nedenle B noktasına

de ikinci dereceden Bezier eğrisine teğet olan, zaman t Bezier eğrisinin açısı Q0 ve q1 arasındaki çizgi parçasının eğimi eşittir.

Wikipedia bunu lovely gif göstermektedir. Siyah nokta B noktasıdır ve yeşil çizgi segmentinin uç noktaları q0 ve q1'dir.

Prensip, daha yüksek boyutlardaki bezier eğrileri için aynıdır. N dereceli bir bezier eğrisindeki bir noktanın açısını bulmak için, kontrol noktaları için N-1 derece bezier eğrilerindeki noktalar olan q0 ve q1 öğelerini bulun [p0, p1, ..., p (N-1)] ve [p1, p2, ..., pN]. Açı q0-q1 çizgi segmentinin eğimine eşittir. pseudocode

:

def bezierCurve(controlPoints, t): 
    if len(controlPoints) == 1: 
     return controlPoints[0] 
    else: 
     allControlPointsButTheLastOne = controlPoints[:-1] 
     allControlPointsButTheFirstOne = controlPoints[1:] 
     q0 = bezierCurve(allControlPointsButTheLatOne, t) 
     q1 = bezierCurve(allControlPointsButTheFirstOne, t) 
     return (1-t) * q0 + t * q1 

def bezierAngle(controlPoints, t): 
    q0 = bezierCurve(controlPoints[:-1], t) 
    q1 = bezierCurve(controlPoints[1:], t) 
    return math.atan2(q1.y - q0.y, q1.x - q0.x) 
+0

Ne yapmam gerektiğini açıkladığın için teşekkür ederim, kodunuzu kullanamadım çünkü CPU için yeterince yoğun ve yeterince dinamik değildi. Benim çözümüme sorumu gönderdim! – tversteeg

3

Kevin'den açıklama ı dinamik ama basit bir çözüm yapılmış sonra: Neden alamaz sen noktayı kendisi için biraz hesap yapıyorsanız

public static function quadraticBezierAngle(u:Number, anchor1:Point, anchor2:Point, control:Point):Number { 
    var uc:Number = 1 - u; 
    var dx:Number = (uc * control.x + u * anchor2.x) - (uc * anchor1.x + u * control.x); 
    var dy:Number = (uc * control.y + u * anchor2.y) - (uc * anchor1.y + u * control.y); 
    return Math.atan2(dy, dx); 
} 
İlgili konular