2014-09-14 1 views
0

Работая в обработке, я пытаюсь создать свой первый генеративный патч. То, что я хочу, это начать рисовать круг где-то на экране (точка, следующая по пути круга), но после случайного промежутка времени кружок ломается, линия идет в случайном направлении в течение случайного промежутка времени , и начинает рисовать новый круг в другом месте.Как я могу справиться с рисованием круга, с разрывом этого круга и начать рисовать в другом месте?

Прямо сейчас у меня есть кружок, и у меня есть механизм переключения, который включается и выключается после случайного периода времени. Я не могу понять, как заставить его «ломаться» от этого оригинального круга, не говоря уже о том, чтобы он начал новый круг в другом месте. Кто-нибудь будет советоваться о том, как это сделать? Я думаю, что это может иметь интересный визуальный эффект.

Rotor r; 
float timer = 0; 
boolean freeze = false; 

void setup() { 
    size(1000,600); 
    smooth(); 
    noFill(); 
    frameRate(60); 
    background(255); 

    timeLimit(); 
    r = new Rotor(random(width),random(height),random(40,100)); 
} 

void draw() { 
    float t = frameCount/100.0; 
    timer = timer + frameRate/1000; 

    r.drawRotor(t); 

    if(timer > timeLimit()){ 
    timer = 0; 
    timeLimit(); 

    if(freeze == true){ 
     freeze = false; 
    }else{ 
     freeze = true; 
    } 

    background(255); 
    } 
} 

float timeLimit(){ 
    float timeLimit = random(200); 
    return timeLimit; 
} 

ротора Класс:

class Rotor { 

    color c; 
    int thickness; 
    float xPoint; 
    float yPoint; 
    float radius; 
    float angle = 0; 
    float centerX; 
    float centerY; 

    Rotor(float cX, float cY, float rad) { 
    c = color(0); 
    thickness = 1; 
    centerX = cX; 
    centerY = cY; 
    radius = rad; 
    } 

    void drawRotor(float t) { 
    stroke(c); 
    strokeWeight(thickness); 
    angle = angle + frameRate/1000; 
    xPoint = centerX + cos(angle) * radius; 
    yPoint = centerY + sin(angle) * radius; 
    ellipse(xPoint, yPoint,thickness,thickness); 
    } 


} 

ответ

0

Вызов background() обычно приходит как первое, что в розыгрыше. Это потому, что ничья отображается только в конце каждого цикла (кадра). Поэтому вызов bg в начале очистит все содержимое, нарисованное в последнем кадре. Если вам нужно упорствовать, ничьи желоба могут либо удалить звонок до background(), либо нарисовать ваши вещи в каждом кадре. Или еще рисуйте материал в PGraphics и покажите его.

Другое дело, что каждый раз, когда останавливается «Ротор», вы должны давать ему новые случайные координаты.

Если вы идете для удаления background() вызова это будет делать трюк:

Rotor r; 
float timer = 0; 
boolean freeze = false; 

void setup() { 
    size(1000,600); 
    smooth(); 
    noFill(); 
    frameRate(60); 
    background(255); 

    timeLimit(); 

    r = new Rotor(random(width),random(height),random(40,100)); 


} 

void draw() { 
    float t = frameCount/100.0; 
    timer = timer + frameRate/1000; 

    r.drawRotor(t); 

    if(timer > timeLimit()){ 
    timer = 0; 
    timeLimit(); 


    //***** here new coordinates!! 
    r = new Rotor(random(width),random(height),random(40,100)); 
    //***** 


    if(freeze == true){ 
     freeze = false; 
    }else{ 
     freeze = true; 
    } 



    //***** no background() 
    // background(255); 
    } 
} 

float timeLimit(){ 
    float timeLimit = random(200); 
    return timeLimit; 
} 

class Rotor { 

    color c; 
    int thickness; 
    float xPoint; 
    float yPoint; 
    float radius; 
    float angle = 0; 
    float centerX; 
    float centerY; 

    Rotor(float cX, float cY, float rad) { 
    c = color(0); 
    thickness = 1; 
    centerX = cX; 
    centerY = cY; 
    radius = rad; 
    } 

    void drawRotor(float t) { 
    stroke(c); 
    strokeWeight(thickness); 
    angle = angle + frameRate/1000; 
    xPoint = centerX + cos(angle) * radius; 
    yPoint = centerY + sin(angle) * radius; 
    ellipse(xPoint, yPoint,thickness,thickness); 
    } 


} 

теперь, если вам нужно, чтобы очистить экран, Вы можете сделать список (ArrayList?) И добавить новый ротор в это когда предыдущее сделано. Но вам нужно управлять ротором, чтобы он мог отображать его сам, не анимируя. Так что новый созданный Ротор будет оживлять, а старые будут просто показывать свою дугу без анимации. Или сделайте PGraphis без вызова bg и отобразите его на основном холсте, который может иметь bg-звонок ...

Обратите внимание, что, полагаясь на фрейм-фрейм, это зависит от производительности системы. Вы можете сделать то же самое, используя millis(), чтобы этого избежать. Пока что это не проблема, поскольку это еще очень легко, но может стать проблемой, если проект будет расти дальше.

1

Прежде всего, чтобы ответить на ваш вопрос о «разрыве» круга: вам нужно создать новый экземпляр rotor или просто изменить его свойства, такие как center и radius. Если бы я получил свою идею прямо вам просто нужно один экземпляр rotor так просто изменить эти значения:

r.centerX = newX; 
r.centerY = newY 
r.radius = random(40,100) //as you have in setup 

Но как вы можете вычислить новую позицию? Это может быть случайным, но вы хотите создать путь, чтобы его вычислить. И здесь идет сложная часть. Итак, как сделать соединительную линию и начать новый круг?

Сначала вам понадобятся два mode. Сначала нарисуем круг второй, нарисуем линию. Простейший способ добиться того, что является обновлением rotor метод рисования [Вы можете передать mode переменную в качестве параметра drawRotor функции или в качестве глобальной переменной]:

if(mode == 1){ 
    angle += frameRate/1000; 
}else{ 
    radius += 2; 
} 

Как вы можете видеть, что я просто различаются между увеличением угла нарисовать круг и увеличивая радиус для рисования линии (не в случайном направлении, а в направлении от центра).Затем нам нужно будет вычислить новое положение центра круга. Чтобы сделать это, мы просто вычислить, как он будет продолжать в соответствии с angle и заменителя нового radius так всю часть будет выглядеть следующим образом:

if(mode != 1){    
    float newR = random(40,100); 
    float newX = r.centerX + cos(r.angle) * (r.radius - newR); 
    float newY = r.centerY + sin(r.angle) * (r.radius - newR);  
    r.newPos(newX, newY); 
    r.radius = newR; //we cant change it earlier because we need also old value 
} 

Это будет происходить внутри вашей функции «время обработчика» только тогда, когда режим возврата к чертежу круг. Режим может быть просто изменена в обработчике

mode *= -1; //but need to be init to 1 inside setup() 

Если вы хотите, чтобы путь всегда виден только удалить background() функцию, но если вы хотите какой-нибудь классный эффект добавить это в попрошайничество draw()

noStroke();    //No stroke needed and you turn it on again in drawRotor() 
fill(255,255,255, 10); //This will set transparency to 10% 
rect(0,0,width,height); //You put layer after each "point" you draw 
noFill();    //This will restore fill settings as you have before 

enter image description here

Here Я вставляю весь код только для демонстрации, и вы должны изменить его в соответствии со своей собственной целью. Лучше закодировать собственную версию.

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