// generate a Koch-curve between two starting points with level l ArrayList kochCurve(int l, PVector start, PVector end) { ArrayList c = new ArrayList(); c.add(start); c.add(end); if (l > 0) insertPoints(c, 0, l); return c; } // insert points i, j, k into list c at interval, // possibly dive into next level // j // . . // . . // . . // a.....i k.....b int insertPoints(ArrayList c, int interval, int level) { int npoints = 0; PVector a, b, i, j, k; // get a and b from list a = (PVector) c.get(interval); b = (PVector) c.get(interval+1); // calculate i, j, and k i = new PVector((2.0*a.x + b.x) / 3.0, (2.0*a.y + b.y) / 3.0 ); k = new PVector((a.x + 2.0*b.x) / 3.0, (a.y + 2.0*b.y) / 3.0 ); j = new PVector(((a.x + b.x) / 2.0) + (b.y-a.y)*sqrt(3.0)/6.0, ((a.y + b.y) / 2.0) - (b.x-a.x)*sqrt(3.0)/6.0); // insert new points into list at correct position c.add(interval+1, i); c.add(interval+2, j); c.add(interval+3, k); // dive into next level if remaining level if (--level > 0) { // iterate over the 4 new intervals for (int m = 0; m < 4; m++) // insert and count points of deeper levels for interval npoints += insertPoints(c, interval+npoints+m, level); } // return number of inserted points (3 from current level, npoints from deeper levels) return npoints+3; }