Hier je me baladais dans les exemples, et je suis tombé sur celui de l'opengl, geometry.
j'ai décortiqué le code, mais impossible pour moi, noob avancé, de trouver comment il tordaait les formes...
j'ai vu comment les formes étais créé, comment les donnés était rangé, mais pas vu ou l'on pliait les formes
Voici le code :
/** * Geometry * by Marius Watz. * * Using sin/cos lookup tables, blends colors, and draws a series of * rotating arcs on the screen. */ import processing.opengl.*; // Trig lookup tables borrowed from Toxi; cryptic but effective. float sinLUT[]; float cosLUT[]; float SINCOS_PRECISION=1.0; int SINCOS_LENGTH= int((360.0/SINCOS_PRECISION)); // System data boolean dosave=false; int num; float pt[]; int style[]; void setup() { size(1024, 768, OPENGL); background(255); // Fill the tables sinLUT=new float[SINCOS_LENGTH]; cosLUT=new float[SINCOS_LENGTH]; for (int i = 0; i < SINCOS_LENGTH; i++) { sinLUT[i]= (float)Math.sin(i*DEG_TO_RAD*SINCOS_PRECISION); cosLUT[i]= (float)Math.cos(i*DEG_TO_RAD*SINCOS_PRECISION); } num = 150; pt = new float[6*num]; // rotx, roty, deg, rad, w, speed style = new int[2*num]; // color, render style // Set up arc shapes int index=0; float prob; for (int i=0; i<num; i++) { pt[index++] = random(PI*2); // Random X axis rotation pt[index++] = random(PI*2); // Random Y axis rotation pt[index++] = random(60,80); // Short to quarter-circle arcs if(random(100)>90) pt[index]=(int)random(8,27)*10; pt[index++] = int(random(2,50)*5); // Radius. Space them out nicely pt[index++] = random(4,32); // Width of band if(random(100)>90) pt[index]=random(40,60); // Width of band pt[index++] = radians(random(5,30))/5; // Speed of rotation // get colors prob = random(100); if(prob<30) style[i*2]=colorBlended(random(1), 255,0,100, 255,0,0, 210); else if(prob<70) style[i*2]=colorBlended(random(1), 0,153,255, 170,225,255, 210); else if(prob<90) style[i*2]=colorBlended(random(1), 200,255,0, 150,255,0, 210); else style[i*2]=color(255,255,255, 220); if(prob<50) style[i*2]=colorBlended(random(1), 200,255,0, 50,120,0, 210); else if(prob<90) style[i*2]=colorBlended(random(1), 255,100,0, 255,255,0, 210); else style[i*2]=color(255,255,255, 220); style[i*2+1]=(int)(random(100))%3; } } void draw() { background(0); int index=0; translate(width/2, height/2, 0); rotateX(PI/6); rotateY(PI/6); for (int i = 0; i < num; i++) { pushMatrix(); rotateX(pt[index++]); rotateY(pt[index++]); if(style[i*2+1]==0) { stroke(style[i*2]); noFill(); strokeWeight(1); arcLine(0,0, pt[index++],pt[index++],pt[index++]); } else if(style[i*2+1]==1) { fill(style[i*2]); noStroke(); arcLineBars(0,0, pt[index++],pt[index++],pt[index++]); } else { fill(style[i*2]); noStroke(); arc(0,0, pt[index++],pt[index++],pt[index++]); } // increase rotation pt[index-5]+=pt[index]/10; pt[index-4]+=pt[index++]/20; popMatrix(); } } // Get blend of two colors int colorBlended(float fract, float r, float g, float b, float r2, float g2, float b2, float a) { r2 = (r2 - r); g2 = (g2 - g); b2 = (b2 - b); return color(r + r2 * fract, g + g2 * fract, b + b2 * fract, a); } // Draw arc line void arcLine(float x,float y,float deg,float rad,float w) { int a=(int)(min (deg/SINCOS_PRECISION,SINCOS_LENGTH-1)); int numlines=(int)(w/2); for (int j=0; j<numlines; j++) { beginShape(); for (int i=0; i<a; i++) { vertex(cosLUT[i]*rad+x,sinLUT[i]*rad+y); } endShape(); rad += 2; } } // Draw arc line with bars void arcLineBars(float x,float y,float deg,float rad,float w) { int a = int((min (deg/SINCOS_PRECISION,SINCOS_LENGTH-1))); a /= 4; beginShape(QUADS); for (int i=0; i<a; i+=4) { vertex(cosLUT[i]*(rad)+x,sinLUT[i]*(rad)+y); vertex(cosLUT[i]*(rad+w)+x,sinLUT[i]*(rad+w)+y); vertex(cosLUT[i+2]*(rad+w)+x,sinLUT[i+2]*(rad+w)+y); vertex(cosLUT[i+2]*(rad)+x,sinLUT[i+2]*(rad)+y); } endShape(); } // Draw solid arc void arc(float x,float y,float deg,float rad,float w) { int a = int(min (deg/SINCOS_PRECISION,SINCOS_LENGTH-1)); beginShape(QUAD_STRIP); for (int i = 0; i < a; i++) { vertex(cosLUT[i]*(rad)+x,sinLUT[i]*(rad)+y); vertex(cosLUT[i]*(rad+w)+x,sinLUT[i]*(rad+w)+y); } endShape(); }
Hors ligne
Salut,
Les Look Up Tables (sinLUT et cosLUT) ont un seul intérêt, alléger les temps de calcul. Toutes les valeurs de sinus et cosinus sont précalculées dans le setup() et rangées dans des tableaux pour ne pas avoir à les recalculer à chaque fois. Tout ça est utilisé pour fixer la position des éléments en coordonnées polaires.
Dans le setup(), les paramètres pour chaque arcs (il y a *num* arcs) sont définis : axe de rotation, taille, largeur, vitesse, etc. ainsi que les styles. Ces paramètres sont rangés dans deux tableaux : pt et style.
Ensuite à chaque évaluation de la boucle draw(), les arcs sont dessinés par une suite de petits quadrilatéres. Ce sont les fonctions arcLine, arcLineBars et arc qui gérent l'affichage des trois types d'éléments. beginShape(QUADS) et beginShape(QUAD_STRIP) sont deux manières de définir un quadrilatère en fonctions de points (vertex)
Tu peux modifier ces fonctions ou en rajouter pour obtenir des formes différentes!
Une image (mieux qu'un long discours?) en rajoutant stroke(255) dans les fonctions de dessin, on voit les petits quads, les "pointillés" sont fait avec beginShape(QUADS) et les arcs continus avec beginShape(QUAD_STRIP) ... Et cet exemple est vraiment excellent, merci Marius Watz!
Hors ligne
merci pour toutes ces explications, je regarde pour appliquer un décalage au niveau des couleur qui sera donné par mon ipod( le décalage)
pour ça je vais faire passer les couleur de RVB en TSL, appliqué mon décalage sur la teinte, puis repassé en RGB, qu'en penses tu ?
Hors ligne
TSL c'est le meilleur modèle pour faire des rotations de couleurs. D'ailleurs, si ça peut t'être utile, voila une fonction que j'ai faite pour prendre une couleur moyenne en TSL (la fonction est extraite telle quelle d'un programme donc il faut la simplifier, enlever la moyenne pondérée entre autre). L'intérêt, c'est que si une de tes valeurs vaut 3 et l'autre 254, le résultat sera 1, et la couleur résultante sera bien entre les deux (une bête moyenne donnerait 129, et une couleur qui ne correspond pas). Le principe est de prendre la couleur moyenne dans l'intervalle le plus court, le spectre étant continu. Enfin, tu en verras peut-être l'intérêt assez vite
void modifyColor(color cBall) { float hCell = hue(cellColor); float hBall = hue(cBall); float hNew; // new blended color // always blend colors with the shortest distance in hue spectrum // colors are weighted average + a ball is half a "score 1" cell if (abs(hCell - hBall) < 128) { hNew = (hCell * max(score, 1) * 2 + hBall) / (max(score, 1) * 2 + 1); // weighted average } else { if (hCell > hBall) { hNew = (((255 - hCell + hBall) / (max(score, 1) * 2 + 1)) + hCell)%255; } else { hNew = (((255 - hBall + hCell) / (max(score, 1) * 2 + 1)) + hBall)%255; } } colorMode(HSB); cellColor = color (hNew, saturation(cellColor), brightness(cellColor)); ball.setColor(cellColor); colorMode(RGB); }
Hors ligne
Pages: 1