2014-09-14 5 views
0

En travaillant dans le traitement, j'essaye de construire mon premier patch génératif. Ce que je veux faire, c'est commencer à dessiner un cercle quelque part sur l'écran (un point suivant le chemin d'un cercle), mais après un laps de temps aléatoire, le cercle se brise, la ligne va dans une direction aléatoire pendant un laps de temps aléatoire et commence à dessiner un nouveau cercle ailleurs.Comment puis-je dessiner un cercle, faire ce cercle et commencer à dessiner ailleurs?

En ce moment, j'ai le cercle dessiné, et j'ai un mécanisme à bascule qui s'allume et s'éteint après une période de temps aléatoire. Je n'arrive pas à comprendre comment le faire «sortir» de ce cercle original, encore moins le faire démarrer un nouveau cercle ailleurs. Quelqu'un aurait-il des conseils sur la façon d'accomplir cela? Je pense que cela pourrait avoir un effet visuel intéressant.

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; 
} 

Classe rotor:

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); 
    } 


} 

Répondre

0

L'appel à background() vient habituellement comme première chose tirage au sort. C'est parce que le tirage ne se fait qu'à la fin de chaque boucle (frame). Donc appeler bg au début effacera toutes les choses dessinées dans la dernière image. Si vous avez besoin de persister, les trames de dessin peuvent soit supprimer l'appel à background(), soit dessiner vos images à chaque image. Ou encore dessiner des choses dans un PGraphics et l'afficher.

L'autre chose est que chaque fois que le 'Rotor' s'arrête, vous devriez lui donner de nouvelles coordonnées aléatoires.

Si vous allez pour enlever l'appel background() cela fera l'affaire:

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); 
    } 


} 

maintenant, si vous devez effacer l'écran, vous pouvez faire une liste (ArrayList?) Et ajouter un nouveau rotor quand le précédent est fait. Mais vous devez gérer le Rotor pour pouvoir l'afficher lui-même sans l'animer. Ainsi, le nouveau Rotor créé animera, et les anciens afficheront simplement leur arc sans l'animer. Ou faire un PGraphis sans appel à bg et l'afficher dans la toile principale qui peut avoir un appel bg ...

Une note de côté, sachez que le recours à frameRate à des choses fois fait fiable sur les performances du système. Vous pouvez faire la même chose en utilisant millis() pour éviter cela. Ce n'est pas un problème jusqu'à présent, car il est encore très léger, mais pourrait devenir un problème si le projet se développe davantage.

1

d'abord pour répondre à votre question sur « rupture » cercle: vous devez créer nouvelle instance rotor ou tout simplement modifier ses propriétés comme center et radius. Si je suis votre bonne idée que vous avez juste besoin d'une instance de rotor donc il suffit de changer ces valeurs:

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

Mais comment vous pouvez calculer nouvelle position? Cela peut être aléatoire, mais vous voulez créer un chemin, vous devez donc le calculer. Et voici la partie délicate. Alors, comment faire une ligne de connexion et commencer un nouveau cercle?

D'abord vous aurez besoin de deux mode. Premier dessinera le cercle deuxième tirera la ligne. Manière la plus simple d'y arriver est par la mise à jour rotor méthode de tirage [Vous pouvez passer mode variables en tant que paramètre de la fonction drawRotor ou variable globale]:

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

Comme vous pouvez le voir je diffère juste entre augmentation de l'angle pour dessiner le cercle et de plus en plus rayon pour dessiner la ligne (pas dans la direction aléatoire mais dans le sens du centre).Ensuite, nous aurons besoin de calculer la nouvelle position du centre du cercle. Pour ce faire, nous calculons simplement la façon dont il continuerait selon angle et y substituer de nouvelles radius volonté partie si tout ressemble à ceci:

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 
} 

Cela se produit à l'intérieur de votre fonction « gestionnaire de temps » que lorsque vous changez le mode de retour au dessin cercle. Mode peut être simple modifié dans gestionnaire

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

Si vous voulez avoir chemin toujours visible juste supprimer background() fonction mais si vous voulez un effet frais ajouter ceci à la mendicité des 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 Je colle le code entier juste pour la démonstration et vous devriez le modifier selon votre propre but. Mieux vaut coder sa propre version.