Renderización en java

11
Ing. Yeimmy Alejandra Contreras Suárez * Renderización en Java

Transcript of Renderización en java

Page 1: Renderización en java

Ing. Yeimmy Alejandra Contreras Suárez

*Renderización en Java

Page 2: Renderización en java

*Introducción

* Java2D ofrece una amplia gama de posibilidades para tratamiento de imágenes y figuras geométricas en dos dimensiones. En este capítulo se van a tratar los conceptos relacionados con el renderizado de imágenes bidimensionales mediante la clase Graphics2D.

* Como ya se ha comentado, el verbo renderizar es una adaptación al español del verbo inglés render y que define un proceso de cálculo más o menos complejo desarrollado por un ordenador destinado a producir una imagen o secuencia de imágenes. En otros contextos, se habla de renderizado para definir el proceso por el cual se pretende dibujar, en un lienzo de dos dimensiones, un entorno en tres dimensiones formado por estructuras poligonales tridimensionales, luces, texturas y materiales, simulando ambientes y estructuras físicas verosímiles. También se habla de Renderización en el contexto de procesos 2D que requieren cálculos complejos como la edición de vídeo, la animación o el desarrollo de efectos visuales.

Page 3: Renderización en java

*Ejemplo pintar rectángulo

import javax.swing.*;

import java.awt.*;

import java.awt.geom.*;

import java.awt.image.*;

public class Ventana extends JFrame {

public Ventana() {

super ("Prueba de Ventana");

Container c = getContentPane();

c.setLayout(new FlowLayout());

this.setSize(250,250);

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.setVisible(true);

}

public static void main (String [] args) {

Ventana v = new Ventana();

}

public void paint (Graphics g) {

Rectangle2D r2 = new Rectangle2D.Float(75, 50, 100, 25);

Graphics2D g2 = (Graphics2D)g;

g2.draw(r2);

}

}

Page 4: Renderización en java

*Si se desea pintar un rectángulo mas grueso se debe tener en cuenta el siguiente código

public void paint (Graphics g) {

Graphics2D g2 = (Graphics2D)g;

Rectangle2D r2 = new Rectangle2D.Float(75, 50, 100, 25);

Stroke pincel = new BasicStroke(4.0f, BasicStroke.CAP_ROUND,

BasicStroke.JOIN_MITER);

g2.setStroke(pincel);

g2.draw(r2);

}

*Tan sólo hay que cambiar el atributo del contexto llamado stroke o pincel, para lo cual se suministra el método setStroke(). Una vez definido el pincel o lápiz, tan sólo hay que invocar a draw() como se ha hecho antes

Page 5: Renderización en java

*El sistema de coordenadas de Java2D

* Java2D mantiene dos sistemas de coordenadas: las coordenadas de usuario (user space) y las coordenadas de dispositivo (device space):Coordenadas de Usuario: constituyen un sistema de

coordenadas totalmente independiente del dispositivo final en el que se vaya a hacer el renderizado.

* El origen de las coordenadas de usuario está situado en la esquina superior izquierda del objeto Graphics2D: este punto sería el (0,0). A medida que se incrementa la x (primer valor de la coordenada) habrá un desplazamiento hacia la derecha y a medida que se incrementa la y (segundo valor de la coordenada) habrá un desplazamiento hacia abajo.

Coordenadas de Dispositivos: constituyen un sistema de coordenadas que sí depende del dispositivo en el cual va a renderizarse realmente.

* Java2D define tres bloques de información necesarios para soportar la conversión entre las coordenadas de usuario y las de dispositivo. Esta información se representa mediante tres objetos de las clases: GraphicsEnvironment, GraphicsDevice y GraphicsConfiguration.

Page 6: Renderización en java

*En la tabla siguiente, a modo de resumen, se muestran las clases que intervienen en el sistema de coordenadas:

Una situación común en la práctica es la programación en un sistema multipantalla. Java tiene tres configuraciones distintas de multipantalla, que consistenen:

• Dos o más pantallas independientes • Dos o más pantallas en la que una es la principal y las otras visualizan copias de lo que aparece en la principal.• Dos o más pantallas que forman un escritorio virtual, al que también se llama dispositivo virtual (virtual device).

En estas tres configuraciones, cada modo de pantalla se representa con un objeto GraphicsDevice y cada uno de ellos puede tener muchos objetos GraphicsConfiguration asociados. Estos objetos permiten crear un objeto Frame, JFrame, Window o JWindow según un modo de pantalla en el cual va a renderizarse.; por ejemplo, la clase JFrame posee un constructor que admite como parámetro un objeto GraphicsConfiguration que sirve para indicar qué configuración debe usarse en su renderizado.

Page 7: Renderización en java

*Si se dispone de un entorno de pantalla virtual entonces, debido a que el sistema de coordenadas es relativo al escritorio virtual, es necesario usar esas coordenadas virtuales al llamar al método setLocation() cuando se quiere colocar o recolocar un objeto de tipo Frame o Window en el escritorio. Un ejemplo de ello es el siguiente:

JFrame f = new JFrame(GraphicsConfiguration gc);

Rectangle limites = gc.getBounds(gc);

f.setLocation (25 + bounds.x, 25 + bounds.y)

Page 8: Renderización en java

*Canal alfa

*En este apartado se va a implementar un ejemplo algo más avanzado, aunque sigue siendo muy sencillo. El objetivo es ilustrar cómo es posible utilizar transparencias en el momento de dibujar figuras geométricas o cualquier otra cosa; en otras palabras, cuando se dibuja una figura sobre otra, la última dibujada no oculta a la de abajo sino que la deja entrever.

Page 9: Renderización en java

public void paint (Graphics g) {

Graphics2D g2 = (Graphics2D)g;

g2.setColor(Color.red);

Rectangle2D r1 = new Rectangle2D.Float(250.0f,50.0f,100.0f,100.0f);

g2.fill(r1);

AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);

g2.setColor(Color.green);

g2.setComposite(ac);

Rectangle2D r2 = new Rectangle2D.Float(200.0f,100.0f,100.0f,100.0f);

g2.fill(r2);

ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f);

g2.setColor(Color.magenta);

g2.setComposite(ac);

Rectangle2D r3 = new Rectangle2D.Float(150.0f,150.0f,100.0f,100.0f);

g2.fill(r3);

ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f);

g2.setColor(Color.yellow);

g2.setComposite(ac);

Rectangle2D r4 = new Rectangle2D.Float(100.0f,200.0f,100.0f,100.0f);

}La línea de código en la que se define la transparencia es:

AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);

Page 10: Renderización en java

* Cuando se construye un objeto de la clase AlphaComposite (con la función estática getInstance() ya que la clase AlphaComposite carece de constructor), puede especificarse un valor para el canal alfa. Cuando se incorpora este objeto AlphaComposite al contexto de Graphics2D, este valor alfa extra incrementa la

* transparencia de cualquier objeto gráfico que se renderice posteriormente. El valor que pueda tener cada objeto gráfico por sí mismo es multiplicado por el valor alfa del AlphaComposite.

* En la tabla siguiente se pueden apreciar los dos métodos para definir transparencias de la clase AlphaComposite:

Page 11: Renderización en java

*Ejercicio en Clase

*Desarrolle la siguiente imagen utilizando transparencias