/******************************************
*
* Cedric Pradalier 2001
* mail : http://cedric.pradalier.free.fr/mail.html
*
*****************************************/
#include "Transform.h"
#include "Rectangle.h"
#include <libX+.h>
#include <math.h>
#include <vector.h>
//#define WAIT
//#define DRAWINTER
#define MINDIM 1
#define D2R(X) ((X)*M_PI/180.0)
typedef vector<Rectangle> Rectangles;
typedef vector<Transform> Transforms;
bool iterate(Rectangles * source, Rectangles * dest, const Transforms & t)
{
unsigned int i,j;
bool res = false;
for (i=0;i<source->size();i++)
{
Rectangle & r = (*source)[i];
if (r.getMaxDim() > MINDIM)
{
res = true;
for (j=0;j<t.size();j++)
dest->push_back(Rectangle(r,t[j]));
}
else
dest->push_back(r);
}
return res;
}
void DrawAll(Rectangles * r,XWin * win,bool init=false)
{
unsigned int i;
for (i=0;i<r->size();i++)
{
if (!init && (*r)[i].getMaxDim() > MINDIM)
win->SetColor("green");
else
win->SetColor("black");
(*r)[i].Draw(win);
}
}
void Init(FILE * fp,Rectangles* r,Transforms & t)
{
int n,i;
fscanf(fp," %d ",&n);
for (i=0;i<n;i++)
r->push_back(Rectangle(fp));
fscanf(fp," %d ",&n);
for (i=0;i<n;i++)
t.push_back(Transform(fp));
}
int main(int argc,char* argv[])
{
unsigned int iter;
char iterS[20];
Rectangles * source;
Rectangles * dest;
XWin * win;
Transforms t;
bool stop = false;
FILE * fp;
if ((argc<2) || ((fp=fopen(argv[1],"r")) == NULL))
{
printf("Usage\n\t%s <Init File>\n",argv[0]);
return 1;
}
source = new Rectangles();
Init(fp,source,t);
fclose(fp);
win = new XWin(400,400,"Fractals");
DrawAll(source,win,true);
dest = new Rectangles();
stop = !iterate(source,dest,t);
delete source;
source = dest;
dest = NULL;
DrawAll(source,win);
iter = 1;
sprintf(iterS,"%05d",iter);
win->DrawImageString(10,10,iterS);
win->DisplayDrawingScreen();
win->WaitClick(1,0,0);
while (!stop) {
iter ++;
/*****************************************
*
* Allocation memoire pour la nouvelle
* iteration
*
* ***************************************/
dest = new Rectangles();
win->SetColor("red");
win->FillCircle(10,30,7);
win->DisplayDrawingScreen();
/******************************************
*
* Iteration : application de toutes les
* tranformations sur tous les rectangles
*
* ****************************************/
stop = !iterate(source,dest,t);
win->SetColor("green");
win->FillCircle(10,30,7);
win->DisplayDrawingScreen();
win->SetColor("black");
/*******************************************
*
* Destruction de l'iteration precedente
*
* *****************************************/
delete source;
source = dest;
dest = NULL;
#ifdef DRAWINTER
win->ClearGraph();
DrawAll(source,win);
#endif
sprintf(iterS,"%05d",iter);
win->DrawImageString(10,10,iterS);
#ifdef WAIT
win->WaitClick(1,0,0);
#else
if (win->MouseClick(1,0,0))
win->WaitClick(1,0,0);
#endif
win->DisplayDrawingScreen();
}
#ifndef DRAWINTER
printf("Drawing fixed point...\n");
win->ClearGraph();
DrawAll(source,win);
#endif
win->SetColor("red");
win->DrawImageString(100,10," FINI ");
win->DisplayDrawingScreen();
win->WaitClick(1,0,0);
delete source;
delete win;
return 0;
}