sábado, 10 de mayo de 2014

Fractal Dragon

Fractal del Dragón.



Fractal


En la naturaleza también aparece la geometría fractal, como en esta romanescu.
Un fractal es un objeto geométrico cuya estructura básica, fragmentada o irregular, se repite a diferentes escalas.1 El término fue propuesto por el matemático Benoît Mandelbrot en 1975 y deriva del Latín fractus, que significa quebrado o fracturado. Muchas estructuras naturales son de tipo fractal. La propiedad matemática clave de un objeto genuinamente fractal es que su dimensión métrica fractal es un número no entero.







Esta aplicacion muestra el fractal del dragon

Metodo que genera el dragon

void TForm1::GenerarDragon(TColor color)
{
       int i,j,dx,dy;
       j=Paso/2;
       TColor colores[]={clRed,clYellow,clBlack,clAqua,clBlue,clGreen};
       //TColor colores []= {clYellow, clRed,clBlue,clBlack, };
       //this->Canvas->Pen->Color;
       this->Canvas->Font->Color =colores[random(5)] ;
        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))/2;
        EjeY[i + j] = EjeY[i] + (dy - (dx * Signo))/2;
        color +=(TColor) i * 5;
        //this->Canvas->Pen->Color = color;
        // this->Canvas->Font->Color =clYellow;//colores[random(6)] ;
       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(100); // tiempo de ejecucion

        }
}


// numero de repeticiones para el dragon

        int rep=6;
        this->Repaint();
        Paso=4096;
        Signo=-1;
        EjeX[1]=this->ClientWidth/8;
        EjeX[4097]=2*this->ClientWidth/8;
        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<=rep;i++)
        {
        Repaint();
        Canvas->TextOutA(5,5,"curva fractal");
        GenerarDragon((TColor)i);

        Paso/=2;

              if(i== rep)
                {
                Timer1->Enabled=false;
                }
        }

Manipulacion de imagenes ,usando brush coppy y copyrect



Esta es una aplicacion realizada , utilizando los metodos de copyrect y brush copy,para simular el Zoom de la imagen, tambien utilizando los recorridos pixel a pixel de la imagen, y usando los operadores OR, AND , NOT para hacer unos cambios de color, usamos tambien las tecnicas de giro de imagenes para poder obtener los efectos de giro a la derecha, giro a la izquierda, 180º, 360º y tipo espejo.

Se le implemento tambien el uso de archivos para poder cargar la imagen desde cualquier lugar, como sucede con paint.

Les dejare parte del codigo para que lo puedan utilizar.

 //codigo para cargar imagen desde archivo, agregar previamete openDialog
        OpenDialog1->Execute();
       Image1->Visible=true;
       Image2->Visible=true;
       Image1->Picture->LoadFromFile(OpenDialog1->FileName);

//girar a la derecha 90 º la imagen
  for(int x=0; x<=Image1->Width; x++)

                for(int y=0;y <=Image1->Height; y++)
                {
                 Color=Image1->Canvas->Pixels[x][y];
                // GIRA 90º ala derecha
                 Image3->Canvas->Pixels[Image3->Width-y][x] = Color;
                 }

//girar a la izquierda 90 º la imagen
  for(int x=0; x<= Image1->Width; x++)

                for(int y=0;y <=Image1->Height; y++)
                {
                 Color=Image1->Canvas->Pixels[x][y];
                // GIRA 90º a la izquierda.

                 Image3->Canvas->Pixels[y][Image3->Height - x] = Color;
                }

  //EFECTO ESPEJO
 for(int x=0; x<Image1->Width; x++)

                for(int y=0;y < Image1->Height; y++)
                {
                 Color=Image1->Canvas->Pixels[x][y];

             
                 Image2->Canvas->Pixels[Image1->Width - x][y] = Color;
                 }
//cambio de color por rojo 255
 for(int x=0; x<Image1->Width;x++)
                for(int y=0; y<Image1->Height;y++)
                {
                    Color=Image1->Canvas->Pixels[x][y];
                    r1= Color & 255 ;//0xff
                    Image2->Canvas->Pixels[x][y] = r1;
                }

//recortar

   // variables tipo objeto
    TRect MyRect, MyOther;
               //x,  y
   //MyOther= Rect(535,10,200,350);
   MyOther= Rect(0, 0, Image2->Width/2, Image2->Height/2);
    MyRect= Rect(cx1,cy1,cx2,cy2);
   // crea objeto bitmap
    //Bitmap = new Graphics::TBitmap;
    // carga la imagen
   // Bitmap->LoadFromFile("C:/Users/orlando/Desktop/simp.bmp");

   //Form1->Canvas->CopyRect(MyOther, Bitmap->Canvas,MyRect);
    Image2->Canvas->CopyRect(MyOther, Image1->Canvas, MyRect);

// brush copy lo utilice para quitar el color seleccionado de la imagen
Graphics::TBitmap *Bitmap;
    // variables tipo objeto
    TRect MyRect, MyOther;

    MyRect = Rect(0,0,Image2->Width,Image2->Height);
    MyOther= Rect(0, 0, Image2->Width, Image2->Height);
    // crea objeto bitmap
    Bitmap = new Graphics::TBitmap;
    // carga la imagen
    Bitmap->LoadFromFile("C:/Users/orlando/Desktop/simp.bmp");

    //quita de la imagen alguno color en especifico o dado
    Image2->Canvas->BrushCopy(MyRect, Bitmap, MyRect,pixel);
    // borra bitmap
    delete Bitmap;