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