/* ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º º º º º trees = PROGRAM TO GENERATE TREES º º º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ */ #include #include #include #include #include #include "tools.h" int combination = 0,LINEWIDTH=1, OPERATOR=0, ANGLE, XCENTER, YCENTER; unsigned long int PATTERN=0xFFFFFFFF; int i,j; float height,width,left_alpha,right_alpha,left_angle,right_angle, left_width_factor,left_height_factor,right_width_factor, right_height_factor; float x,y,x1,y01,x2,y2; float turtle_x,turtle_y,turtle_r,turtle_theta; int level; void generate(float x, float y, float width, float height, float angle, int level); main() { printf("\nEnter stem height: "); scanf("%f",&height); printf("\nEnter stem width: "); scanf("%f",&width); printf("\nEnter left alpha: "); scanf("%f",&left_alpha); printf("\nEnter right alpha: "); scanf("%f",&right_alpha); printf("\nEnter left branch angle: "); scanf("%f",&left_angle); printf("\nEnter right branch angle: "); scanf("%f",&right_angle); printf("\nEnter recursion level: "); scanf("%d",&level); left_width_factor = pow(2,-1/left_alpha); left_height_factor = pow(2,-2/(3*left_alpha)); right_width_factor = pow(2,-1/right_alpha); right_height_factor = pow(2,-2/(3*right_alpha)); x = 0; y = -235; LINEWIDTH = width; setMode(16); cls(9); x1 = 0; y01 = y + height; drawLine(x,y,x1,y01,6); turtle_theta = point(x,y,x1,y01); turn(left_angle); generate(x1,y01,left_width_factor*width,left_height_factor*height, left_angle,level); turtle_theta = point(x,y,x1,y01); turn(-right_angle); generate(x1,y01,right_width_factor*width,right_height_factor*height, right_angle,level); getch(); } void generate(float x, float y, float width, float height, float angle, int level) { float x1,y01; turtle_x = x; turtle_y = y; turtle_r = height; step(); x1 = turtle_x; y01 = turtle_y; LINEWIDTH = width; level--; if (level < 3) drawLine(x,y,x1,y01,10); else drawLine(x,y,x1,y01,6); if (level > 0) { turtle_theta = point(x,y,x1,y01); turn(left_angle); generate(x1,y01,left_width_factor*width,left_height_factor* height,left_angle,level); turtle_theta = point(x,y,x1,y01); turn(-right_angle); generate(x1,y01,right_width_factor*width,right_height_factor* height,right_angle,level); } } /*ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ ³ ³ drawLine() = draws a line from one set of coordinates ³ ³ to another in a designated color ³ ³ ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ*/ void drawLine(int x1, int y01, int x2, int y2, int color) { #define sign(x) ((x) > 0 ? 1: ((x) == 0 ? 0: (-1))) int dx, dy, dxabs, dyabs, i, j, px, py, sdx, sdy, x, y; unsigned long int mask=0x80000000; x1 += 320; y01 = 175 - ((y01*93) >> 7); x2 += 320; y2 = 175 - ((y2*93) >> 7); dx = x2 - x1; dy = y2 - y01; sdx = sign(dx); sdy = sign(dy); dxabs = abs(dx); dyabs = abs(dy); x = 0; y = 0; px = x1; py = y01; if (dxabs >= dyabs) { for (i=0; i=dxabs) { y -= dxabs; py += sdy; } px += sdx; if ((PATTERN & mask) && (px>=0) && (px<640) && (py>=0) && (py<350)) { for (j=-LINEWIDTH/2; j<=LINEWIDTH/2; j++) plot(px,py+j,color); } mask >>= 1; } } else { for (i=0; i=dyabs) { x -= dyabs; px += sdx; } py += sdy; if ((PATTERN & mask) && (px>=0) && (px<640) && (py>=0) && (py<350)) { for (j=-LINEWIDTH/2; j<=LINEWIDTH/2; j++) plot(px+j,py,color); } mask >>= 1; } } }