Hola de nuevo amigos me da gusto saludarlos una vez mas y poder seguir practicando con mas aplicaciones en C++ Builder. Bueno ya casi hemos terminado con el tema de los fractales, pero aun nos quedan un par de ejemplo mas para realizar. El fractal que programaremos el día de hoy es el conocido como fractal de Sierpinski.
Bien amigos pues el día de hoy lo haremos un poco más rápido de lo normal debido a que tengo un poco de prisa, entonces me saltaré la parte de cambiarle el color a la Forma y lo único que haré en ella será colocar un botón con la leyenda "Dibujar Sierpinski". Nuestra Forma queda de la siguiente manera:
Bien ahora pasamos a la parte de código y primero nos vamos al archivo H y en la parte de declaraciones privadas declaramos las siguientes variables que utilizaremos más adelante y la definición de los métodos que declararemos más adelante y que son los que nos darán el efecto del fractal:
private: // User declarations
int depth;
int w,h;
void subTriangle(int n, float x1, float y1, float x2, float y2, float x3, float y3);
void drawSierpinski(float x1, float y1, float x2, float y2, float x3, float y3);
Ahora nos preparamos para generar el efecto del fractal de Sierpinski y primero que nada tenemos que abrir el evento OnCreate de la Forma y en él escribimos el código que tenemos a continuación:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
depth=7;
this->ClientWidth=640;
this->ClientHeight=480;
w=this->ClientWidth;
h=this->ClientHeight;
}
//---------------------------------------------------------------------------
Bien enseguida vamos a codificar los métodos definidos anteriormente primero lo haremos con el método drawSierpinski(), el código de dicho método lo tenemos a continuación:
//Esta funcion dibujara solo 1 triangulo y entonces empezara la funcion de recursividad a si mismo
void TForm1::drawSierpinski(float x1, float y1, float x2, float y2, float x3, float y3)
{
//Aqui dibujamos las 3 lineas del triangulo, uniendo los 3 puntos para generar lineas
this->Canvas->Pen->Color=(TColor)random(65000);
this->Canvas->MoveTo(x1,y1);
this->Canvas->LineTo(x2,y2);
this->Canvas->MoveTo(x2,y2);
this->Canvas->LineTo(x3,y3);
this->Canvas->MoveTo(x3,y3);
this->Canvas->LineTo(x1,y1);
//Llamamos a la funcion de recursividad y pintara el resto de los tringulos, las 3 esquinas de triangulo son simempre el centro de su posicion
subTriangle
(
1, //Esto representa la primer recursicion
(x1 + x2) / 2, //coordenada x de la primera esquina
(y1 + y2) / 2, //coordenada y de la primera esquina
(x1 + x3) / 2, //coordenada x de la segunda esquina
(y1 + y3) / 2, //coordenada y de la segunda esquina
(x2 + x3) / 2, //coordenada x de la tercera esquina
(y2 + y3) / 2 //coordenada y de la tercera esquina
);
}
//-------------------------------------------------------------------------------
Ahora codificaremos el siguiente método el cual es llamado subTriangle(), el código se muestra enseguida:
//La funcion de recursividad subtriangulo pintara todo lo que esta dentro del tringulo mayor a este
void TForm1::subTriangle(int n, float x1, float y1, float x2, float y2, float x3, float y3)
{
Sleep(10);
//Dibujamos los 3 lados del subtriangulo
this->Canvas->MoveTo(x1,y1);
this->Canvas->LineTo(x2,y2);
this->Canvas->MoveTo(x2,y2);
this->Canvas->LineTo(x3,y3);
this->Canvas->MoveTo(x3,y3);
this->Canvas->LineTo(x1,y1);
//Llamadas a si mismo 3 veces con nuevas esquinas,pero solo si el actual numero de recurrencias es menor que la profundidad maxima
if(n < depth)
{
//Triangulo mas pequeño #1
subTriangle
(
n+1, //numero de recurrencias para la siguiente llamada con aumento de 1
(x1 + x2) / 2 + (x2 - x3) / 2, //coordenada x de la primera esquina
(y1 + y2) / 2 + (y2 - y3) / 2, //coordenada y de la primera esquina
(x1 + x2) / 2 + (x1 - x3) / 2, //coordenada x de la segunda esquina
(y1 + y2) / 2 + (y1 - y3) / 2, //coordenada y de la segunda esquina
(x1 + x2) / 2, //coordendaa x de la tercera esquina
(y1 + y2) / 2 //coordenada y de la tercera esquina
);
//Triangulo mas pequeño #2
subTriangle
(
n+1, //numero de recurrencias para la siguiente llamada con aumento de 1
(x3 + x2) / 2 + (x2 - x1) / 2,
(y3 + y2) / 2 + (y2 - y1) / 2,
(x3 + x2) / 2 + (x3 - x1) / 2,
(y3 + y2) / 2 + (y3 - y1) / 2,
(x3 + x2) / 2,
(y3 + y2) / 2
);
//Triangulo mas pequeño #3
subTriangle
(
n+1, //numero de recurrencias para la siguiente llamada con aumento de 1
(x1 + x3) / 2 + (x3 - x2) / 2,
(y1 + y3) / 2 + (y3 - y2) / 2,
(x1 + x3) / 2 + (x1 - x2) / 2,
(y1 + y3) / 2 + (y1 - y2) / 2,
(x1 + x3) / 2,
(y1 + y3) / 2
);
}
}
//---------------------------------------------------------------------------------
El código de los 2 métodos anteriores es algo largo y relativamente un poco complicado sin embargo en el código se incluyen comentarios para ayudarnos a saber que hace cada parte del código y así comprender mejor el comportamiento de este fractal.
Ya para terminar solo nos resta escribir la llamada al método drawSierpinski() dentro del evento clic del Button1 (solo se hace la llamada el método drawSierpinski() ya que dentro de éste método se llama al segundo método que es el subTriangle()), el código lo tenemos enseguida:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
this->Repaint();
Sleep(1);
Button1->Enabled=false;
//Llamamos a la función de Sierpinski (funciona con cualquier esquina dentro de la pantalla)
//Asignamos las coordenadas del tringulo principal "el mas grande"
drawSierpinski(10, h - 10, w - 10, h - 10, w / 2, 10);
Button1->Enabled=true;
Button1->SetFocus();
}
//---------------------------------------------------------------------------
Bien chavos pues eso es todo lo que tenemos que hacer ahora solo compilamos y corremos nuestra aplicación y observamos el efecto que nos genera el cual es un poco tardado así que solo dejen el programa correr tranquilamente, dicho efecto debe ser como lo que tenemos enseguida:
Y bueno amigos eso fue todo por hoy, ya solo nos queda un fractal más para concluir con este tema, el fractal restante es el conocido como fractal de Landscape, y nos genera el efecto de un paisaje. Pero todo eso ya lo veremos en la siguiente ocasión. Hasta la próxima amigos!.
sábado, 7 de abril de 2012
viernes, 6 de abril de 2012
Fractal De Malthus 2
Que onda chavos me da gusto saludarlos de nuevo y en esta ocasión para continuar con el tema de los fractales, programaremos el fractal conocido como el fractal de Malthus 2, como ya se los había dicho en la vez pasada.
Bien pues rápidamente comencemos. Lo primero será como ya hemos estado acostumbrando hacer será cambiar el color de la Forma. Como ya les había mencionado en ocasiones pasadas esto es opcional, si quieren lo pueden hacer e incluso pueden elegir el color que ustedes deseen, en mi caso yo cambiaré el color de la Forma a color rojo. Inmediatamente después tenemos que colocar un botón sobre la Forma.
Nuestra interfaz debería verse mas o menos de la siguiente manera, dependiendo de lo que hayan elegido ustedes:
Ahora nos vamos a la parte del código la cual será bastante sencilla. Primero nos vamos al archivo H y en la parte de declaraciones privadas declaramos las siguientes variables:
private: // User declarations
int maxX, maxY;
Luego en la parte de las declaraciones públicas escribimos la definición del método ExtranioConfinador(), el cual es diferente a los que ya hemos utilizado antes a pesar de tener el mismo nombre:
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void TForm1::ExtranioConfinador();
Bueno ahora nos vamos a la Forma y en sus respectivos eventos buscamos el evento OnCreate y damos doble clic, luego en él escribimos el siguiente código:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
maxX = this->ClientWidth;
maxY = this->ClientHeight;
}
//---------------------------------------------------------------------------
Es hora pues de codificar el método ExtranioConfinador(), el código que necesitaremos para poder generar el efecto del fractal es el que tenemos a continuación:
void TForm1::ExtranioConfinador()
{
int i, j, k, l, Color, Contador;
double PobAnt, PobNueva, X, Y, Razon;
PobAnt = PobNueva = 0.0;
Razon = 2.3;
Y = 0;
for ( j = 1; j <= 15; j++)
{
Color++;
if ( Color > clWhite )
Color = clBlue;
for ( k = 1; k <= 10; k++ )
{
Contador = 0;
Razon = Razon + 0.01;
PobAnt = 0.01;
for ( i = 1; i <= 1000; i++)
{
PobNueva = Razon * ( PobAnt * ( 1 - PobAnt ) );
X = PobNueva - PobAnt;
this->Canvas->Pixels[(X*maxX/2)+maxX/2][(maxY/2)-(Y*maxY/2)]=(TColor)Color;
if( PobAnt == PobNueva )
Contador++;
else
Contador = 0;
if( Contador > 100 )
i = 10000;
PobAnt = PobNueva;
Y = X;
}
}
}
this->Canvas->TextOutA(10, 10, "Flujo Maltusiano");
}
//---------------------------------------------------------------------------
Ya para terminar damos doble clic en el botón que habíamos colocado sobre la Forma y en el escribimos la llamada el método ExtranioConfinador(), el código es así:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
this->Repaint();
ExtranioConfinador();
}
//---------------------------------------------------------------------------
Y es todo chavos ahora todo lo que tenemos que hacer es compilar y correr nuestra aplicación y aquí tenemos el efecto que se debe de generar:
Bien chavos por esta ocasión fue todo, como pueden ir viendo generar los fractales es algo bastante sencillo y rápido pero también muy interesante debido a los efectos que se van formando. Aun nos quedan unos cuantos por ver, pero eso ya será en otra ocasión. Hasta la vista amigos!.
Bien pues rápidamente comencemos. Lo primero será como ya hemos estado acostumbrando hacer será cambiar el color de la Forma. Como ya les había mencionado en ocasiones pasadas esto es opcional, si quieren lo pueden hacer e incluso pueden elegir el color que ustedes deseen, en mi caso yo cambiaré el color de la Forma a color rojo. Inmediatamente después tenemos que colocar un botón sobre la Forma.
Nuestra interfaz debería verse mas o menos de la siguiente manera, dependiendo de lo que hayan elegido ustedes:
Ahora nos vamos a la parte del código la cual será bastante sencilla. Primero nos vamos al archivo H y en la parte de declaraciones privadas declaramos las siguientes variables:
private: // User declarations
int maxX, maxY;
Luego en la parte de las declaraciones públicas escribimos la definición del método ExtranioConfinador(), el cual es diferente a los que ya hemos utilizado antes a pesar de tener el mismo nombre:
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void TForm1::ExtranioConfinador();
Bueno ahora nos vamos a la Forma y en sus respectivos eventos buscamos el evento OnCreate y damos doble clic, luego en él escribimos el siguiente código:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
maxX = this->ClientWidth;
maxY = this->ClientHeight;
}
//---------------------------------------------------------------------------
Es hora pues de codificar el método ExtranioConfinador(), el código que necesitaremos para poder generar el efecto del fractal es el que tenemos a continuación:
void TForm1::ExtranioConfinador()
{
int i, j, k, l, Color, Contador;
double PobAnt, PobNueva, X, Y, Razon;
PobAnt = PobNueva = 0.0;
Razon = 2.3;
Y = 0;
for ( j = 1; j <= 15; j++)
{
Color++;
if ( Color > clWhite )
Color = clBlue;
for ( k = 1; k <= 10; k++ )
{
Contador = 0;
Razon = Razon + 0.01;
PobAnt = 0.01;
for ( i = 1; i <= 1000; i++)
{
PobNueva = Razon * ( PobAnt * ( 1 - PobAnt ) );
X = PobNueva - PobAnt;
this->Canvas->Pixels[(X*maxX/2)+maxX/2][(maxY/2)-(Y*maxY/2)]=(TColor)Color;
if( PobAnt == PobNueva )
Contador++;
else
Contador = 0;
if( Contador > 100 )
i = 10000;
PobAnt = PobNueva;
Y = X;
}
}
}
this->Canvas->TextOutA(10, 10, "Flujo Maltusiano");
}
//---------------------------------------------------------------------------
Ya para terminar damos doble clic en el botón que habíamos colocado sobre la Forma y en el escribimos la llamada el método ExtranioConfinador(), el código es así:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
this->Repaint();
ExtranioConfinador();
}
//---------------------------------------------------------------------------
Y es todo chavos ahora todo lo que tenemos que hacer es compilar y correr nuestra aplicación y aquí tenemos el efecto que se debe de generar:
Bien chavos por esta ocasión fue todo, como pueden ir viendo generar los fractales es algo bastante sencillo y rápido pero también muy interesante debido a los efectos que se van formando. Aun nos quedan unos cuantos por ver, pero eso ya será en otra ocasión. Hasta la vista amigos!.
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!!.
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!!.
miércoles, 4 de abril de 2012
Fractal De Henon
Hola de nueva cuenta amigos! Aquí me encuentro otra vez para continuar con más aplicaciones en C++ Builder. En este momento estamos analizando el tema de los fractales y en esta ocasión programaremos uno más el cual es llamado el fractal de Henon.
Para realizar esto lo primero que haremos será cambiar el colo de la Forma a verde (como siempre ya saben que este paso es opcional). Después todo lo que necesitaremos será colocar un botón sobre la Forma. Entonces procedemos con la parte del código, por lo pronto nuestra Forma debe quedar mas o menos así:
Ahora nos vamos al archivo H de nuestra aplicación y en la parte privada declaramos las siguientes variables:
private: // User declarations
int maxX, maxY;
double EscalaX, EscalaY, DespX, DespY;
Luego en la parte pública escribimos la definición del método que utilizaremos para generar el fractal:
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void TForm1::ExtranioConfinador();
Bueno ahora abrimos el evento OnCreate de la Forma y en él escribimos el siguiente código para que las variables maxX y maxY carguen los valores apenas corramos nuestra aplicación:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
maxX=this->ClientWidth;
maxY=this->ClientHeight;
}
//---------------------------------------------------------------------------
Enseguida escribimos el código del método anteriormente definido, es decir, el método ExtranioConfinador(), este es el codigo:
void TForm1::ExtranioConfinador()
{
int a,i,PosX,PosY, Color;
double Xant,Xnuevo,Yant,Ynuevo;
HDC hdc;
Xant = Xnuevo = Yant = Ynuevo = 0;
for(Color=1; Color<=15; Color++)
for(i=1; i<=0x02ff; i++)
{
Sleep(1);
Xnuevo = Yant + 1 - (1.4*Xant *Xant);
Ynuevo = 0.3 * Xant;
PosX = ( Xnuevo * maxX / 3 * EscalaX ) + maxX / 2 + DespX;
PosY = ( Ynuevo * maxY * EscalaY ) + maxY / 2 + DespY;
if(( PosX>=0)&&(PosX<=maxX)&&(PosY>=0)&&(PosY<=maxY))
this->Canvas->Pixels[PosX][PosY]=(TColor)Color;
Xant=Xnuevo;
Yant=Ynuevo;
}
this->Canvas->TextOutA(10,110,"CONFINADOR HENON");
this->Canvas->TextOutA(10,130,EscalaX);
this->Canvas->TextOutA(10,150,EscalaY);
this->Canvas->TextOutA(10,170,DespX);
this->Canvas->TextOutA(10,190,DespY);
}
//---------------------------------------------------------------------------
Para realizar esto lo primero que haremos será cambiar el colo de la Forma a verde (como siempre ya saben que este paso es opcional). Después todo lo que necesitaremos será colocar un botón sobre la Forma. Entonces procedemos con la parte del código, por lo pronto nuestra Forma debe quedar mas o menos así:
Ahora nos vamos al archivo H de nuestra aplicación y en la parte privada declaramos las siguientes variables:
private: // User declarations
int maxX, maxY;
double EscalaX, EscalaY, DespX, DespY;
Luego en la parte pública escribimos la definición del método que utilizaremos para generar el fractal:
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void TForm1::ExtranioConfinador();
Bueno ahora abrimos el evento OnCreate de la Forma y en él escribimos el siguiente código para que las variables maxX y maxY carguen los valores apenas corramos nuestra aplicación:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
maxX=this->ClientWidth;
maxY=this->ClientHeight;
}
//---------------------------------------------------------------------------
Enseguida escribimos el código del método anteriormente definido, es decir, el método ExtranioConfinador(), este es el codigo:
void TForm1::ExtranioConfinador()
{
int a,i,PosX,PosY, Color;
double Xant,Xnuevo,Yant,Ynuevo;
HDC hdc;
Xant = Xnuevo = Yant = Ynuevo = 0;
for(Color=1; Color<=15; Color++)
for(i=1; i<=0x02ff; i++)
{
Sleep(1);
Xnuevo = Yant + 1 - (1.4*Xant *Xant);
Ynuevo = 0.3 * Xant;
PosX = ( Xnuevo * maxX / 3 * EscalaX ) + maxX / 2 + DespX;
PosY = ( Ynuevo * maxY * EscalaY ) + maxY / 2 + DespY;
if(( PosX>=0)&&(PosX<=maxX)&&(PosY>=0)&&(PosY<=maxY))
this->Canvas->Pixels[PosX][PosY]=(TColor)Color;
Xant=Xnuevo;
Yant=Ynuevo;
}
this->Canvas->TextOutA(10,110,"CONFINADOR HENON");
this->Canvas->TextOutA(10,130,EscalaX);
this->Canvas->TextOutA(10,150,EscalaY);
this->Canvas->TextOutA(10,170,DespX);
this->Canvas->TextOutA(10,190,DespY);
}
//---------------------------------------------------------------------------
Bien para terminar solo damos doble clic en el botón que habíamos colocado sobre la Forma y en el evento OnClic que se abre escribimos el código que tenemos a continuación:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
this->Repaint();
EscalaX=1;
EscalaY=1;
DespX=0;
DespY=0;
ExtranioConfinador();
}
//---------------------------------------------------------------------------
Eso es todos chavos ahora solo queda compilar y correr nuestra aplicación y nos generará el efecto de la curva de Henon además nos desplegará en pantalla los valores de la escala en X, la escala en Y, así como los desplazamientos en X y en Y. Nuestra aplicación quedará de la siguiente manera:
Eso es todo por hoy amigos nos vemos en la próxima con un ejemplo más de los diferentes fractales que podemos generar mediante programación, espero que ya se sientan todos unos expertos en el C++ Builder y sino pues no queda de otra que seguir practicando. Hasta la vista amigos!.
martes, 3 de abril de 2012
Fractal De Mandelbrot
Hola amigos! En esta ocasión vamos a continuar rápidamente con el tema de los fractales y programaremos otro diferente a los que ya hemos hecho anteriormente, hoy le toca el turno al fractal de Mandelbrot.
Bien pues para comenzar lo primero es que tenemos que pintar la Forma de color (esto es opcional), damos clic en la propiedad Color de la forma y elegimos clNavy. Ahora colocamos un botón sobre la forma y eso es todo lo que necesitamos para comenzar a programar. Nuestra forma debería verse mas o menos de la siguiente manera:
Con la interfaz ya lista comenzamos entonces con la programación del fractal de Mandelbrot. Primero nos vamos a el archivo H y en la parte pública declaramos las siguientes variables que utilizaremos más adelante:
int maxX, maxY, Limite, i, j, Pasos, Terminar;
double PasoX, PasoY, PosX, PosY, OrigX, OrigY, DimX, DimY, IterX, IterY, TempX;
Esto será bastante sencillo y rápido chavos ahora nos cambiamos al archivo .cpp, o nos vamos a la Forma y damos doble clic en el botón para abrir su evento OnClic y ahí escribimos el siguiente código que será el que nos formará el efecto de Mandelbrot:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
maxX = Form1->ClientWidth;
maxY = Form1->ClientHeight;
Limite = 100;
OrigX = -2.0;
OrigY = -1.25;
DimX = 0.5;
DimY = 1.25;
PasoX = ( DimX - OrigX ) / maxX;
PasoY = ( DimY - OrigY ) / maxY;
for ( i = 0; i <= maxX; i++)
for ( j = 0; j <= maxY; j++)
{
PosX = OrigX + i * PasoX;
PosY = OrigY + j * PasoY;
IterX = 0.0;
IterY = 0.0;
Terminar = Pasos = 0;
while ( !Terminar )
{
TempX = ( IterX * IterX ) - ( IterY * IterY ) + PosX;
IterY = 2 * ( IterX * IterY ) + PosY;
IterX = TempX;
Pasos++;
if ( hypot( fabs(IterX), fabs(IterY)) >= 2.0)
Terminar++;
if ( Pasos >= Limite )
Terminar++;
}
if ( Pasos < Limite )
Canvas->Pixels[i][j] = (TColor)Pasos;
}
}
//---------------------------------------------------------------------------
Y pues aunque no lo crean es todo chavos, ahora solo tenemos que compilar nuestra programa y correrlo para ver su funcionamiento y si todo salió bien nuestra aplicación debería verse así:
Y por hoy eso fue todo amigos nos vemos la próxima ocasión en la que programaremos otro fractal más para que sigan viendo las diferentes opciones que tenemos en este amplio tema. Hasta la vista chavos!.
Bien pues para comenzar lo primero es que tenemos que pintar la Forma de color (esto es opcional), damos clic en la propiedad Color de la forma y elegimos clNavy. Ahora colocamos un botón sobre la forma y eso es todo lo que necesitamos para comenzar a programar. Nuestra forma debería verse mas o menos de la siguiente manera:
Con la interfaz ya lista comenzamos entonces con la programación del fractal de Mandelbrot. Primero nos vamos a el archivo H y en la parte pública declaramos las siguientes variables que utilizaremos más adelante:
int maxX, maxY, Limite, i, j, Pasos, Terminar;
double PasoX, PasoY, PosX, PosY, OrigX, OrigY, DimX, DimY, IterX, IterY, TempX;
Esto será bastante sencillo y rápido chavos ahora nos cambiamos al archivo .cpp, o nos vamos a la Forma y damos doble clic en el botón para abrir su evento OnClic y ahí escribimos el siguiente código que será el que nos formará el efecto de Mandelbrot:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
maxX = Form1->ClientWidth;
maxY = Form1->ClientHeight;
Limite = 100;
OrigX = -2.0;
OrigY = -1.25;
DimX = 0.5;
DimY = 1.25;
PasoX = ( DimX - OrigX ) / maxX;
PasoY = ( DimY - OrigY ) / maxY;
for ( i = 0; i <= maxX; i++)
for ( j = 0; j <= maxY; j++)
{
PosX = OrigX + i * PasoX;
PosY = OrigY + j * PasoY;
IterX = 0.0;
IterY = 0.0;
Terminar = Pasos = 0;
while ( !Terminar )
{
TempX = ( IterX * IterX ) - ( IterY * IterY ) + PosX;
IterY = 2 * ( IterX * IterY ) + PosY;
IterX = TempX;
Pasos++;
if ( hypot( fabs(IterX), fabs(IterY)) >= 2.0)
Terminar++;
if ( Pasos >= Limite )
Terminar++;
}
if ( Pasos < Limite )
Canvas->Pixels[i][j] = (TColor)Pasos;
}
}
//---------------------------------------------------------------------------
Y pues aunque no lo crean es todo chavos, ahora solo tenemos que compilar nuestra programa y correrlo para ver su funcionamiento y si todo salió bien nuestra aplicación debería verse así:
Y por hoy eso fue todo amigos nos vemos la próxima ocasión en la que programaremos otro fractal más para que sigan viendo las diferentes opciones que tenemos en este amplio tema. Hasta la vista chavos!.
lunes, 2 de abril de 2012
Fractal Del Dragón
Hola de nueva cuenta amigos! Es hora de continuar practicando con el C++ Builder, en esta ocasión programaremos otro fractal como el de la vez anterior pero este genera un efecto diferente y es conocido como el fractal del dragón.
Bien pues para empezar primero cambiamos el color de la Forma a negro, y colocamos los siguientes componentes:
-1 botón
-1 Edit (con un valor inicial de 2)
-1 Edit (con un valor inicial de 12)
-1 UpDown (con un valor mínimo de 1 y máximo de 10, asociado con el Edit1)
-1 UpDown (con un valor mínimo de 1 y máximo de 13, asociado con el Edit2)
La forma en mi caso queda de la siguiente manera:
Ahora abrimos el archivo H y en la parte privada declaramos las siguientes variables:
private: // User declarations
int Paso, Signo, EjeX[4098], EjeY[4098], x1, y1, x2, y2;
Y en la parte pública declaramos la definición de los métodos que utilizaremos:
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void TForm1::GenerarDragon();
Bueno pues enseguida declaramos el método GenerarDragon(), ahora en el archivo .cpp:
void TForm1::GenerarDragon()
{
int i, j, dx, dy;
j = Paso / 2;
for(i = 1; i <= 4096; i += Paso)
{
dx = EjeX[Paso+i] - EjeX[i];
dy = EjeY[Paso+i] - EjeY[i];
Signo *= -1;
EjeX[i + j] = EjeX[i] + (dx + (dy * Signo)) / Edit1->Text.ToInt();
EjeY[i + j] = EjeY[i] + (dy - (dx * Signo)) / Edit1->Text.ToInt();
this->Canvas->MoveTo(EjeX[i],EjeY[i]);
this->Canvas->LineTo(EjeX[i+j],EjeY[i+j]);
this->Canvas->MoveTo(EjeX[i+j],EjeY[i+j]);
this->Canvas->LineTo(EjeX[i+Paso],EjeY[i+Paso]);
Sleep(1);
}
}
//--------------------------------------------------------------------------
Ahora abrimos el Button1 y escribimos el código que tenemos a continuación:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Paso = 4096;
Signo = -1;
EjeX[1] = this->ClientWidth / 4;
EjeX[4097] = 3 * this->ClientWidth / 4;
EjeY[1] = EjeY[4097] = 2 * this->ClientHeight / 3;
this->Canvas->Pen->Color = clRed;
this->Canvas->MoveTo(EjeX[1],EjeY[1]);
this->Canvas->LineTo(EjeX[4097],EjeY[4097]);
for(int i = 1; i <= Edit2->Text.ToInt(); i++)
{
this->Repaint();
GenerarDragon();
Paso /= 2;
}
}
//---------------------------------------------------------------------------
Ahora abrimos en evento OnPaint de la Forma y escribimos la siguiente línea:
void __fastcall TForm1::FormResize(TObject *Sender)
{
Invalidate();
}
//---------------------------------------------------------------------------
Y pues eso es todo chavos ahora solo queda compilar nuestra aplicación y correrla para ver como funciona. Pueden mover los valores de los Edits para ver los diferentes efectos que se forman, el primero afectará la forma que tendrá el fractal al formarse y el segundo es el número de iteraciones que realizará la aplicación para formar el fractal. El resultado final es el siguiente:
Por hoy eso fue todo amigos nos vemos en la siguiente ocasión para seguir con más de este tema de los fractales que es bastante amplio y ay mucha variedad de ellos. Nos vemos chavos!.
Bien pues para empezar primero cambiamos el color de la Forma a negro, y colocamos los siguientes componentes:
-1 botón
-1 Edit (con un valor inicial de 2)
-1 Edit (con un valor inicial de 12)
-1 UpDown (con un valor mínimo de 1 y máximo de 10, asociado con el Edit1)
-1 UpDown (con un valor mínimo de 1 y máximo de 13, asociado con el Edit2)
La forma en mi caso queda de la siguiente manera:
Ahora abrimos el archivo H y en la parte privada declaramos las siguientes variables:
private: // User declarations
int Paso, Signo, EjeX[4098], EjeY[4098], x1, y1, x2, y2;
Y en la parte pública declaramos la definición de los métodos que utilizaremos:
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void TForm1::GenerarDragon();
Bueno pues enseguida declaramos el método GenerarDragon(), ahora en el archivo .cpp:
void TForm1::GenerarDragon()
{
int i, j, dx, dy;
j = Paso / 2;
for(i = 1; i <= 4096; i += Paso)
{
dx = EjeX[Paso+i] - EjeX[i];
dy = EjeY[Paso+i] - EjeY[i];
Signo *= -1;
EjeX[i + j] = EjeX[i] + (dx + (dy * Signo)) / Edit1->Text.ToInt();
EjeY[i + j] = EjeY[i] + (dy - (dx * Signo)) / Edit1->Text.ToInt();
this->Canvas->MoveTo(EjeX[i],EjeY[i]);
this->Canvas->LineTo(EjeX[i+j],EjeY[i+j]);
this->Canvas->MoveTo(EjeX[i+j],EjeY[i+j]);
this->Canvas->LineTo(EjeX[i+Paso],EjeY[i+Paso]);
Sleep(1);
}
}
//--------------------------------------------------------------------------
Ahora abrimos el Button1 y escribimos el código que tenemos a continuación:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Paso = 4096;
Signo = -1;
EjeX[1] = this->ClientWidth / 4;
EjeX[4097] = 3 * this->ClientWidth / 4;
EjeY[1] = EjeY[4097] = 2 * this->ClientHeight / 3;
this->Canvas->Pen->Color = clRed;
this->Canvas->MoveTo(EjeX[1],EjeY[1]);
this->Canvas->LineTo(EjeX[4097],EjeY[4097]);
for(int i = 1; i <= Edit2->Text.ToInt(); i++)
{
this->Repaint();
GenerarDragon();
Paso /= 2;
}
}
//---------------------------------------------------------------------------
Ahora abrimos en evento OnPaint de la Forma y escribimos la siguiente línea:
void __fastcall TForm1::FormResize(TObject *Sender)
{
Invalidate();
}
//---------------------------------------------------------------------------
Y pues eso es todo chavos ahora solo queda compilar nuestra aplicación y correrla para ver como funciona. Pueden mover los valores de los Edits para ver los diferentes efectos que se forman, el primero afectará la forma que tendrá el fractal al formarse y el segundo es el número de iteraciones que realizará la aplicación para formar el fractal. El resultado final es el siguiente:
domingo, 1 de abril de 2012
Fractal De Newton-Raphson
Hola a todos amigos!! Después de tanto tiempo de no andar por aquí les pido una disculpa y es hora de que volvamos a seguir con las prácticas de aplicaciones gráficas en C++ Builder. Bueno en esta ocasión empezaremos con le tema de los fractales. Si no sabemos lo que son los fractales podemos seguir el siguiente enlace y nuestra buena amiga doña Wikipedia nos lo dirá:
http://es.wikipedia.org/wiki/Fractal
El fractal que programaremos hoy será el conocido como Newton-Raphson. Lo que haremos hoy será un poco diferente a lo que hacemos regularmente ya que esta vez no utilizaremos la Forma que nos da el C++ Builder sino que llamaremos directo a Windows para que nos cree una al tamaño que nosotros deseemos etc.
Bueno pues empezamos por crear una nueva aplicación en C++ Builder y luego nos vamos al menú "Project" luego al sub-menú "Remove From Project" y en la ventana que se abre seleccionamos la opción "Unit1.cpp" y le damos en OK. Esto nos eliminará la Forma ahora abrimos el menú "View" y después el sub-menú "Project Manager" y en la ventana damos doble clic en "Project1.cpp". Una vez que se nos haya abierto el editor de código borramos todo el código que haya escrito y escribimos todo lo siguiente:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//--- Declaración de funciones del programa ------------------------------
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
void CrearPaleta(void);
//--- Declaración de variables del programa ------------------------------
char WindowName[] = "Ventana de Windows";
char WindowTitle[] = "Fractal de Newton-Raphson";
BYTE ColorRGB[256][3];
void CrearPaleta(void)
{
int i;
for (i=0; i<256; i++)
{
if (i<64)
{
ColorRGB[i][0] = 192 + i;
ColorRGB[i][1] = 0;
ColorRGB[i][2] = 0;
}
else if ((i>63) && (i<128))
{
ColorRGB[i][0] = 0;
ColorRGB[i][1] = (192 + i)-64;
ColorRGB[i][2] = 0;
}
else if ((i>127)&&(i<192))
{
ColorRGB[i][0] = 0;
ColorRGB[i][1] = 0;
ColorRGB[i][2] = (192 + i)-128;
}
}
}
//=== Función principal WinMain() ========================================
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
HWND hwnd; // handle a la ventana ppal.
MSG msg; // estructura de mensaje
WNDCLASSEX wcx; // estructura de la ventana
// Definimos la estructura de clase de ventana (campos):
wcx.cbSize = sizeof( WNDCLASSEX ); // tamaño de la estructura
wcx.style = CS_HREDRAW | CS_VREDRAW; // valores más usuales
wcx.lpfnWndProc = WndProc; // función de ventana (Wnd)
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0; // informaciones extra
wcx.hInstance = hInstance; // instancia actual
// icono, cursor, fondo e icono pequeño de la clase de ventana:
wcx.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wcx.hCursor = LoadCursor(NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH) GetStockObject( WHITE_BRUSH );
wcx.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
wcx.lpszMenuName = NULL; // nombre del menú
wcx.lpszClassName = WindowName; // nombre de la ventana
// Registramos la clase de ventana ya preparada:
if( !RegisterClassEx( &wcx ) )
return( FALSE ); // en caso de error, salir
// Creamos la ventana con CreateWindowEx():
hwnd = CreateWindowEx(
WS_EX_OVERLAPPEDWINDOW, // estilo extendido
WindowName, // nombre de la ventana
WindowTitle, // título de la ventana
WS_OVERLAPPEDWINDOW, // estilo de ventana
CW_USEDEFAULT, CW_USEDEFAULT, // Posición (x,y) en pantalla
400, 400, // ancho y alto de la ventana
NULL, NULL, // ventana padre e hija+menú
hInstance, // instancia actual
NULL // no hay más información
);
// Comprobamos la creación de la ventana:
if( !hwnd )
return( FALSE ); // en caso de error, salir
// Hacemos visible la ventana y la actualizamos:
ShowWindow( hwnd, nCmdShow );
UpdateWindow( hwnd );
// Bucle de mensajes, envía los mensajes hacia WndProc
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg ); // convertimos el mensaje
DispatchMessage( &msg ); // devolvemos el control a w95
}
// devolvemos el valor recibido por PostQuitMessage().
return( msg.wParam );
}
//=== Función del procedimiento de ventana WndProc() =====================
LRESULT CALLBACK WndProc( HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
BYTE R, G, B;
double deltax, deltay, x, y, tmp, xx, yy, d;
float xmin = -2.0, ymin=-2.0, xmax=2.0, ymax=2.0;
int maxiter = 2048;
int maxcol, maxrow;
int color, row, col, count;
switch( message )
{
// mensaje producido en la creación de la ventana
case WM_CREATE:
break;
//dibuja el fractal de Newton-Raphson
case WM_PAINT:
CrearPaleta();
hdc = BeginPaint( hwnd, &ps );
GetClientRect(hwnd, &rect);
maxcol = rect.right - rect.left ;
maxrow = rect.bottom - rect.top;
deltax = (xmax - xmin)/maxcol;
deltay = (ymax - ymin)/maxrow;
for (col=0; col<=maxcol; col++)
{
for (row=0; row<=maxrow; row++)
{
x = xmin + col * deltax;
y = ymin + row * deltay;
count=0;
while (count<maxiter)
{
xx = x*x;
yy = y*y;
d = 3.0*((xx - yy)*(xx - yy) + 4.0*xx*yy);
if (d == 0.0)
d = 0.000001;
tmp=x;
x = (2.0/3.0)*x + (xx - yy)/d;
y = (2.0/3.0)*y - 2.0*tmp*y/d;
count+=1;
}
if (x>0.0)
color = count%64;
else
{
if ((x<-0.3) && (y>0.0))
color = (count%64) + 64;
else
color = (count%64) + 128;
}
R=ColorRGB[color][0];
G=ColorRGB[color][1];
B=ColorRGB[color][2];
SetPixel(hdc, col, row, RGB(R,G,B));
}
}
EndPaint( hwnd, &ps );
break;
// mensaje producido al cerrar la ventana
case WM_DESTROY:
PostQuitMessage( 0 );
break;
// resto de mensajes, dar una respuesta estándar.
default:
return( DefWindowProc( hwnd, message, wParam, lParam ) );
}
return(0);
}
//=== Fin del archivo ====================================================
Ahora compilamos y corremos nuestra aplicación y obtendremos nuestro fractal resultante:
Y bueno amigos por esta ocasión eso fue todo nos vemos más adelante para continuar y ver un poco más de fractales ya que son muy interesantes. Hasta la próxima!!.
http://es.wikipedia.org/wiki/Fractal
El fractal que programaremos hoy será el conocido como Newton-Raphson. Lo que haremos hoy será un poco diferente a lo que hacemos regularmente ya que esta vez no utilizaremos la Forma que nos da el C++ Builder sino que llamaremos directo a Windows para que nos cree una al tamaño que nosotros deseemos etc.
Bueno pues empezamos por crear una nueva aplicación en C++ Builder y luego nos vamos al menú "Project" luego al sub-menú "Remove From Project" y en la ventana que se abre seleccionamos la opción "Unit1.cpp" y le damos en OK. Esto nos eliminará la Forma ahora abrimos el menú "View" y después el sub-menú "Project Manager" y en la ventana damos doble clic en "Project1.cpp". Una vez que se nos haya abierto el editor de código borramos todo el código que haya escrito y escribimos todo lo siguiente:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
//--- Declaración de funciones del programa ------------------------------
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int );
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
void CrearPaleta(void);
//--- Declaración de variables del programa ------------------------------
char WindowName[] = "Ventana de Windows";
char WindowTitle[] = "Fractal de Newton-Raphson";
BYTE ColorRGB[256][3];
void CrearPaleta(void)
{
int i;
for (i=0; i<256; i++)
{
if (i<64)
{
ColorRGB[i][0] = 192 + i;
ColorRGB[i][1] = 0;
ColorRGB[i][2] = 0;
}
else if ((i>63) && (i<128))
{
ColorRGB[i][0] = 0;
ColorRGB[i][1] = (192 + i)-64;
ColorRGB[i][2] = 0;
}
else if ((i>127)&&(i<192))
{
ColorRGB[i][0] = 0;
ColorRGB[i][1] = 0;
ColorRGB[i][2] = (192 + i)-128;
}
}
}
//=== Función principal WinMain() ========================================
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
HWND hwnd; // handle a la ventana ppal.
MSG msg; // estructura de mensaje
WNDCLASSEX wcx; // estructura de la ventana
// Definimos la estructura de clase de ventana (campos):
wcx.cbSize = sizeof( WNDCLASSEX ); // tamaño de la estructura
wcx.style = CS_HREDRAW | CS_VREDRAW; // valores más usuales
wcx.lpfnWndProc = WndProc; // función de ventana (Wnd)
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0; // informaciones extra
wcx.hInstance = hInstance; // instancia actual
// icono, cursor, fondo e icono pequeño de la clase de ventana:
wcx.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wcx.hCursor = LoadCursor(NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH) GetStockObject( WHITE_BRUSH );
wcx.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
wcx.lpszMenuName = NULL; // nombre del menú
wcx.lpszClassName = WindowName; // nombre de la ventana
// Registramos la clase de ventana ya preparada:
if( !RegisterClassEx( &wcx ) )
return( FALSE ); // en caso de error, salir
// Creamos la ventana con CreateWindowEx():
hwnd = CreateWindowEx(
WS_EX_OVERLAPPEDWINDOW, // estilo extendido
WindowName, // nombre de la ventana
WindowTitle, // título de la ventana
WS_OVERLAPPEDWINDOW, // estilo de ventana
CW_USEDEFAULT, CW_USEDEFAULT, // Posición (x,y) en pantalla
400, 400, // ancho y alto de la ventana
NULL, NULL, // ventana padre e hija+menú
hInstance, // instancia actual
NULL // no hay más información
);
// Comprobamos la creación de la ventana:
if( !hwnd )
return( FALSE ); // en caso de error, salir
// Hacemos visible la ventana y la actualizamos:
ShowWindow( hwnd, nCmdShow );
UpdateWindow( hwnd );
// Bucle de mensajes, envía los mensajes hacia WndProc
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg ); // convertimos el mensaje
DispatchMessage( &msg ); // devolvemos el control a w95
}
// devolvemos el valor recibido por PostQuitMessage().
return( msg.wParam );
}
//=== Función del procedimiento de ventana WndProc() =====================
LRESULT CALLBACK WndProc( HWND hwnd, UINT message,
WPARAM wParam, LPARAM lParam )
{
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
BYTE R, G, B;
double deltax, deltay, x, y, tmp, xx, yy, d;
float xmin = -2.0, ymin=-2.0, xmax=2.0, ymax=2.0;
int maxiter = 2048;
int maxcol, maxrow;
int color, row, col, count;
switch( message )
{
// mensaje producido en la creación de la ventana
case WM_CREATE:
break;
//dibuja el fractal de Newton-Raphson
case WM_PAINT:
CrearPaleta();
hdc = BeginPaint( hwnd, &ps );
GetClientRect(hwnd, &rect);
maxcol = rect.right - rect.left ;
maxrow = rect.bottom - rect.top;
deltax = (xmax - xmin)/maxcol;
deltay = (ymax - ymin)/maxrow;
for (col=0; col<=maxcol; col++)
{
for (row=0; row<=maxrow; row++)
{
x = xmin + col * deltax;
y = ymin + row * deltay;
count=0;
while (count<maxiter)
{
xx = x*x;
yy = y*y;
d = 3.0*((xx - yy)*(xx - yy) + 4.0*xx*yy);
if (d == 0.0)
d = 0.000001;
tmp=x;
x = (2.0/3.0)*x + (xx - yy)/d;
y = (2.0/3.0)*y - 2.0*tmp*y/d;
count+=1;
}
if (x>0.0)
color = count%64;
else
{
if ((x<-0.3) && (y>0.0))
color = (count%64) + 64;
else
color = (count%64) + 128;
}
R=ColorRGB[color][0];
G=ColorRGB[color][1];
B=ColorRGB[color][2];
SetPixel(hdc, col, row, RGB(R,G,B));
}
}
EndPaint( hwnd, &ps );
break;
// mensaje producido al cerrar la ventana
case WM_DESTROY:
PostQuitMessage( 0 );
break;
// resto de mensajes, dar una respuesta estándar.
default:
return( DefWindowProc( hwnd, message, wParam, lParam ) );
}
return(0);
}
//=== Fin del archivo ====================================================
Ahora compilamos y corremos nuestra aplicación y obtendremos nuestro fractal resultante:
Y bueno amigos por esta ocasión eso fue todo nos vemos más adelante para continuar y ver un poco más de fractales ya que son muy interesantes. Hasta la próxima!!.
Suscribirse a:
Entradas (Atom)












