gpt4 book ai didi

actionscript-3 - 贝塞尔曲线上给定点的角度?

转载 作者:行者123 更新时间:2023-12-04 13:28:14 25 4
gpt4 key购买 nike

我在 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);
}

最佳答案

鉴于:

  • 控制点p0,p1,p2
  • 时间t

  • B点是在时间t由p0,p1和p2描述的二次贝塞尔曲线上的点。

    q0是线性贝塞尔曲线上在时间t由p0和p1表示的点。

    q1是在时间t由p1和p2描述的线性贝塞尔曲线上的点。

    q0和q1之间的线段与B点处的二次贝塞尔曲线相切。

    因此,在时间t的贝塞尔曲线的角度等于q0和q1之间的线段的斜率。

    维基百科上有一个 lovely gif来证明这一点。黑点是点B,绿线段的端点是q0和q1。

    对于较大尺寸的贝塞尔曲线,原理是相同的。要找到N度贝塞尔曲线上的点的角度,请找到q0和q1,它们是控制点[p0,p1,...,p(N-1)的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)

    关于actionscript-3 - 贝塞尔曲线上给定点的角度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12357200/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com