GRAFICACION 2D
La computación gráfica 2D es la generación de imágenes digitales por computadora sobre todo de modelos bidimensionales (como modelos geométricos, texto y imágenes digitales 2D) y por técnicas específicas para ellos.
La computación gráfica 2D se utiliza principalmente en aplicaciones que fueron desarrolladas originalmente sobre tecnologías de impresión y dibujo tradicionales, tales como tipografía, cartografía, dibujo técnico, publicidad, etc. En estas aplicaciones, la imagen bidimensional no es sólo una representación de un objeto del mundo real, sino un artefacto independiente con valor semántico añadido; los modelos bidimensionales son preferidos por lo tanto, porque dan un control más directo de la imagen que los gráficos 3D por computadora (cuyo enfoque es más semejante a la fotografía que a la tipografía).
2.1 Trazo de lineas rectas:
Una línea recta, lo mismo que cualquier curva contenida totalmente en un plano está representada, en relación con un sistema de ejes cartesianos, por una función de dos variables, siempre y cuando dicha función sea capaz de expresar la condición común que satisfacen absolutamente todos y cada uno de los puntos que constituyen dicha línea.
Un segmento de línea recta dentro de una escena está definido por las coordenadas de los dos extremos del segmento.
Para mostrar la línea en un monitor digital, el sistema gráfico debe primero proyectar las coordenadas de los extremos para obtener coordenadas de pantalla de valor entero y determinar las posiciones de píxel más próximas a lo largo de la línea que conecta los dos extremos. Entonces, se cargará en el búfer de imagen el color correspondiente a la línea en las coordenadas de píxel apropiadas, Al leer los datos del búfer de imagen, la controladora de vídeo dibujará los píxeles en pantalla.
Este proceso lo que hace es digitalizar la línea para obtener un conjunto de posiciones enteras discretas que en general, únicamente sirve como aproximación del verdadero trayecto seguido por la línea.
Una posición de línea calculada como (10.48. 20.51), por ejemplo, se convierte a la posición de píxel (10, 21). Este redondeo de los valores de las coordenadas para obtener enteros hace que todas las líneas (excepto las horizontales y las verticales) se dibujen con una apariencia escalonada.
La forma escalonada característica de las líneas digitalizadas es particularmente apreciable en los sistemas de baja resolución, pudiéndose mejorar un poco su apariencia si se utiliza un monitor de resolución más alta. Otras técnicas más efectivas para suavizar la línea digitalizada se basan en ajustar las intensidades de los píxeles a lo largo del trayecto de la línea.
Para determinar las posiciones de los píxeles a lo largo de un trayecto de línea recta se utilizan las propiedades geométricas de la línea.
La ecuación punto-pendiente cartesiana para una línea recta es:

siendo m la pendiente de la línea y b el punto de intersección con el eje.
El algoritmo de análisis diferencia digital (DDA, Digital Diflerential Analizar) es un algoritmo de digitalización de líneas basado en calcular Sy o Sx, Las líneas se muestrean a intervalos unitarios según una de las coordenadas y los correspondientes valores enteros más próximos al trayecto lineal se calculan para la otra coordenada.
Este algoritmo, inventado por Bresenham, utiliza sólo cálculos enteros para determinar los incrementos.
Además, el algoritmo de Bresenham para dibujo de líneas puede adaptarse para dibujar círculos y otras líneas.
Es considerado uno de los algoritmos más efectivos para dibujar líneas mediante rastreo. Emplea cálculos incrementales con valores enteros. La forma de determinar el siguiente pixel a dibujar en la generación de una línea, se describe a continuación:
1. Punto inicial P1(Xinicial,Yinicial).
2. Se desplaza una columna (incrementando la posición en X)
3. Se traza el pixel cuyo valor de Y de la línea de rastreo se aproxima más a la trayectoria de la línea. Se capturan los dos extremos de la línea P1(Xinicial,Yinicial) y P2(Xfinal,Yfinal)
4. Se dibuja el primer pixel correspondiente al extremo izquierdo de la línea(P1)
5. Se calculan los parámetros que permitien decidir cuál será el proximo pixel a dibujar (DeltaX, DeltaY y ConstanteP).
6. Dependiendo del valor que tome el Parámetro ConstanteP se evalúa y determina la coordenada a dibujar que puede ser:
1. (X+1,Y) para ConstanteP < 0
2. Sino (X+1,Y+1)
3. BRESENHAM:<!--[endif]-->
2. Sino (X+1,Y+1)
3. BRESENHAM:<!--[endif]-->
El algoritmo de Bresenham sirve para trazar una línea entre dos puntos.
Código:
void Bres(int x0,int y0,int xFin,int yFin)
{
int dx = fabs(xFin - x0),
dy = fabs(yFin - y0);
int p = 2 * dy - dx;
int dosDy = 2 * dy,
dosDyMenosDx = 2 * (dy - dx);
int x, y;
/* Determinamos que punto usamos como inicio.*/
if (x0 > xFin) {
x = xFin;
y = yFin;
xFin = x0;
}
else {
x = x0;
y = y0;
}
setPixel (x, y);
while (x <>
x++;
if (p <>
p += dosDy;
else {
y++;
p += dosDyMenosDx;
}
setPixel (x, y);
}
}
Algoritmo de Bresenham para trazar circunferencias
El algoritmo de línea de Bresenham se adapta a la generación de circunferencias al establecer los parámetros de decisión para identificar el pixel más cercano a la circunferencia en cada paso del muestreo.Además sincroniza el dibujado de los píxeles en cada octante de la circunferencia.
Código:
void circuloPtoMedio(scrPt circCtr, GLint radio)
{
scrPt circPt;
GLint p = 1 - radio;
circPt.x = 0;
circPt.y = radio;
void circuloPuntos(scrPt, scrPt);
/* Dibujamos el punto inicial en cada cuadrante del circulo*/
circuloPuntos(circCtr, circPt);
/* Calculamos los siguientes puntos y los dibujamos en cada octante*/
while (circPt.x <>
circPt.x++;
if (p <>
p += 2 * circPt.x + 1;
else {
circPt.y--;
p += 2 * (circPt.x - circPt.y) + 1;
}
circuloPuntos(circCtr, circPt);
}
}
void circuloPuntos(scrPt circCtr, scrPt circPt);
{
setPixel (circCtr.x + circPt.x, circCtr.y + circPt.y);
setPixel (circCtr.x - circPt.x, circCtr.y + circPt.y);
setPixel (circCtr.x + circPt.x, circCtr.y - circPt.y);
setPixel (circCtr.x - circPt.x, circCtr.y - circPt.y);
setPixel (circCtr.x + circPt.y, circCtr.y + circPt.x);
setPixel (circCtr.x - circPt.y, circCtr.y + circPt.x);
setPixel (circCtr.x + circPt.y, circCtr.y - circPt.x);
setPixel (circCtr.x - circPt.y, circCtr.y - circPt.x);
}
void circuloPtoMedio(scrPt circCtr, GLint radio)
{
scrPt circPt;
GLint p = 1 - radio;
circPt.x = 0;
circPt.y = radio;
void circuloPuntos(scrPt, scrPt);
/* Dibujamos el punto inicial en cada cuadrante del circulo*/
circuloPuntos(circCtr, circPt);
/* Calculamos los siguientes puntos y los dibujamos en cada octante*/
while (circPt.x <>
circPt.x++;
if (p <>
p += 2 * circPt.x + 1;
else {
circPt.y--;
p += 2 * (circPt.x - circPt.y) + 1;
}
circuloPuntos(circCtr, circPt);
}
}
void circuloPuntos(scrPt circCtr, scrPt circPt);
{
setPixel (circCtr.x + circPt.x, circCtr.y + circPt.y);
setPixel (circCtr.x - circPt.x, circCtr.y + circPt.y);
setPixel (circCtr.x + circPt.x, circCtr.y - circPt.y);
setPixel (circCtr.x - circPt.x, circCtr.y - circPt.y);
setPixel (circCtr.x + circPt.y, circCtr.y + circPt.x);
setPixel (circCtr.x - circPt.y, circCtr.y + circPt.x);
setPixel (circCtr.x + circPt.y, circCtr.y - circPt.x);
setPixel (circCtr.x - circPt.y, circCtr.y - circPt.x);
}
2.3 Transformacion bidimensional:
Aquí
estudiamos primero los procedimientos generales para aplicar parámetros de
traslación, rotación y escalación para cambiar la posición y el tamaño de los
objetos bidimensionales.
Traslación
Se aplica una traslación en un objeto
para cambiar su posición a lo largo de la trayectoria de una línea recta de una
dirección de coordenadas a otra. Convertimos un punto bidimensional al agregar
las distancias de traslación, tx y ty la posición de coordenadas original (x,y)
El par de distancia de traslación se
llama vector de traslación o vector de cambio. Se pueden expresar las
ecuaciones anteriores en una sola ecuación matricial al utilizar vectores de
columna para representar las posiciones de coordenadas y el vector de traslación
Los polígonos se trasladan al sumar el
vector de traslación a la posición de coordenadas de cada vértice y se vuelve a
generar el polígono utilizando un nuevo conjunto de coordenadas y vértices y
las especificaciones actuales de los atributos.
Rotación
Se aplica una rotación bidimensional en un objeto al cambiar
su posición a lo largo de la trayectoria de una circunferencia en el plano de
xy . Para generar una rotación, especificamos un ángulo de rotación θ y la
posición (x r , y r ) del punto de rotación (o punto pivote) en torno al cual
se gira el objeto.
Escalación
Una transformación de escalación altera el tamaño de un
objeto. Se puede realizar esta operación para polígonos al multiplicar los
valores de coordenadas (x, y) de cada vértice por los factores de escalación sx
y sy para producir las coordenadas transformadas (x’, y’).
El factor de escalación sx escala objetos en la dirección de
x, mientras que el factor de escalación sy lo hace en la dirección de y.
Cuando se asignan el mismo valor a sx y sy’ se general una
escala uniforme. Y cuando se asignan valores distintos a sx y sy se obtiene una
escala diferencial.
Podemos encontrar la localización de un objeto escalonado al
seleccionar una posición llamada punto fijo, que debe permanecer sin cambio
después de la transformación de escalación.
2.4
Representación matricial:
Es posible expresar cada una de las transformaciones básicas en la forma
de matriz general con las posiciones de coordenadas P y P’ representadas como
columnas de vector.
La matriz M1 es una matriz de 2 por 2 que contiene factores de
multiplicación y M2 es una matriz de columnas de dos elementos que contiene
términos de traslación.
Para la traslación, M1 es la matriz de identidad.
Para la rotación o la escalación M2 contiene los términos de traslación asociados con el punto pivote o el punto fijo de escalación.
Podemos combinar los términos de multiplicación y de adición para transformaciones geométricas bidimensionales en una sola representación de matriz al ampliar las representaciones de matriz de 2 por 2 a matrices de 3 por 3.
Esto nos permite expresar todas las ecuaciones de matriz como multiplicaciones de matriz, si también ampliamos las representaciones de matriz para las posiciones de coordenadas. Para expresar cualquier transformación bidimensional como una multiplicación de matriz, representamos cada posición de coordenadas cartesianas (x, y) con las tres coordenadas homogéneas (xh, yh, h), donde
Para la traslación, M1 es la matriz de identidad.
Para la rotación o la escalación M2 contiene los términos de traslación asociados con el punto pivote o el punto fijo de escalación.
Podemos combinar los términos de multiplicación y de adición para transformaciones geométricas bidimensionales en una sola representación de matriz al ampliar las representaciones de matriz de 2 por 2 a matrices de 3 por 3.
Esto nos permite expresar todas las ecuaciones de matriz como multiplicaciones de matriz, si también ampliamos las representaciones de matriz para las posiciones de coordenadas. Para expresar cualquier transformación bidimensional como una multiplicación de matriz, representamos cada posición de coordenadas cartesianas (x, y) con las tres coordenadas homogéneas (xh, yh, h), donde
Por tanto, una representación general de coordenadas homogéneas se puede
expresar también como (h*x, h*y, h). Para transformaciones geométricas
bidimensionales, seleccionamos el parámetro homogéneo h como cualquier valor no
cero. Así, existe un número finito de representaciones homogéneas equivalentes
para cada punto de coordenadas (x, y).
Expresar posiciones en coordenadas homogéneas nos permite representar todas las ecuaciones de transformación geométrica como multiplicaciones de matriz. Se representan las coordenadas con vectores de columna de tres elementos y las operaciones de transformación se expresan como matrices de 3 por 3.
Para la traslación tenemos:
Expresar posiciones en coordenadas homogéneas nos permite representar todas las ecuaciones de transformación geométrica como multiplicaciones de matriz. Se representan las coordenadas con vectores de columna de tres elementos y las operaciones de transformación se expresan como matrices de 3 por 3.
Para la traslación tenemos:
que podemos expresar en forma abreviada:
con T(tx, ty) como la matriz de traslación 3 por 3.
Se obtiene el inverso de la matriz de traslación al reemplazar los parámetros de traslación tx y ty con sus valores negativos -tx y -ty.
De modo similar, ahora se expresan las ecuaciones de transformación de rotación respecto al origen de las coordenadas como
Se obtiene el inverso de la matriz de traslación al reemplazar los parámetros de traslación tx y ty con sus valores negativos -tx y -ty.
De modo similar, ahora se expresan las ecuaciones de transformación de rotación respecto al origen de las coordenadas como
o como:
El operador de transformación de rotación
R("theta") es la matriz de 3 por 3 con el parámetro de rotación
"theta". Obtenemos la matriz de rotación inversa cuando se sustituye
θ con -θ.
Por último, ahora se expresa una transformación de escalación con respecto del origen de las coordenadas como la multiplicación de matriz:
Por último, ahora se expresa una transformación de escalación con respecto del origen de las coordenadas como la multiplicación de matriz:
o
donde S(Sx, Sy) es la matriz de 3 por 3 en la ecuación 2.21 con los parámetros Sx y Sy.
Al sustituir sus inversos multiplicativos (1/sx y 1/sy) se obtiene la matriz de escalación inversa.
2.5
Ventana y puerto de visión:
Algunos paquetes gráficos permiten que el programador especifique coordenadas de primitivas de salida en un sistema de coordenadas de mundo de punto flotante, usando las unidades que sean relevantes para el programa de aplicación: angstroms, micras, metros, millas, años luz, etcétera. Se emplea el término de mundo porque el programa de aplicación representa un mundo que se crea o presenta interactivamente para el usuario:
Como las primitivas de salida se expresan en coordenadas de mundo, hay que indicar al paquete de subrutinas gráficas cómo establecer la correspondencia entre las coordenadas de mundo y las coordenadas de pantalla.
Esta correspondencia se puede efectuar si el programador de la aplicación proporciona al paquete gráfico una matriz de transformación para la correspondencia.
Otra forma es que el programador de la aplicación especifique una región rectangular en coordenadas de mundo, llamada ventana de coordenadas mundiales y una región rectangular correspondiente en coordenadas de pantalla, llamada área de vista, con la cual se establece la correspondencia de la ventana de coordenadas mundiales.
La transformación que establece la correspondencia entre la ventana y el área de vista se aplica a todas las primitivas de salida en coordenadas de mundo para que correspondan a coordenadas de pantalla.
Si la ventana y el área de vista no tienen la misma razón altura-anchura, ocurre un escalamiento no uniforme. Si el programa de aplicación cambia la ventana o el área de vista, las nuevas primitivas de salida que se dibujen en la pantalla se verán afectadas por el cambio, no así las primitivas existentes.
Si SRGP proporcionara primitivas de salida en coordenadas de mundo, el área de vista se hallaría en el lienzo actual, que por omisión es el lienzo 0, la pantalla. El programa de aplicación podría cambiar en cualquier instante la ventana o el área de vista, en cuyo caso las primitivas de salida que se especificaran subsecuentemente estarían sujetas a una nueva transformación. Si el cambio incluyera un área de vista distinta, las nuevas primitivas de salida se colocarían en el lienzo en posiciones distintas a las anteriores.












No hay comentarios:
Publicar un comentario