Java 2D
# Java 2D

En computación, Java 2D es un API para dibujar gráficos en dos dimensiones usando el lenguaje de programación Java. Cada operación de dibujo Java 2D puede tratarse como rellenar una forma usando un pincel y componiendo el resultado en la pantalla.

## Conceptos básicos

Estos objetos son parte necesaria de cada operación de dibujo Java 2D.

### Formas

Una forma en Java 2D es un límite infinitamente delgado el cual define un interior y un exterior. Los Píxeles internos de la forma están afectados por la operación de dibujo, los que están fuera no.

Intentar rellenar un segmento de línea recto extremadamente fino resultará en que no habrá píxeles afectados, por lo tanto una forma no contiene píxeles. En su lugar, un rectángulo fino se debe usar para que la forma contenga algunos píxeles.

### Pinceles

Un pincel genera los colores que serán usados para cada píxel de la operación de relleno. El pincel más simple es java.awt.Color, el cual genera el mismo color para todos los píxeles. Pinceles más complicados pueden producir gradientes, imágenes, o cualquier combinación de colores. Rellenar una forma circular usando el color amarillo resulta en un círculo sólido amarillo, mientras rellenar la misma forma circular usando un pincel que genera una imagen produce un recorte circular de la imagen.

### Compuestos

Durante cualquier operación de dibujo, hay una fuente (los píxeles que son producidos por el pincel) y un destino (los píxeles ya en la pantalla). Normalmente, los píxeles fuente simplemente sobrescriben los píxeles de destino, pero el compuesto permite modificar este comportamiento.

El compuesto, dados los píxeles fuente y destino, produce el resultado final que por último aparece en la pantalla. El compuesto más común es java.awt.AlphaComposite, el cual trata los píxeles que están siendo dibujados como parcialmente transparentes, para que los píxeles destino se muestren en algún grado.

### Rellenado

Para rellenar una forma, el primer paso es identificar que píxeles caen dentro de la forma. Estos píxeles serán afectados por la operación de relleno. Los píxeles que están parcialmente dentro y parcialmente fuera de la forma pueden ser afectados en menor grado si está activado el Anti-aliasing.

El pincel es requerido para generar un color de cada uno de los píxeles que se van a pintar. En el caso común del relleno de un color sólido, cada píxel será asignado al mismo color.

El compuesto toma los píxeles generados por el pincel y los combina con los píxeles que ya están en la pantalla para producir el resultado final.

## Objetos Avanzados

Estos objetos pueden ser entendidos en relación con los objetos más simples escritos antes.

### Transformación

Cada operación Java 2D es sujeto a transformación, para que las formas pueden ser traducidas, rotadas, y escaladas cuando son dibujadas. La transformación activa es a menudo la transformación identidad, la cual no hace nada.

Rellenar usando una transformación puede verse como simplemente crear una nueva forma transformada y entonces rellenar esa forma.

### Movimiento

Además de la operación rellenar, Java 2D suministra una operación dibujar. Mientras rellenar dibuja el interior de una forma, dibujar dibuja su contorno. El contorno puede ser tan simple como una línea fina, o tan complicado como una línea con bordes redondeados.

El objeto responsable de generar el exterior es el movimiento. Dada una forma de entrada, el movimiento produce una nueva forma que representa su exterior. Por ejemplo, un segmento de línea infinitamente fino (sin interior) no puede ser movido a un rectángulo de ancho de un píxel.

Una operación dibujar puede por lo tanto ser descrito como crear un nuevo, objeto movido y entonces rellenar ese objeto.

Técnicamente hablando, el movimiento es sólo requerido para aceptar una forma de entrada y produce una nueva forma. La implementación de movimiento suministrada con Java 2D implementa las reglas de contorno descritas anteriormente, pero un contorno personalizado podría producir cualquier forma deseada.

## Optimizaciones

Conceptualmente, dibujando una línea negra en Java 2D puede pensarse como crear un segmento de línea, transformarlo de acuerdo a la transformación actual, moviéndolo para crear un rectángulo fino, consultando su forma para computar los píxeles que están siendo afectados, generando los píxeles que usan java.awt.Color.BLACK, y entonces componiendo los resultados en la pantalla.

Sin embargo, realizar esta secuencia completa de pasos para cada operación de dibujado sería muy ineficiente. Java 2D por lo tanto optimiza las operaciones de dibujado comunes para que muchos de esos pasos puedan saltarse. Si el pincel es de un color sólido simple, por ejemplo, no hay necesidad de ordenar que genere una lista de los colores que van a ser pintados. Asimismo, si el compuesto por defecto completamente opaco está en uso, actualmente pedir que realice la operación de composición es innecesario y resultaría en esfuerzo inútil.

Java 2D realiza la mínima cantidad de trabajo necesario para hacer que parezca como si realizara todos los pasos para cada operación, por lo tanto conserva gran flexibilidad y alto rendimiento.

## Destino

Por simplicidad, los ejemplos en este artículo han asumido que la ventana es el dispositivo destino. Sin embargo, el destino puede ser cualquier cosa, tal como una impresora, imagen de memoria, o incluso un objeto que acepte comandos gráficos Java 2D y los traduzca a ficheros de imagen de Gráficos vectoriales.*

## Interoperabilidad Java2D / OpenGL

Desde el build 51 hasta la nueva versión Java SE 6 del lenguaje de programación Java, Java2D y Opengl han llegado a ser interoperables, permitiendo por ejemplo dibujar gráficos 3D animados en lugar de iconos en un Botón (ver JOGL).

