2016-02-11 6 views
0

Я пытаюсь получить анимированную спиральную кривую на Обработке, так что кривая постепенно создается внутри каждой функции draw(). Я успешно создал кривую как статическую форму - теперь я пытаюсь сделать еще один шаг вперед.Анимация кривой с помощью кривойVertex() на Proccesing

К сожалению, мой код, похоже, не работает, несмотря на мои усилия. Через некоторое время ожидания я получаю форму статическую снова вместе со следующим сообщением об ошибке:

Вы должны использовать beginShape() или beginShape (многоугольник) до curveVertex()

В отличие от этого сообщения, у меня уже есть() инструкция beginShape

Вот мой код (возможно, в неправильном месте?):

float x,y; 
float stepSize; 
float angle; 

int counter; 

void setup() { 
    size(900, 600); 
    background(255); 
    frameRate(30); 
    smooth(); 
    //noStroke(); 
    stroke(0); 

    x = 0; 
    y = 0; 
    stepSize = 6; 
    angle = radians(270); 
    counter = 0; 
} 

void draw() { 
    translate(width/3, height/2); 
    if (counter == 0) { 
    beginShape(); 
    curveVertex(x, y); // initial control point 
    } else { 
    if (stepSize > 1.0) { 
     curveVertex(x, y); 

     x = x + cos(angle) * stepSize; 
     y = y + sin(angle) * stepSize; 
     stepSize = stepSize * 0.99; 
     angle = angle - radians(1.5);  
    } else { 
     // return to previous x,y values for last control point 
     angle = angle + radians(1.5); 
     stepSize = stepSize/0.99; 
     y = y - sin(angle) * stepSize; 
     x = x - cos(angle) * stepSize; 

     curveVertex(x, y); // last control point 
     endShape(); 
    } 
    } 
    counter++; 
} 

Заранее благодарим за любую помощь, которую вы могли бы предоставить! - Илиас

ответ

0

Это кажется очень странным, чтобы попытаться разделить beginShape(), curveVertex(), endShape() группу между несколькими вызовами функции draw().

Вместо этого вы должны следить за каждой точкой, которую хотите нарисовать, - здесь может пригодиться ArrayList<PVector>. Чтобы нарисовать свою кривую, просто переберитесь за это ArrayList и нарисуйте каждую точку. Чтобы расширить кривую, просто добавьте к ней PVector.

float stepSize = 6.0; 
float angle= radians(270); 

ArrayList<PVector> points = new ArrayList<PVector>(); 

void setup() { 
    size(900, 600); 
    frameRate(30); 
    points.add(new PVector(0, 0)); 
} 

void draw() { 
    background(255); 

    translate(width/3, height/2); 

    //draw previous points 
    beginShape(); 
    for (PVector point : points) { 
    curveVertex(point.x, point.y); 
    } 
    endShape(); 

    if (stepSize > 1.0) { 
    //add a new point 
    PVector prevPoint = points.get(points.size()-1); 

    float x = prevPoint.x + cos(angle) * stepSize; 
    float y = prevPoint.y + sin(angle) * stepSize; 
    points.add(new PVector(x, y)); 

    stepSize = stepSize * 0.99; 
    angle = angle - radians(1.5); 
    } 
} 

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

+0

Спасибо, Кевин, за умный ответ! Мне так интересно узнать о расширенных циклах, о которых я раньше не знал ...;) –

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

  • Нет связанных вопросов^_^