2012-09-10 20 views
6

मैंने इस वर्ग को एक्शनस्क्रिप्ट में बनाया है, यह बेजियर का एक दिया गया बिंदु देता है। और जो मैं हासिल करने की कोशिश कर रहा हूं वह वर्तमान बिंदु के कोण को प्राप्त करना है। मैंने इंटरनेट पर खोज की लेकिन मुझे ज्यादा नहीं मिला। मैं यह कैसे कर सकता हूँ?बेजियर वक्र पर दिए गए बिंदु का कोण?

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

आप गणित कर रहे हैं बिंदु ही प्राप्त करने के लिए, आप क्यों नहीं ले सकते ढलान खोजने के लिए व्युत्पन्न? फिर कोण खोजने के लिए atan2 ले लो? बीज़र घटता से बहुत परिचित नहीं है, इसलिए यह वास्तविक जवाब नहीं बना रहा है –

उत्तर

9

को देखते हुए:

  • नियंत्रण बिंदुओं p0, P1, P2
  • समय टी

बिंदु बी p0, p1 द्वारा वर्णित द्विघात बेज़ियर वक्र पर बिंदु, और समय टी पर पी 2।
q0 समय टी पर पी 0 और पी 1 द्वारा वर्णित रैखिक बेजियर वक्र पर बिंदु है।
q1 समय टी पर पी 1 और पी 2 द्वारा वर्णित रैखिक बेजियर वक्र पर बिंदु है।
Q0 और Q1 के बीच की रेखा खंड बिंदु बी

इसलिए में अपने द्विघात बेज़ियर वक्र को स्पर्श रेखा होती है, समय टी पर बेज़ियर वक्र के कोण Q0 और Q1 के बीच की रेखा खंड की ढलान के बराबर है।

विकिपीडिया में lovely gif इसका प्रदर्शन करता है। ब्लैक डॉट बिंदु बी है, और हरी रेखा खंड के अंत बिंदु q0 और q1 हैं।

सिद्धांत उच्च आयामों के बेजियर वक्र के समान है। एन-डिग्री बेजियर वक्र पर किसी बिंदु के कोण को खोजने के लिए, q0 और q1 खोजें, जो नियंत्रण बिंदुओं के लिए एन -1 डिग्री-डिग्री बेजियर वक्र पर बिंदु हैं [p0, p1, ..., p (N-1)] और [पी 1, पी 2, ..., पीएन]। कोण q0-q1 लाइन सेगमेंट की ढलान के बराबर है।

स्यूडोकोड में:

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

मुझे यह बताने के लिए धन्यवाद कि मुझे क्या करना होगा, मैं आपके कोड का उपयोग नहीं कर सका क्योंकि यह सीपीयू के लिए गहन होगा और यह पर्याप्त गतिशील नहीं था, इसलिए मैंने अपने समाधान पर अपना समाधान पोस्ट किया! – tversteeg

3

के बाद केविन से स्पष्टीकरण मैं एक गतिशील लेकिन सरल उपाय किए गए:

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); 
} 
संबंधित मुद्दे