在Cocos2d中获得Bezier曲线问题的导数

时间:2011-05-27 01:33:26

标签: iphone cocos2d-iphone bezier

在cocos2d中,您可以使用ccBezierConfig在Bezier路径中移动精灵。这不是我的问题,我有一个导弹,我试图让它垂直于曲线上的那个点旋转。我暂时想不通,然后我的朋友告诉我衍生物。现在我需要明显地找到贝塞尔曲线的导数。我在Google上搜索并在此页面上找到了它: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是我试图旋转的导弹。我真的很困惑这个衍生的东西(换句话说,我真的很迷茫和困惑)。我需要帮助试图弄清楚什么是错的...对不起,代码很乱,方程式很长,我可以想办法让它不那么混乱。

1 个答案:

答案 0 :(得分:2)

实际上我不明白你是如何选择衍生品并将其放入浮动的。那是因为比较曲线是二维参数曲线(它有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。所以实际上它只不过是三阶的两个多项式。三次贝塞尔曲线的传统形式是

enter image description here

注意,这里的B(t)是二维矢量(x(t),y(t))。因此,如果你有一个传统方式定义Bezier曲线,你可以通过评估系数x0,x1和son on将它转换为form1。

如果你现在在form1中定义了Bezier曲线,那么很容易得到导数:

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))。

以下是系数: enter image description here

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