void setup(){ size(800,600); rectMode(CENTER_DIAMETER); noStroke(); } void loop(){ background(0); int limite = 70; translate(400,300,-3000); rotateY(linea(mouseX,0,width,0,TWO_PI)); rotateZ(linea(mouseY,0,height,0,TWO_PI)); float ancho=1000; Movim m=new Movim(); for(int j=-limite;j0.3 && distancia(anguy+HALF_PI,factor)>0.3){ return linea(distancia(angux,factor)+distancia(anguy+HALF_PI,factor),1,2,ancho,ancho*1.5); }else{ return ancho; } } float distancia(float valor, float factor){ float intervalo=TWO_PI/factor; float minimo=intervalo; for(int i=0;i<=factor;i++){ minimo=min(minimo,abs(intervalo*i-valor)); } float newval=linea(minimo,0,intervalo,1,0); newval = pow(newval,8); return (newval>0.3 ? newval : 0.3); } class Movim{ float totX,totY,totZ; float angX,angY,angZ; Movim(){ reiniciar(); } void reiniciar(){ totX=totY=totZ=angX=angY=angZ=0; } void deshacer(){ translate(-totX,-totY,-totZ); rotateX(-angX); rotateY(-angY); rotateZ(-angZ); reiniciar(); } } void esfera(float longitud, float latitud, float radio, Movim m){ rotateY(longitud); rotateX(latitud); m.angY+=longitud; m.angX+=latitud; translate(0,0,radio); m.totZ+=radio; } void cilindro(float angulo, float altura, float radio, Movim m){ rotateY(angulo); m.angY+=angulo; translate(0,altura,radio); m.totY+=altura; m.totZ+=radio; } float linea(float x,float x1, float x2, float y1, float y2){ return (x-x1)/(x2-x1)*(y2-y1)+y1; }