【问题标题】:Getting the derivative of a Bezier curve problem in Cocos2d在 Cocos2d 中获取贝塞尔曲线问题的导数
【发布时间】:2011-05-29 11:17:54
【问题描述】:

在 cocos2d 中,您可以使用 ccBezierConfig 在 Bezier 路径中移动精灵。但这不是我的问题,我有一枚导弹,并试图让它垂直于曲线上的那个点旋转。我有一段时间想不通,然后我的朋友告诉我衍生品。现在我显然需要找到贝塞尔曲线的导数。我在谷歌上搜索并在这个页面上找到了它:http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/bezier-der.html。所以我尝试用 3 种方法来实现旋转导弹:

-(float)f:(int)x {
    if (x == 0)
        return 1.0f;
    float result = 1;
    while (x>0) {
        result = result*x;
        x--;
    }
    return result;
}

-(float)B:(float)u i:(int)i n:(int)n {
    return ([self f:n])/([self f:i]*[self f:(n-i)])*pow(u, (float)i)*pow(1-u, (float)n-i);
}

-(void)rotateMissile:(float)delta {
    //Get bezier derivative...
    float y = [self B:missileP1.controlPoint_1.x i:0 n:2]+[self B:missileP1.controlPoint_2.x i:1 n:2]
                *2*(missileP1.controlPoint_1.x - missileP1.controlPoint_2.x);

    //Take the y and rotate it...
    missile1.rotation = atanf(y);

}

第一种方法适用于阶乘,第二种方法应该在方程导数中找到 B。第三种方法是通过使用 atanf 将斜率转换为度数来找到实际导数并旋转导弹。

rotateMissile 像这样被连续调用:

    [self schedule:@selector(rotateMissile:)];

missileP1 是 ccBezierConfig 对象。导弹 1 是我要旋转的导弹。我只是对这整个衍生事物感到非常困惑(换句话说,我真的很迷茫和困惑)。我需要帮助来找出问题所在...抱歉,代码很混乱,方程式很长,我可以想办法让它不那么混乱。

【问题讨论】:

    标签: iphone cocos2d-iphone bezier


    【解决方案1】:

    实际上,我不明白您如何将导数放入浮点数中。这是因为 Bizier 曲线是二维参数曲线(它具有 x 和 y 分量)。它不是函数 y(x)。在立方情况下是:

    x(t) = x0 + x1*t + x2*t*t + x3*t*t*t
    y(t) = y0 + y1*t + y2*t*t + y3*t*t*t
    

    我们称之为form1。所以实际上它只不过是两个三阶多项式。三次贝塞尔曲线的传统形式是

    注意,这里的 B(t) 是一个二维向量 (x(t), y(t))。因此,如果您有一个传统方式定义的贝塞尔曲线,您可以通过评估系数 x0、x1 和儿子将其转换为 form1。

    如果您现在在 form1 中定义了贝塞尔曲线,那么很容易得到导数:

    x'(t) = x1 + 2*x2*t + 3*x3*t*t
    y'(t) = y1 + 2*y2*t + 3*y3*t*t
    

    现在向量 (x'(t), y'(t)) - 是贝塞尔曲线上的速度。它也是曲线的切线向量。垂直向量将为 (-y'(t), x'(t)) 或 ((y'(t), -(x'(t)))。

    这里是系数:

    对于 y 系数,公式完全相同。它只会 py0, py1, py2, py3 而不是 px0, ... .

    【讨论】:

    • 是 x0, y0, y1, x1 控制点吗?是导弹的位置吗(在我的例子中)?
    • @anon:不,控制点是 P0、P1、P2、P3。但是计算x0,y0,x1,...,y3很简单。只需去掉括号并收集。 t 是曲线参数。你可以在这里阅读更多关于这个en.wikipedia.org/wiki/Bezier_curve
    • 既然我所做的只是在 Cocos2d 中给出分数(2 个影响点和终点),我怎么知道 x0-y3 相等?从我所看到的(我可能弄错了)x0 - y3 是常数。但是,这些常量的值是多少?我怎么知道在贝塞尔路径(导弹所遵循的路径)中的特定时间 t 应该等于多少。 (我知道 t 应该在 0 和 1 之间,但是当导弹完成 1/4 的行程时,t = 应该是多少?1/2?1/3?等等)。
    • O 等等,t 等于时间,所以如果我的动画持续时间是 1 秒:那么 t 在中途交叉 = 0.5 抱歉。但是,我仍然不明白如何找到常量。 :(
    • @anon: t 是一个参数,但是你可以把它当作一个时间。我已经更新了答案。
    猜你喜欢
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多