我在actionscript中创建了这个类,它返回bezier的一个给定点。我想要实现的是得到当前点的角度。我在网上找了一下,但没找到多少。我该怎么做呢?
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);
}发布于 2012-09-11 02:26:36
给定:
点B是由p0、p1和p2在时间t描述的二次贝塞尔曲线上的点。
q0是由p0和p1在时间t处描述的线性贝塞尔曲线上的点。
q1是由p1和p2在时间t处描述的线性贝塞尔曲线上的点。
q0和q1之间的线段在点B处与二次贝塞尔曲线相切。
因此,时间t处贝塞尔曲线的角度等于q0和q1之间的线段的斜率。
维基百科有一个lovely gif演示了这一点。黑点是点B,绿色线段的端点是q0和q1。
对于更高维度的bezier曲线,原理是相同的。若要查找N次贝塞尔曲线上点的角度,请查找q0和q1,它们是N次贝塞尔曲线上控制点p0、p1、...、p(N-1)和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)发布于 2013-06-11 16:50:09
在Kevin的解释之后,我做了一个动态但简单的解决方案:
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);
}https://stackoverflow.com/questions/12357200
复制相似问题