Fractale de koch

Description

Générateur d'images fractales a partir du procédé de Koch!

Toutes les infos ici : http://colin.chargy.free.fr/Wiki/index.php?title=Fractale

Il ya dans le zip un exécutable Windows (renommer en .exx) et un exécutable Linux (sans extensions).

Source / Exemple :

#include <SDL/SDL.h>

#include <SDL/SDL_opengl.h>

#include <GL/gl.h>

#include <GL/glu.h>



#include <stdio.h>

#include <stdlib.h>

#include <stdexcept>

#include <string>

#include <vector>

#include <math.h>

#include <fstream>



using namespace std;



const double pi = 3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067;



class Ligne

{

	public:

		double x1, y1, x2, y2;

};



vector<Ligne> Lignes;



int Split(vector<string>* vecteur, string chaine, char separateur)

{



    vecteur->resize(1);

    vecteur[0].empty();



    int longeur = chaine.length();



    for(int i = 0; i < longeur; ++i)

    {



        if(chaine.at(i) == separateur)

        {

            vecteur->resize(vecteur->size() + 1);

        }

        else

        {

            vecteur->at(vecteur->size() - 1).resize(vecteur->at(vecteur->size() - 1).size() + 1);

            vecteur->at(vecteur->size() - 1).at(vecteur->at(vecteur->size() - 1).size() - 1) = chaine.at(i);

        }



    }



    return vecteur->size();



}



void LireFichier()

{

	ifstream fichier("geo.frac");

	//Lecture du fichier

	string Fichier, Ligne;

	vector<string> Parties;

	char ch;

	

	while(fichier.get(ch))

      Fichier += ch;

   

   int nblignes = Split(&Parties, Fichier, '\n');

   for(int i = 0; i < nblignes; i++)

   {

		Ligne = Parties[i];

		if(Ligne[Ligne.size() - 1] == '\r') Ligne.erase(Ligne.size() - 1);

		if((Ligne[0] != '/') && (Ligne[1] != '/'))

		{

			vector<string> SousParties, SousPartiesDebut, SousPartiesFin;

			if((Split(&SousParties, Ligne, '>') == 2) && (Split(&SousPartiesDebut, SousParties[0], ',') == 2) && (Split(&SousPartiesFin, SousParties[1], ',') == 2))

			{

				Lignes.resize(Lignes.size() + 1);

				Lignes[Lignes.size() - 1].x1 = atoi(SousPartiesDebut[0].c_str());

				Lignes[Lignes.size() - 1].y1 = atoi(SousPartiesDebut[1].c_str());

				Lignes[Lignes.size() - 1].x2 = atoi(SousPartiesFin[0].c_str());

				Lignes[Lignes.size() - 1].y2 = atoi(SousPartiesFin[1].c_str());

			}

		}

	}

	

}



void Calcul()

{

	Uint32 temps = 0;

	int size = Lignes.size(); 

	

	glMatrixMode(GL_MODELVIEW);

	glLoadIdentity();

	

	for(int i = 0; i < size; i++)

	{

		if(temps + 50 < SDL_GetTicks())

		{

			temps = SDL_GetTicks();

			glBegin(GL_QUADS);

				glColor3ub(0, 0, 255);

				glVertex2d(250, 100);

				glVertex2d(-250, 100); 

				glVertex2d(-250, -100); 

				glVertex2d(250, -100); 

				

				glColor3ub(200, 55, 55);

				glVertex2d(200, 50);

				glVertex2d(-200, 50); 

				glVertex2d(-200, -50); 

				glVertex2d(200, -50); 	

				

				glColor3ub(255, 0, 0);

				glVertex2d((((400 * i) / size) - 200), 50);

				glVertex2d(-200, 50); 

				glVertex2d(-200, -50); 

				glVertex2d((((400 * i) / size) - 200), -50); 	

			glEnd();

			

			glFlush();

      	SDL_GL_SwapBuffers();

		}

		

		if(Lignes.size() >= Lignes.max_size()) return;

		Lignes.resize(Lignes.size() + 3);

		

		Lignes.at(Lignes.size() - 3).x2 = Lignes.at(i).x2;

		Lignes.at(Lignes.size() - 3).y2 = Lignes.at(i).y2;

		

		Lignes.at(Lignes.size() - 3).x1 = Lignes.at(i).x1 + (2 * (Lignes.at(i).x2 - Lignes.at(i).x1) / 3);

		Lignes.at(Lignes.size() - 3).y1 = Lignes.at(i).y1 + (2 * (Lignes.at(i).y2 - Lignes.at(i).y1) / 3);

		

		Lignes.at(i).x2 = Lignes.at(i).x1 + ((Lignes.at(i).x2 - Lignes.at(i).x1) / 3);

		Lignes.at(i).y2 = Lignes.at(i).y1 + ((Lignes.at(i).y2 - Lignes.at(i).y1) / 3);

		

		//Le triangle

		double angle = acos((Lignes.at(i).x2-Lignes.at(i).x1)/sqrt((Lignes.at(i).x2-Lignes.at(i).x1)*(Lignes.at(i).x2-Lignes.at(i).x1) + (Lignes.at(i).y2-Lignes.at(i).y1)*(Lignes.at(i).y2-Lignes.at(i).y1)));

		if((Lignes.at(i).y2-Lignes.at(i).y1) < 0) angle = -angle;

		

		Lignes.at(Lignes.size() - 2).x1 = Lignes.at(i).x2;

		Lignes.at(Lignes.size() - 2).y1 = Lignes.at(i).y2;

		

		Lignes.at(Lignes.size() - 1).x1 = ((Lignes.at(i).x2 + Lignes.at(Lignes.size() - 3).x1) / 2) + (cos(angle+pi/2)*sqrt((Lignes.at(i).x2-Lignes.at(i).x1)*(Lignes.at(i).x2-Lignes.at(i).x1)+(Lignes.at(i).y2-Lignes.at(i).y1)*(Lignes.at(i).y2-Lignes.at(i).y1)));

		Lignes.at(Lignes.size() - 1).y1 = ((Lignes.at(i).y2 + Lignes.at(Lignes.size() - 3).y1) / 2) + (sin(angle+pi/2)*sqrt((Lignes.at(i).x2-Lignes.at(i).x1)*(Lignes.at(i).x2-Lignes.at(i).x1)+(Lignes.at(i).y2-Lignes.at(i).y1)*(Lignes.at(i).y2-Lignes.at(i).y1)));

		

		Lignes.at(Lignes.size() - 2).x2 = Lignes.at(Lignes.size() - 1).x1;

		Lignes.at(Lignes.size() - 2).y2 = Lignes.at(Lignes.size() - 1).y1;

		

		Lignes.at(Lignes.size() - 1).x2 = Lignes.at(Lignes.size() - 3).x1;

		Lignes.at(Lignes.size() - 1).y2 = Lignes.at(Lignes.size() - 3).y1;

		

		

	}

	

}



int main(int argc, char *argv[])

{

	LireFichier();

	

	double Zoom = 1.0, OffsetX = 0.0, OffsetY = 0.0;

	

   SDL_Init(SDL_INIT_VIDEO);

   SDL_EnableKeyRepeat(50, 50);

   SDL_WM_SetCaption("Fractale", NULL);

   SDL_SetVideoMode(600, 600, 32, SDL_OPENGL | SDL_GL_DOUBLEBUFFER);

   bool continuer = true, Redessine = true;

   SDL_Event event;

   

   glClearColor(1, 1, 1, 1);

   glColor3ub(0, 0, 0);

    

	glViewport(0, 0, (GLsizei) 600, (GLsizei) 600);

	glMatrixMode(GL_PROJECTION);

	glLoadIdentity();

	gluOrtho2D((GLdouble)-300, (GLdouble)300, (GLdouble)-300, (GLdouble)300);

	glMatrixMode(GL_MODELVIEW);

	glLoadIdentity(); 



   while (continuer)

   {

   	while(!Redessine)

   	{

			while(SDL_PollEvent(&event))

			{

		   	switch(event.type)

		   	{

		   		case SDL_QUIT:

		         	continuer = false;

						Redessine = true;

						break;

		         	

			      case SDL_KEYDOWN:

						if(event.key.keysym.sym == SDLK_ESCAPE)

						{

							continuer = false;

							Redessine = true;

						}

						

						if(event.key.keysym.sym == SDLK_RETURN) 

						{

							Calcul();

							Redessine = true;

							char titre[100];

							sprintf(titre, "Fractale - Nombre de lignes : %d", Lignes.size());

							SDL_WM_SetCaption(titre, NULL);

							

						}

						

						if(event.key.keysym.sym == SDLK_PAGEUP)

						{

							Zoom *= 1.1;

							Redessine = true;

						}

						

						if(event.key.keysym.sym == SDLK_PAGEDOWN)

						{

							Zoom *= .9;

							Redessine = true;

						}

						

						if(event.key.keysym.sym == SDLK_UP)

						{

							OffsetY -= 10/Zoom;

							Redessine = true;

						}

						

						if(event.key.keysym.sym == SDLK_DOWN)

						{

							OffsetY += 10/Zoom;

							Redessine = true;

						}					

						

						if(event.key.keysym.sym == SDLK_LEFT)

						{

							OffsetX -= 10/Zoom;

							Redessine = true;

						}	

						

						if(event.key.keysym.sym == SDLK_RIGHT)

						{

							OffsetX += 10/Zoom;

							Redessine = true;

						}	

						

						break;

				

					case SDL_ACTIVEEVENT:

						Redessine = true;

						break;

			   }

	      }

	      if(!Redessine && continuer) SDL_Delay(50);

		}

		

		if(continuer)

		{



		   glClear(GL_COLOR_BUFFER_BIT);

		   glColor3ub(0, 0, 0);

		   

		   glMatrixMode(GL_MODELVIEW);

			glLoadIdentity();

			

			glScaled(Zoom, Zoom, 1.0);

			glTranslated(-OffsetX, -OffsetY, 0.0);



		   glBegin(GL_LINES);

		   	for(int i = 0; i < Lignes.size(); i++)

		   	{

		   		if(i % 1000 == 0)

		   		{

		   			glFlush();

		   		}	

					glVertex2d(Lignes[i].x1, Lignes[i].y1);

					glVertex2d(Lignes[i].x2, Lignes[i].y2);

				}

		   glEnd();



		   glFlush();

		   SDL_GL_SwapBuffers();

		   

		   Redessine = false;

		   

      }

   }



   SDL_Quit();



   return 0;

}

Conclusion :

Voilà si vous avez des remarques, commentaires n'hésitez pas!

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.