SlideShare una empresa de Scribd logo
1 de 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

Más contenido relacionado

La actualidad más candente

maquinas de turing
maquinas de turingmaquinas de turing
maquinas de turingAnel Sosa
 
Arquitectura de computadoras II-Codigo de Operaciones y Campo de Direccionami...
Arquitectura de computadoras II-Codigo de Operaciones y Campo de Direccionami...Arquitectura de computadoras II-Codigo de Operaciones y Campo de Direccionami...
Arquitectura de computadoras II-Codigo de Operaciones y Campo de Direccionami...Mari Cruz
 
maquinas de turing jflap
maquinas de turing jflapmaquinas de turing jflap
maquinas de turing jflapAnel Sosa
 
Métodos para la detección y corrección de errores
Métodos para la detección y corrección de erroresMétodos para la detección y corrección de errores
Métodos para la detección y corrección de erroresDaniel Huerta Cruz
 
Principios electricos y aplicaciones digitalesl sesion 1
Principios electricos y aplicaciones digitalesl sesion 1Principios electricos y aplicaciones digitalesl sesion 1
Principios electricos y aplicaciones digitalesl sesion 1Rodolfo Alcantara Rosales
 
Perceptrón simple y multicapa
Perceptrón simple y multicapaPerceptrón simple y multicapa
Perceptrón simple y multicapaJefferson Guillen
 
El algoritmo a (asterisco)
El algoritmo a (asterisco)El algoritmo a (asterisco)
El algoritmo a (asterisco)Cristina Lopez
 
Fundamentos de Telecomunicaciones - Unidad 5 Multiplexación
Fundamentos de Telecomunicaciones - Unidad 5 MultiplexaciónFundamentos de Telecomunicaciones - Unidad 5 Multiplexación
Fundamentos de Telecomunicaciones - Unidad 5 MultiplexaciónJosé Antonio Sandoval Acosta
 
Alfabetos-Lenguajes y Automatas 1
Alfabetos-Lenguajes y Automatas 1Alfabetos-Lenguajes y Automatas 1
Alfabetos-Lenguajes y Automatas 1Osiris Mirerus
 
Fundamentos de Telecomunicaciones Unidad 2 medios de transmisión y caracterís...
Fundamentos de Telecomunicaciones Unidad 2 medios de transmisión y caracterís...Fundamentos de Telecomunicaciones Unidad 2 medios de transmisión y caracterís...
Fundamentos de Telecomunicaciones Unidad 2 medios de transmisión y caracterís...José Antonio Sandoval Acosta
 
Investigación Técnicas de detección de errores de transmisión
Investigación Técnicas de detección de errores de transmisiónInvestigación Técnicas de detección de errores de transmisión
Investigación Técnicas de detección de errores de transmisiónJosé Alexis Cruz Solar
 
Gramática Libre de Contexto
Gramática Libre de ContextoGramática Libre de Contexto
Gramática Libre de ContextoBrayhan Acosta
 
Analizador Sintáctico
Analizador SintácticoAnalizador Sintáctico
Analizador SintácticoPablo Guerra
 
3. Modelos OSI y TCP/IP (Características, Funciones, Diferencias)
3.	Modelos OSI y TCP/IP (Características, Funciones, Diferencias)3.	Modelos OSI y TCP/IP (Características, Funciones, Diferencias)
3. Modelos OSI y TCP/IP (Características, Funciones, Diferencias)wilber147
 
automatas finitos
 automatas finitos automatas finitos
automatas finitosAnel Sosa
 

La actualidad más candente (20)

Taller de Base de Datos - Unidad 7 Conectividad
Taller de Base de Datos - Unidad 7 ConectividadTaller de Base de Datos - Unidad 7 Conectividad
Taller de Base de Datos - Unidad 7 Conectividad
 
Tutorial de JFLAP
Tutorial de JFLAPTutorial de JFLAP
Tutorial de JFLAP
 
maquinas de turing
maquinas de turingmaquinas de turing
maquinas de turing
 
Codigo Hamming
Codigo HammingCodigo Hamming
Codigo Hamming
 
Arquitectura de computadoras II-Codigo de Operaciones y Campo de Direccionami...
Arquitectura de computadoras II-Codigo de Operaciones y Campo de Direccionami...Arquitectura de computadoras II-Codigo de Operaciones y Campo de Direccionami...
Arquitectura de computadoras II-Codigo de Operaciones y Campo de Direccionami...
 
maquinas de turing jflap
maquinas de turing jflapmaquinas de turing jflap
maquinas de turing jflap
 
Unidad 2 expresiones regulares
Unidad 2 expresiones regularesUnidad 2 expresiones regulares
Unidad 2 expresiones regulares
 
Métodos para la detección y corrección de errores
Métodos para la detección y corrección de erroresMétodos para la detección y corrección de errores
Métodos para la detección y corrección de errores
 
Principios electricos y aplicaciones digitalesl sesion 1
Principios electricos y aplicaciones digitalesl sesion 1Principios electricos y aplicaciones digitalesl sesion 1
Principios electricos y aplicaciones digitalesl sesion 1
 
Perceptrón simple y multicapa
Perceptrón simple y multicapaPerceptrón simple y multicapa
Perceptrón simple y multicapa
 
El algoritmo a (asterisco)
El algoritmo a (asterisco)El algoritmo a (asterisco)
El algoritmo a (asterisco)
 
Fundamentos de Telecomunicaciones - Unidad 5 Multiplexación
Fundamentos de Telecomunicaciones - Unidad 5 MultiplexaciónFundamentos de Telecomunicaciones - Unidad 5 Multiplexación
Fundamentos de Telecomunicaciones - Unidad 5 Multiplexación
 
Alfabetos-Lenguajes y Automatas 1
Alfabetos-Lenguajes y Automatas 1Alfabetos-Lenguajes y Automatas 1
Alfabetos-Lenguajes y Automatas 1
 
Fundamentos de Telecomunicaciones Unidad 2 medios de transmisión y caracterís...
Fundamentos de Telecomunicaciones Unidad 2 medios de transmisión y caracterís...Fundamentos de Telecomunicaciones Unidad 2 medios de transmisión y caracterís...
Fundamentos de Telecomunicaciones Unidad 2 medios de transmisión y caracterís...
 
Investigación Técnicas de detección de errores de transmisión
Investigación Técnicas de detección de errores de transmisiónInvestigación Técnicas de detección de errores de transmisión
Investigación Técnicas de detección de errores de transmisión
 
Analizador léxico
Analizador léxicoAnalizador léxico
Analizador léxico
 
Gramática Libre de Contexto
Gramática Libre de ContextoGramática Libre de Contexto
Gramática Libre de Contexto
 
Analizador Sintáctico
Analizador SintácticoAnalizador Sintáctico
Analizador Sintáctico
 
3. Modelos OSI y TCP/IP (Características, Funciones, Diferencias)
3.	Modelos OSI y TCP/IP (Características, Funciones, Diferencias)3.	Modelos OSI y TCP/IP (Características, Funciones, Diferencias)
3. Modelos OSI y TCP/IP (Características, Funciones, Diferencias)
 
automatas finitos
 automatas finitos automatas finitos
automatas finitos
 

Similar a 59563233 algoritmo-bresenham

Algoritmos de Raster karen quiroga
Algoritmos de Raster   karen quirogaAlgoritmos de Raster   karen quiroga
Algoritmos de Raster karen quirogaKaren 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.pptxPaulaInes2
 
Guia 3 2_s_2015
Guia 3 2_s_2015Guia 3 2_s_2015
Guia 3 2_s_2015momosoad
 
Trazado de lineas rectas
Trazado de lineas rectasTrazado de lineas rectas
Trazado de lineas rectasSam 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 dUDEC
 
Referencias MATLAB
Referencias MATLABReferencias MATLAB
Referencias MATLABOmar Sanchez
 
Método de jacobi
Método de jacobiMétodo de jacobi
Método de jacobiTensor
 
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...Triplenlace Química
 
Actividad slideshare
Actividad slideshareActividad slideshare
Actividad slideshareLuis Verde
 
Producto escalar
Producto escalarProducto escalar
Producto escalarHenry Cueva
 
Metodo Gauss Seidel
Metodo Gauss SeidelMetodo Gauss Seidel
Metodo Gauss SeidelDiana Rocio
 
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
 
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.pdfKarwlynaKwayntiru
 
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 PLANOSJose Gonzalez Garcia
 
C) trazado de lineas rectas
C) trazado de lineas rectasC) trazado de lineas rectas
C) trazado de lineas rectasyesuam
 

Similar a 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
 

Más de 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