Sei sulla pagina 1di 5

U.T.O. – F.N.I. ING. DE SISTEMAS – ING.

INFORMÁTICA

SIS – 2430 PROGRAMACIÓN GRÁFICA

GUÍA DE LABORATORIO # 6

Tema: TRANSFORMACIONES EN 2D
OBJETIVOS.

 Entender los conceptos geométricos de traslación, escalado y rotación 
 Comprender cómo la teoría de matrices permite formalizar los conceptos anteriores. 
 Aprender a realizar, de una forma eficaz, transformaciones geométricas mediante operaciones con matrices 

FUNDAMENTO TEÓRICO:
Coordenadas homogéneas
• Traslación: P’=T+P
• Escala: P’ = S*P
• Rotación:P’=R*P

Traslación en coordenadas homogeneas


• Las ecuaciones de traslación pasan a ser una matriz 3x3 en coordenadas homogéneas

• Esta ecuación puede ser representada de la siguiente forma:

• Donde

Rotación en coordenadas homogéneas

– Si

– La rotación resulta:

Escalado en coordenadas homogéneas


Se obtiene una nueva representación matricial:

– El escalado resulta
Programa en Clase.- Ejecutar el siguiente programa que realiza operaciones de traslación, rotación y
escalamiento en en C++ Builder

El código asociado es el siguiente:

//---------------------------------------------------------------------- {40,50,0},
#include <vcl.h> {40,150,1},
#pragma hdrstop {240,150,1},
#include<math.h> {240,200,1},
#include "Unit1.h" {340,100,1},
//----------------------------------------------------------------------- {240,0,1},
#pragma package(smart_init) {240,50,1},
#pragma resource "*.dfm" {40,50,1}};
TForm1 *Form1; tmat mat=identidad;
//----------------------------------------------------------------------
struct tmat void trasladar(double tx,double ty);
{ void dibujar();
double v[3][3]; void ejes();
}; void aplica(tmat *m,tpunto a,tpunto *b);
struct tpunto void multiplica(tmat *a,tmat *b,tmat *c);
{ void escalar(double sx,double sy);
double x,y; //-----------------------------------------------------------------------
int dib; __fastcall TForm1::TForm1(TComponent* Owner)
}; : TForm(Owner)
tmat identidad={{{1,0,0},{0,1,0},{0,0,1}}}; {
tpunto newpunto; }
const maxp=18; //-----------------------------------------------------------------------
tpunto grafico[maxp]={{0,50,0},
{0,150,1}, void trasladar(double tx,double ty)
{10,150,1}, {
{10,50,1}, tmat a,b;
{0,50,1}, a=identidad;
{15,50,0}, a.v[0][2]=tx;
{15,150,1}, a.v[1][2]=ty;
{35,150,1}, b=mat;
{35,50,1}, multiplica(&a,&b,&mat);
{15,50,1},
Form1->Image1->Canvas->FillRect(Form1->Image1- }
>Canvas->ClipRect); //-----------------------------------------------------------------------
dibujar(); void escalar(double sx,double sy)
} {
//----------------------------------------------------------------------- tmat a,b;
void dibujar() a=identidad;
{ a.v[0][0]=sx;
int i,maxx,maxy; a.v[1][1]=sy;
maxx=Form1->Image1->Width; b=mat;
maxy=Form1->Image1->Height; multiplica(&a,&b,&mat);
ejes(); Form1->Image1->Canvas->FillRect(Form1->Image1-
for(i=0;i<maxp;i++) >Canvas->ClipRect);
{ dibujar();
aplica(&mat,grafico[i],&newpunto); }
if(grafico[i].dib==1) //-----------------------------------------------------------------------
Form1->Image1->Canvas- void rotar(double ang)
>LineTo(maxx/2+newpunto.x,maxy/2-newpunto.y); {
else double dcos=cos(ang*M_PI/180);
Form1->Image1->Canvas- double dsin=sin(ang*M_PI/180);
>MoveTo(maxx/2+newpunto.x,maxy/2-newpunto.y); tmat a,b;
} a=identidad;
} a.v[0][0]=dcos;
//----------------------------------------------------------------------- a.v[0][1]=-dsin;
void ejes() a.v[1][0]=dsin;
{ a.v[1][1]=dcos;
int i,maxx,maxy; b=mat;
maxx=Form1->Image1->Width; multiplica(&a,&b,&mat);
maxy=Form1->Image1->Height; Form1->Image1->Canvas->FillRect(Form1->Image1-
Form1->Image1->Canvas->Pen->Color=clRed ; >Canvas->ClipRect);
Form1->Image1->Canvas->MoveTo(0,maxy/2); dibujar();
Form1->Image1->Canvas- }
>LineTo(maxx,maxy/2); //-----------------------------------------------------------------------
Form1->Image1->Canvas->MoveTo(maxx/2,0); void __fastcall TForm1::Button1Click(TObject
Form1->Image1->Canvas- *Sender)
>LineTo(maxx/2,maxy); {
Form1->Image1->Canvas->Pen->Color=clBlack; trasladar(-5,0);
} }
//------------------------------------------------------------------
void aplica(tmat *m,tpunto a,tpunto *b) //-----------------------------------------------------------------------
{ void __fastcall TForm1::Button2Click(TObject
b->x=m->v[0][0]*a.x+m->v[0][1]*a.y+m->v[0][2]; *Sender)
b->y=m->v[1][0]*a.x+m->v[1][1]*a.y+m->v[1][2]; {
} trasladar(5,0);
//----------------------------------------------------------------------- }
void multiplica(tmat *a,tmat *b,tmat *c) //-----------------------------------------------------------------------
{ void __fastcall TForm1::Button3Click(TObject
int i,j,k; *Sender)
for(i=0;i<3;i++) {
{ trasladar(0,5);
for(j=0;j<3;j++) }
{ //-----------------------------------------------------------------------
c->v[i][j]=0; void __fastcall TForm1::Button4Click(TObject
for(k=0;k<3;k++) *Sender)
{ {
c->v[i][j]+=a->v[i][k]*b->v[k][j]; trasladar(0,-5);
} }
} //-----------------------------------------------------------------------
}
void __fastcall TForm1::Button10Click(TObject
void __fastcall TForm1::Button5Click(TObject *Sender)
*Sender) {
{ //reflexion en y;
escalar(1.2,1.2); tmat a,b;
} a=identidad;
//----------------------------------------------------------------------- a.v[0][0]=-1;
void __fastcall TForm1::Button6Click(TObject b=mat;
*Sender) multiplica(&a,&b,&mat);
{ Form1->Image1->Canvas->FillRect(Form1->Image1-
escalar(0.8,0.8); >Canvas->ClipRect);
} dibujar();
//----------------------------------------------------------------------- }
//-----------------------------------------------------------------------
void __fastcall TForm1::Button7Click(TObject
*Sender) void __fastcall TForm1::Button11Click(TObject
{ *Sender)
rotar(5); {
} //reflexion en xy
//----------------------------------------------------------------------- tmat a,b;
a=identidad;
void __fastcall TForm1::Button8Click(TObject a.v[0][0]=-1;
*Sender) a.v[1][1]=-1;
{ b=mat;
rotar(-5); multiplica(&a,&b,&mat);
} Form1->Image1->Canvas->FillRect(Form1->Image1-
//----------------------------------------------------------------------- >Canvas->ClipRect);
dibujar();
void __fastcall TForm1::Button9Click(TObject }
*Sender) //-----------------------------------------------------------------------
{ void __fastcall TForm1::Button12Click(TObject
//reflexion en x *Sender)
tmat a,b; {
a=identidad; mat=identidad;
a.v[1][1]=-1; dibujar();
b=mat; }
multiplica(&a,&b,&mat); //-----------------------------------------------------------------------
Form1->Image1->Canvas->FillRect(Form1->Image1- void __fastcall TForm1::Button13Click(TObject
>Canvas->ClipRect); *Sender)
dibujar(); {
} Form1->Image1->Canvas->FillRect(Form1-
//---------------------------------------------------------------------- >Image1->Canvas->ClipRect);
}
//-----------------------------------------------------------------------
void __fastcall TForm1::Button14Click(TObject
*Sender)
{
Application->Terminate();
}
//-----------------------------------------------------------------------
TAREA.- Ejecutar el ejemplo anteriores aplicando la transformación de coordenadas y mostrar diferentes
resultados.

Potrebbero piacerti anche