Получение производной задачи кривой Безье в Cocos2d - PullRequest
2 голосов
/ 27 мая 2011

В cocos2d вы можете перемещать спрайт по пути Безье, используя ccBezierConfig. Хотя это не моя проблема, у меня есть ракета, и я пытаюсь заставить ее вращаться перпендикулярно этой точке кривой. Я не мог понять это некоторое время, а потом мой друг рассказал мне о производных. Теперь мне нужно найти производную кривой Безье, по-видимому. Я искал в Google и нашел его на этой странице: http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/bezier-der.html. Итак, я попытался реализовать вращение ракеты тремя способами, вот они:

-(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. missile1 - это ракета, которую я пытаюсь повернуть. Я просто очень запутался во всей этой производной вещи (другими словами, я действительно потерян и растерян) Мне нужна помощь, чтобы выяснить, в чем дело ... Извините, что код грязный, уравнения длинные, и я могу найти способ сделать его менее грязным.

1 Ответ

2 голосов
/ 27 мая 2011

На самом деле я не понимаю, как вы берете производную и помещаете ее в плавающее число.Это потому, что кривая Бизье является двумерной параметрической кривой (она имеет компоненты 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)).Так, если у вас есть кривая Безье, определенная традиционным способом, вы можете преобразовать ее в форму form1, вычислив коэффициенты x0, x1 и son.

Если теперь у вас есть кривая Безье, определенная в форме 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)).

Вот коэффициенты: enter image description here

Для коэффициентов y формула полностью идентична, она просто будет py0, py1, py2, py3 вместо px0, ....

...