diff --git a/batrang.c b/batrang.c index 52aabf28ad4f0b6c3752e8221941ff030e383ed4..db7ee1616aef639f0fc019c055f311f7318b7976 100644 --- a/batrang.c +++ b/batrang.c @@ -3,89 +3,190 @@ #include <graphics.h> #include <math.h> -void bezier (int x[4], int y[4]) -{ +#define LEFT 0 +#define TOP 1 +#define RIGHT 2 +#define BOTTOM 3 +#define BOUND 30 +double ANG(double x) { return x*3.1415/180; } - int i; - double t; - double xm,ym; +double xm,ym; +double ang = 0; +int flag[] = {0,0,0,0}; +int kbhit() { + struct timeval tv; + fd_set fds; + tv.tv_sec = 0; + tv.tv_usec = 0; + FD_ZERO(&fds); + FD_SET(STDIN_FILENO, &fds); //STDIN_FILENO is 0 + select(STDIN_FILENO+1, &fds, NULL, NULL, &tv); + return FD_ISSET(STDIN_FILENO, &fds); +} +double rotatex(double x, double y, double angle, double pivotx, double pivoty){ + return (x)*cos(angle) - (y)*sin(angle) + pivotx* (1-cos(angle)) + pivoty*(sin(angle)); + // return (x - pivotx)*cos(angle) - (y - pivoty)*sin(angle) + pivotx; +} +double rotatey(double x, double y, double angle, double pivotx, double pivoty){ + return (x)*sin(angle) + (y)*cos(angle) + pivoty* (1-cos(angle)) - pivotx*(sin(angle)); + // return (x - pivotx)*sin(angle) - (y - pivoty)*cos(angle) + pivoty; +} +void bezier (int x[4], int y[4]) { - xm = getmaxx()/2; - ym = getmaxy()/2; + int i; + double u; - for (i=0; i<4; i++) - putpixel ((xm+x[i]), (ym-y[i]), YELLOW); + // for (i=0; i<4; i++) + // putpixel ((xm+x[i]), (ym-y[i]), YELLOW); - for (t = 0.0; t < 1.0; t += 0.0001) + for (u = 0.0; u < 1.0; u += 0.01) { - double xt = pow (1-t, 3) * x[0] + 3 * t * pow (1-t, 2) * x[1] + - 3 * pow (t, 2) * (1-t) * x[2] + pow (t, 3) * x[3]; + double xt = pow (1-u, 3) * x[0] + 3 * u * pow (1-u, 2) * x[1] + + 3 * pow (u, 2) * (1-u) * x[2] + pow (u, 3) * x[3]; + + double yt = pow (1-u, 3) * y[0] + 3 * u * pow (1-u, 2) * y[1] + + 3 * pow (u, 2) * (1-u) * y[2] + pow (u, 3) * y[3]; + + xt += xm; + yt = ym - yt; - double yt = pow (1-t, 3) * y[0] + 3 * t * pow (1-t, 2) * y[1] + - 3 * pow (t, 2) * (1-t) * y[2] + pow (t, 3) * y[3]; + if (rotatex(xt, yt, ANG(ang), xm, ym) <= BOUND) + flag[LEFT] = 1; + if (rotatex(xt, yt, ANG(ang), xm, ym) >= getmaxx()-BOUND) + flag[RIGHT] = 1; + if (rotatey(xt, yt, ANG(ang), xm, ym) <= BOUND) + flag[TOP] = 1; + if (rotatey(xt, yt, ANG(ang), xm, ym) >= getmaxy()-BOUND) + flag[BOTTOM] = 1; - xt += xm; - yt = ym - yt; - putpixel (xt,yt, WHITE); + if(!(flag[LEFT]==1||flag[RIGHT]==1||flag[TOP]==1||flag[BOTTOM]==1)){ + putpixel ((int)rotatex(xt, yt, ANG(ang), xm, ym), + (int)rotatey(xt, yt, ANG(ang), xm, ym), + WHITE); + } } return; } -void main() -{ +void main() { int x[4], y[4]; - int xm,ym; + int x_step=5, y_step=5, ang_step = 5; int gd = DETECT, gm; + int i = 0; initgraph(&gd, &gm, ""); xm = getmaxx()/2; ym = getmaxy()/2; - - x[0]=xm-20; y[0]=ym; - x[1]=xm-100; y[1]=ym; - x[2]=xm+20; y[2]=ym; - x[3]=xm+100; y[3]=ym; - - line(x[0],y[0],x[1],y[1]); - line(x[2],y[2],x[3],y[3]); - - //Bat left top wing - x[0]=-100; y[0]=0; - x[1]=-60; y[1]=-10; - x[2]=-60; y[2]=-20; - x[3]=-60; y[3]=-30; - bezier (x,y); - - //Bat left bottom wing - x[0]=-60; y[0]=-30; - x[1]=-40; y[1]=-32; - x[2]=-20; y[2]=-34; - x[3]=0; y[3]=-50; - bezier (x,y); - - //Bat right top wing - x[0]=100; y[0]=0; - x[1]=60; y[1]=-10; - x[2]=60; y[2]=-20; - x[3]=60; y[3]=-30; - bezier (x,y); - - //Bat right bottom wing - x[0]=60; y[0]=-30; - x[1]=40; y[1]=-32; - x[2]=20; y[2]=-34; - x[3]=0; y[3]=-50; - bezier (x,y); - - //Bat head cave in - x[0]=-20; y[0]=0; - x[1]=-10; y[1]=-10; - x[2]=10; y[2]=-10; - x[3]=20; y[3]=0; - bezier (x,y); - - getch(); + + while(!kbhit()) { + + if (flag[LEFT] == 1) { + x_step = 5; + if ((ang > 180 && ang < 270) || (ang > 0 && ang < 90)) { + ang_step = -ang_step; + } + } + if (flag[RIGHT] == 1) { + x_step = -5; + if ((ang > 180 && ang < 270) || (ang > 0 && ang < 90)) { + ang_step = -ang_step; + } + } + if (flag[TOP] == 1) { + y_step = 5; + if (!((ang > 180 && ang < 270) || (ang > 0 && ang < 90))) { + ang_step = -ang_step; + } + } + if (flag[BOTTOM] == 1) { + y_step = -5; + if ((ang > 90 && ang < 180) || (ang > 0 && ang < 90)) { + ang_step = -ang_step; + } + } + + ang = (double)(((int)(ang+ang_step))%359); + xm += x_step; + ym += y_step; + + for(int loop = 0; loop < 4; loop++) flag[loop]=0; + + x[0]=xm-20; y[0]=ym; + x[1]=xm-100; y[1]=ym; + x[2]=xm+20; y[2]=ym; + x[3]=xm+100; y[3]=ym; + + rectangle (BOUND,BOUND,getmaxx()-BOUND,getmaxy()-BOUND); + if ((int)rotatex(x[0],y[0],ANG(ang),xm,ym) < BOUND || + (int)rotatey(x[0],y[0],ANG(ang),xm,ym) < BOUND || + (int)rotatex(x[1],y[1],ANG(ang),xm,ym) < BOUND || + (int)rotatey(x[1],y[1],ANG(ang),xm,ym) < BOUND || + (int)rotatex(x[2],y[2],ANG(ang),xm,ym) < BOUND || + (int)rotatey(x[2],y[2],ANG(ang),xm,ym) < BOUND || + (int)rotatex(x[3],y[3],ANG(ang),xm,ym) < BOUND || + (int)rotatey(x[3],y[3],ANG(ang),xm,ym) < BOUND || + (int)rotatex(x[0],y[0],ANG(ang),xm,ym) > getmaxx() - BOUND || + (int)rotatey(x[0],y[0],ANG(ang),xm,ym) > getmaxy() - BOUND || + (int)rotatex(x[1],y[1],ANG(ang),xm,ym) > getmaxx() - BOUND || + (int)rotatey(x[1],y[1],ANG(ang),xm,ym) > getmaxy() - BOUND || + (int)rotatex(x[2],y[2],ANG(ang),xm,ym) > getmaxx() - BOUND || + (int)rotatey(x[2],y[2],ANG(ang),xm,ym) > getmaxy() - BOUND || + (int)rotatex(x[3],y[3],ANG(ang),xm,ym) > getmaxx() - BOUND || + (int)rotatey(x[3],y[3],ANG(ang),xm,ym) > getmaxy() - BOUND) { + //pass + } else { + line( + (int)rotatex(x[0],y[0],ANG(ang),xm,ym), + (int)rotatey(x[0],y[0],ANG(ang),xm,ym), + (int)rotatex(x[1],y[1],ANG(ang),xm,ym), + (int)rotatey(x[1],y[1],ANG(ang),xm,ym) + ); + line( + (int)rotatex(x[2],y[2],ANG(ang),xm,ym), + (int)rotatey(x[2],y[2],ANG(ang),xm,ym), + (int)rotatex(x[3],y[3],ANG(ang),xm,ym), + (int)rotatey(x[3],y[3],ANG(ang),xm,ym) + ); + } + //left top wing + x[0]=-100; y[0]=0; + x[1]=-60; y[1]=-10; + x[2]=-60; y[2]=-20; + x[3]=-60; y[3]=-30; + bezier (x,y); + + //left bottom wing + x[0]=-60; y[0]=-30; + x[1]=-40; y[1]=-32; + x[2]=-20; y[2]=-34; + x[3]=0; y[3]=-50; + bezier (x,y); + + //right top wing + x[0]=100; y[0]=0; + x[1]=60; y[1]=-10; + x[2]=60; y[2]=-20; + x[3]=60; y[3]=-30; + bezier (x,y); + + //right bottom wing + x[0]=60; y[0]=-30; + x[1]=40; y[1]=-32; + x[2]=20; y[2]=-34; + x[3]=0; y[3]=-50; + bezier (x,y); + + //head + x[0]=-20; y[0]=0; + x[1]=-10; y[1]=-10; + x[2]=10; y[2]=-10; + x[3]=20; y[3]=0; + bezier (x,y); + + delay(15); + cleardevice(); + } closegraph(); } \ No newline at end of file