SlideShare ist ein Scribd-Unternehmen logo
1 von 8
2011
Algoritmo Bresenham
Antonio Acosta
Instituto Tecnológico de Culiacán
07/07/2011
Algoritmo Bresenham 7 de julio de 2011
1
Contenido
Algoritmo de bresenham para líneas.................................................................................................................. 2
Código bresenham para líneas en C++........................................................................................................ 3
Algoritmo de bresenham para círculos ............................................................................................................... 4
Código bresenham para círculos en C++ ..................................................................................................... 5
Ejemplo de la Línea de Bresenham...................................................................................................................... 6
Un ejemplo sencillo del algoritmo de la línea de Bresenham.................................................................... 6
Ejemplo del Círculo de Bresenham....................................................................................................................... 6
Esta es una implementación del algoritmo de círculo. ................................................................................. 6
Bibliografía............................................................................................................................................................... 7
Conocimientos puede tenerlos cualquiera, pero el arte de pensar es el regalo más escaso de la
naturaleza. Federico II
Algoritmo Bresenham 7 de julio de 2011
2
Algoritmo Bresenham
Algoritmo de bresenham para líneas
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 aproximación a una línea
recta entre dos puntos dados. Es
comúnmente usado para dibujar líneas
en una pantalla de ordenador, ya que
utiliza sólo adición de enteros, la resta
y desplazamiento de bits, que son
operaciones muy barato en las
arquitecturas de ordenador estándar.
Es uno de los primeros algoritmos
Resultados del algoritmo de Bresenham.
desarrollados en el campo de gráficos por ordenador. Una extensión menor a la del algoritmo
original también se ocupa de dibujar círculos.
Partimos de que las coordenadas de los pixels en una imagen son coordenadas enteras y que
conocemos los extremos del segmento que forma la línea siendo sus coordenadas (x0,y0) y (x1,y1).
El algoritmo de Bresenham selecciona el entero 'y' correspondiente al pixel central que está más
cercano del que sería 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 ecuación general de la línea 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 más cercano según la siguiente fórmula.
( )
La pendiente (y1 - y0) / (x1 - x0) depende sólo 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 añadiendo en varias ocasiones la pendiente.
Algoritmo Bresenham 7 de julio de 2011
3
Código bresenham para líneas 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
4
Algoritmo de bresenham para círculos
En graficación, el algoritmo de “midpoint circle” es
un algoritmo utilizado para determinar los puntos
necesarios para dibujar un círculo. El algoritmo es una
variante del algoritmo de la línea Bresenham, por lo
que es a veces conocido como algoritmo de círculo
Bresenham, aunque en realidad no inventada por
Bresenham.
El algoritmo comienza en consecuencia con el círculo
de la ecuación x 2 + y 2 = r 2. Así, el centro del círculo
se encuentra en (0,0). Consideramos que sólo 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 °.
La dirección “rápida” aquí es la dirección vertical. El
algoritmo hace siempre un paso en la dirección positiva
Circle by the Bresenham algorithm
(hacia arriba), y de vez en cuando también tiene que hacer un paso en la "lenta" la dirección, la
dirección x negativa.
De la ecuación de un círculo se obtiene la ecuación transformada x 2 + y 2 - r 2 = 0, donde r 2 se
calcula sólo una sola vez durante la inicialización:
( )
Y por lo tanto para la coordenada x. Además tenemos que añadir las coordenadas del punto
medio al establecer un píxel. Estas adiciones frecuentes entero no limitan el rendimiento de mucho,
ya que puede prescindir de los cuadrados (root) los cálculos en el lazo interno, a su vez. Una vez
más el cero en la ecuación del círculo transformado se sustituye por el término de error.
La inicialización del término de error se deriva de un desplazamiento de pixel y medio en la salida.
Hasta la intersección con la línea perpendicular, esto conduce a un valor acumulado de r en el
término de error, de modo que este valor se utiliza para la inicialización.
Una posible implementación del algoritmo de Bresenham de un círculo completo en C. Aquí otra
variable para el cálculo recursivo de los términos de segundo grado se utiliza, lo que corresponde
con el término de2 n + 1. Sólo tiene que incrementar en un 2 a partir de una etapa a la siguiente:
Algoritmo Bresenham 7 de julio de 2011
5
Código bresenham para círculos 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
6
Ejemplo de la Línea de Bresenham
Un ejemplo sencillo del algoritmo de la línea 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 Círculo de Bresenham
Esta es una implementación del algoritmo de círculo.
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
7
Bibliografía
1. JACK E. BRESENHAM, "ALGORITHM FOR COMPUTER CONTROL OF A DIGITAL PLOTTER", IBM SYSTEMS
JOURNAL, VOL. 4, NO.1, JANUARY 1965, PP. 25–30
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

Weitere ähnliche Inhalte

Was ist angesagt?

Taller de redes i
Taller de redes iTaller de redes i
Taller de redes i
carlos
 
Organización y estructura interna del cpu
Organización y estructura interna del cpuOrganización y estructura interna del cpu
Organización y estructura interna del cpu
Isaí Beto Matz Mijes
 
Diccionario de datos
Diccionario de datosDiccionario de datos
Diccionario de datos
Jorge Garcia
 
2.4 herramientas case
2.4 herramientas case2.4 herramientas case
2.4 herramientas case
Ivan Rm
 
particiones de un disco duro
particiones de un disco duroparticiones de un disco duro
particiones de un disco duro
tecnologia01
 
Redes Avanzadas; Protocolos de enrutamientos
Redes  Avanzadas; Protocolos de enrutamientos Redes  Avanzadas; Protocolos de enrutamientos
Redes Avanzadas; Protocolos de enrutamientos
Victor Ramirez Pulido
 

Was ist angesagt? (20)

Arboles Binarios
Arboles BinariosArboles Binarios
Arboles Binarios
 
Colas en programacion
Colas en programacionColas en programacion
Colas en programacion
 
Taller de redes i
Taller de redes iTaller de redes i
Taller de redes i
 
Construir una red de área local
Construir  una red  de área localConstruir  una red  de área local
Construir una red de área local
 
Organización y estructura interna del cpu
Organización y estructura interna del cpuOrganización y estructura interna del cpu
Organización y estructura interna del cpu
 
Metodologias de diseño de bd
Metodologias de diseño de bdMetodologias de diseño de bd
Metodologias de diseño de bd
 
Tutorial de JFLAP
Tutorial de JFLAPTutorial de JFLAP
Tutorial de JFLAP
 
Instalacion de un (SGBD)sistema gestor de base de datos.
Instalacion de un (SGBD)sistema gestor de base de datos.Instalacion de un (SGBD)sistema gestor de base de datos.
Instalacion de un (SGBD)sistema gestor de base de datos.
 
Portafolio unidad 2 [Lenguajes y autómatas]- Expresiones y lenguajes regulares
Portafolio unidad 2 [Lenguajes y autómatas]- Expresiones y lenguajes regularesPortafolio unidad 2 [Lenguajes y autómatas]- Expresiones y lenguajes regulares
Portafolio unidad 2 [Lenguajes y autómatas]- Expresiones y lenguajes regulares
 
Diccionario de datos
Diccionario de datosDiccionario de datos
Diccionario de datos
 
Taller de Base de datos - Unidad 1 SGBD introduccion
Taller de Base de datos - Unidad 1 SGBD introduccionTaller de Base de datos - Unidad 1 SGBD introduccion
Taller de Base de datos - Unidad 1 SGBD introduccion
 
2.4 herramientas case
2.4 herramientas case2.4 herramientas case
2.4 herramientas case
 
Noción de archivo real y virtual
Noción de archivo real y virtual Noción de archivo real y virtual
Noción de archivo real y virtual
 
particiones de un disco duro
particiones de un disco duroparticiones de un disco duro
particiones de un disco duro
 
Reporte metodos de busqueda y ordenamiento
Reporte metodos de busqueda y ordenamientoReporte metodos de busqueda y ordenamiento
Reporte metodos de busqueda y ordenamiento
 
maquinas de turing jflap
maquinas de turing jflapmaquinas de turing jflap
maquinas de turing jflap
 
Organismos de estandarización de redes
Organismos de estandarización de redesOrganismos de estandarización de redes
Organismos de estandarización de redes
 
Procesadores Vectoriales
Procesadores VectorialesProcesadores Vectoriales
Procesadores Vectoriales
 
Redes Avanzadas; Protocolos de enrutamientos
Redes  Avanzadas; Protocolos de enrutamientos Redes  Avanzadas; Protocolos de enrutamientos
Redes Avanzadas; Protocolos de enrutamientos
 
Ejercicios
EjerciciosEjercicios
Ejercicios
 

Ähnlich wie 59563233 algoritmo-bresenham

Trazado de lineas rectas
Trazado de lineas rectasTrazado de lineas rectas
Trazado de lineas rectas
Sam Rdgz
 
Algoritmos basicos de dibujo en 2 d
Algoritmos basicos de dibujo en 2 dAlgoritmos basicos de dibujo en 2 d
Algoritmos basicos de dibujo en 2 d
UDEC
 
Varios problemas de cálculo numérico (teoría del MEF-FEM)
Varios problemas de cálculo numérico (teoría del MEF-FEM)Varios problemas de cálculo numérico (teoría del MEF-FEM)
Varios problemas de cálculo numérico (teoría del MEF-FEM)
José Manuel Gómez Vega
 
PUNTO DE UNA RECTA QUE EQUIDISTA DE DOS PLANOS
PUNTO DE UNA RECTA QUE EQUIDISTA DE DOS PLANOSPUNTO DE UNA RECTA QUE EQUIDISTA DE DOS PLANOS
PUNTO DE UNA RECTA QUE EQUIDISTA DE DOS PLANOS
Jose Gonzalez Garcia
 

Ähnlich wie 59563233 algoritmo-bresenham (20)

Algoritmos de Raster karen quiroga
Algoritmos de Raster   karen quirogaAlgoritmos de Raster   karen quiroga
Algoritmos de Raster karen quiroga
 
UNIDAD 7 y 8 Intergración numérica y Ec Dif.pptx
UNIDAD 7 y 8  Intergración numérica y Ec Dif.pptxUNIDAD 7 y 8  Intergración numérica y Ec Dif.pptx
UNIDAD 7 y 8 Intergración numérica y Ec Dif.pptx
 
Guia 3 2_s_2015
Guia 3 2_s_2015Guia 3 2_s_2015
Guia 3 2_s_2015
 
Trazado de lineas rectas
Trazado de lineas rectasTrazado de lineas rectas
Trazado de lineas rectas
 
Algoritmos basicos de dibujo en 2 d
Algoritmos basicos de dibujo en 2 dAlgoritmos basicos de dibujo en 2 d
Algoritmos basicos de dibujo en 2 d
 
Referencias MATLAB
Referencias MATLABReferencias MATLAB
Referencias MATLAB
 
Método de jacobi
Método de jacobiMétodo de jacobi
Método de jacobi
 
Tecnicas instrumentales ejercicios numericos - 1.1 - Determinación polarogr...
Tecnicas instrumentales   ejercicios numericos - 1.1 - Determinación polarogr...Tecnicas instrumentales   ejercicios numericos - 1.1 - Determinación polarogr...
Tecnicas instrumentales ejercicios numericos - 1.1 - Determinación polarogr...
 
Blog
BlogBlog
Blog
 
Blog
BlogBlog
Blog
 
Matemáticas
MatemáticasMatemáticas
Matemáticas
 
Algoritmos Raster jairo andres rincon
Algoritmos Raster jairo andres rinconAlgoritmos Raster jairo andres rincon
Algoritmos Raster jairo andres rincon
 
Actividad slideshare
Actividad slideshareActividad slideshare
Actividad slideshare
 
Producto escalar
Producto escalarProducto escalar
Producto escalar
 
Metodo Gauss Seidel
Metodo Gauss SeidelMetodo Gauss Seidel
Metodo Gauss Seidel
 
Varios problemas de cálculo numérico (teoría del MEF-FEM)
Varios problemas de cálculo numérico (teoría del MEF-FEM)Varios problemas de cálculo numérico (teoría del MEF-FEM)
Varios problemas de cálculo numérico (teoría del MEF-FEM)
 
102906052-Metodo-de-Gauss-Seidel-exposicion.pdf
102906052-Metodo-de-Gauss-Seidel-exposicion.pdf102906052-Metodo-de-Gauss-Seidel-exposicion.pdf
102906052-Metodo-de-Gauss-Seidel-exposicion.pdf
 
PUNTO DE UNA RECTA QUE EQUIDISTA DE DOS PLANOS
PUNTO DE UNA RECTA QUE EQUIDISTA DE DOS PLANOSPUNTO DE UNA RECTA QUE EQUIDISTA DE DOS PLANOS
PUNTO DE UNA RECTA QUE EQUIDISTA DE DOS PLANOS
 
C) trazado de lineas rectas
C) trazado de lineas rectasC) trazado de lineas rectas
C) trazado de lineas rectas
 
Calculo II
Calculo II Calculo II
Calculo II
 

Mehr von Simar Leaño Prieto (9)

Despido por causas legales
Despido por causas legalesDespido por causas legales
Despido por causas legales
 
Produccion y utilizacion de insumos
Produccion y utilizacion de insumosProduccion y utilizacion de insumos
Produccion y utilizacion de insumos
 
168315310 plan-de-negocios-minimarket
168315310 plan-de-negocios-minimarket168315310 plan-de-negocios-minimarket
168315310 plan-de-negocios-minimarket
 
Simulacioncsharp
SimulacioncsharpSimulacioncsharp
Simulacioncsharp
 
Apunte clase
Apunte claseApunte clase
Apunte clase
 
Proceso de-desarrollo-software
Proceso de-desarrollo-softwareProceso de-desarrollo-software
Proceso de-desarrollo-software
 
Cocomo2 apuntes
Cocomo2 apuntesCocomo2 apuntes
Cocomo2 apuntes
 
Tesis con rup
Tesis con rupTesis con rup
Tesis con rup
 
Ejercicios prolog
Ejercicios prologEjercicios prolog
Ejercicios prolog
 

59563233 algoritmo-bresenham

  • 1. 2011 Algoritmo Bresenham Antonio Acosta Instituto Tecnológico de Culiacán 07/07/2011
  • 2. Algoritmo Bresenham 7 de julio de 2011 1 Contenido Algoritmo de bresenham para líneas.................................................................................................................. 2 Código bresenham para líneas en C++........................................................................................................ 3 Algoritmo de bresenham para círculos ............................................................................................................... 4 Código bresenham para círculos en C++ ..................................................................................................... 5 Ejemplo de la Línea de Bresenham...................................................................................................................... 6 Un ejemplo sencillo del algoritmo de la línea de Bresenham.................................................................... 6 Ejemplo del Círculo de Bresenham....................................................................................................................... 6 Esta es una implementación del algoritmo de círculo. ................................................................................. 6 Bibliografía............................................................................................................................................................... 7 Conocimientos puede tenerlos cualquiera, pero el arte de pensar es el regalo más escaso de la naturaleza. Federico II
  • 3. Algoritmo Bresenham 7 de julio de 2011 2 Algoritmo Bresenham Algoritmo de bresenham para líneas 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 aproximación a una línea recta entre dos puntos dados. Es comúnmente usado para dibujar líneas en una pantalla de ordenador, ya que utiliza sólo adición de enteros, la resta y desplazamiento de bits, que son operaciones muy barato en las arquitecturas de ordenador estándar. Es uno de los primeros algoritmos Resultados del algoritmo de Bresenham. desarrollados en el campo de gráficos por ordenador. Una extensión menor a la del algoritmo original también se ocupa de dibujar círculos. Partimos de que las coordenadas de los pixels en una imagen son coordenadas enteras y que conocemos los extremos del segmento que forma la línea siendo sus coordenadas (x0,y0) y (x1,y1). El algoritmo de Bresenham selecciona el entero 'y' correspondiente al pixel central que está más cercano del que sería 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 ecuación general de la línea 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 más cercano según la siguiente fórmula. ( ) La pendiente (y1 - y0) / (x1 - x0) depende sólo 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 añadiendo en varias ocasiones la pendiente.
  • 4. Algoritmo Bresenham 7 de julio de 2011 3 Código bresenham para líneas 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; } } }
  • 5. Algoritmo Bresenham 7 de julio de 2011 4 Algoritmo de bresenham para círculos En graficación, el algoritmo de “midpoint circle” es un algoritmo utilizado para determinar los puntos necesarios para dibujar un círculo. El algoritmo es una variante del algoritmo de la línea Bresenham, por lo que es a veces conocido como algoritmo de círculo Bresenham, aunque en realidad no inventada por Bresenham. El algoritmo comienza en consecuencia con el círculo de la ecuación x 2 + y 2 = r 2. Así, el centro del círculo se encuentra en (0,0). Consideramos que sólo 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 °. La dirección “rápida” aquí es la dirección vertical. El algoritmo hace siempre un paso en la dirección positiva Circle by the Bresenham algorithm (hacia arriba), y de vez en cuando también tiene que hacer un paso en la "lenta" la dirección, la dirección x negativa. De la ecuación de un círculo se obtiene la ecuación transformada x 2 + y 2 - r 2 = 0, donde r 2 se calcula sólo una sola vez durante la inicialización: ( ) Y por lo tanto para la coordenada x. Además tenemos que añadir las coordenadas del punto medio al establecer un píxel. Estas adiciones frecuentes entero no limitan el rendimiento de mucho, ya que puede prescindir de los cuadrados (root) los cálculos en el lazo interno, a su vez. Una vez más el cero en la ecuación del círculo transformado se sustituye por el término de error. La inicialización del término de error se deriva de un desplazamiento de pixel y medio en la salida. Hasta la intersección con la línea perpendicular, esto conduce a un valor acumulado de r en el término de error, de modo que este valor se utiliza para la inicialización. Una posible implementación del algoritmo de Bresenham de un círculo completo en C. Aquí otra variable para el cálculo recursivo de los términos de segundo grado se utiliza, lo que corresponde con el término de2 n + 1. Sólo tiene que incrementar en un 2 a partir de una etapa a la siguiente:
  • 6. Algoritmo Bresenham 7 de julio de 2011 5 Código bresenham para círculos 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); } }
  • 7. Algoritmo Bresenham 7 de julio de 2011 6 Ejemplo de la Línea de Bresenham Un ejemplo sencillo del algoritmo de la línea 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 Círculo de Bresenham Esta es una implementación del algoritmo de círculo. 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); }
  • 8. Algoritmo Bresenham 7 de julio de 2011 7 Bibliografía 1. JACK E. BRESENHAM, "ALGORITHM FOR COMPUTER CONTROL OF A DIGITAL PLOTTER", IBM SYSTEMS JOURNAL, VOL. 4, NO.1, JANUARY 1965, PP. 25–30 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