int count = 12; // number of control vertices int cap=64; // size of array containing control vertices int gr=6; // current maximum for recursion calls int pts=count*round(pow(2,gr)); float[] x = new float [cap]; float[] y = new float [cap]; float[] vx = new float [cap*round(pow(2,6))]; float[] vy = new float [cap*round(pow(2,6))]; int j=0; float Px = 0.0; float Py = 0.0; // current mouse position int bi=-1; // index of selected vertex, -1 if none selected float lx, ly; // last point of span float[] tt = new float [8]; // values ot Jarek's offset for each recursion float l=10.0; int time=0; int animating =0; int col=0; color black = color(0, 0, 0); color soft = color(250, 240, 190); color red = color(200, 0, 0); color green = color(0, 200, 0); color blue = color(0, 0, 200); color yellow = color(250, 250, 130); color green1 = color(0, 150, 0); color green2 = color(50, 200, 50); color green3 = color(100, 250, 100); color [] cols = new color[6]; color blue1 = color(0, 0, 150); color blue2 = color(50,50, 200); color blue3 = color(100,100, 250); void setup() { size(600, 600, P3D); // window size and 3D for (int i=0; i-1) {x[bi]=mouseX; y[bi]=mouseY;}; // snap selected vertex to mouse position during dragging if (animating==1) {time++; if (time==pts) {time=0;}; translate(300, 300, 450); translate(0.0, 9.0, (300-mouseY)/4); rotateX(75*PI/180); rotateZ(PI*(mouseX-300)/400); rotateZ(-PI/2-atan2(vy[vn(time)]-vy[vp(time)],vx[vn(time)]-vx[vp(time)])); translate(-vx[time], -vy[time]); paintRoad(); paintRunner(); } else { stroke(black); strokeWeight(1.0); // draws thinner bundary in black beginShape(POLYGON); for (int i=0; i100) { // if closest vertex is too far bd=600*600; // reinitilize distance squared for (int i=0; ibi; i--) {x[i+1]=x[i]; y[i+1]=y[i]; }; // shift down the rest bi++; x[bi]=Px; y[bi]=Py; count++; // insert new vertex at mouse position pts=count*round(pow(2,gr)); }else {bi=-1;}; // nothing selected }; make(); } void mouseReleased() { // do this when mouse released if ((bi!=-1) && ((x[bi]<0)||(x[bi]>600)||(y[bi]<0)||(y[bi]>600))) // if outside of port { for (int i=bi; ibx) {bx=x[i];}; if (x[i]by) {by=y[i];}; if (y[i]abs(y[n(i)]-y[i])) {float dy=(y[n(i)]-y[i])/2; y[n(i)]-=dy; y[i]+=dy;} else {float dx=(x[n(i)]-x[i])/2; x[n(i)]-=dx; x[i]+=dx;} }; }; if (key=='b') {for (int i=0; i<7; i=i+1) {tt[i]=0.0;};}; // bspline paremeters if (key=='f') {for (int i=0; i<7; i=i+1) {tt[i]=1.0;};}; // four-point paremeters if (key=='j') {for (int i=0; i<7; i=i+1) {tt[i]=0.5;};}; // jarek paremeters if (key=='s') {tt[1]=2.2; tt[2]=-1.0; tt[3]=-2.0; tt[4]=-2.0; tt[5]=-2.0; tt[6]=-2.0; }; // non-uniform paremeters for z-curve if (key=='-') {gr=gr-1; if (gr<0) {gr=0;}; pts=count*round(pow(2,gr));}; if (key=='=') {gr=gr+1; if (gr>6) {gr=6;}; pts=count*round(pow(2,gr));}; // adjust recursion level if (key=='[') {tt[gr]=tt[gr]-0.2;}; if (key==']') {tt[gr]=tt[gr]+0.2;}; // adjust parameters for that recursion level if (key==',') {for (int i=0; i<7; i=i+1) {tt[i]=tt[i]-0.2;}; }; if (key=='.') {for (int i=0; i<7; i=i+1) {tt[i]=tt[i]+0.2;}; }; // adjust all parameters if (key=='m') {println(); make(); }; if (key=='a') {animating= 1-animating; time=0;}; if (key=='z') {l=l/2;}; if (key=='x') {l=l*2;}; // adjust length of force make(); }; void make() { j=0; for (int i=0; i