Vistas de página en total

sábado, 15 de octubre de 2011

simular paint

Nuestra aplicación dibuja lineas, círculos y espirales, con ayuda de una clase gráficos que les muestro a continuación.

//---------------------------------------------------------------------------


#pragma hdrstop
#include <math.h>
#include "Graficos1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)
   void Graficos::linea(int x1,int y1,int x2,int y2,TColor color)
   {
    int dx,dy,steps,k,n,m;
    float x_inc,y_inc,x,y;
    dx=x2-x1;
    dy=y2-y1;
    if(abs(dx)>abs(dy))
    steps=abs(dx);
    else
    steps=abs(dy);
    x_inc=(float)dx/steps;
    y_inc=(float)dy/steps;
    x=x1;
    y=y1;
    n=static_cast<int>(x);
    m=static_cast<int>(y);
    canvas->Pixels[n][m]=clBlue;
    for(k=1;k<steps+1;k++)
    {
     x=x+x_inc;
     y=y+y_inc;
     n=static_cast<int>(x);
     m=static_cast<int>(y);
     canvas->Pixels[n][m]=clBlue;
    }

   }

   //--------------------------------
   void Graficos::linea(int x1,int y1,int x2,int y2)
   {
    int dx,dy,steps,k,n,m;
    float x_inc,y_inc,x,y;
    dx=x2-x1;
    dy=y2-y1;
    if(abs(dx)>abs(dy))
    steps=abs(dx);
    else
    steps=abs(dy);
    x_inc=(float)dx/steps;
    y_inc=(float)dy/steps;
    x=x1;
    y=y1;
    n=static_cast<int>(x);
    m=static_cast<int>(y);
    canvas->Pixels[n][m]=(TColor)random(255);//clBlue;
    for(k=1;k<steps+1;k++)
    {
     x=x+x_inc;
     y=y+y_inc;
     n=static_cast<int>(x);
     m=static_cast<int>(y);
     canvas->Pixels[n][m]=(TColor)random(255);//clBlue;
    }

   }

  void Graficos::circulo_1(int x1,int y1)
   {
        //int r=Edit3->Text.ToIntDef(50);
    int xc=x1;
    int yc=y1;
    int x,y,r;
    r=xc/2;
    x=r;
    for(int i=0;i<=r;i++)
    {
      y = yc + sqrt((r*r)-((x-xc)*(x-xc)));
      x++;
      canvas->Pixels[x][static_cast<int>(y)]=clBlue;
    }
    x=r;
    //xc=100;
    //yc=100;
    for(int i=0;i<=r;i++)
    {
      y =  yc - sqrt((r*r)-((x-xc)*(x-xc)));
      x++;
      canvas->Pixels[x][static_cast<int>(y)]=clBlue;
    }
     x=xc;
    //xc=100;
    //yc=100;
    for(int i=0;i<=r;i++)
    {
      y =  yc + sqrt((r*r)-((x-xc)*(x-xc)));
      x++;
      canvas->Pixels[x][static_cast<int>(y)]=clBlue;
    }
    x=xc;
    //xc=100;
    //yc=100;
    for(int i=0;i<=r;i++)
    {
      y =  yc - sqrt((r*r)-((x-xc)*(x-xc)));
      x++;
      canvas->Pixels[x][static_cast<int>(y)]=clBlue;
    }
   }

void Graficos::circulo_2(int x1,int y1,int r)
{
  float dt,ct,st,x,y,xtemp;
  dt=1.0/r;
 x=0;
 y=r;
 ct=cos(dt);
 st=sin(dt);
 while(x<=y)
 {
   canvas->Pixels[static_cast<int>(x1+x)][static_cast<int>(y1+y)]=clBlue;
    canvas->Pixels[static_cast<int>(x1-x)][static_cast<int>(y1+y)]=clRed;
     canvas->Pixels[static_cast<int>(x1+x)][static_cast<int>(y1-y)]=clOlive;
      canvas->Pixels[static_cast<int>(x1-x)][static_cast<int>(y1-y)]=clSkyBlue;
   xtemp=x;
   x=x*ct-y*st;
   y=y*ct+xtemp*st;
 }
}

void Graficos::circulo_3(int x1,int y1,int r)
{
  float pi=M_PI*2.0;
   float dth,ct,st,x,y,xtemp;
  if(r!=0)
  {
   dth=pi/(16*r);
   ct=cos(dth);
   st=sin(dth);
   x=0;
   y=r;
   for(int i=0;i<=(16*r);i++)
   {
    xtemp=x;
    x=x*ct+y*st;
    y=y*ct-xtemp*st;
    canvas->Pixels[static_cast<int>(x1+x)][static_cast<int>(y1+y)]=clSkyBlue;
    Sleep(30);
   }
  }
}

 void Graficos::circulo_4(int x1,int y1,int r)
 {
   int x,y;
   for(int grados=0;grados<360;grados++)
   {
    x=x1+r*cos(grados/180.0+M_PI);
    y=y1+r*sin(grados/180.0+M_PI);
    canvas->Pixels[x][y]=clBlue;
    Sleep(10);
   }
   for(int grados=0;grados<360;grados++)
   {
    x=x1+r*cos(grados/90.0+M_PI);
    y=y1+r*sin(grados/90.0+M_PI);
    canvas->Pixels[x][y]=clBlue;
    Sleep(10);
   }
    for(int grados=0;grados<360;grados++)
   {
    x=x1+r*cos(grados/M_PI);
    y=y1+r*sin(grados/M_PI);
    canvas->Pixels[x][y]=clBlue;
    Sleep(10);
   }
 }

recibimos las coordenadas de el área donde quiere el usuario dibujar y con un botton hacemos el llamado al método de la clase gráficos.
los espirales los hacemos dibujando lineas del método linea como sigue:
int xc=Form1->PaintBox1->ClientWidth/2, yc=Form1->PaintBox1->ClientHeight/2,radio=5;
  double pi=M_PI*2.0;
  int count=0;
  double dth,cth,sth,x,y,x_temp,xt,yt;
  dth=pi/(16*radio);
  cth=cos(dth);
  sth=sin(dth);
  x=0.0;
  y=radio;
  xt=xc+x;
  yt=yc+y;
  do
  {
    x_temp=x;
    x=x*cth-y*sth;
    y=y*cth+x_temp*sth;
    if(x>0)
      x +=0.5;
    else
      x-=0.5;
    if(y>0)
      y+=0.5;
    else
      y-=0.5;
    //Form1->PaintBox1->Canvas->Pixels[floor(xt+0.5)][floor(yt+0.5)]=clRed;
    /*x1=floor(xt+0.5);
    y1=floor(yt+0.5);
    x2=floor(xc+0.5);
    y2=floor(yc+0.5);
    g->linea(x1,y1,x2,y2);*/
    xt=xc+x;
    yt=yc+y;
    count++;
    Sleep(5);
    }
    while(count<=350);

Así quedo nuestra aplicación.
dibujando linea:
dibujando el circulo dado el centro de este
dibujando circulo con coordenadas del centro y radio
dibujando el circulo poco a poco:

dibujando el circulo calculando los ángulos:


dibujando espiral:
espiral 1:

espiral 2:


Agregando efectos a espiral:



Aquí puedes descargar




 

No hay comentarios:

Publicar un comentario