Definición de líneas
Una línea es una sucesión continua de
puntos (trazado), como por ejemplo un trazo o un guion. Las líneas suelen
utilizarse en la composición artística, se denomina en cambio «raya» a
trazos rectos sueltos, que no forman una figura o forma en particular. En matemáticas y
geometría, línea suele denotar línea recta o curva.
Algoritmo
DDA para generación de rectas
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.
El Codigo es el Siguiente :
void DDA(int x_0,int y_0, int x_fin, int y_fin){
glClear ( GL_COLOR_BUFFER_BIT );
glPointSize(3.0);
glScalef(4.0, 4.0, 2.0);
glPointSize(3.0);
glScalef(4.0, 4.0, 2.0);
glBegin(GL_POINTS);
glVertex2i(x_0,y_0);
glVertex2i(x_0,y_0);
int vx=(int)fabs(x_fin-x_0);
int vy=(int)fabs(y_fin-y_0);
int dx,dy;
int m = (int)(y_fin-y_0)/(x_fin-x_0);
int vy=(int)fabs(y_fin-y_0);
int dx,dy;
int m = (int)(y_fin-y_0)/(x_fin-x_0);
if(m==1)m++;
if(m==0)m=-1;
if(m==0)m=-1;
if(m>0&&m<1){
if(x_0<x_fin){
dx=1;
dy=m;
}else{
dx=-1;
dy=-m;
}
}
else
if(m>0&&m>1){
if(m>1){
if(x_0<x_fin){
dy=1;
dx=(int)1/m;
if(x_0<x_fin){
dx=1;
dy=m;
}else{
dx=-1;
dy=-m;
}
}
else
if(m>0&&m>1){
if(m>1){
if(x_0<x_fin){
dy=1;
dx=(int)1/m;
}else{
dy=-1;
dx=(int)-1/m;
dy=-1;
dx=(int)-1/m;
}
}else
if(m<0&&fabs(m)<1){
if(x_0>x_fin)
{
dx=-1;
dy=-m;
{
dx=-1;
dy=-m;
}else
{
dx=1;
dy=-m;
}
{
dx=1;
dy=-m;
}
}
else{
if(x_0>x_fin){
dy=1;
dx=-1/m;
dy=1;
dx=-1/m;
}
else {
dy=-1;
dx=1/m;
else {
dy=-1;
dx=1/m;
}
}
if(m>0&&m<1){
for(int i=1;i<=vx;i++)
{
glVertex2i(x_0+dx ,y_0+dy );
x_0+=dx;
y_0+=dy;
for(int i=1;i<=vx;i++)
{
glVertex2i(x_0+dx ,y_0+dy );
x_0+=dx;
y_0+=dy;
}
}
else
if(m>0&&m>1){
for(int i=1;i<=vy;i++){
glVertex2i(x_0+dx ,y_0+dy );
x_0+=dx;
y_0+=dy;}
}
else
if(m>0&&m>1){
for(int i=1;i<=vy;i++){
glVertex2i(x_0+dx ,y_0+dy );
x_0+=dx;
y_0+=dy;}
}else
if(m<0&&fabs(m)<1){
for(int i=1;i<=vx;i++)
{
glVertex2i(x_0+dx ,y_0+dy );
x_0+=dx;
y_0+=dy;
{
glVertex2i(x_0+dx ,y_0+dy );
x_0+=dx;
y_0+=dy;
}
}
else{
for(int i=1;i<=vy;i++){
glVertex2i(x_0+dx ,y_0+dy );
x_0+=dx;
y_0+=dy;
}
}
}
glEnd();
glFlush();
}
glVertex2i(x_0+dx ,y_0+dy );
x_0+=dx;
y_0+=dy;
}
}
}
glEnd();
glFlush();
}
Algoritmo de Bresenham
para trazar líneas
Es un algoritmo preciso para la generación de líneas de rastreo que
convierte mediante rastreo las líneas al utilizar solo cálculos incrementales
con enteros que se pueden adaptar para desplegar circunferencias y curvas. Los
ejes verticales muestran las posiciones de rastreo y los ejes horizontales
identifican columnas de pixeles.
Algoritmo
El algoritmo sería el siguiente:
Si
0<|m|<1
*Se capturan los extremos de la línea y se
almacena el extremo izquierdo en (x0,y0).
*Se carga (x0,y0) en el
bufer de estructura (se traza el primer punto)
*Se calculan las constantes Δx,Δy, 2Δy y
2Δy-Δx y se obtiene el valor inicial para el
parametro de decisión p0=2Δy-Δx.
Para j=0 mientras j<Δx
*En cada xk a lo largo de la
línea, que inicia en k=0 se efectúa la prueba siguiente:
Si pk<0
*Trazamos (xk+1,yk).
*Asignamos pk+1= pk+2Δy.
Sino
*Trazamos (xk+1,yk+1).
*Asignamos pk+1= pk+2Δy-2Δx.
Fin Para
Si |m|>1
*Recorremos la dirección en pasos unitarios
y calculamos los valores sucesivos
de x que se aproximen más a la trayectoria
de la línea.
Implementación
Esta es la implementación del algoritmo:public void Bresenham(Graphics g,int x0, int y0, int x1, int y1)
{ int x, y, dx, dy, p, incE, incNE, stepx, stepy;
dx = (x1 - x0);
dy = (y1 - y0);
/* determinar que punto usar para empezar, cual para terminar */
if (dy < 0) {
dy = -dy; stepy = -1;
}
else
stepy = 1;
if (dx < 0) {
dx = -dx; stepx = -1;
}
else
stepx = 1;
x = x0;
y = y0;
g.drawLine( x0, y0, x0, y0);
/* se cicla hasta llegar al extremo de la línea */
if(dx>dy){
p = 2*dy - dx;
incE = 2*dy;
incNE = 2*(dy-dx);
while (x != x1){
x = x + stepx;
if (p < 0){
p = p + incE;
}
else {
y = y + stepy;
p = p + incNE;
}
g.drawLine( x, y, x, y);
}
}
else{
p = 2*dx - dy;
incE = 2*dx;
incNE = 2*(dx-dy);
while (y != y1){
y = y + stepy;
if (p < 0){
p = p + incE;
}
else {
x = x + stepx;
p = p + incNE;
}
g.drawLine( x, y, x, y);
}
}
}
Definicion de circunferencia
Algoritmo
de Bresenham para trazar circunferencias
Una circunferencia
se define como un conjunto de puntos que se encuentran, en su totalidad, a una
distancia determinada r de una posición central.
Es posible reducir el
cálculo al considerar la simetría de las circunferencias, la forma de la
circunferencia es similar entre cuadrantes y simétrica entre octantes.
Para aplicar el método
del punto medio, definimos una función de circunferencia como:
pk = fcircunferencia(x,y)=
x2 + y2 − r2
fcircunferencia(x,y)<0 si (x,y) está dentro de la frontera de la
circunferencia.
fcircunferencia(x,y)=0 si (x,y) está en la frontera de la circunferencia.
fcircunferencia(x,y)>0 si (x,y) está fuera de la frontera de la circunferencia.
Los parámetros de
decisión sucesivos se obtienen al utilizar cálculos incrementales.
El algoritmo será el
siguiente:
*Se capturan el radio r y el centro de la
circunferencia (xc, yc).
*Se obtiene el primer punto de la circunferencia centrada
en origen (xc, yc) como (0, r).
*Se cacula el valor incial del parametro de decisión como
p0=5/4 - r.
Para k=0 hasta x>=y incrementa k
Si pk < 0
*Siguiente punto de la circunferencia con centro (0,0) es
(xk+1, yk).
*pk+1=pk+2xk+1+1.
Sino
*Siguiente punto de la circunferencia con centro (0,0) es
(xk+1, yk-1).
*pk+1=pk+2xk+1+1-2yk+1.
//Donde 2xk+1=2xk+2 y 2yk+1=2yk-2
*Se determinan los puntos de simetría para los otros
siete octantes.
*Se mueve cada posición del pixel calculada (x,y) a la
trayectoria circular centrada en (xc, yc)
y trazamos los valores de las coordenadas: x=x+xc
y y=y+yc
No hay comentarios:
Publicar un comentario