// draw levy fractal of given DEGREE over line from (X1,Y1) // to (X2,Y2) void levy(int x1, int y1, int x2, int y2, int degree) { if ( degree <= 0 ) line(x1, y1, x2, y2); else { double baseAngle = (x1 == x2) ? pi / 2 : atan(abs(y2 - y1) / abs(x2 - x1)); double side = sqrt(double(sqr(x2 - x1) + sqr(y2 - y1))) / 2; double cos_side = side * (cos(baseAngle) - sin(baseAngle)); double sin_side = side * (cos(baseAngle) + sin(baseAngle)); int newx, newy; if ( x1 < x2 && y1 < y2 ) { newx = iround(x2 - cos_side); newy = iround(y2 - sin_side); } else if ( x1 < x2 ) // && y1 >= y2 { newx = iround(x1 + cos_side); newy = iround(y1 - sin_side); } else if ( y1 < y2 ) // && x1 >= x2 { newx = iround(x1 - cos_side); newy = iround(y1 + sin_side); } else // x1 >= x2 && y1 >= y2 { newx = iround(x2 + cos_side); newy = iround(y2 + sin_side); } levy(x1, y1, newx, newy, degree - 1); levy(newx, newy, x2, y2, degree - 1); } }