Page d'accueil Description du projet
Page d'accueil Description du projet
/******************************************
 *
 *   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;
}