// Prog: Serie9_3b.cpp
// Draw turtle graphics for the Lindenmayer system with
// productions X -> X+Y++Y-X--XX-Y+, Y -> -X+YY++Y+X--X-Y, initial word Y
// and rotation angle 60 degrees
#include
#include
// necessary: x and y call each other
void x (const unsigned int i);
// necessary: x and y call w and z
void w (const unsigned int i);
// necessary: x and y call w and z
void z (const unsigned int i);
// POST: w_i^Y is drawn
void y (const unsigned int i) {
if (i > 0) {
ifm::right(60); // -
ifm::forward(); // X
x(i-1); // w_{i-1}^X
ifm::left(60); // +
ifm::forward(); //Y
y(i-1); // w_{i-1}^Y
ifm::forward(); //Y
y(i-1); // w_{i-1}^Y
ifm::left(60); // +
ifm::left(60); // +
ifm::forward(); //Y
y(i-1); // w_{i-1}^Y
ifm::left(60); // +
ifm::forward(); // X
x(i-1); // w_{i-1}^X
ifm::right(60); // -
ifm::right(60); // -
ifm::forward(); // X
x(i-1); // w_{i-1}^X
ifm::right(60); // -
ifm::forward(); //Y
y(i-1); // w_{i-1}^Y
if(i%2!=0)w(i-1);
}
}
// POST: w_i^X is drawn
void x (const unsigned int i) {
if (i > 0) {
ifm::forward(); // X
x(i-1); // w_{i-1}^X
ifm::left(60); // +
ifm::forward(); //Y
y(i-1); // w_{i-1}^Y
ifm::left(60); // +
ifm::left(60); // +
ifm::forward(); //Y
y(i-1); // w_{i-1}^Y
ifm::right(60); // -
ifm::forward(); // X
x(i-1); // w_{i-1}^X
ifm::right(60); // -
ifm::right(60); // -
ifm::forward(); // X
x(i-1); // w_{i-1}^X
ifm::forward(); // X
x(i-1); // w_{i-1}^X
ifm::right(60); // -
ifm::forward(); //Y
y(i-1); // w_{i-1}^Y
ifm::left(60); // +
if(i%2!=0) w(i-1);
}
}
// necessary: z and w call each other
void z (const unsigned int i);
// POST: w_i^z is drawn
void w (const unsigned int i) {
if (i > 0) {
w(i-1); // w_{i-1}^W
ifm::left(90); // +
z(i-1); // w_{i-1}^Z
ifm::forward(); // F
ifm::left(90); // +
}
}
// POST: w_i^Z is drawn
void z (const unsigned int i) {
if (i > 0) {
ifm::right(90); // -
ifm::forward(); // F
w(i-1); // w_{i-1}^W
ifm::right(90); // -
z(i-1); // w_{i-1}^Z
}
}
int main () {
std::cout << "Number of iterations =? ";
unsigned int n;
std::cin >> n;
// draw w_n = w_n^X
y(n);
return 0;
}