jueves, 28 de noviembre de 2013

Moviendo Pixeles

En esta ocasión veremos un programa que nos servirá como introducción a la graficación en C++.

Para esto vamos a utilizar el IDE denominado Borland C++ Builder para realizarlo.

La forma solamente tendrá un "Timer", debido a que graficaremos directamente sobre ella y es un programa tan básico que no empleara ningún botón para funcionar. El Timer empezara a funcionar en cuanto la forma sea creada.

El código quedará de la siguiente manera:

Para el archivo ".h":

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

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
        TTimer *Timer1;
        void __fastcall FormPaint(TObject *Sender);
        void __fastcall Timer1Timer(TObject *Sender);
        void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift,
          int X, int Y);
private: // User declarations
  POINT Puntos[10000]; // Matriz para mantener la posición de 10000 puntos
  int Contador; // Contador general para la matriz anterior
  int MediaX, MediaY; // Punto medio del área de dibujo.- a donde se dirigiran los pixeles
public: // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
 y el .cpp quedaria de la siguiente manera:

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)  // usamos el evento OnPaint de la forma
{
        for(int N = 0; N < 10000; 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] = clRed;
        }
        Contador = 0; // Inicializar el contador
        MediaX = ClientWidth / 2; // Y calcular el punto medio
        MediaY = ClientHeight / 2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
        for (int N = 0; N < 10000; N++)
        {// Desplazar 10000 puntos en cada ciclo, cambia la cantidad a 100 o a 1000
                // Desactivar el punto de su posición actual igualando el pixel al color de la forma
                Canvas->Pixels[Puntos[Contador].x][Puntos[Contador].y] = clWhite;
                // Calcular su nueva posición
                Puntos[Contador].x += (Puntos[Contador].x < MediaX)*1 +
                (Puntos[Contador].x > MediaX)*-1;
                //if(Puntos[Contador].x < MediaX)  Puntos[Contador].x += 1;
                //else if(Puntos[Contador].x > MediaX)  Puntos[Contador].x -= 1;
                Puntos[Contador].y += (Puntos[Contador].y < MediaY)*1 +
                (Puntos[Contador].y > MediaY)*-1;
                //if(Puntos[Contador].x < MediaY)  Puntos[Contador].y += 1;
                //else if(Puntos[Contador].x > MediaY)  Puntos[Contador].y -= 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);
                }
                // 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 == 10000)
                Contador = 0;
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
     MediaX = X; // Cambiamos la posicion de X y de Y conforme movamos el mouse en la forma
     MediaY = Y; // Para que los puntos se dirijan a la posicion del mouse
}
//---------------------------------------------------------------------------
El Resultado sera el Siguiente:



Y si movemos el cursor los puntos siguen otra dirección y asemejan la "cruz" en la posición donde éste se ubique.



Como vemos es algo muy básico, pero nos servirá como introducción debido a que proximamente estaré presentando programas con mayor complejidad.

Gracias por su visita y hasta la proxima.

No hay comentarios:

Publicar un comentario