Académique Documents
Professionnel Documents
Culture Documents
GEOMTRICAS
GRAFICACIN I
Transformaciones en dos
dimensiones
Los objetos se definen mediante un conjunto de
puntos. Las transformaciones son procedimientos para
calcular nuevas posiciones de estos puntos, cambiado
el tamao y orientacin del objeto.
Las operaciones bsicas de transformacin son
Traslacin
Escalamiento
Rotacin.
Traslacin
Las coordenadas (x, y) de un objeto se transforman a (x', y')
de acuerdo a las frmulas:
x ' x Tx ,
y ' y Ty
x
(a)
Ejemplo traslacin
Vector de desplazamiento T = (3, 2)
(x1, y1)
Vector de desplazamiento
(x1, y1)
(x2, y2)
(x2, y2)
(x3, y3)
(x3, y3)
Escalamiento
El escalamiento modifica el tamao de un polgono. Para
obtener este efecto, se multiplica cada par coordenado (x, y)
por un factor de escala en la direccin x y en la direccin y
para obtener el par (x', y').
Las frmulas son
x' x Sx
y' y Sy
x
(a)
x
(b)
Ejemplo escalamiento
Factores de escalamiento S = (2, 1)
(x1, y1)
(x2, y2)
(x3, y3)
(x3, y3)
(x2, y2)
(x1, y1)
Rotacin
La rotacin gira los puntos de una figura alrededor de un punto
fijo. De la figura se obtiene
x ' r cos r cos cos r sen sen
Simplificando
y
(x', y')
(x, y)
Ejemplo rotacin
ngulo de rotacin = 45
(x1, y1) = (2, 3)
(x1, y1)
(x3, y3)
(x1, y1)
(x2, y2)
(x2, y2)
(x3, y3)
x' x F x x F S x , y' y F y y F S y
Reacomodando
x ' x S x 1 S x x F
(x
y ' y S y 1 S y y F
,y
x
(a)
x
(b)
,y )
R
Ejemplo rotacin 2
ngulo de rotacin = 90
Centro de rotacin (3,1)
(x1, y1) = (2, 3)
(x1, y1)
x1 = 3 + (2 3)cos(90) (3 1) sen(90)= 3 + 2 = 5
y1 = 1 + (3 1)cos(90) + (2 3) sen(90)= 1 + 1 = 2
x2 = 3 + (1 3)cos(90) (1 1) sen(90)= 3
y2 = 1 + (1 1)cos(90) + (1 3) sen(90)= 1 + 2 = 3
x3 = 3 + (3 3)cos(90) (1 1) sen(90)= 3
y3 = 1 + (1 1)cos(90) + (3 3) sen(90)= 1
(x2, y2)
(x1, y1)
(x2, y2)
Cdigo en C
struct point{
float x,y;
};
void translate(point &p, float tx, float ty){
p.x = p.x + tx;
p.y = p.y + ty;
}
void scale(point &p, float sx, float sy){
p.x = sx*p.x;
p.y = sy*p.y;
}
void rotate(point &p, float a){
float sn = sin(a*PI/180);
float cs = cos(a*PI/180);
p.x = cs*p.x - sn*p.y;
p.y = cs*p.y + sn*p.x;
}
Tarea
Escriba una funcin que dibuje un polgono relleno. Haciendo
uso de esa funcin, escriba un programa en C que dibuje la
figura que se muestra transformada mediante traslaciones,
escalamientos y rotaciones para crear la imagen que se
muestra.
Coordenadas homogneas
Para poder representar las tres transformaciones en forma
matricial como producto de matrices, es necesario representar
los puntos en coordenadas homogneas.
Estas coordenadas agregan una tercer componente a las
coordenadas bidimensionales. De tal forma que, un punto (x, y)
pasa a ser (x, y, W). El punto en coordenadas Cartesianas
representado por esta trada es el (x/W, y/W). El valor de W es
generalmente 1.
Representacin matricial de
traslaciones
Haciendo uso de coordenadas homogneas la traslacin puede
representarse como:
x'
y ' 1 x
y 1 0
T
x
0
1
Ty
T Tx , Ty
0
T
x
0
1
Ty
0
1
P' P T Tx , Ty
Representacin matricial de
escalamientos
Haciendo uso de coordenadas homogneas el escalamiento
puede representarse como:
x'
y ' 1 x
Sx
y 1 0
0
0
Sy
0
S Sx , S y
Sx
0
0
0
Sy
0
0
1
P' P S S x , S y
Representacin matricial de
rotaciones
Haciendo uso de coordenadas homogneas la rotacin puede
representarse como:
x'
y ' 1 x
cos sen
y 1 sen cos
0
0
0
1
R sen cos
0
0
0
1
P' P R
Composicin de
transformaciones
Para aplicar varias transformaciones a un conjunto de puntos
basta con combinar las matrices de transformacin en una sola,
mediante multiplicacin matricial. En caso de tener solo
transformaciones del mismo tipo, la combinacin sigue reglas
muy simples.
Traslacin:
Escalamiento:
S S x 1 , S y1 S S x 2 , S y 2 S S x1 S x 2 , S y1 S x 2
Rotacin:
R 1 R 2 R 1 2
0
x F
1
yF
0 S x
0 0
1 0
0 1
0 0
1 x F
0
Sy
0
Sx
Sy
1 S x x F
1 S y
y
1
yF
0
1
(x
,y
(a)
Objeto original y punto fijo
(b)
Traslada de manera que el
punto fijo quede en el origen
(x
(c)
Escala el objeto respecto al origen
,y
(d)
Traslada de manera que el
punto fijo quede en la posicin
original
1
0
xR
0
1
yR
0
0
1
cos
sen
cos
sen
1 cos x R y R sen
sen
cos
0
0
0
1
1
0
x R
0
1
yR
0
0
1
sen
cos
1 cos y R x R sen
0
0
1
(x
,y
(a)
Objeto original y punto fijo
(b)
Traslada de manera que el
punto fijo quede en el origen
(x
(c)
Rota el objeto respecto al origen
,y
(d)
Traslada de manera que el
punto fijo quede en la posicin
original
Forma general
En general una transformacin que utilice traslaciones,
escalamientos y rotaciones tendr la forma:
x'
y ' 1 x
y 1 b
c
e
f
0
1
x' ax by c
y ' dx ey f
Otras transformaciones
Otras transformaciones que permiten llevar
a cabo operaciones muy tiles, estas son:
Reflexiones
Corte.
Reflexiones en x y y
Las reflexiones respecto al eje x y y se obtienen con las matrices
siguientes:
1 0 0
1 0 0
0 1 0
0 1 0
0 0 1
0 0 1
Posicin original
Posicin original
Posicin reflejada
Posicin reflejada
(a)
(b)
0
0
1 0
0 1
Posicin original
Posicin reflejada
(a)
1
0
0
0 0 1
Posicin original
Posicin original
Posicin reflejada
Corte en x
El corte produce una deformacin similar al deslizamiento de
una capa sobre otra. El corte en x se produce por la matriz:
1
SH x
0 0
1 0
0 1
y ' y shy x
y
(0,1)
(0,0)
x' x shx y
(2,1)
(1,1)
(1,0)
(a)
(0,0)
(1,0)
(b)
(3,1)
Corte en y
El corte en y se produce por la matriz
1 SH y
0
0
0
1
1
0
(1,3)
y
y
(1,2)
(0,1)
(0,0)
(1,1)
(1,0)
(a)
(0,1)
x
(0,0)
(b)
Implementacin de transformaciones
con matrices
Para la implementacin de matrices es conveniente definir tipos
para punto y matriz.
Luego funciones para crear las matrices de las transformaciones
bsicas.
Lo primero es crear una matriz unitaria y a partir de est crear las
dems funciones.
Es necesaria definir una funcin para multiplicar matrices y poder
acumular las transformaciones.
Otra funcin debe aplicar una matriz de transformacin a un
punto y regresar el punto transformado.
Finalmente aplicar la matriz a un ppolgono.
Tipos bsicos
Los tipos bsicos para punto, matriz y polgono son los
siguientes:
typedef double Point[3];
typedef double Matrix[3][3];
typedef Point poligono[10];
El punto p(1, -4) se define como
Point p = {1,-4,1};
Matrices de traslacin y
escalamiento
Matriz de traslacin.
void create_traslation_matrix(double tx, double
ty,Matrix t){
set_identity(t);
t[2][0] = tx;
t[2][1] = ty;
}
Matriz de escalamiento:
void create_scale_matrix(double sx, double sy,Matrix
t){
set_identity(t);
t[0][0] = sx;
t[1][1] = sy;
}
Matriz de rotacin
El ngulo se especifica en grados.
void create_rotation_matrix(double
a,Matrix t){
set_identity(t);
double sn = sin(a*PI/180);
double cs = cos(a*PI/180);
t[0][0] = cs; t[0][1] = sn;
t[1][0] = -sn;t[1][1] = cs;
}
Matriz de corte
Solo es necesario definir una matriz de corte. Si se hace solo
corte en x, shy = 0 y si se hace solo corte en y, shx = 0.
void create_shear_matrix(double shx, double
shy,Matrix t){
set_identity(t);
t[0][1] = shy;
t[1][0] = shx;
}
Dibujar polgono
Dibuja un polgono. Note que la tercer coordenada no se usa.
void draw(poligono p,int n){
moveto((int)p[0][0],(int)p[0][1]);
for(int i=1;i<n;i++){
lineto((int)p[i][0],(int)p[i][1]);
}
}
Puerto de visin 2
Puerto de visin 1
Ventana
Coordenadas mundiales
Coordenadas de pantalla
Transformaciones de visin
(xmax, ymax)
(xmin, ymin)
Ventana en coordenadas mundiales
(umin, vmin)
Ventana escalada al tamao
del rea de visin.
Transformaciones de visin
(continuacin)
M WV
0
1
ymin
umax u min
x x
min
0 max
0
0
1
0
0
vmax vmin
ymax ymin
0
1
0 0
1 umin
0
1
vmin
0
0
1
Transformaciones de visin
(continuacin)
u max umin
xmax xmin
M WV
xmin
umax umin
umin
xmax xmin
ymin
vmax vmin
ymax ymin
vmax vmin
vmin
ymax ymin
Implementacin en C
void crate_window_view_matrix(
double xmin,double ymin, double xmax, double
ymax, int umin, int vmin, int umax, int vmax,
Matrix m){
Matrix m1,m2,m3,m4;
create_traslation_matrix(-xmin,-ymin,m1);
create_scale_matrix((umax-umin)/(xmax-xmin),
(vmax-vmin)/(ymax-ymin),m2);
create_traslation_matrix(umin,vmin,m3);
accumulate_matrices(m1,m2,m4);
accumulate_matrices(m4,m3,m);
}
Rutina de despliegue
void show_polygon(
double xmin,double ymin,double xmax,double ymax,
int umin,int vmin,int umax,int vmax,poligono p){
Matrix m1,m2;
poligono p2,p3;
//poligonos transformados
int xv1,xv2,yv1,yv2; //coordenadas del viewport
//es necesario ordenar las coordenadaas del
viewport
if(umin>umax){
xv1 = umax; xv2 = umin;
}else{
xv1 = umin; xv2 = umax;
}
if(vmin>vmax){
yv1 = vmax; yv2 = vmin;
}else{
yv1 = vmin; yv2 = vmax;
}
Propiedades de las
transformaciones
Los vectores fila de la submatriz superior 2x2 de rotacin
tienen tres propiedades:
1. Cada uno es un vector unidad
2. Cada uno es perpendicular al otro (su producto punto es
cero)
3. El primer y segundo vector se rotarn por R() para que
caigan sobre los ejes x y y positivos.
Una matriz que cumple esto se le llama ortogonal especial.
r11
r
21
0
r12
r22
0
tx
t y
1
Operaciones de rastreo
El buffer de pantalla se puede manipular directamente para
llevar a cabo algunas transformaciones. La ms sencilla es la
copia de un bloque de un lugar de la pantalla a otro.
Para girar una figura un ngulo mltiplo de 90 grados se
pueden lograr invirtiendo renglones por columnas. La rotacin
por 180 grados se logra invirtiendo cada rengln y
posteriormente invirtiendo los renglones.
Para otros ngulos cada rea de pixel de destino se diagrama
sobre la matriz que se gira y se calcula la cantidad de
superposicin con las reas de pixel que se giran. Entonces se
calcula una intensidad para el pixel al promediar las
intensidades de los pixeles fuente superpuestos.
Tarea
Escribir una biblioteca para realizar transformaciones de 2D
utilizando matrices, defina lo siguiente:
- Tipo vector y tipo matriz en coordenadas homogneas
- Rutinas para: trasladar, rotar, escalar, reflejar, cortar y
transformacin de puerto de visin.
Animacin
Para lograr una animacin mediante transformaciones es
conveniente mantener una copia del los objetos sin transformar.
Para lograr la animacin se copia el objeto original, luego se le
aplican a esta copia las transformaciones a realizar y se dibuja
el objeto transformado.
-Copiar objeto
- transformar
- dibujar
Ejemplo
Define un cruz:
void init(){
poly[0].x = 0;poly[0].y = 10;
poly[1].x = 10;poly[1].y = 10;
poly[2].x = 10;poly[2].y = 0;
poly[3].x = 20;poly[3].y = 0;
poly[4].x = 20;poly[4].y = 10;
poly[5].x = 30;poly[5].y = 10;
poly[6].x = 30;poly[6].y = 20;
poly[7].x = 20;poly[7].y = 20;
poly[8].x = 20;poly[8].y = 30;
poly[9].x = 10;poly[9].y = 30;
poly[10].x = 10;poly[10].y = 20;
poly[11].x = 0;poly[11].y = 20;
}
void play(){
while(true){
char c;
if(kbhit()){
int i,p=0;
c = (char)getch();
unsigned int size;
switch(c){
point p1[20];
case 27:return;
float a=0,da = 0,vx=0,vy=0,x=0,y=0;
case 'i':vy--;break;
setactivepage(1);
case 'm':vy++;break;
for(i = 0; i< 1000; i++){
putpixel(rand()%400,rand()%400,rand()%15+1); case 'j':vx--;break;
case 'k':vx++;break;
}
case 'r':da--;break;
size = imagesize(0, 0, 400, 400);
case 't':da++;break;
/* allocate memory to hold the image */
case e':s--;break;
img = malloc(size);
case w':s++;break;
/* grab the image */
}
getimage(0,0,400,400,img);
}
x += vx;
y += vy;
a += da;
inicia
Lee teclado
a=(a>360)?a-360:a;
a=(a<-360)?a+360:a;
if(x>400) x= 0;
if(y>400) y= 0;
if(x<0) x= 400;
if(y<0) y= 400;
Biblioteca de transformaciones
//archivo: transform.h
struct point{
float x,y;
};
void translate(point &p, float tx, float ty);
void scale(point &p, float sx, float sy);
void rotate(point &p, float a);
void rotateFix(point &p, float a,float xr, float yr);
void scaleFix(point &p, float sx, float sy,float xf, float
yf);
void translatePoly(point *p,int n, float tx, float ty);
void dibujaPunto(point p);
void dibujaPoly(point *p,int n);
void transW2V(point *p,int n,float xmin,float ymin,float
xmax,float ymax,
int umin,int vmin,int umax, int vmax);
void copia(point *p1,point *p2,int n);
//archivo: transform.cpp
#include <graphics.h>
#include <math.h>
#include "transform.h"
float PI = 3.14159265;
void translate(point &p, float tx, float ty){
...
void transW2V(point *p,int n,float xmin,float ymin,float xmax,float
ymax,int umin,int vmin,int umax, int vmax){
int i;
for(i=0; i<n ; i++){
translate(p[i],-xmin,-ymin);
scale(p[i],(umax-umin)/(xmax-xmin),(vmax-vmin)/(ymax-ymin));
translate(p[i],umin,vmin);
}
rectangle(umin,vmin,umax,vmax);
}
void copia(point *p1,point *p2,int n){
int i;
for(i=0; i<n; i++)
p2[i] = p1[i];
}
#include <graphics.h>
#include "transform.h"
main(){
initwindow(400,400);
point p[10],p1[10];
p[0].x = 0;p[0].y = 10;
p[1].x = 10;p[1].y = 10;
p[2].x = 10;p[2].y = 0;
p[3].x = 20;p[3].y = 0;
p[4].x = 20;p[4].y = 10;
p[5].x = 30;p[5].y = 10;
dibujaPoly(p,6);
copia(p,p1,6);
transW2V(p1,6,0,0,30,30,100,100,150,150);
dibujaPoly(p1,6);
copia(p,p1,6);
transW2V(p1,6,0,0,30,20,200,100,350,300);
dibujaPoly(p1,6);
// setviewport(100,100,200,200,true);
// dibujaPoly(p,6);
getch();
}