Vistas de página en total

domingo, 4 de septiembre de 2011

Movimiento de pixeles


En este proyecto veremos como mostrar pixeles en una aplicación en c++ builder, y como desplazarlos hacia el centro de cada uno de los cuadrantes y se borran cuando llegan al centro.


Ejemplo:


Para esto hacemos uso de POINT que cuenta con un campo para la posición x y y de cada pixel.


Agregamos las siguientes variables en el archivo h. de la Tform en la parte de private:

   POINT Puntos[1000]; // Matriz para mantener la posición de 1000 puntos
    int Contador; // Contador general para la matriz anterior
    int MediaX, MediaY,MediaXC,MediaYC,MediaXS, MediaYS,MediaXT, MediaYT; // Puntos medios del área de dibujo


métodos

agregamos un timer a la forma y el siguiente código en sus respectivos 

void __fastcall TForm1::FormPaint(TObject *Sender)
{
    for(int N = 0; N < 1000; N++)
{ // Calcular los 1000 puntos
Puntos[N].x = random(ClientWidth); // de forma aleatoria
Puntos[N].y = random(ClientHeight);
Canvas->Pixels[Puntos[N].x][Puntos[N].y] = clBlack;
}
Contador = 0; // Inicializar el contador
//primer cuadrante
MediaX = (ClientWidth / 2)/2; // Y calcular el punto medio
MediaY = (ClientHeight / 2)/2;
//tercero cuadrante
MediaXC=ClientWidth - (ClientWidth / 2)/2;
MediaYC=ClientHeight - (ClientHeight / 2)/2;
//cuarto cuadrante
 MediaXS=((ClientWidth - ((ClientHeight / 2)-((ClientWidth / 2)/2)/2))/2)/2;
 MediaYS=ClientHeight - ((ClientHeight / 2)-(ClientHeight / 2)/2);
 //segundo cuadrante
  MediaXT=ClientWidth -((ClientWidth / 2)- (ClientWidth / 2)/2);
 MediaYT=((ClientHeight -( (ClientHeight / 2)-(ClientHeight / 2)/2))/2)/2;
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
      for (int N = 0; N < 100; N++)
    {// Desplazar 100 puntos en cada ciclo, probar en vez de 100 - 1000
    // Desactivar el punto de su posición actual
    Canvas->Pixels[Puntos[Contador].x][Puntos[Contador].y] = clBlack;
    // Calcular su nueva posición
      if (Puntos[Contador].x < (ClientWidth / 2) && Puntos[Contador].y <(ClientHeight / 2))
   {
    Puntos[Contador].x += (Puntos[Contador].x < MediaX)*1 +
    (Puntos[Contador].x > MediaX)*-1;
    Puntos[Contador].y += (Puntos[Contador].y < MediaY)*1 +
    (Puntos[Contador].y > MediaY)*-1;
    }


   // Si el punto está en el centro del área debe desaparecer
   if (Puntos[Contador].x == MediaX && Puntos[Contador].y == MediaY)
   {
   // Reapareciendo en un punto aleatorio
   Puntos[Contador].x = random(ClientWidth);
   Puntos[Contador].y = random(ClientHeight);
   }
    if (Puntos[Contador].x < (ClientWidth )&&Puntos[Contador].x > (ClientWidth/2 ) && Puntos[Contador].y <(ClientHeight )&&Puntos[Contador].y >(ClientHeight/2 ))
   {
   Puntos[Contador].x += (Puntos[Contador].x < MediaXC)*1 +
    (Puntos[Contador].x > MediaXC)*-1;
   Puntos[Contador].y += (Puntos[Contador].y < MediaYC)*1 +
    (Puntos[Contador].y > MediaYC)*-1;
    }
    if (Puntos[Contador].x < (ClientWidth/2 ) && Puntos[Contador].y <(ClientHeight )&&Puntos[Contador].y >(ClientHeight/2 ))
   {
   Puntos[Contador].x += (Puntos[Contador].x < MediaXS)*1 +
    (Puntos[Contador].x > MediaXS)*-1;
   Puntos[Contador].y += (Puntos[Contador].y < MediaYS)*1 +
    (Puntos[Contador].y > MediaYS)*-1;
    }
   
    if (Puntos[Contador].x < (ClientWidth/2 ) && Puntos[Contador].y <(ClientHeight )&&Puntos[Contador].y >(ClientHeight/2 ))
   {
   Puntos[Contador].x += (Puntos[Contador].x < MediaXS)*1 +
    (Puntos[Contador].x > MediaXS)*-1;
   Puntos[Contador].y += (Puntos[Contador].y < MediaYS)*1 +
    (Puntos[Contador].y > MediaYS)*-1;
    }
      if (Puntos[Contador].x > (ClientWidth / 2)&&Puntos[Contador].x < (ClientWidth) && Puntos[Contador].y <(ClientHeight / 2))
   {
    Puntos[Contador].x += (Puntos[Contador].x < MediaXT)*1 +
    (Puntos[Contador].x > MediaXT)*-1;
    Puntos[Contador].y += (Puntos[Contador].y < MediaYT)*1 +
    (Puntos[Contador].y > MediaYT)*-1;
    }
   // Mostrarlo en la nueva posición
   Canvas->Pixels[Puntos[Contador].x][Puntos[Contador].y] = clRed;//Black;
   Contador++; // Pasar al punto siguiente
   // O al primero si ya se han recorrido todos
   if (Contador == 1000)
     Contador = 0;
    }


}



Así 

funciona nuestro programa:




Aqui puedes descargar el archivo

No hay comentarios:

Publicar un comentario