2012-09-10 3 views
6

나는이 클래스를 actionscript에 만들었고, 베 지어의 주어진 점을 반환했다. 그리고 내가 성취하고자하는 것은 현재 포인트의 각도를 얻는 것입니다. 나는 인터넷에서 수색했지만별로 찾을 수 없었다. 어떻게해야합니까?베 지어 곡선에서 주어진 점의 각도?

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를 이용합니까? Beizer 곡선에 너무 익숙하지 않아서 실제 응답을하지 못합니다. –

답변

9

주어 : P2

  • 제어 점 P0, P1,
  • 시간 t

점 B P0, P1 설명 차 베지에 곡선의 포인트가되고 시간 t에서 p2.
q0는 시간 t에서 p0 및 p1에 의해 설명되는 선형 베 지어 곡선상의 점입니다.
q1은 시간 t에서 p1 및 p2로 설명되는 선형 베 지어 곡선의 점입니다. Q0 및 Q1 사이
선분 따라서 포인트 B.

객실 차 베지에 곡선의 접선 인 시각 t에서의 베 지어 곡선의 각은 Q0 및 Q1 사이의 선분의 기울기와 동일하다.

위키 피 디아에는 이것을 시연하는 lovely gif이 있습니다. 검정색 점은 점 B이고 녹색 선분의 끝점은 q0 및 q1입니다.

더 높은 차원의 베 지어 곡선에 대한 원리는 동일합니다. N도 베 지어 곡선에서 점의 각도를 찾으려면 제어점 [p0, p1, ..., p (N-1)에 대한 N-1도 베 지어 곡선의 점인 q0 및 q1을 찾습니다.)] 및 [p1, p2, ..., pN]을 생성한다. 각도는 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

CPU에 집중적으로 사용하기 때문에 코드를 사용할 수 없으므로 설명해 주셔서 감사합니다. 내 질문에 내 솔루션을 게시했습니다! – 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); 
}