Blog hecho para la Materia de Graficacion de la carrera de ing. en sistemas computacionales del Instituto Tecnologico de la Laguna. Las publicaciones de este blog seran conforme vallamos avanzando en el curso, asi que se publicara codigo e imagenes para que sean de provecho para todos que quieran aprender.
domingo, 2 de octubre de 2011
Algoritmo linea dda(algoritmo diferencial digital)
Este programa para trazar una linea recta basado en al algoritmo dda. Este, sirve para calcular posiciones de pixeles a lo largo de una linea recta. Abajo se encuentra el codigo de la aplicacion
de este algoritmo. Las lineas en el programa se pueden hacer con el click y arrastre del mouse o ya sea
insertando las coordenas manualmente.
class TForm1 : public TForm
{
__published: // IDE-managed Components
TPanel *Panel1;
TLabel *Label1;
TButton *Button1;
TEdit *Edit1;
TLabel *Label2;
TEdit *Edit2;
TLabel *Label3;
TEdit *Edit3;
TLabel *Label4;
TEdit *Edit4;
TPaintBox *PaintBox1;
TButton *Button2;
TComboBox *ComboBox1;
TLabel *Label5;
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormCreate(TObject *Sender);
void __fastcall PaintBox1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall PaintBox1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
Graficos *g;
int x1, y1, x2, y2;
void linea_DDA(int x1, int y1, int x2, int y2);
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
void TForm1::linea_DDA(int x1, int y1, int x2, int y2)
{
int dx, dy, steps, k;
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;
//Putpixel(floor(x), floor(y), 1);
Form1->Canvas->Pixels[x][y] = clBlack;
for(k = 1; k < steps + 1 ; k++)
{
x = x + x_inc;
y = y + y_inc;
//Putpixel(x, y, 1);
PaintBox1->Canvas->Pixels[x][y] = clBlack;
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int x1 = Edit1->Text.ToInt();
int y1 = Edit2->Text.ToInt();
int x2 = Edit3->Text.ToInt();
int y2 = Edit4->Text.ToInt();
TColor color;
if(ComboBox1->Text == 'rojo')
{
color = color & 255;
}
g->linea_DDA(x1, y1, x2, y2, color);
//linea_DDA(x1, y1, x2, y2);
//int x1 = Edit1->Text.ToIntDef(10); por si el usuario no pone un valor en Edit
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
g = new Graficos(PaintBox1->Canvas);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1MouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
Edit1->Text = x1 = X;
Edit2->Text = y1 = Y;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
Edit3->Text = x2 = X;
Edit4->Text = y2 = Y;
g->linea_DDA(x1, y1, x2, y2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Refresh(); //
}
//---------------------------------------------------------------------------
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario