*
    Ing. Yeimmy Alejandra Contreras Suárez
* 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.




                               *
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);
              }
}




*
* 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
* 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.


               *
* 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 consisten
en:

• 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.
* 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)
* 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.




                                   *
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);
*   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:
* Desarrolle la siguiente imagen utilizando transparencias




                   *

Renderización en java

  • 1.
    * Ing. Yeimmy Alejandra Contreras Suárez
  • 2.
    * 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. *
  • 3.
    import javax.swing.*; import java.awt.*; importjava.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); } } *
  • 4.
    * Si sedesea 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
  • 5.
    * Java2D mantienedos 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. *
  • 6.
    * 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 consisten en: • 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.
  • 7.
    * Si sedispone 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)
  • 8.
    * En esteapartado 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. *
  • 9.
    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);
  • 10.
    * 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:
  • 11.
    * Desarrolle lasiguiente imagen utilizando transparencias *