104 lines
3.1 KiB
C
104 lines
3.1 KiB
C
|
#include<graphics.h>
|
||
|
#include<stdio.h>
|
||
|
#include<conio.h>
|
||
|
#include<math.h>
|
||
|
#include<dos.h>
|
||
|
// Calculates new co-ordinates of a figure after
|
||
|
// rotating it at an angle about a point (cx,cy)
|
||
|
void rotate( int figure[], int edges, double angle, int cx, int cy ) {
|
||
|
double x, y;
|
||
|
angle = -1 * (angle*3.14/180);
|
||
|
double cos_a = cos(angle);
|
||
|
double sin_a = sin(angle);
|
||
|
for (int i=0; i < edges; i++) {
|
||
|
x = figure[2*i] - cx;
|
||
|
y = figure[2*i+1] - cy;
|
||
|
figure[2*i] = floor( (x * cos_a) - (y * sin_a) + cx + 0.5 );
|
||
|
figure[2*i+1] = floor( (x * sin_a)+(y * cos_a) + cy + 0.5 );
|
||
|
}
|
||
|
}
|
||
|
void drawClock(int,int,int);
|
||
|
void main() {
|
||
|
int second_hand[4],minute_hand[4], hour_hand[4], edges = 2 ;
|
||
|
double angle;
|
||
|
int cx=300, cy=200;
|
||
|
int gd = DETECT, gm;
|
||
|
initgraph( &gd, &gm, "" );
|
||
|
int max_y = getmaxy();
|
||
|
clrscr();
|
||
|
cleardevice();
|
||
|
angle = -6;
|
||
|
// Set the initial position of the second, minute and the hour hands.
|
||
|
second_hand[0] = cx ;
|
||
|
second_hand[1] = max_y - cy;
|
||
|
second_hand[2] = cx;
|
||
|
second_hand[3] = max_y - 320;
|
||
|
hour_hand[0] = cx;
|
||
|
hour_hand[1] = max_y - cy;
|
||
|
hour_hand[2] = cx + 90;
|
||
|
hour_hand[3] = max_y - 200;
|
||
|
minute_hand[0] = cx;
|
||
|
minute_hand[1] = max_y - cy;
|
||
|
minute_hand[2] = cx;
|
||
|
minute_hand[3] = max_y - 310;
|
||
|
cleardevice();
|
||
|
setbkcolor(WHITE);
|
||
|
// Draw the clock
|
||
|
drawClock(cx,max_y - cy,150);
|
||
|
setlinestyle(SOLID_FILL,0,1);
|
||
|
// Draw the minute and the hour hand
|
||
|
drawpoly(2,minute_hand);
|
||
|
drawpoly(2,hour_hand);
|
||
|
int i=0;
|
||
|
while(!kbhit()) {
|
||
|
setcolor(RED);
|
||
|
drawpoly(2,second_hand);
|
||
|
setcolor(GREEN);
|
||
|
drawpoly(2,minute_hand);
|
||
|
setcolor(BLUE);
|
||
|
drawpoly(2,hour_hand);
|
||
|
delay(1000);
|
||
|
// set delay(10) to tick the clock fast
|
||
|
setcolor(15);
|
||
|
drawpoly(2,second_hand);
|
||
|
rotate(second_hand,edges,angle,cx,max_y - cy);
|
||
|
i++;
|
||
|
// Reset the second hand and move the minute hand
|
||
|
// when the second hand has moved 60 times.
|
||
|
if(i%60 == 0) {
|
||
|
second_hand[0] = cx ;
|
||
|
second_hand[1] = max_y - cy;
|
||
|
second_hand[2] = cx;
|
||
|
second_hand[3] = max_y - 320;
|
||
|
drawpoly(2,minute_hand);
|
||
|
rotate(minute_hand,edges,angle,cx,max_y - cy);
|
||
|
}
|
||
|
// Move the minute hand
|
||
|
// when the second hand has moved 720 (60*12) times.
|
||
|
if(i%720 == 0) {
|
||
|
i = 0;
|
||
|
drawpoly(2,hour_hand);
|
||
|
rotate(hour_hand,edges,angle,cx,max_y - cy);
|
||
|
}
|
||
|
}
|
||
|
getch();
|
||
|
}
|
||
|
// Function to draw the clock
|
||
|
void drawClock(int cx, int cy, int r) {
|
||
|
setcolor(GREEN);
|
||
|
setlinestyle(SOLID_FILL,0,3);
|
||
|
circle(cx,cy,r);
|
||
|
int max_y = getmaxy();
|
||
|
int center[2] = {
|
||
|
cx, max_y - 340
|
||
|
}
|
||
|
;
|
||
|
for (int i=0; i<60; i++) {
|
||
|
if(i%5 == 0) {
|
||
|
circle(center[0],center[1],2);
|
||
|
} else {
|
||
|
circle(center[0],center[1],1);
|
||
|
}
|
||
|
rotate(center,1,-6,cx,cy);
|
||
|
}
|
||
|
}
|