Code:
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <dos.h>

void InitGraph()
{
   /* request auto detection */
   int gdriver = DETECT, gmode, errorcode;

	/* initialize graphics and local variables */
    initgraph(&gdriver, &gmode, "C:/Program Files/CodeBlocks/EGAVGA.BGI");

   /* read result of initialization */
   errorcode = graphresult();
   if (errorcode != grOk)  /* an error occurred */
   {
      printf("Graphics error: %s\n", grapherrormsg(errorcode));
	  printf("Press any key to halt:");
      getch();
      exit(1); /* terminate with an error code */
   }
}

void CloseGraph()
{
	getch();
	closegraph();
}

struct Point
{
	double x;
	double y;
};

struct Vector
{
	double powr;
	double ang;
};


double radToDeg(double rad)
{
	return rad/180*M_PI;
}

Point Translate(Point p,Vector v)
{
	Point r;
	r.x = p.x + v.powr*cos(v.ang);
	r.y = p.y - v.powr*sin(v.ang);
	return r;
}

Point Rotate(Point p, Point pc, double ang)
{
	Point r;
	double dc = sqrt(pow(p.x-pc.x,2)+pow(p.y-pc.y,2));
	r.x = pc.x + dc*cos(ang);
	r.y = pc.y - dc*sin(ang);
	return r;
}

Point Rotate(Point pc,double ang,double dc)
{
	Point r;
	r.x = pc.x + dc*cos(ang);
	r.y = pc.y - dc*sin(ang);
	return r;
}

Point Scale(Point p, Point pc, double scl)
{
	Point r;
	r.x = pc.x+(p.x-pc.x)*scl;
	r.y = pc.y+(p.y-pc.y)*scl;
	return r;
}

int main(void)
{
	InitGraph();
	Point c;
	Vector speed;
	speed.ang = radToDeg(-10);
	speed.powr = 1;
	c.x = 60;
	c.y = 60;
	double r = 40;
	for(int i = c.x; i<getmaxx()/2; i++)
	{
		setcolor(0);
		circle(c.x,c.y,r);
		setcolor(getmaxcolor());
		c = Translate(c,speed);
		circle(c.x,c.y,r);
		delay(10);
	}
	Point pc;
	pc.x = c.x;
	pc.y = c.y-r;
	Point oldc = c;
	double oldr = r;
	for(int i = 0; i<4; i++)
	{
		c = Scale(c,pc,1.3);
		r = r*1.3;
		circle(c.x,c.y,r);
		delay(100);
	}
	Point newc = c;

	clearviewport();
	setcolor(getmaxcolor());
	circle(newc.x,newc.y,r);
	Point oldc2 = oldc;
	speed.powr = 3;
	speed.ang = radToDeg(270);
	oldc = Translate(oldc,speed);
	speed.powr = 3+2*oldr;
	speed.ang = radToDeg(90);
	oldc2 = Translate(oldc2,speed);

	Point c2;
	c2.x = oldc.x-oldr+3;
	c2.y = oldc.y;

	Point c3;
	c3.x = c2.x-10;
	c3.y = c2.y;

	Point c4;
	c4.x = oldc2.x-oldr-3;
	c4.y = oldc2.y;

	Point c5;
	c5.x = oldc2.x+oldr-3;
	c5.y = oldc2.y;

	int c45r = 10;
	int d45r = 1;

	int i = 90;
	while(!kbhit())
	{
		if(i>360)
			i = 0;
		setcolor(0);
		circle(oldc.x,oldc.y,oldr);
		circle(oldc2.x,oldc2.y,oldr);
		circle(c2.x,c2.y,10);
		circle(c3.x,c3.y,3);
		circle(c4.x,c4.y,10);
		circle(c5.x,c5.y,10);
//		circle(newc.x,newc.y,r);
		setcolor(getmaxcolor());
		oldc = Rotate(oldc,newc,radToDeg(i));
		oldc2 = Rotate(oldc2,newc,radToDeg(360-i));
		c2 = Rotate(oldc,radToDeg(360-i),30);
		c3 = Rotate(c2,radToDeg(i+360),7);
		c4 = Rotate(oldc2,radToDeg(180-i),c45r);
		c5 = Rotate(oldc2,radToDeg(180-i),-c45r);
		circle(oldc.x,oldc.y,oldr);
		circle(oldc2.x,oldc2.y,oldr);
		circle(c2.x,c2.y,10);
		circle(c3.x,c3.y,3);
		circle(c4.x,c4.y,10);
		circle(c5.x,c5.y,10);
//		circle(newc.x,newc.y,r);
		i++;
		c45r += d45r;
		if(c45r<0)
			d45r = 1;
		if(c45r>30)
			d45r = -1;
		delay(4);
	}

	CloseGraph();
	return 0;
}