martes, 11 de septiembre de 2012

2.1 Generación de líneas rectas


Linea

Una marca delgada hecha por un esferográfico o un lápiz etc.

En geometría una línea:

· es recta (sin curvas),
· no tiene grosor, y
· se extiende en ambas direcciones sin tener un final (infinitamente).

Si tuviera fin se llamaría "segmento de línea".

"Línea" normalmente significa recta, así que di "curva" si tiene una curva.

Algoritmo DDA para Generacion de Rectas

Algoritmo DDA para generación de líneas
Como todos saben Open GL es una herramienta que nos facilita mucho la generación de gráficos por computadora. Aqui aplicamos conocimientos matemáticos, usando Open GL para generar rectas, corcunferencias, elipses, etc.

DDA: El Algoritmo DDA es un algoritmo de línea de conversión de rastreo que se basa en el cálculo ya sea en el incremento de X o en el incremento de Y. La finalidad de este algoritmo es determinar los valores enteros correspondientes más próximos a la trayectoria de la línea para la otra coordenada.

  

 

Código:

void DDA(int x0,int y0,int xFin,int yFin)

{

int dx = xFin - x0, dy = yFin - y0, steps, k;

float xIncremento, yIncremento;

float x = x0, y = y0;

if (fabs (dx) > fabs (dy))

steps = fabs (dx); /* |m|<1>

else

steps = fabs (dy); /* |m|>=1 */

xIncremento=float(dx)/float (steps);

yIncrement = float (dy) / float (steps);

setPixel (round (x), round (y));

for (k = 0; k <>

{

x += xIncremento;

y += yIncremento;

setPixel (round (x), round (y));

}

}

BRESENHAM:

 

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

}

}
 

 

Circunferencia

La circunferencia es una línea curva, plana y cerrada

La circunferencia sólo posee longitud. Se distingue del círculo en que éste es el lugar geométrico de los puntos contenidos en una circunferencia determinada; es decir, la circunferencia es el perímetro del círculo cuya superficie contiene.

Puede ser considerada como una elipse de excentricidad nula, o una elipse cuyos semiejes son iguales. También se puede describir como la sección, perpendicular al eje, de una superficie cónica o cilíndrica, o como un polígono de infinitos lados, cuya apotema coincide con su radio.

La circunferencia de centro en el origen de coordenadas y radio 1 se denomina circunferencia unidad o circunferencia goniométrica

Algoritmo de Bresenham para trazar circunferencias

El programa debe trazar un circulo cada que el usuario agregue dos puntos.

El usuario debe introducir con el ratón dos puntos p0 y p1 para trazar el circulo. El primero, que representa el centro

del circulo p0 = (cx; cy) y el segundo, desde el cual se puede calcular el radio d(p0; p1) = r. Es decir, el primero es el

centro y el otro es un punto en la circunferencia.
 
 

Se deben de poder trazar círculos parciales. Es decir, puede suceder que algunos de los puntos del circulo caigan

fuera de la pantalla, en ese caso el programa debe de poder trazar la parte visible del circulo.

Sugerencia para mejorar el programa. Por calificación extra puede tratar de generalizar el algoritmo de Bresenham

para que pueda trazar elipses (El algoritmo solo funciona para trazar elipses alineadas a los ejes). Recuerde que si en clase

se dedujo el algoritmo del circulo a partir de la ecuación x2 + y2 = r2, se puede deducir el de la elipse a partir de la

ecuación􀀀 x a_2􀀀 yb_2= 1. Donde a y b son los radios de la elipse con respecto a los ejes.

Puede consultar como bibliografía [2] Y para darse idea de como se puede hacer la interfaz de usuario puede ver como

operan los programas como Inkscape o Ilustrator el trazo de círculos y elipses. Con esto en mente puede intentar el trazador

de elipses a mano alzada. Usando las funciones glutMotionFunc y glutActiveMotionFunc.

No hay comentarios:

Publicar un comentario