Sei sulla pagina 1di 8

2011

Algoritmo Bresenham

Antonio Acosta Instituto Tecnolgico de Culiacn 07/07/2011

Algoritmo Bresenham

7 de julio de 2011

Contenido
Algoritmo de bresenham para lneas ................................................................................................................. 2 Cdigo bresenham para lneas en C++ ....................................................................................................... 3 Algoritmo de bresenham para crculos ............................................................................................................... 4 Cdigo bresenham para crculos en C++ ..................................................................................................... 5 Ejemplo de la Lnea de Bresenham ..................................................................................................................... 6 Un ejemplo sencillo del algoritmo de la lnea de Bresenham ................................................................... 6 Ejemplo del Crculo de Bresenham ...................................................................................................................... 6 Esta es una implementacin del algoritmo de crculo. ................................................................................ 6 Bibliografa .............................................................................................................................................................. 7

Conocimientos puede tenerlos cualquiera, pero el arte de pensar es el regalo ms escaso de la naturaleza. Federico II

Algoritmo Bresenham

7 de julio de 2011

Algoritmo Bresenham
Algoritmo de bresenham para lneas
El algoritmo de Bresenham es un algoritmo que determina los puntos en un mapa de bits de n-dimensiones que deben ser trazados con el fin de formar una aproximacin a una lnea recta entre dos puntos dados. Es comnmente usado para dibujar lneas en una pantalla de ordenador, ya que utiliza slo adicin de enteros, la resta y desplazamiento de bits, que son operaciones muy barato en las arquitecturas de ordenador estndar. Resultados del algoritmo de Bresenham. Es uno de los primeros algoritmos desarrollados en el campo de grficos por ordenador. Una extensin menor a la del algoritmo original tambin se ocupa de dibujar crculos. Partimos de que las coordenadas de los pixels en una imagen son coordenadas enteras y que conocemos los extremos del segmento que forma la lnea siendo sus coordenadas (x0,y0) y (x1,y1). El algoritmo de Bresenham selecciona el entero 'y' correspondiente al pixel central que est ms cercano del que sera calculado con fracciones y lo mismo para la coordenada 'x'. En las sucesivas columnas la coordenada 'y' puede permanecer con el mismo valor o incrementarse en cada paso a una unidad. La ecuacin general de la lnea que pasa por los extremos conocidos es:

Puesto que conocemos la columna, 'x', la fila 'y' del pixel se calcula redondeando esta cantidad al entero ms cercano segn la siguiente frmula.

La pendiente (y1 - y0) / (x1 - x0) depende slo de las coordenadas de los extremos y puede ser previamente calculada, y el valor ideal de 'y' para los sucesivos valores enteros de 'x' se puede calcular a partir de y0 e ir aadiendo en varias ocasiones la pendiente.

Algoritmo Bresenham

7 de julio de 2011

Cdigo bresenham para lneas en C++


void brenenham(int x1, int y1, int x2, int y2) { int slope; int dx, dy, incE, incNE, d, x, y; // Reverse lines where x1 > x2 if (x1 > x2) { brenenham(x2, y2, x1, y1); return; } dx = x2 - x1; dy = y2 - y1; // Adjust y-increment for negatively sloped lines if (dy < 0) { slope = -1; dy = -dy; } else { slope = 1; } // Bresenham constants incE = 2 * dy; incNE = 2 * dy - 2 * dx; d = 2 * dy - dx; y = y1; // Blit for (x = x1; x <= x2; x++) { putpixel(x, y, 15); if (d <= 0) { d += incE; } else { d += incNE; y += slope; } } }

Algoritmo Bresenham

7 de julio de 2011

Algoritmo de bresenham para crculos


En graficacin, el algoritmo de midpoint circle es un algoritmo utilizado para determinar los puntos necesarios para dibujar un crculo. El algoritmo es una variante del algoritmo de la lnea Bresenham, por lo que es a veces conocido como algoritmo de crculo Bresenham, aunque en realidad no inventada por Bresenham. El algoritmo comienza en consecuencia con el crculo de la ecuacin x 2 + y 2 = r 2. As, el centro del crculo se encuentra en (0,0). Consideramos que slo la primera el octante primera y trazar una curva que comienza en el punto (r, 0) y hacia arriba los ingresos ya la izquierda, llegando al ngulo de 45 .
Circle by the Bresenham algorithm La direccin rpida aqu es la direccin vertical. El algoritmo hace siempre un paso en la direccin positiva (hacia arriba), y de vez en cuando tambin tiene que hacer un paso en la "lenta" la direccin, la direccin x negativa.

De la ecuacin de un crculo se obtiene la ecuacin transformada x 2 + y 2 - r 2 = 0, donde r 2 se calcula slo una sola vez durante la inicializacin:

Y por lo tanto para la coordenada x. Adems tenemos que aadir las coordenadas del punto medio al establecer un pxel. Estas adiciones frecuentes entero no limitan el rendimiento de mucho, ya que puede prescindir de los cuadrados (root) los clculos en el lazo interno, a su vez. Una vez ms el cero en la ecuacin del crculo transformado se sustituye por el trmino de error. La inicializacin del trmino de error se deriva de un desplazamiento de pixel y medio en la salida. Hasta la interseccin con la lnea perpendicular, esto conduce a un valor acumulado de r en el trmino de error, de modo que este valor se utiliza para la inicializacin. Una posible implementacin del algoritmo de Bresenham de un crculo completo en C. Aqu otra variable para el clculo recursivo de los trminos de segundo grado se utiliza, lo que corresponde con el trmino de2 n + 1. Slo tiene que incrementar en un 2 a partir de una etapa a la siguiente:

Algoritmo Bresenham

7 de julio de 2011

Cdigo bresenham para crculos en C++


void rasterCircle(int x0, int y0, int radius) { int f = 1 - radius; int ddF_x = 1; int ddF_y = -2 * radius; int x = 0; int y = radius; setPixel(x0, y0 + radius); setPixel(x0, y0 - radius); setPixel(x0 + radius, y0); setPixel(x0 - radius, y0); while(x < y) { // ddF_x == 2 * x + 1; // ddF_y == -2 * y; // f == x*x + y*y - radius*radius + 2*x - y + 1; if(f >= 0) { y--; ddF_y += 2; f += ddF_y; } x++; ddF_x += 2; f += ddF_x; setPixel(x0 + x, y0 + y); setPixel(x0 - x, y0 + y); setPixel(x0 + x, y0 - y); setPixel(x0 - x, y0 - y); setPixel(x0 + y, y0 + x); setPixel(x0 - y, y0 + x); setPixel(x0 + y, y0 - x); setPixel(x0 - y, y0 - x); } }

Algoritmo Bresenham

7 de julio de 2011

Ejemplo de la Lnea de Bresenham


Un ejemplo sencillo del algoritmo de la lnea de Bresenham
void plotLine(int x0, int y0, int x1, int y1) { int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1; int dy = -abs(y1-y0), sy = y0<y1 ? 1 : -1; int err = dx+dy, e2; /* error value e_xy */ for(;;){ /* loop */ setPixel(x0,y0); if (x0==x1 && y0==y1) break; e2 = 2*err; if (e2 >= dy) { err += dy; x0 += sx; } /* e_xy+e_x > 0 */ if (e2 <= dx) { err += dx; y0 += sy; } /* e_xy+e_y < 0 */ } }

Ejemplo del Crculo de Bresenham


Esta es una implementacin del algoritmo de crculo.
void plotCircle(int xm, int ym, int r) { int x = -r, y = 0, err = 2-2*r; /* II. Quadrant */ do { setPixel(xm-x, ym+y); /* I. Quadrant */ setPixel(xm-y, ym-x); /* II. Quadrant */ setPixel(xm+x, ym-y); /* III. Quadrant */ setPixel(xm+y, ym+x); /* IV. Quadrant */ r = err; if (r > x) err += ++x*2+1; /* e_xy+e_x > 0 */ if (r <= y) err += ++y*2+1; /* e_xy+e_y < 0 */ } while (x < 0); }

Algoritmo Bresenham

7 de julio de 2011

Bibliografa
1. JACK E. BRESENHAM, "ALGORITHM FOR COMPUTER CONTROL OF A DIGITAL PLOTTER", IBM SYSTEMS JOURNAL, VOL. 4, NO.1, JANUARY 1965, PP. 2530 2. "THE BRESENHAM LINE-DRAWING ALGORITHM", BY COLIN FLANAGAN 3. MICHAEL ABRASH'S GRAPHICS PROGRAMMING BLACK BOOK A VERY OPTIMIZED VERSION OF THE ALGORITHM IN C AND ASSEMBLY FOR USE IN VIDEO GAMES WITH COMPLETE DETAILS OF ITS INNER WORKINGS, WRITTEN BY MICHAEL ABRASH, PAGES 654-678 - ISBN 978-1-57610-174-2 4. HTTP://WWW.CS.TORONTO.EDU/~SMALIK/418/TUTORIAL2_BRESENHAM.PDF 5. HTTP://DIGITUM.UM.ES/XMLUI/BITSTREAM/10201/22175/1/MYPFC.PDF 6. HTTP://FREE.PAGES.AT/EASYFILTER/BRESENHAM.HTML

Potrebbero piacerti anche