/** * rotating fan */ #include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <math.h> 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; } 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); } int main() { /* request autodetection */ int gdriver = DETECT, gmode, errorcode; /* Local Variables */ double cx, cy; double l1x1, l1y1, l1x2, l1y2; double l1angle = 120 / 180.0 * 3.14; double l2angle = 240 / 180.0 * 3.14; double rotate_angle = 2 / 180.0 * 3.14; int speed=1; int i=0; /* initialize graphics and local variables */ initgraph(&gdriver, &gmode, ""); cx = getmaxx() / 2; cy = getmaxy() / 2; l1x1 = cx; l1y1 = cy - 20; l1x2 = cx; l1y2 = cy - 90; while (!kbhit()) { i++; if(i>=60){ l1x1 = cx; l1y1 = cy - 20; l1x2 = cx; l1y2 = cy - 90; i=0; } circle((int)cx, (int)cy, 20); line((int)l1x1, (int)l1y1, (int)l1x2,(int) l1y2); line( (int)rotatex(l1x1, l1y1, l1angle, cx, cy), (int)rotatey(l1x1, l1y1, l1angle, cx, cy), (int)rotatex(l1x2, l1y2, l1angle, cx, cy), (int)rotatey(l1x2, l1y2, l1angle, cx, cy) ); line( (int)rotatex(l1x1, l1y1, l2angle, cx, cy), (int)rotatey(l1x1, l1y1, l2angle, cx, cy), (int)rotatex(l1x2, l1y2, l2angle, cx, cy), (int)rotatey(l1x2, l1y2, l2angle, cx, cy) ); /* prepare for next frame */ delay(15); cleardevice(); l1x1 = rotatex(l1x1, l1y1, rotate_angle, cx, cy); l1y1 = rotatey(l1x1, l1y1, rotate_angle, cx, cy); l1x2 = rotatex(l1x2, l1y2, rotate_angle, cx, cy); l1y2 = rotatey(l1x2, l1y2, rotate_angle, cx, cy); } /* clean up */ closegraph(); return 0; }