I began with a single curve and moving it in a circle around the center. I then modified the curve to go in and out of the circle to different radii. Next I flipped the in and out movement to be a back and forth movement. Lastly, I added some twist to every other point and exaggerated these twists and extensions.
This assignment pushed my ability to completely understand my code as I was writing it. When I hit a happy accident, I made sure to really think through how my change had affected the output.
/* * sapeck_LineWalk.pde * A drawing consisting of a single continuous line * Originally created by sapeck 2021-09-07 * CMU 60-428 F21 Drawing With Machines */ import processing.svg.*; float[] radii = { .5, 1, 2, 3, 4, 5, 6, 7, 6, 5, 4, 3, 2, 1 }; int MULTIPLIER = 30; int OUTER = 10; int OUTER_TWIST = 50; int DIVISIONS = radii.length * MULTIPLIER; int SMALLER_COORD = min(width, height); void setup() { size(1056, 816); // Letter: 11"x8.5" at 96 DPI. noLoop(); } void draw() { background(255); beginRecord(SVG, "sapeck-LineWalk.svg"); stroke(0); noFill(); // Don't create duplicate shapes! beginShape(); int current_radius = 0; for (int i = 0; i < (2*DIVISIONS)+3; i++) { float radius = OUTER; if (i % 2 == 0) radius = radii[current_radius]; float offset = 0; if (radius != OUTER) offset -= ((OUTER - radii[current_radius])/max(radii)) * MULTIPLIER*2*PI/DIVISIONS; float theta = i*2*PI/DIVISIONS + offset; float scale =(radii[current_radius]*SMALLER_COORD/2); if (radii[current_radius] == max(radii)) theta -= OUTER_TWIST*2*PI/DIVISIONS; float x = width/2 - scale*cos(theta); float y = height/2 - scale*sin(theta); curveVertex(x, y); current_radius++; if (current_radius == radii.length) current_radius = 0; } endShape(CLOSE); endRecord(); saveFrame("sapeck-LineWalk.png"); }