Algoritmos para dibujar una circunferencia, GRUPO B

Anuncio
Instituto Tecnológico de Cd. Guzmán
Graficación
Unidad I. Introducción a la graficación por computadora
Primitivas básicas de dibujo
Trazado de una circunferencia
Para trazar un círculo solo es necesario conocer el radio y
la ubicación del punto central de ésta. Existen diversas
ecuaciones o formulas que nos permiten obtenerlo, en
estas notas solo se verán dos de éstas, la primera basada
en coordenadas cartesianas (rectangulares) y la segunda
basada
en
coordenadas
polares
(funciones
trigonométricas).
maria eugenia puga nathal
Página 1
14/11/2015
Ecuación polinomial cuadrada (reducida) de la circunferencia
El tipo de coordenadas utilizadas para este caso son las cartesianas.
Punto central de la circunferencia igual a cero
r2 = x2 + y2
________
r = √ x2 + y2
donde r es la distancia o radio desde el punto central a cualquier punto de la circunferencia.
Punto central de la circunferencia diferente a cero
r2 = (x - h) 2 + (y - k ) 2
_________________
d(C,P) = √ (x - h) 2 + (y - k ) 2 = r
P un punto cualquiera de la recta
C punto central de la circunferencia
r radio o distancia de la circunferencia desde el punto C a cualquier punto P de la circunferencia
Coordenadas polares
Para representar gráficamente un lugar geométrico y establecer su ecuación, muchas veces conviene
el empleo de otro sistema de coordenadas distinto al cartesiano, éste es el caso del sistema de
coordenadas polares.
En este sistema se elige en el plano un punto O, que se le llama polo y una semirrecta fija que
recibe el nombre de eje polar, y tiene su origen en el polo.
Las coordenadas rectangulares pertenecen al sistema cartesiano, el cual, en ciertos casos también
emplea ejes oblicuos en vez de perpendiculares.
La posición de un punto M en el plano, queda determinado por el segmento OM que se representa
por r y por el ángulo θ que dicho segmento forma con el eje polar.
r y θ son las coordenadas del punto M
r recibe el nombre de radio vector
θ se le conoce con el nombre de ángulo polar, ángulo vectorial o argumento de M
Las coordenadas para el punto M se escriben:
M(r, θ)
El ángulo polar se mide considerando el eje polar como lado inicial y el radio vector como lado
final. Se considera positivo, cuando se genera en sentido contrario al movimiento de las manecillas
del reloj y negativa en el caso opuesto.
maria eugenia puga nathal
Página 2
14/11/2015
Relación entre coordenadas rectangulares y las polares
Considerar que el origen de un sistema de coordenadas rectangulares coincide con el polo y la
dirección positiva del eje de las X, es decir OX coincide con el eje polar.
Entonces, para un punto M del plano se tiene:
M(x, y) en el sistema de coordenadas rectangulares
M(r, θ) en el sistema de coordenadas polares
Se observa que entre las coordenadas cartesianas y las polares de un mismo punto del plano se
pueden establecer las siguientes relaciones:
a) x = r cos θ
b) y = r sen θ
c) x2 + y2 = r2
d) θ = arc tan (y / x)
______
e) r = √ x2 + y2
______
f) sen θ = y / √ x2 + y2
______
g) cos θ = x / √ x2 + y2
Para más información sobre este tema, consultar cualquier libro de geometría analítica.
Grados-Radianes
π radianes = 180º
Grados
Radianes
0º
0
1 radian = 180º / π
30º
π/6
45º
π/4
60º
π/3
1º = (π / 180) radianes
90º
π/2
120º
2π/3
135º
3π/4
150º
5π/6
180º
Π
270º
3π/2
360º
2π
Algoritmos para trazar una circunferencia
Existen varios algoritmos que nos permiten trazar una circunferencia entre los que se mencionan:
- algoritmo general o directo de la circunferencia
- algoritmo del método incremental
- algoritmo del punto medio
- algoritmo de Bresenham
algoritmo general o directo de la circunferencia
Se basa en la ecuación general de la circunferencia, con centro en el origen: x2 + y2 = r2. Como el
trazado de una circunferencia se usa normalmente fuera del origen, la formula se amplia:
(x-xc)2 + (y-yc)2 = r2, donde xc y yc son las coordenadas del punto central de la circunferencial.
maria eugenia puga nathal
Página 3
14/11/2015
Para dibujar la circunferencia, se incrementa de manera unitaria a x de –r a r, y se calcula el valor de
y.
__________
y = yc  √ r2 - (x-xc)2
algoritmo circulo_general(entero xc, entero yc, entero r)
inicio
entero x
double y1, y2
para x=xc-r hasta x<=xc+r con incrementos en x de 2 unidades
inicio
y1=yc+raizCuadrada(cuadrado(r)-cuadrado(x-xc))
y2=yc-raizCuadrada(cuadrado(r)-cuadrado(x-xc))
dibujarPixel(x, redondear(y1))
dibujarPixel(x, redondear(y2))
fin
fin
Entre las desventajas que presenta este algoritmo están:
- No aprovecha la simetría, se hace el trazado de la mitad de la circunferencia, por lo que por
cada incremento de x, se trata de dibujar dos puntos
- Las operaciones de potencia requieren mucho tiempo de ejecución
- Presenta segmentación al aproximarse al eje de las x, ya que al acercarse los puntos a este
eje, se pintan mas separados
algoritmo incremental
Tiene como fundamento la representación paramétrica polar de la circunferencia y se creo para
corregir el algoritmo anterior en lo que respecta a la separación de los puntos que no se ven cerca
del eje x.
x = xc + (r cos θ)
y = yc +(r sen θ)
donde θ se mide en radianes de 0 a 2π
r es el radio
(xc, yc) es la coordenada del punto del centro de la circunferencia
Como la longitud de un arco de circunferencia es r*θ y el radio r son constantes, los incrementos de
dθ iguales, dan espaciamientos uniformes, haciendo que la circunferencia se vea “pareja”
r*θ = 1
θ = 1/r
Una de las desventajas que presenta este algoritmo es el calculo continuo del seno de θ y el coseno
de θ para cada incremento angular, lo cual consume mucho tiempo.
Dos puntos consecutivos:
x1 = r cos θ
y1 = r sen θ
x2 = r cos (θ + dθ)
y2 = r sen (θ + dθ)
donde dθ es un paso angular constante de tamaño fijo.
maria eugenia puga nathal
Página 4
14/11/2015
Aplicando la identidad trigonométrica para calcular el seno y coseno de la suma de dos ángulos
tenemos:
cos (θ + dθ) = (cos θ)(cos dθ) - (sen θ)(sen dθ)
sen (θ + dθ) = (sen θ)(cos dθ) + (cos θ)(sen dθ)
Sustituyendo x2 y y2
x2 = (r cos θ)(cos dθ) - (r sen θ)(sen dθ)
y2 = (r sen θ)(cos dθ) + (r cos θ)(sen dθ)
Sustituyendo x1 y y1
x2 = x1 cos dθ - y1 sen dθ
y2 = y1 cos dθ + x1 sen dθ
Al iniciar, x=0, y=r,
El sen θ, y el cos θ se calcula solo una vez al inicio del proceso
Se aprovecha la simetría de la circunferencia lo que disminuye el número de cálculos:
P1(x, y)
P5(-x, -y)
P2(y, x)
P6(-y, -x)
P3(y, -x)
P7(-y, x)
P4(-x, y)
P8(x, -y)
algoritmo circulo_incremental(entero xc, entero yc, entero r)
inicio
entero tx, ty
double dt, cc, ss, x, y, aux
dt = (double) 1/r
cc=coseno(dt)
ss=seno(dt)
x=0
y=r
mientras (y>=valorAbsoluto(x))
inicio
tx=redondear(x)
ty=redondear(y)
dibujarPixel(xc+tx, yc+ty)
dibujarPixel(xc-tx, yc+ty)
dibujarPixel(xc+tx, yc-ty)
dibujarPixel(xc-tx, yc-ty)
dibujarPixel(xc+ty, yc+tx)
dibujarPixel(xc+ty, yc-tx)
dibujarPixel(xc-ty, yc+tx)
dibujarPixel(xc-ty, yc-tx)
aux=x
x=x*cc-y*ss
y=y*cc+aux*ss
fin
fin
maria eugenia puga nathal
Página 5
14/11/2015
algoritmo de Bresenham
En este algoritmo se calculan los puntos de 0º a 45º, algo similar que el anterior y se aprovecha de
la simetría de la circunferencia para obtener el trazado del resto de los puntos. Está nuevamente
basado en la ecuación de la recta polinomial de segundo grado.
__
De x=0 a x= r / √ 2
Al igual que en el algoritmo de la recta, se toman dos posibles valores:
A(xi+1, yi) B(xi+1, yi-1)
r2 = (xi+1)2 + y2
y2 = r2 - (xi+1)2
d(a)= yi2 - y2
d(b)= y2 – (yi -1)2
d(a)= yi2 – r2 + (xi+1)2
d(b)= r2 - (xi+1)2 – (yi -1)2
Si la distancias hacia algunos puntos candidatos es igual a 0, el punto está sobre la circunferencia,
sino es lo anterior, toma el punto mas cercano:
P1 = d(a) – d(b)
P1 = yi2 – r2 + (xi+1)2 - r2 + (xi+1)2 + (yi -1)2
P1 = 2(xi+1)2 + yi2 + (yi -1)2 – 2r2
Si el punto inicial es x=0, y=r
Pi = 2(0+1)2 + r2 + (r -1)2 – 2r2
Pi = 2 + r2 + (r -1)2 – 2r2
Pi = 2 + r2 + r2 – 2r +1 – 2r2
Pi = 3 - 2r
Si el valor de Pi < 0
xi+1=xi+1
y i+1=y i
r2 = (xi+1)2 + (y i)2
p i+1 = pi + 4xi + 6
Si el valor de Pi >= 0
xi+1=xi+1
y i+1=y i - 1
r2 = (xi+1)2 + (y i - 1)2
p i+1 = pi + 4(xi - y i)+ 10
1. seleccionar como punto inicial la coordenada (0, r) donde r = radio
2. calcular el primer parámetro como:
P=3-2r
3. incrementando x en pasos unitarios, calcular cada parámetro sucesivo de pi+1 a partir de los
siguiente:
Si pi<0
sisi y i+1=y i
p i+1 = pi + 4xi + 6
maria eugenia puga nathal
Página 6
14/11/2015
Si pi>0
sisi y i+1=y i - 1
p i+1 = pi + 4(xi - y i)+ 10
4. repetir paso 3 hasta que x sea mayor o igual que y
Para dibujar la circunferencia, aplicar la simetría de la circunferencia para los siete puntos restantes,
en los cálculos se obtiene el primer punto(x, y), por lo que bastara que se vayan intercambiando
estas dos coordenadas, al igual que sus signos
algoritmo circulo_Bresenham(entero xc, entero yc, entero r)
inicio
entero p, x, y
x=0
y=r
p=3-2*r
mientras (x<=y)
inicio
dibujarPixel(xc+x, yc+y)
dibujarPixel(xc-x, yc+y)
dibujarPixel(xc+x, yc-y)
dibujarPixel(xc-x, yc-y)
dibujarPixel(xc+y, yc+x)
dibujarPixel(xc+y, yc-x)
dibujarPixel(xc-y, yc+x)
dibujarPixel(xc-y, yc-x)
si p<0
si si p=p+4*x+6
si no inicio
p=p+4*(x-y)+10
y=y-1
fin
x=x+1
fin
fin
maria eugenia puga nathal
Página 7
14/11/2015
Descargar