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