2015-12-02 6 views
1

Мой код the ball moving in a Bezier Curve from start to the middle of the curve является:Перемещение вдоль кривой Безье в обработке

 void ballMove() 
    { 

     if(y[0]==height*1/10) 
     { 

     bezier (x[0], y[0],x[1], y[1], x[2], y[2], x[3], y[3]); 
     float x0; float x1; float x2; float x3; 
    float y0; float y1; float y2; float y3; 

    x0 = x[0]; x1 = x[1]; x2 = x[2]; x3 = x[3]; 
    y0 = y[0]; y1 = y[1]; y2 = y[2]; y3 = y[3]; 


    float t = (frameCount/100.0)%1; 
     float x = bezierPoint(x0, x1, x2, x3, t); 
     float y = bezierPoint(y0, y1, y2, y3, t); 

     if(t>=0.5) 
     { 
     t=0; 
     } 

     while(t==0.5) 
    { 
     a=x; 
     b=y; 
    } 
     while(t>0.5) 
     { 
     ellipse(a,b,30,30); 
     } 
     fill(255,0,0); 
     if(t!=0) 
     { 
     ellipse(x, y, 15, 15); 
     } 
     } 
    } 

Я определил все, что в настройках, рисовать и т.д., но я хочу, чтобы запустить мяч от начала до середины кривой Безье только один раз при нажатии пробела.

Текущая версия показывает мне цикл. Как я могу это сделать?

Пробовал все как возврат, разрыв, изменение параметра t и т. Д., Но код не работает. Я новичок в обработке.

Есть ли у вас какие-либо предложения?

+0

Можете ли вы опубликовать [MCVE] (http://stackoverflow.com/help/mcve) вместо отключенного метода? –

ответ

0

Самая большая ошибка, которую вы делаете, меняет значение t после того, как вы рассчитали x и y положения красного шара. Чтобы этого избежать, сначала нужно вычислить t между [0, 1] в вашем случае [0, 0.5], а затем изменить это значение в соответствии с состоянием вашей программы.

Вторая ошибка, которую вы сделали при расчете t от frameCount. Во-первых вы используете по модулю для извлечения чисел [0, 50], а затем отобразить его в диапазоне [0, 0,5], как этот

float t = (frameCount % 50) * 0.01; 

Вы также упоминали, что вы хотите повторить эту анимацию после нажатия какой-то ключ. Для этого вам понадобится метод keyPressed и некоторые глобальные переменные для представления состояния программы и сохранения исходного кадра анимации (потому что frameCount следует читать только). Таким образом, базовая функциональность может быть достигнута следующим образом:

boolean run = false; 
float f_start = 0; 

void ballMove() { 
    noFill(); 
    bezier (x0, y0, x1, y1, x2, y2, x3, y3); 

    float t = ((frameCount - f_start) % 50) * 0.01; 

    if (run == false) { 
    t = 0; 
    } 
    float x = bezierPoint(x0, x1, x2, x3, t); 
    float y = bezierPoint(y0, y1, y2, y3, t); 

    fill(255, 0, 0); 
    ellipse(x, y, 5, 5); 
} 

void keyPressed() { 
    run = !run; 
    f_start = frameCount; 
} 

Надеюсь, это вам поможет. В следующий раз pls отправит MCVE, поэтому нам не нужно бороться с вашим кодом.

Смежные вопросы