public void eiffelTower (double size, double shrinkFactor, double angle,
int levels, double offset) {
System.out.println("eiffelTower("+size+", "+shrinkFactor+
", "+angle+", "+levels+", "+offset+");");
if (levels>0) { // base case
eiffelBase(size, angle); // draw the base story of the Eiffel Tower
moveToNextStory(offset); // move in position to draw next pattern
eiffelTower(size*shrinkFactor, shrinkFactor, angle, levels-1, offset); //draw next pattern
returnToStart(offset); // meet invariant: start and end in same place
}
}
// draws one story of an Eiffel Tower with the specified inner angle and side length of size
public void eiffelBase (double size, double angle) {
System.out.println("eiffelBase size "+size);
rt(((180-angle)/2)+90);
fd(size);
bd(size);
rt(angle);
fd(size);
bd(size);
rt(((180-angle)/2)+90);
}
public void moveToNextStory (double offset) {
System.out.println("moveToNextStory");
pu();
fd(offset);
pd();
}
public void returnToStart (double offset) {
System.out.println("returnToStart");
pu();
bd(offset);
pd();
}