jueves, 5 de abril de 2012

Fractal De Malthus 1

Hola chavos! Espero que anden de lo mejor y yo aquí ando pasando rápidamente para mostrarles otro ejemplo de los fractales por supuesto programado en C++ Builder. En esta ocasión el fractal que programaremos será el conocido como el fractal de Malthus 1.

Bien pues como siempre ya saben que el primer paso que realizo es opcional, si quieren pueden seguirlo y si no  pues no hay problema todo funcionará normalmente. Lo primero que haré yo será cambiar el color de la Forma en su propiedad color buscamos el color clTeal y lo elegimos. Ahora colocamos un botón sobre la Forma y eso será todo lo que tenemos que hacer sobre la Forma, la cual nos quedará de la siguiente manera:


Bien ahora nos cambiamos a la parte del editor de código y nos vamos al archivo cabecera del programa, es  decir al archivo H y en la parte de declaraciones privadas tecleamos las siguientes variables:


private: // User declarations
        int maxX, maxY, MaxGen;


Ahora en la parte de las declaraciones públicas escribimos la siguiente definición del método ExtranioConfinador(), que aunque su nombre es igual al método que utilizamos en el fractal pasado su funcionamiento es completamente diferente:


public: // User declarations
        __fastcall TForm1(TComponent* Owner);
        void TForm1::ExtranioConfinador();


Bueno ahora nos vamos a la Forma y en sus eventos elegimos el llamado OnCreate y le damos doble clic, ahí tecleamos el siguiente código, que nos servirá para que las siguientes variables tomen un valor cada vez que ejecutemos nuestra aplicación:


void __fastcall TForm1::FormCreate(TObject *Sender)
{
        MaxGen = 0x00FF;
        maxX = this->ClientWidth;
        maxY = this->ClientHeight;
}
//---------------------------------------------------------------------------


Enseguida escribimos el método ExtranioConfinador(), el código que necesitamos para generar el efecto del fractal es el que tenemos a continuación:


void TForm1::ExtranioConfinador()
{
        int i, j, k, l, Color, Contador, X, Y;
        double PobAnt, PobNueva, Razon;
        PobNueva = 0.0;
        Razon = 2.3;
        Color = clBlack;
        for( j = 1; j <= 151; j++ )
        {
                Color++;
                if( Color >= clWhite )
                        Color = clBlue;
                Contador = 0;
                Razon += 0.01;
                PobAnt = 0.01;
                for( i = 1; i <= MaxGen; i++ )
                {
                        PobNueva = Razon * ( PobAnt * ( 1 - PobAnt ) );
                        X = PobAnt * maxX;
                        Y = maxY - ( PobNueva * maxY );
                        this->Canvas->Pixels[X][Y] = (TColor)Color;
                        if ( PobAnt == PobNueva )
                                Contador++;
                        else
                                Contador = 0;
                        if ( Contador > 10 )
                                i = MaxGen;
                        PobAnt = PobNueva;
                }
                this->Canvas->TextOutA(10, 10, "Flujo Maltusiano");
                Sleep(5);
        }
}
//---------------------------------------------------------------------------


Finalmente solo queda escribir la llamada al método en el evento OnClic del botón que habíamos colocado sobre la Forma:


void __fastcall TForm1::Button1Click(TObject *Sender)
{
        this->Repaint();
        ExtranioConfinador();
}
//---------------------------------------------------------------------------


Y así de fácil fue todo chavos ahora compilamos y corremos nuestra aplicación y si hicimos todo correctamente obtendremos un efecto como el siguiente:


Bueno amigos pues ya hemos visto un montón de fractales diferentes pero aun nos quedan unos cuantos más por mostrar, ya que como les había dicho antes este tema es bastante amplio e interesante. Por hoy eso fue todo chavos nos vemos en la siguiente ocasión para continuar con más de este mismo tema y mostrar otro fractal parecido al de hoy conocido como el fractal de Malthus 2, hasta entonces amigos!!.

1 comentario: