Computación Gráfica

Primitivos Gráficos - Rectas
Basadas en: www.cs.unc.edu/~mcmillan/comp136/Lecture 6

¿Qué son las primitivas gráficas?
‡ Son algoritmos elementales, através de los cuales pueden ser trazados objetos en el monitor. ‡ Desarrollados a partir de la función punto
± set pixel (x,y)

Imágenes Bi-dimensionales
‡ Las imágenes son formas bidimensionales. ‡ Etiquetamos los dos ejes como
± X (horizontal) ± Y (vertical)
0

Eje Y

(0,Y)

Eje X

+X

Separación del espacio en pixels
1. Defina un conjunto de puntos (vértices) en el espacio 2D. 2. Dado un conjunto de vértices, dibujar líneas entre vértices consecutivos. (6,2) (13,2)

(6,8)

(13,8)

Vértice - un punto en el espacio dimensional 2D o 3D.

Del punto de un pixel? ¿Un cuadrado o es un punto. Q: ¿Dónde está (2.1)? Q: ¿Qué es vista geométrico. un pixel un punto? ¿Qué es un ³pixel´? 3 2 1 0 1 2 3 4 5 .

Pero cuando pensamos en imágenes. un pixel es un cuadrado. Q: ¿Dónde está (2. Al medio de un pixel 2 1 0 0 1 2 3 4 .1)? R.

1? ¿Cuál puede ser una buena heurística? (4.0) 0 0 1 2 3 4 .Dibuje una línea de 0.2) 2 1 (0.2 ¿Cómo escoger entre los puntos 1.0 y 1.0 para 4.

0) 0 0 1 2 3 (4.0) 4 .Vamos a dibujar un triangulo (4.2) 2 1 (0.

convertir Rapidez información de vértices/lados em datos pixel para display. (³on´) Conversión por barredura .2) de la línea son Discretización ± conversión de una señal encendidos contínua en elementos discretos.La línea ideal ‡ ‡ ‡ (17. .8) ‡ ¿Qué se desea? Apariencia continua Espesura y brillo uniformes Pixels próximos (2.

Algoritmos para dibujo de líneas ‡ Ecuación de la recta ‡ DDA (Digital Differential Analyser) ‡ Bresenham/Punto medio .

Ecuación de la recta Y=m.X+b (X2.Y2) (X1.Y1) .

m .X+b ‡ m = (Y2 .Ecuación de la recta ‡ Y=m. X1 .Y1)/(X2-X1) => m = (Y/(X ‡ b = y1 .

5 6 5.41666667 b = 1.833333 4 4.916667 6 6.666667 5 5.333333333 x 5 6 7 8 9 10 11 12 13 14 15 y round(y) 3.333333 6 6.166667 7 7.3) (X2.75 7 7.Y2) = (16.25 4 4.083333 5 5.Y1) = (4.Ejemplo (X1.583333 8 .8) m = 0.416667 3 3.

.

.

¿Qué sucede cuando m>1? .

¿Qué sucede cuando m>1? .

Solución ‡ Invertir el plano de modo que (Y = 1 ‡ Cálculo rápido para m ± Si (X>(Y -> plano normal. caso contrario invertir el plano X = (Y-b)/m .

Optimizando la ecuación de la recta ‡ ¿Cuál es la dificultad del algoritmo de ecuación de la recta? ‡ ¿Es posible encontrar um algoritmo para la ecuación de la recta que no implique operaciones de multiplicación? .

e .Optimizaciones ‡ En general: ± Sumas y restas son más rápidas que la multiplicación. preferiblemente 0. el cual es más rápido que la división ± Cálculos de enteros son más rápidos que los de punto flotante. > . u .= . . ± Teste para casos especiales ± Los casos de teste de variable son: < . { ± Es mucho más rápido cuando el teste es hecho contra una constante.

y y aplicarla em cada componente individualmente.DDA (Digital Differential Analyser) ‡ Con DDA la recta es calculada utilizando apenas sumas. ‡ El algoritmo parte del principio de encontrar la constante incremental de x. .

..083333 5 5.666667 5 5.833333 4 4.416667 3 3.333333 6 6.41666.166667 7 7.25 4 4.75 7 7.916667 6 6.Ejemplo Incrementa x = 1 Incrementa y = 0. x 5 6 7 8 9 10 11 12 13 14 15 y round(y) 3.5 6 5.583333 8 .

DrawLine (Point point1. Point point2) { } . y.Método de intercepción de la inclinación ‡ Del algebra tenemos: y = mx + b ± m = inclinación b = y intercepción un poco de código class Point { public: int x. unsigned byte framebuffer[IMAGE_WIDTH*IMAGE_HEIGHT*3]. }.

int g. buffer[(y * IMAGE_WIDTH+x) * 3 + 2]=b. int r.r. Point point2){ m=(point2.x to point2.g. for i=point1. pixel1. round(m*i+b)).x).b.x SetPixel(i .Método de intercepción de la inclinación ‡ Del algebra: y = mx + b ± m = inclinación b = y intercepción DrawLine (Point point1. pixel1.y-point1.x-point2. pixel1. int y. b=point1.} SetPixel(int x. buffer[(y * IMAGE_WIDTH+x) * 3 + 1]=g.y) / (point2.} . int b){ buffer[(y * IMAGE_WIDTH+x) * 3 + 0]=r.x) * m.y + (-point1.

0.0.0) (18.8) C:(255.0) Punto2 V:(17.2) (0.Ejemplo: (0.0) (17.9) Ejemplo 1: Punto1 V:(2.0) .8) (2.2) C:(255.

9) (17.8) (2.Qué significa ello para el framebuffer? (0.2) (0.0) (18.0) .

255.Ejemplo: (0.0) (18.0) .0) Punto2 V:(12.255.9) (7.0) (0.9 ) C:( 0.0) Cuáles son los problemas con este método? Inclinación>1 (12.9) Ejemplo 2: Punto1 V:(7.0) C:(0.

round(i*m+b)).x to point2.Intercepción de inclinación revisado DrawLine (Point point1.y-point1. Point point2){ m=(point2.y SetPixel(round((i-b)/m). b=point1.y) / (point2.y + (-point1.} } else { for i=point1. if (m<1) { for i=point1.x).} } Cuál utilizariamos si m=1? Cuál es el costo por pixel? .x) * m.x-point2. i).y to point2.x SetPixel(i .

x SetPixel(i . un entero adicional.x).y-point1.Optimización (Algoritmo DDA) ‡ Desde que y se incremente por una misma cantidad.x) * m + 0. también se puede redondear: DrawLine (Point point1. (int)j+=m)).x to point2.5. un cast.} ‡ Nuevo costo: un punto flotante adicional. for i=point1. . Point point2){ m=(point2.x-point2.y + (-point1.y) / (point2. j=point1.

utilizar apenas operaciones com enteros ‡ Puede ser adaptado para otras curvas. como por ejemplo. círculos y elipses ‡ La idea básica del algoritmo es el punto medio .Algoritmo de Bresenham ‡ Propuesta .

Punto medio .

Punto medio .

y0 el objetivo del algoritmo es determinar el valor si el próximo y será yk o yk+1 .Punto medio Dado el punto inicial x0.

y = yk + 1 .Punto Medio y = m(xk + 1) + b d1 = y .yk = m(xk + 1) + b .m(xk + 1) .yk d2 = (yk + 1) .b d2 d1 d2 > d1 ????? .

(y. yk) ‡ ‡ pk+1 = pk + 2(y pk+1 = pk + 2(y .punto inicial = x0.Algoritmo de Bresenham p/ m<1 ‡ 1 .Calcule (x. Calcule el parámetro de decisión inicial p0 ± p0 = 2(y .(x ‡ 4 .dibuje x0.2(x.Repita paso 4 (x veces .y0 ‡ 2 . para k iniciando em 0 haga verifique si pk < 0.Para cada xk. ± Afirmativo: dibuja (xk + 1.2(x ± Negativo: dibuja (xk + 1.y0 ‡ 3 . 2(y e 2(y . yk + 1) ‡ 5 .

18) .10) y punto final (30.Ejemplo para Bresenham Calcule una línea para: punto inicial (20.

(y=8 2(y = 16. 2(y-2(x = -4 p0 = 2(y-(x = 6 .18) (x = 10.10) y punto final (30.Ejemplo para Bresenham Calcule una línea para: punto inicial (20.

(y=8 2(y = 16.12) 14 (24. 2(y-2(x = -4 p0 = 2(y-(x = 6 k 0 1 2 3 4 pk (xk+1.18) .16) 14 (29.Ejemplo para Bresenham Calcule una línea para: punto inicial (20. yk+1) 6 (21.15) 2 (27.17) 10 (30.16) -2 (28.14) k 5 6 7 8 9 pk (xk+1.18) (x = 10.10) y punto final (30.13) 10 (25.12) -2 (23. yk+1) 6 (26.11) 2 (22.

F ( x. y ) ! ax  by  c ! 0 dy ! y2  y1 dx ! x2  x1 dy y! xB dx ( x. c ! B.dx ! 0 a ! dy. y ) ! dy. y p  ) 2 1 d ! a ( x p  1)  b( y p  )  c 2 .x  dx. y  B.dx 1 F ( M ) ! F ( x p  1. b !  dx.

. y p  ) ! a ( x p  2)  b( y p  )  c 2 2 pero 1 d old ! a ( x p  1)  b( y p  )  c 2 (E ! d new  d old ( ! a ! dy ...¿Qué sucede con M en el próximo punto?. M es incrementado en 1 en x 1 1 d new ! ( x p  2. Depende de elegir E o NE Si E es escogido.

y 3 3 d new ! ( x p  2.Si NE es escogido. M es incrementado en 1 en ambas direcciones x. y p  ) ! a ( x p  2)  b( y p  )  c 2 2 pero 1 d old ! a ( x p  1)  b( y p  )  c 2 (E ! d new  d old (E ! a  b ! dy  dx .

y1) se puede calcular el valor inicial de d 1 1 F ( x1  1. y1 )  a  2 b dx d start ! a  ! dy  2 2 .A partir del primer pixel (x1. y1  ) ! a ( x1  1)  b( y1  )  c 2 2 b ! F ( x1 .

.

8) x 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 y 2 2 3 3 4 4 4 5 5 6 6 6 7 7 8 8 e¶ e 0 6 -3 3 -6 0 6 -3 3 -6 0 6 -3 3 -6 0 .2 -> 17.Bresenham Trace (2.

‡ Porqué gastamos mucho tiempo optimizando? . etc.Recordando ‡ Algoritmo de ecuación de la recta ± Intercepción de inliniación y = mx + b ± Fácil de implementar ± Lento ‡ DDA/Algoritmo de intercepción de inclinación ± Intercepción de inliniación y = mx + b ± Fácil de implementar ± Lento ‡ Bresenham/Algoritmo de Ponto Meio ± No tiene cálculos de punto flotante ± Rápido ‡ Extender para circunferencia.

2. vertices[2][0]= 13. vertices[0][0]= 6. int edges[100][2]. V1: (6.8) V2: (13. vertices[3][0]= 13. vertices[0][1]= 2.2) edges[2][0]= edges[2][1]= edges[3][0]= edges[3][1]= 2. 1. edges[0][0]= edges[0][1]= edges[1][0]= edges[1][1]= 0. 3.8) V0: (6. vertices[2][1]= 8. vertices[1][0]= 6.Con qué es que estamos trabajando? int vertices[100][2]. vertices[1][1]= 8.2) V3: (13. 0. . vertices[3][1]= 2. 1. 3.

Sign up to vote on this title
UsefulNot useful