Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
COMPUTACION GRAFICA
UNAD 2017
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
Lección 16 JDK
El JDK (Java Development Kit) comprende todas las herramientas necesarias para la
programación en JAVA, a continuación, se presenta una relación de sus principales
componentes:
Para realizar la instalación del JDK de JAVA es necesario descargarlo desde la página
http://www.oracle.com/technetwork/java/javase/downloads/index.html, allí deberá hacer
clic en el enlace de descarga y seleccionar el instalador correspondiente a su sistema
operativo.
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
Sin embargo, los tipos de datos mayormente empleados en la programación básica con
JAVA son boolean, int y double.
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
18.2. Caracteres
En Java los caracteres no están limitados a los presentes en la tabla ASCII, son Unicode.
Un caracter se presenta siempre entre comillas simples ej. 'A', '5', 'ó', etc. El tipo de dato
char se emplea para almacenar estos caracteres.
\r: Retorno de carro (hace que se mueva el cursor a la primera posición de una
línea)
\t: Tabulador horizontal (genera un espacio de separación entre caracteres)
\n: Nueva línea (indica el final de una línea de texto y el paso a la siguiente).
\\: Escribe una barra invertida.
18.3 Variables
booleanas: Una variable booleana solamente puede guardar uno de los dos posibles
valores: true (verdadero) y false (falso). Ej. boolean var1 = true;
enteras: Una variable entera corresponde a cualquier combinación de cifras
precedida por el signo más + (opcional), para los positivos, o el signo menos -, para
los negativos. Ej. int var1 = -254; las variables enteras se enuncian en java con las
palabras reservadas (int, byte, short, int, long) según la longitud de los valores a
contener.
en coma flotante: Las variables del tipo float o double (coma flotante) se
emplean para almacenar valores que poseen parte entera y parte decimal. Ej. float
var1 = 4.3f; double var1 = 3.5;
Valores constantes: Cuando se declara una variable de tipo final, su valor
permanece y no es posible modificarlo durante la ejecución del programa. Ej. final
int VAR1=256;
IntelliJ IDEA: Considerado uno de los mejores entornos de desarrollo, posee soporte para
multiples lenguajes de programación.
El SDK de Eclipse incluye las herramientas de desarrollo de Java, ofreciendo un IDE con
un compilador de Java interno y un modelo completo de los archivos fuente de Java. Esto
permite técnicas avanzadas de refactorización y análisis de código.
Netbeans: NetBeans es un proyecto de código abierto de gran éxito con una gran base
de usuarios, una comunidad en constante crecimiento, y con cerca de 100 socios en todo
el mundo. Sun MicroSystems fundó el proyecto de código abierto NetBeans en junio de
2000 y continúa siendo el patrocinador principal de los proyectos.
Modularidad. Todas las funciones del IDE son provistas por módulos. Cada módulo provee
una función bien definida, tales como el soporte de Java, edición, o soporte para el sistema
de control de versiones. NetBeans contiene todos los módulos necesarios para el desarrollo
de aplicaciones Java en una sola descarga, permitiéndole al usuario comenzar a trabajar
inmediatamente.
Gestión de proyectos
Plantillas de proyecto
Finalización de código
interfaz de depuración
Editor con resaltado de sintaxis
Asistentes
Interfaz de usuario totalmente personalizable
Con JCreator es posible compilar o ejecutar directamente el programa Java sin necesidad
de activar el documento principal. JCreator identifica automáticamente el archivo con el
método principal o el archivo html cargador del applet de Java.
Para el desarrollo de las actividades prácticas del presente curso se recomienda el empleo
de JCreator (versión LE).
20.1 Compilación
20.2 Ejecución
Los mensajes de salida producidos por la ejecución del programa serán visualizados en el
recuadro de la derecha (General output).
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
Es muy difícil escoger un conjunto de primitivas gráficas que sea adecuado para la
representación de todo tipo de entidades gráficas. Sin embargo, el siguiente subconjunto
resulta suficiente en la práctica:
Dada una primitiva gráfica a discretizar, debemos encontrar los pixeles que la representen
de la manera más correcta posible. Para ello, lo más adecuado es caracterizar
matemáticamente a dicha primitiva, de modo que su discretización pueda efectuarse en
forma sencilla. Entre los diversos métodos que pueden plantearse destacamos los dos
siguientes:
Análisis del error: Estos métodos fueron desarrollados por Bressenham y se basan en
analizar, dado un pixel que pertenece a la discretización de la primitiva, cuál es el próximo
pixel que minimiza una determinada expresión que evalúa el error que comete la
discretización.
• Δx = (x1 - x0) ≥ 0,
• Δy = (y1 - y0) ≥ 0, y
• Δx ≥ Δy.
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
El método busca encontrar una secuencia de n + 1 puntos tales que (x0;y0) = (x0;y0);
(x1;y1); … (xn;yn) = (x1;y1). La discretización de cada uno de ellos son los pixeles de la
discretización del segmento. Esta propiedad, si bien es trivial, es de gran importancia
porque determina que la discretización de un segmento de recta es invariante frente a
transformaciones afines. Esto significa que es equivalente transformar los extremos del
segmento y discretizar el segmento transformado, o discretizar primero y transformar cada
punto obtenido. Sin embargo, la primera alternativa es mucho más eficiente.
Un pequeño paréntesis para explicar algunas sentencias que pueden causar dudas:
cual se está dibujando, se toma el color como un objeto de tipo Color que puede
ser de los preterminados de Java o creado a partir de los parámetros r, g, b. Esta
llamada al método setColor permite modificar el color del “lápiz” que dibuja sobre
el contexto gráfico.
3. Java no tiene una sentencia básica para dibujar puntos (pixeles), en este caso se
utiliza la sentencia g.drawRect (línea 35) para dibujar un rectángulo con un ancho
y alto de 0, que en su ejecución se traduce a pintar un único pixel ubicado en el
punto enviado como parámetro.
4. En la misma sentencia g.drawRect (línea 35) se utiliza el “casting” a enteros para
lograr la discretización de las coordenadas flotantes.
La ejecución del algoritmo daría como resultado algo similar a lo mostrado en la siguiente
figura para 3 líneas diferentes.
Por último, si no se cumple que Δx ≥ Δy, entonces es necesario intercambiar los roles de
las variables x e y (simetría C). Cualquier combinación de situaciones se puede resolver
con combinaciones de simetrías (ver figura siguiente).
En el algoritmo DDA para segmentos de recta es necesario computar sumas entre las
variables en punto flotante, y además se requiere una división en punto flotante para
computar la pendiente. El mérito del algoritmo que vamos a presentar consiste en que
todas las operaciones se realizan en aritmética entera por medio de operaciones sencillas,
y por lo tanto, su ejecución es más rápida y económica, y es de fácil implementación con
hardware específico.
La decisión de ir hacia el paso E o D se toma en función del error que se comete en cada
caso. En este algoritmo se considera que el error es la distancia entre el
centro del pixel elegido y el segmento de recta, medida en dirección del eje Y positivo del
espacio de pantalla (es decir, hacia abajo). Si el error en p fuese cero, entonces al ir hacia
E el error pasa a ser m (la pendiente del segmento), y en D el error pasa a ser m - 1 (ver
Figura 16).
• Paso a E : e = e + m
• Paso a D : e = e + m –1
Por lo tanto, la elección del paso E o D depende de que el valor absoluto de e+m sea o no
menor que el valor absoluto de e+m-1. Expresado de otra manera, sea e el error en un
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
determinado pixel. Si e +m> 0.5 entonces el segmento de recta pasa más cerca del pixel
D, y si no, pasa más cerca del pixel E (ver Figura 17).
Una de las economías de cómputo del método proviene de poder evaluar el error
preguntando por cero. Es fácil ver que si se inicializa el error en e = m – 0.5 entonces en
cada paso hay que chequear e >0 para elegir D. La otra economía proviene de realizar
manipulaciones algebraicas para efectuar un cómputo equivalente, pero en aritmética
entera. Como se evalúa el error por cero, multiplicar el error por una constante no afecta
el resultado. Por lo tanto, multiplicamos el error por 2Δx. A partir de dicho cambio, se
constatan las siguientes igualdades:
• Paso a E: e = e+2Δy
• Paso a D: e = e+2(Δy-Δx)
x = r * cos
y = r *sen
Estas ecuaciones serán las que ocuparemos para calcular cada punto (x,y) del círculo,
donde el r será obviamente el radio de círculo y será el ángulo que forma el radio con la
parte positiva del eje x. En forma gráfica sería así:
El ángulo deberá estar en radianes ya que las funciones de seno y coseno que incluye Java,
trabajan con los ángulos en radianes. La fórmula para transformar grados a radianes es la
𝑔𝑟𝑎𝑑𝑜𝑠∗ 𝜋
siguiente: 𝑟𝑎𝑑𝑖𝑎𝑛𝑒𝑠 = 180
Entonces para dibujar el círculo de un radio determinado, solamente tenemos que hacer
un ciclo desde 0 hasta 360, pero con incrementos pequeños, calcular cada punto con las
ecuaciones en coordenadas polares e ir dibujando cada punto. El ciclo en vez de ir de 0 a
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
360 (ángulos en grados) irá de 0 a 6.28 (360*3.14/180=6.28) ya que el ángulo debe estar
en radianes.
Como dijimos el ciclo de 0 a 6.28 debe hacerse con incrementos pequeños, no contando
de uno en uno, ya que, para un círculo de radio muy grande, podrían aparecer huecos
entre un punto y el siguiente, por lo tanto, tenemos que usar un incremento fraccionario.
El valor 0.005 produce buenos resultados. Dibujar el círculo punto a punto es una tarea un
poco lenta, debido a que se debe calcular en cada punto el seno y el coseno del ángulo, y
estas funcionas son muy lentas. Para solucionar esto se pueden crear tablas predefinidas
o pre-calculadas. En la siguiente figura se muestra el código en Java que permitiría dibujar
el círculo en una ventana.
Se considera un polígono una figura cerrada, formada a partir de varias líneas. Para la
discretización de polígonos se considerarán 2 tipos de polígonos: los irregulares y los
regulares, en concordancia con lo mostrado por Steven R Davidson en su curso de gráficos
disponible en internet.
Como se podrá deducir del código el objeto Punto incluye las coordenadas x e y de un
punto en el plano cartesiano.
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
• x i = cx + r * cos( i*α )
• y i = cy + r * sen( i*α )
donde:
• i = 0,1,2,...,N-1,
• r es el radio de la circunferencia, y
• c = (cx, cy) es la coordenada del centro geométrico de la circunferencia y
del polígono.
Al agregar el centro a nuestra fórmula, conseguimos mover el centro geométrico del origen
(0,0) al que nosotros deseemos. En la siguiente figura se muestra el código que generaría
los polígonos regulares.
Los parámetros de entra para el método especifican el número de lados del polígono (N),
el punto centro de la circunferencia (centro), el radio de la circunferencia (radio), el
contexto gráfico (g) y el color.
Si bien existen diversos métodos, aquí presentaremos el más económico y difundido, que
se basa en encontrar la intersección de todos los lados del polígono con cada línea de
barrido (a y constante), por lo que el método se denomina conversión scan del polígono.
Este método es de gran importancia porque se generaliza a una clase de algoritmos
denominados scan-line para resolver determinados problemas de iluminación y sombreado
en tres dimensiones.
Todo polígono plano puede descomponerse en triángulos. Por lo tanto, el triángulo será la
base del análisis de la conversión scan de polígonos en general. Para computarla es
necesario dimensionar dos arreglos auxiliares de enteros minx, maxx que para cada línea
de barrido almacenarán el menor y mayor x respectivamente.
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
CAPÍTULO 6 TRANSFORMACIONES
Naturalmente, así como se desean dibujar gráficos, también se desea moverlos, rotarlos,
cambiar su tamaño, etc. En esta sección se presentan los principales fundamentos
matemáticos que subyacen al proceso de transformación de los gráficos en dos
dimensiones, a partir de lo mostrado por el euitmt WWW team de la Universidad de Oviedo.
Se espera que el estudiante en su proceso de profundización realice los algoritmos que
permitan hacer estas transformaciones.
Una de las mayores virtudes de los gráficos generados por ordenador es la facilidad con se
pueden realizar algunas modificaciones sobre las imágenes. Un gerente puede cambiar la
escala de las gráficas de un informe. Un arquitecto puede ver un edificio desde distintos
puntos de vista. Un cartógrafo puede cambiar la escala de un mapa. Un animador puede
modificar la posición de un personaje. Estos cambios son fáciles de realizar porque la
imagen gráfica ha sido codificada en forma de números y almacenada en el interior del
ordenador. Los números son susceptibles a las operaciones matemáticas denominadas
transformaciones.
Las transformaciones permiten alterar de una forma uniforme toda la imagen. Es un hecho
que a veces es más fácil modificar toda la imagen que una porción de ella. Esto supone un
complemento muy útil para las técnicas de dibujo manual, donde es normalmente más
fácil modificar una pequeña porción del dibujo que crear un dibujo completamente nuevo.
Las imágenes gráficas que se han generado están compuestas por un conjunto de
segmentos que están representados por las coordenadas de sus extremos. Algunos
cambios en la imagen pueden ser fácilmente realizados mediante la aplicación de algunas
operaciones matemáticas sobre estas coordenadas. Antes de ver algunas de las posibles
transformaciones, es necesario repasar algunas de las herramientas matemáticas que se
necesitarán, como la multiplicación de matrices
Entonces el elemento situado en la segundo fila y la tercera columna será A[2][3] y tendrá
un valor de 6.
Entonces podemos multiplicar A por B porque la primera tiene tres columnas y la segunda
tres filas. Al contrario que la multiplicación de números, la multiplicación de matrices no
es conmutativa, es decir, aunque podemos multiplicar A por B no podemos multiplicar B
por A, porque B tiene sólo dos columnas que no se corresponden con las tres filas de A.
Cuando multiplicamos dos matrices se obtiene como resultado otra matriz. Este matriz
producto tendrá el mismo número de filas que la primera de las matrices que se multiplican
y el mismo número de columnas que la segunda, es decir, a partir del ejemplo, la
multiplicación de la matriz A3x3 con la matriz B3x2 da como resultado la matriz C3x2.
Los elementos del matriz producto C se expresan en función de los elementos de las
matrices A por B mediante la siguiente fórmula:
Esta es una propiedad muy útil ya que permitirá combinas varias transformaciones gráficas
en una sola transformación, produciendo como resultado unos cálculos más eficientes.
Existe un conjunto de matrices que cuando multiplican a otra matriz, la reproducen. Por
esta razón reciben el nombre de matrices identidad. Son matrices cuadradas (tienen el
mismo número de columnas y de filas) con todos los elementos 0 excepto los elementos
de la diagonal principal, que valen todos 1. Por ejemplo
De forma matemática A = AI
¿Cómo se aplica todo esto a los gráficos? Bueno, consideremos un punto P1=[x1 y1] como
una matriz de 1x2. Si la multiplicamos por una matriz T2x2, obtendremos otra matriz que
puede ser interpretada como otro punto.
Por tanto, la matriz T es una aplicación entre el punto original P1 y el nuevo punto P2. Si
suponemos la imagen compuesta por los vértices de un polígono. ¿Qué pasará si
transformamos cada uno de los puntos mediante una multiplicación por una matriz T y
dibujamos el resultado? ¿Qué aspecto tendrá esta nueva imagen? La respuesta, por
supuesto, depende de los elementos de la matriz T. Si, por ejemplo, escogemos la matriz
identidad entonces la imagen no se verá alterada.
entonces
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
Cada una de las nuevas coordenadas x tiene el doble de valor que las antiguas. Las líneas
horizontales serán dos veces más largas en la nueva imagen. La nueva imagen tendrá la
misma altura, pero parecerá que la hemos estirado hasta alcanzar el doble del ancho
original.
Lección 28 Rotación
La siguiente transformación gráfica que vamos a ver es la rotación. Para introducir esta
transformación recordaremos brevemente algunos conceptos trigonométricos. Sea un
punto p1=(x1, y1) y lo giramos alrededor del origen un ángulo para pasar a una nueva
posición p2=(x2, y2). Queremos encontrar la transformación que convierte (x1, y1) en
(x2, y2). Pero, antes de comprobar si alguna transformación es la adecuada, debemos
saber primero que (x2, y2) debe escribirse en función de (x1, y1) y . Para esto es
necesario recordar las razones trigonométricas de seno y coseno.
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
También emplearemos las siguientes relaciones trigonométricas para determinar cómo gira
un punto:
Ahora estamos listos ya para determinar la rotación de un punto alrededor del origen.
De forma análoga:
Dando
A la vista de estas ecuaciones podemos imaginar una matriz que relacione las coordenadas
del punto original y del punto girado:
Así la matriz de transformación para una rotación en sentido contrario a las agujas del reloj
de ángulo alrededor del origen es:
Para una rotación en el sentido de las agujas del reloj, basta sustituir en la expresión
anterior el valor del ángulo por -□. Así nos queda
En general, con el fin de trasladar una imagen (Tx, Ty), cada punto (x1, y1) se convierte
en uno nuevo (x2, y2) donde:
Tal combinación sería deseable; por ejemplo, hemos visto que la rotación alrededor de un
punto que no sea el origen puede realizarse mediante una traslación, una rotación u otra
traslación. Sería deseable combinar estas tres transformaciones en una sola
transformación por motivos de eficacia y elegancia. Una forma de hacer esto es emplear
matrices 3x3 en vez de matrices 2x2, introduciendo una coordenada auxiliar w. Este
método recibe el nombre de coordenadas homogéneas. En estas coordenadas, los puntos
están definidos por tres coordenadas y no por dos. Así un punto (x, y) estará representado
por la tripleta (xw, yw, w). Las coordenadas x e y se pueden recuperar fácilmente
dividiendo los dos primeros números por el tercero respectivamente. No emplearemos la
coordenada w hasta que no veamos las transformaciones tridimensionales de perspectiva.
En dos dimensiones su valor suele ser 1 para simplificar. Sin embargo, lo veremos de
forma general como anticipo de las transformaciones tridimensionales.
se convierte en
Si dividimos ahora por el tercer valor w tenemos (Exx, Eyy) que es el punto correcto
cambiado de escala.
Haremos esta transformación en tres pasos. Primero trasladaremos el punto (xC, yC) al
origen, luego haremos la rotación alrededor del origen y, por último, devolveremos el
centro de rotación a su posición original.
La rotación es
Cabe destacar que esta matriz se puede formar también mediante una rotación inicial de
ángulo y una traslación definida por los valores contenidos en la tercera fila
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
Las tres transformaciones de cambio de escala, rotación y traslación son las más útiles y
las más usadas. Son también posibles otras transformaciones. Dado que una matriz 2x2
cualquiera
-1 0
0 1 Reflexión respecto al eje y
1 0
0 -1 Reflexión respecto al eje x
-1 0
0 -1 Reflexión respecto al origen
0 1
1 0 Reflexión respecto a la recta y=x
0 -1
-1 0 Reflexión respecto a la recta y=-x
1 α
0 1 Deformación en el eje y
1 0
b 1 Deformación en el eje x
Las primeras tres reflexiones son simples cambios de escala, pero con factores negativos.
Las simetrías respecto a las rectas y=x e y=-x pueden realizarse mediante un cambio de
escale y un giro posterior. Es posible realizar las deformaciones mediante una secuencia
de rotaciones y cambios de escala, aunque es mucho más fácil aplicar la matriz resultante.
Universidad Nacional Abierta y a Distancia – UNAD
Vicerrectoría Académica y de Investigación - VIACI
Escuela: Escuela De Ciencias Básicas Tecnología E Ingeniería Programa: Ingeniería de Sistemas
Curso: Computación Gráfica Código: 299210
Referencias Bibliográficas
Universidad Nacional del Sur - Departamento de Ingeniería eléctrica. (2011). Cosas que pueden ser útiles.
Obtenido de http://www-2.dc.uba.ar/materias/cgr/util.htm