blase-13-9-65
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 | // blase ur, imitation of 13/9/65 Nr. 2 by Frieder Nake void setup() { size(500,500); } void draw() { // defining the circles int circlesNumber = 9; int circlesMaxSize = 100; float circlesLeftBias = 0.85; // the circles seem to be biased towards the left // defining the horizontalish lines int linesNumber = 9; int linesAverageSegments = 7; float linesMaxChange = 0.12; float linesTolerance = 0.4; float linesVerticalTolerance = height/linesAverageSegments*0.1; // create a background background(255,255,255); // draw circles drawCircles(circlesMaxSize,circlesLeftBias,circlesNumber); // draw lines (randomly choosing vertical vs. spider) float[] prevl = {0,0,width,0}; // prev1 is the previous line (going from the top), and nextl is the next one. float[] nextl; // we keep track of this so we can connect them with lines for(int n=0; n<linesNumber; n++) // loop through the horizontalish lines { nextl = linePoints(linesAverageSegments, linesMaxChange, linesTolerance, height/(linesNumber+1)*(n+1)+random(linesVerticalTolerance*-1,linesVerticalTolerance)); drawLines(nextl); // draw the horizontalish line makeLines(prevl,nextl); // draw the vertical or spider lines in between the previous and current line prevl = nextl; } float[] lastl = { 0,height,width,height }; makeLines(prevl,lastl); // draw the vertical or spider lines in between the previous and the bottom of the screen delay(2796); } void makeLines(float[] p, float[] n) // this function decides where to put lines from left to right, setting their boundaries. it then randomly calls the vertical or spider lines function to draw those lines { float minwidth = width*.05; float maxwidth = width*.15; int howmany = round(random(2,7)); int h = 1; float[] startSpots = new float[howmany]; float[] endSpots = new float[howmany]; startSpots[0] = random(0,width-maxwidth); endSpots[0] = startSpots[0] + random(minwidth,maxwidth); boolean found = false; while(h<howmany) { float candidatestart = random(0,width-maxwidth); float candidatestop = candidatestart + random(minwidth,maxwidth); found = false; // this is a sentinel variable to make sure we don't have groups of either spider or vertical lines overlapping from left to right for(int t=0; t<h; t++) { if(((startSpots[t]candidatestart)) || ((startSpots[t]candidatestop))) { found = true; break; } } if(!found) // we're not overlapping, so randomly choose either vertical or spider and then call the function to draw it { startSpots[h] = candidatestart; endSpots[h] = candidatestop; if(random(1)<0.5) { verticalLines(startSpots[h],endSpots[h],p,n); } else { spiderLines(startSpots[h],endSpots[h],p,n); } h = h+1; } } } void verticalLines(float spot1, float spot2, float[] p, float[] n) // draw vertical lines between the lines defined by p and n between the horizontal coordinates spot1 and spot2 { int minlines = 7; int maxlines = 14; int numlines = int(random(minlines,maxlines)); // println("making " + numlines + " lines bw " + spot1 + " and " + spot2); for(int k=0; k<numlines; k++) // choose points { float xcoords = random(spot1, spot2); line(xcoords, giveYcoord(xcoords,p), xcoords, giveYcoord(xcoords,n)); } } void spiderLines(float spot1, float spot2, float[] p, float[] n) // draw spider lines between the lines defined by p and n between the horizontal coordinates spot1 and spot2 { int minlines = 2; int maxlines = 7; int bottomlines = int(random(minlines,maxlines)); int toplines = int(random(minlines,maxlines)); for(int k=0; k<bottomlines; k++) // choose points for bottom { float xcoords = random(spot1, spot2); float xcoords1 = random(spot1, spot2); float xcoords2 = random(spot1, spot2); line(xcoords, giveYcoord(xcoords,p), xcoords1, giveYcoord(xcoords1,n)); line(xcoords, giveYcoord(xcoords,p), xcoords2, giveYcoord(xcoords2,n)); } for(int k=0; kpts[i]) { i = i+2; } float totalRun = pts[i] - pts[i-2]; float totalRise = pts[i+1] - pts[i-1]; return pts[i-1] + (x-pts[i-2])/totalRun*totalRise; } void drawLines(float[] pts) // draw horizontalish lines { int i = 2; while(pts[i]!=0) { line(pts[i-2],pts[i-1],pts[i],pts[i+1]); i += 2; } } float[] linePoints(int seg, float change, float tol, float startingHeight) // generate a set of points defining the segments for the horizontalish lines. returns in the form {x0,y0,x1,y1,x2,y2,...} { float variance = width/seg*tol; float[] pts = new float[100]; pts[0] = 0.0; pts[1] = startingHeight; int xi = 0; while(pts[xi]width) { pts[xi] = width; // next x pts[xi+1] = pts[xi-1] + (width-pts[xi-2])*delta; // next y } else { pts[xi] = pts[xi-2] + nextSeg; // next x pts[xi+1] = pts[xi-1] + nextSeg*delta; // next y } } return pts; } void drawCircles(int maxsize, float leftbias, int howmany) // draw howmany number of non-overlapping circles of random diameter up to maxsize { int circlek = 0; float[] prevradius = new float[howmany]; float[] prevx = new float[howmany]; float[] prevy = new float[howmany]; while(circlek<howmany) { int circleSize = int(random(1,maxsize)); int hCenter; if(random(1)<leftbias) // more circles seemed to be on the left in the original. copy that by biasing towards the left side of the screen { hCenter = int(random(1+circleSize/2,width/2-1)); } else { hCenter = int(random(width/2,width-1-circleSize/2)); } int vCenter = int(random(1+circleSize/2,height-1-circleSize/2)); boolean allcool = true; for(int a = 0; a<circlek; a++) // make sure we don't overlap { if(sqrt(sq(prevx[a]-hCenter)+sq(prevy[a]-vCenter)) = sum of radii { allcool = false; break; } } if(allcool) // we don't overlap { prevradius[circlek] = circleSize/2; prevx[circlek] = hCenter; prevy[circlek] = vCenter; noFill(); ellipse(hCenter, vCenter, circleSize, circleSize); circlek = circlek+1; } } } |
Comments Off on blase-13-9-65