19
Transformaciones Geométricas en 2D Una transformación es un cambio que se le aplica a una figura o punto para generar otra muy parecida pero con alguna diferencia en cuanto a tamaño, posición, ángulo o despliegue. Tipos de transformaciones que se pueden aplicar son escalamiento, rotación, reflección, traslación y deformación. Un punto en 2D se representa como [x , y] y este puede ser almacenado de diferentes formas en alguna estructura, como puede ser en: Vector unidimensional Vector Bidimensional Clase de Puntos Por ejemplo vamos a almacenar la figura de una flecha que tiene por coordenadas: 200,50 100,100 200,100 300,150 100,200 200,200 200,250 int flecha[ ]={100,100,200,100,200,50,300,150,200,250,200,200,100,200} ; int flecha[ ][ ]={{100,100},{200,100},{200,50},{300,150}, {200,250},{200,200},{100,200}}; class punto{ int x; int y;

Transformaciones en 2D y 3D

Embed Size (px)

Citation preview

Page 1: Transformaciones en 2D y 3D

Transformaciones Geométricas en 2D

Una transformación es un cambio que se le aplica a una figura o punto para generar otra muy parecida pero con alguna diferencia en cuanto a tamaño, posición, ángulo o despliegue.

Tipos de transformaciones que se pueden aplicar son escalamiento, rotación, reflección, traslación y deformación.

Un punto en 2D se representa como [x , y] y este puede ser almacenado de diferentes formas en alguna estructura, como puede ser en:

Vector unidimensional

Vector Bidimensional

Clase de Puntos

Por ejemplo vamos a almacenar la figura de una flecha que tiene por coordenadas:

200,50

100,100 200,100

300,150

100,200 200,200

200,250

int flecha[ ]={100,100,200,100,200,50,300,150,200,250,200,200,100,200};

int flecha[ ][ ]={{100,100},{200,100},{200,50},{300,150},{200,250},{200,200},{100,200}};

class punto{ int x; int y;}punto flecha[]={new punto(100,100),new punto(200,100),new punto(200,50), new punto(300,150),new punto(200,250),new punto(200,200), new punto(100,200)};

Después de eso entonces ahora sigue mostrar la figura en el plano bidimensional.

Page 2: Transformaciones en 2D y 3D

Representación de las Transformaciones en 2D

Las transformaciones son representadas a través de matrices.

Un punto dado está representado por: [x,y]

Y las transformaciones por una matriz de 2x2

De tal forma que si se multiplica el punto dado por la matriz identidad nos queda el mismo punto.

[x,y] Pero si modificamos a la matriz identidad por una variable nos queda de la siguiente forma:

[x,y]

Y si es sobre el otro valor queda:

[x,y]

Y para que se produzca un escalamiento uniforme se modifican los dos valores.

[x,y]

Realizar la programación del escalamiento en dos dimensiones.

Rotación

1 00 1

1 00 1

A 00 1

1 00 B

A 00 B

= [x,y]

= [Ax,y] Produciendo un escalamiento sobre el eje x

= [x,By] Produciendo un escalamiento sobre el eje y

= [Ax,By] Produciendo un escalamiento uniforme sobre ambos ejes

Page 3: Transformaciones en 2D y 3D

La rotación de una figura en dos dimensiones también se realiza por medio de la matriz de transformación de 2*2, como se muestra a continuación:

[x,y]

[x,y]

Deformación o Shear

La deformación de una figura en dos dimensiones modifica la forma de la figura, este cambio puede ser tanto en x como en y o en ambos.

[x,y]

[x,y]

[x,y]

Traslación o TrasladarPara realizar una traslación y que esta funciones como una multiplicación de matrices y no como una suma, la matriz se debe de ampliar a 3x3 y utilizar coordenadas homogéneas.

[x,y,1]

La traslación nos sirve para que podamos escalar, rotar, reflejar y deformar una figura sobre un punto de esta.Secuencia:a) Trasladar la figura al origen –Tx,-Tyb) Realizar la transformación (escalar, rotar, reflejar y deformar)c) Regresar la figura a la posición especificada (Tx,Ty)Reflección

cos α sen α-sen α cos α

cos α -sen αsen α cos α

1 B0 1

1 0A 1

1 0A 1

1 0 00 1 0Tx Ty 1

= [xcosα-ysenα ,xsenα+ycosα] Produciendo un rotación en el sentido de las manecillas del reloj

= [xcosα+ysenα ,-xsenα+ycosα] Produciendo un rotación en contra de las manecillas del reloj

= [x,Bx+y] Produciendo una deformación en el eje y

= [x+Ay,y] Produciendo una deformación en el eje x

= [x+Ay,Bx+y] Produciendo una deformación en ambos ejes

= [x+Tx,y+Ty,1] Trasladando el punto la cantidad especificada por Tx y Ty

Page 4: Transformaciones en 2D y 3D

Esta transformación permite simular lo que ocurre cuando se refleja una imagen en un espejo.

[x,y]

[x,y]

[x,y]

Coordenadas homogéneas

Las coordenadas homogéneas son un instrumento usado para describir un punto en el espacio. En coordenadas homogéneas, todo punto bidimensional está definido por tres coordenadas. De tal modo que un punto de dimensiones x, y, se lo representa por 3 valores: x / w, y / w, w. Matemáticamente, las coordenadas x y y se hallan dividiendo los dos primeros números entre el tercero, respectivamente. En dos dimensiones, su valor se puede encontrar más fácilmente si w = 1, por simplificación.Básicamente, se trata de ampliar el plano euclídeo (en el caso bidimensional) al plano proyectivo. Una consecuencia de esta escritura es que un punto tiene infinitas formas de escribirlo, todo dependerá de los cocientes x / w y y / w (con w distinto de 0).Coordenadas homogéneas ( 2,4,1)=(4,8,2)=(12,24,6) Objetivo:Convertir la traslación de una suma a una multiplicación, además de permitir concatenar una sucesión de transformaciones en una matriz.

Quiere decir que nosotros podemos encadenar matrices para formar una sola que realice múltiples transformaciones.

Ejemplo de un escalamiento sobre un punto utilizando coordenadas homogéneas:

-1 00 1

1 00 -1

-1 00 -1

= [-x,y] Reflección en X

= [x,-y] Reflección en Y

= [-x,-y] Reflección en XY

Page 5: Transformaciones en 2D y 3D

Trasladar al origen Escalar Trasladar a su posición

1 0 0 Sx

0 0 1 0 0

0 1 0 . 0 Sy 0 . 0 1 0 = Matriz de transformación

-Tx -Ty 1 0 0 1 Tx

Ty 1

Sx 0 0[x,y,1] . 0 Sy 0 = [xSx-TxSx+Tx,ySy-TySy+Ty,1]

-Tx*Sx+Sx -Ty*Sy+Sy 1

Trasladar al origen Rotar Trasladar a su posición1 0 0 co

s -sen 0 1 0 0

0 1 0 . sen

cos 0 . 0 1 0 = Matriz de transformación

-Tx -Ty 1 0 0 1 Tx

Ty 1

cos -sen 0[x,y,1] . sen Cos 0 = [xcos+ysen-Txcos-Tysen+Tx,

-Txcos-Tysen+Tx Txsen-Tycos+Ty 1 -xsen+ycos+Txsen-Tycos+Ty,1]

Trasladar al origen Deformar Trasladar a su posición1 0 0 1 B 0 1 0 00 1 0 . A 1 0 . 0 1 0 = Matriz de transformación

-Tx -Ty 1 0 0 1 Tx

Ty 1

1 B 0[x,y,1] . A 1 0 = [x+Ay-ATy,Bx+y-BTx,1]

-ATy -BTx 1

Realizar todas las matrices de transformaciones y programarlas con la figura que debe de contener por lo menos 100 puntos.

Page 6: Transformaciones en 2D y 3D

Mapeo de Ventana a puerto de Visión

Sx= (Xvisionmax-Xvmin)/(Xwindowmax-Xwmin)Sy= (Yvmax-Yvmin)/(Ywmax-Ywmin)

Sx= (640-500)/(640-0)=140/640=0.21875Sy= (480-350)/(480-0)=130/480=0.270833 factores de escala

Para representarlos en el puerto de visión se les suma los valores de inicio del puerto de visión. 500+Valores en X y 350+Valores en Y.

Como cargar imágenes en Java

Primero hay que obtener la ruta donde se encuentra el proyecto.

- System.getProperty(“user.dir”); obtener el directorio actual mediante una cadena- getClass( ).getResource(“Dire/file.xxx”); obtener el directorio actual mediante un

URL

Definir la imagen mediante un objeto

Image imagen; define un objeto de tipo imagen

ImageIcon icono; define una imagen para un icono

Page 7: Transformaciones en 2D y 3D

Instanciar el ImageIcon a través de un URL

URL ruta=getClass().getResource("/UnidadIIv2/Imagenes/Dibujar.PNG");

imgdib=new ImageIcon(ruta);

ImageIcon puede recibir en el constructor una imagen o un URL

Para obtener una imagen en un objeto Image se puede hacer:

- A través del método getimage de la clase Toolkit de awt generando un objeto Toolkit tk=Toolkit.getDefaultToolkit(); Imagen=tk.getImage(ruta);

- A través un método devolviendo un objeto de tipo imagenpublic BufferedImage loadImage(String nombre) {

URL url=null;

try {

url = getClass().getResource(nombre);

return ImageIO.read(url);

} catch (Exception e) {

System.out.println("No se pudo cargar la imagen " + nombre +" de "+url);

System.out.println("El error fue : "+e.getClass().getName()+" "+e.getMessage());

//System.exit(0);

return null;

}

}

Como integrar un Menú a una aplicación

1) Generar un Barra de Menú. JMenuBar BarraM;2) Construir la BarraM=new JMenuBar();3) Asignar la barra de Menú a la ventana ventana.setJMenuBar(BarraM);4) Definir los menús JMenu uno,dos;5) Construir los menús uno=new JMenu("Dibujar");

Page 8: Transformaciones en 2D y 3D

6) Definir las opciones de los Menús JMenuItem el1,el2,el3,el4,el5;7) Construir las opciones de los Menús el1=new JMenuItem("Rectangulo");8) Agregar las opciones a los Menús uno.add(el1);9) Cargar a la Barra de Menú los Menús BarraM.add(uno);

Generar elementos de tipo Action.

Action El1=new AbstractAction( "Rectangulo" , new ImageIcon( Imagen )) {

public void actionPerformed(ActionEvent arg0) {

obj.DibujaRect();

}};

El1.putValue(Action.SHORT_DESCRIPTION,"Dibuja un Rectangulo");

El1.putValue(Action.MNEMONIC_KEY,new Integer('R'));

El1.putValue(Action.ACCELERATOR_KEY,KeyStroke.getKeyStroke(KeyEvent.VK_R, InputEvent.CTRL_MASK));

Integrar las acciones al Menú. uno.add(El1);

Como agregar una Barra de Herramientas a una aplicación.

1) Crear una barra de herramientas JToolBar barh;2) Se construye la barra de herramientas

Barrah=new JToolBar("Operaciones",SwingConstants.VERTICAL); Vertical y Horizontal es el orden de acomodos de los botones.

3) Agregar los botones o acciones a la barra de herramientas Barrah.add(uno);4) Agregar la barra de herramientas al contenedor

cont.add(Barrah,BorderLayout.EAST);

Eventos del Ratón

MouseListener,MouseMotionListener,MouseWheelListener

Métodos y acciones de los eventos del raton.

MouseListener

void mouseClicked(MouseEvent me) cuando se presiona y se libera el ratón

Page 9: Transformaciones en 2D y 3D

void mouseEntered(MouseEvent me) cuando el ratón entra en un componente

void mouseExited(MouseEvent me) cuando el ratón sale de un componente

void mousePressed(MouseEvent me) cuando se presiona el ratón

void mouseReleased(MouseEvent me) cuando se libera el ratón

MouseMotionListener

void mouseDragged(MouseEvent me) Se llama mientras se arrastra el ratón

void mouseMoved(MouseEvent me) Se llama mientras se mueva el ratón

MouseWheelListener

void mouseWheelMoved(MouseWheelEvent me) Cuando se mueve la rueda del raton.

Métodos mas utilizados de MouseEvent

int getButton( ) indica que boton del raton ha cambiado su estado, se puede hacer la consulta comparando con los valores BUTTON1,BUTTON2 o BUTTON3

int getClickCount( )

Devuelve el número de clicks asociados con el evento.

Point getPoint( ) Devuelve la coordenada x,y donde se presiono.int getX( ) Devuelve la coordenada en x donde se presionoint getY( ) Devuelve la coordenada en y donde se presionoObject getSource( )

Devuelve el nombre del objeto que produjo el evento.

Método más utilizado de MouseWheelEvent

int getWheelRotation( ) Devuelve el número de rotaciones realizadas por la rueda. Devuelve un valor negativo cuando el movimiento es hacia arriba y positivo cuando es hacia abajo.

Cuadros de Dialogoclass Drotation extends JDialog{

JRadioButton rd,ri;JTextField ang;JDialog dialog;JButton b1,b2;

Page 10: Transformaciones en 2D y 3D

ButtonGroup group;int ret=0;public Drotation(JFrame padre,boolean modal){

super(padre,modal); //modal que debe de seleccionar afuerzas algo

JPanel panel=new JPanel();Icon bug = new ImageIcon(

getClass().getResource("/UnidadII/rec/Fd.png" ) );Icon bug2 = new ImageIcon( getClass().getResource(

"/UnidadII/rec/Fi.png" ) );group = new ButtonGroup();JLabel l1=new JLabel("",bug, SwingConstants.LEFT);JLabel l2=new JLabel("",bug2, SwingConstants.LEFT);JLabel l3=new JLabel(" Angulo a rotar: ");rd=new JRadioButton("",false);ri=new JRadioButton("",false);group.add(rd);group.add(ri);ang=new JTextField();ang.setColumns(5);b1=new JButton("Aceptar");b2=new JButton("Cancelar");panel.add(l2);panel.add(ri);panel.add(l1);panel.add(rd);

panel.add(l3);panel.add(ang);panel.add(b1, BorderLayout.SOUTH);panel.add(b2,BorderLayout.SOUTH);add(panel);this.setSize(600,80);

b1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {

if(rd.isSelected())ret=1;

elseif(ri.isSelected())

ret=2;else

ret=-1;

Drotation.this.setVisible(false);Drotation.this.dispose();

}

});b2.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e) {ret=-1;

Page 11: Transformaciones en 2D y 3D

Drotation.this.setVisible(false); Drotation.this.dispose();

}

});}public int mostrar(){

this.setVisible(true);return -1;

}public void closeDialog(WindowEvent we){

this.setVisible(false);this.dispose();

}}

Evento mousePressedint cox=arg0.getX();

int coy=arg0.getY();Lienzo.minmax();

System.out.println(Lienzo.menorx+","+Lienzo.mayorx+","+Lienzo.menory+","+Lienzo.mayory);

if((cox>Lienzo.menorx && cox<Lienzo.mayorx) && (coy>Lienzo.menory && coy<Lienzo.mayory))

moverse=true;else

moverse=false;System.out.println(moverse);

Evento mouseDragged

int dx=e.getX();int dy=e.getY();if(moverse)

Lienzo.Trasladar(dx, dy);

Presentaciones de los temas de Java 2D.

Transformaciones geométricas en 3D

Page 12: Transformaciones en 2D y 3D

Una transformación es un cambio que se le aplica a una figura o punto para generar otra muy parecida pero con alguna diferencia en cuanto a tamaño, posición, ángulo o despliegue.

Tipos de transformaciones que se pueden aplicar son escalamiento, rotación, reflección, traslación.

Antes de almacenar las coordenadas es necesario obtenerlas y poder calcularlas en base a una representación de una figura en 3D, con sus correspondientes dimensiones llamado Isométrico.

Para poder encontrar las coordenadas primero se debe de definir el origen de la figura y para no tener que trasladar la figura al origen, para aplicarle alguna transformación y esta no cambie de posición, por conveniencia se define dentro de la figura.

Si el Origen está en el centro de cubo las coordenadas Serian:

Puntos del CuboA) x=-20 y=-15 z=15 E) x=-20 y=-15 z=-15 B) x=-20 y=15 z=15 F) x=-20 y=15 z=-15C) x=20 y=-15 z=15 G) x=20 y=-15 z=-15D) x=20 y=15 z=15 H) x=20 y=15 z=-15

Ejercicio:

Page 13: Transformaciones en 2D y 3D

1) Sacar las coordenadas en tres dimensiones de la figura anterior para cada uno de sus vértices, considere el origen en el punto es decir el centro de la parte de cubo. (No olvide los vértices ocultos).

2) Sacar la vistas ortográficas para la misma figura (Superior, Frontal, Lateral derecha).

3) Transformar las coordenadas 3d en coordenadas 2d y graficarlas. (SX,SY) considere una distancia de 20.

Un punto en 3D se representa como [x , y, z] y este puede ser almacenado de diferentes formas en alguna estructura, como puede ser en:

Vector unidimensional Vector Bidimensional Clase de Puntos

Después de tener los puntos almacenados es necesario para visualizar la figura hacer una proyección en un plano bidimensional, es decir es necesario convertir de coordenadas en 3D a coordenadas en 2D. (Ver presentación Trans de 3D a 2D proyecciones).

Ya que se hizo la proyección de la figura en el plano bidimensional, ahora si ya se le pueden aplicar las transformaciones:

Transformaciones Tridimensionales (3D)

Rotación sobre el eje de la x.

1 0 00 Cos ∞ Sen ∞0 -sen ∞ Cos ∞

Rotación sobre el eje de la y.

Cos ∞ 0 Sen ∞0 1 0-sen ∞ 0 Cos ∞

Rotación sobre el eje de la z.

Cos ∞ Sen ∞ 0-sen ∞ Cos ∞ 00 0 1

A veces es necesario generar una sola matriz de rotación que nos permita rotar en múltiples sentidos de manera simultánea (Rotación en x=20o en y=30o z=50o) por lo que hay que aplicar coordenadas homogéneas concatenar múltiples transformaciones.

Page 14: Transformaciones en 2D y 3D

1 0 0 0 Cos y 0 Sen y 0 Cos z Sen z 0 0[x,y,z,1]

. 0 Cos x Sen x 0 . 0 1 0 0 . -sen z Cos z 0 0 =

0 -sen x Cos x 0 -sen y 0 Cos y 0 0 0 1 00 0 0 1 0 0 0 1 0 0 0 1

Rotación en x Rotación en y Rotación en z

La matriz resultante me permite generar rotaciones en múltiples sentidos en un solo proceso.

Resultado=

x*(cry*crz)+y*((-srx*sry)*crz+(crx*srz))+z*((crx*sry)*crz+(srx*srz))x*(cry*-srz)+y*((-srx*sry)*-srz+(crx*crz))+z*((crx*sry)*-srz+(srx*crz))x*-sry+y*(-srx*cry)+z*(crx*cry)

Escalar

En tres dimensiones hay dos formas básicas para escalar una figura:

Variando la distancia del observador en la proyección (Centro de proyección) Aplicar la matriz de escalamiento.

Sx 0[x,y,z] . 0 Sy 0 = [x*Sx,y*Sy,z*Sz]

0 0 SzDonde Sx es la cantidad a escalar en X, Sy la cantidad en Y y Sz la cantidad a escalar en Z.

Trasladar

Para trasladar una figura es necesario aplicar coordenadas homogéneas:

1 0 0 0[x,y,z,1]

. 0 1 0 0 = [x+Tx,y+Ty,z+Tz,1]

0 0 1 0Tx Ty Tz 1

Tx es la cantidad a trasladar en X, Ty la cantidad a Trasladar en Y y Tz la cantidad a trasladar en Z.

Vistas

Para poder obtener las vistas ortográficas es necesario quitar algunos valores, por ejemplo si se quiere sacar la vista frontal de una figura se debe de eliminar la profundidad, para generar la vista superior será necesario eliminar y y para la vista lateral eliminar x.

Page 15: Transformaciones en 2D y 3D

Implementar JSlider para las operaciones de rotación y escalamiento.