2013-06-18 6 views
0

По какой-то нечетной причине приведенный ниже код не дает желаемого эффекта. Синусоида отлично и функциональна, а фрагмент кода ниже отлично работает, за исключением движения вперед, которое является толстым.Проблема с линейной анимацией

Я использую millis() и делясь на 1000, чтобы преобразовать в секунды, но эффект по-прежнему создает то, что я ожидаю от формы, используя функцию second() - синусоидальное движение вперед каждые 1 секунду. Я хочу, чтобы линии двигались горизонтально плавно, так как линия синусоиды вертикально. Что я сделал не так?

int cyclesBeforeStopping = 4; 
int distanceBeforeStopping = 400; 

float frequency = 0.2; // in Hz 
float peak = 25; // Highest point of wave 
float trough = 275; // Lowest point of wave 
float amplitudeOffset; 
float forwardOffset; 

float timeUntilStop = (1/frequency) * cyclesBeforeStopping; 

void setup(){  
    size(600,300); 
    frameRate(50); 

    forwardOffset = ForwardOffset(); 
} 

void draw(){ 
    background(255); 

    float forwardOffsetNow = forwardOffset * (millis()/1000); 

    // Guidelines 
    line(50 + forwardOffsetNow, peak, 100 + forwardOffsetNow, peak); 
    line(50 + forwardOffsetNow, trough, 100 + forwardOffsetNow, trough); 

    // Sine line 
    float newPosition = NewPosition(); 
    line(50 + forwardOffsetNow, newPosition, 100 + forwardOffsetNow, newPosition); 
} 

float ForwardOffset() { 
    float forwardOffsetVar = (distanceBeforeStopping)/timeUntilStop; 
    return forwardOffsetVar; 
} 

float NewPosition() { 
    float omega = TWO_PI * frequency; 
    float amplitude = trough - peak; 
    float halfway = peak + amplitude/2; 

    float newPosition = halfway - (amplitude * sin(omega * millis()/1000)/2); 

    return newPosition; 
} 
+0

Оказывается, что 'millis()/1000! == millis() * 0.001'. По какой-то причине деление, кажется, выводит округленное число до целого числа, тогда как умножение не округляет. Это отвечает на мой вопрос, но я не стану отмечать этот вопрос как ответ, пока не узнаю, почему расчеты ведут себя таким образом. Если кто-нибудь знает, почему это происходит, было бы действительно интересно узнать, почему! –

ответ

0

Один дот решение :) просто сделать:

float forwardOffsetNow = forwardOffset * (millis()/1000.);//mind the dot after 1000 

, а также:

float newPosition = halfway - (amplitude * sin(omega * millis()/1000.)/2); 

Это называется целочисленное деление, хорошо документированы в вики устранения неполадок Processing в, here.

Этого можно избежать, используя точку или п после номера, как:

millis()/1000.; 

или

millis()/1000.0; 

или

millis()/1000f; 

Все будет работать.

+0

Ответ чемпиона! огромное спасибо –

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