Dibujo en circulos

DOCENCIA UNIVERSITARIA ‎ > ‎ Computación Gráfica I ‎ > ‎ Laboratorio de Computación Gráfica I ‎ > ‎

Laboratorio 004: Algoritmo punto medio para el dibujo de círculos

I) Objetivo

  • Implementar algoritmos para el dibujo de círculos con el algoritmo de punto medio.

II) Marco conceptual

    Ver Guía de Computación Grafica: Temas Algoritmos de dibujo de Círculos y Elipses

III) Prácticas

1) Implementar una clase para dibujar el octante de un Círculo con el algoritmo de la ecuación canónica y el punto medio. Además dibujar un circulo con las ecuaciones polares del circulo.

/*

 * Creado el 23 de mayo, 2012 por Hernán Nina Hanco

 *

 * Este trabajo es parte del proyecto CG1, que corresponde a la 

 * implementación de algoritmos de Dibujo de graficas.

 * 

 * Universidad Nacional de San Antonio Abad del Cusco

 * Carrera Profesional de Ingeniería Informática y de Sistemas

 * Asignatura: Computación Gráfica I

 */

package geometrias.curvas;

/*

 * Dibujo de líneas con pendiente -1<m<1

 * @author Hernan Nina Hanco 

 */

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.media.opengl.*;

public class Renderer_Circulo implements GLEventListener {

    static final Logger logger = Logger.getLogger("BasicLoggingExample");

    protected GL2 gl;

    /*

     * Inicializar graficador OpenGL

     */

    @Override

    public void init(GLAutoDrawable gLDrawable) {

        logger.log(Level.INFO, "método - init");

        // Provee un objeto que enlaza las APIs del OpenGL

        // Que se encargara de realizar las instrucciones de dibujos 

        gl = gLDrawable.getGL().getGL2();

        // Color de fondo del GLCanvas

        gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

        gl.glClear(GL2.GL_COLOR_BUFFER_BIT);

        // definir el color del pincel

        gl.glColor3f(1.0f, 0.0f, 0.0f);

    }

    /*

     * Método para actualizar el dibujo cuando,

     * se modifica el tamaño de la ventana.

     */

    @Override

    public void reshape(GLAutoDrawable glad, int x, int y, int width,

            int height) {

        logger.log(Level.INFO, "Reshape");

        // 7. Especificar el área de dibujo (frame) utilizamos coordenadas

        gl.glMatrixMode(GL2.GL_PROJECTION);

        gl.glLoadIdentity();

        gl.glOrtho(-300, 300, -300, 300, -1.0, 1.0);

        // Dibujar un Sistema de Referencia.

        // dibujarSistemaReferencia(-300, 300, -300, 300);

    }

    /*

     *  

     */

    @Override

    public void dispose(GLAutoDrawable glad) {

        // no implementado

    }

    /*

     * Inicializar y presentar el dibujo de OpenGL

     */

    @Override

    public void display(GLAutoDrawable drawable) {

        int x0, y0, xn, yn, dx, dy;

        // Establecer el tamaño y color del punto     

        gl.glPointSize(1);

        gl.glColor3f(0.0f, 0.0f, 1.0f);

        // Dibujo de Circulos 

  

           //  Dibujar un Círculo según el algoritmo de punto medio

READ  Palabras con ci

        dibujarCirculoPuntoMedio(100,0,0);

    }

    /*

     * Algoritmo para el dibujo de Círculo con el algoritmo de  

     * punto medio

     */

    public void dibujarCirculoPuntoMedio(int r, int xc, int yc) {

        // Punto inicial del círculo

        int x = 0;

        int y = r;

        // Cálcular el parámetro inicial de decisión

        int pk = 1-r;

        

        // verificar el pk para determinar las posiciones de pixel siguuientes

        while (x<=y)

        {

            System.out.println("(x,y)= "+x+","+y+" pk="+pk);

            dibujarPunto(xc+x,yc+y);

            if (pk<0){

                pk+=2*(x+1)+1;

                x++;

            }

            else // pk>=0

            {

                pk+=2*(x+1)+1 - 2*(y-1);

                x++;

                y--;

            }

        }

    }

    /*

     * Algoritmo para el dibujo de Círculo con el algoritmo implementado  

     * por OpenGL.

     */

    void dibujarCirculoOpenGL(int r, int xc, int yc) {

    }

    /*

     * Dibujar un punto 

     */

    protected void dibujarPunto(int x, int y) {

        gl.glPointSize(2);

        gl.glBegin(GL.GL_POINTS);

        gl.glVertex2i(x, y);

        gl.glEnd();

    }

}

IV) Tarea

READ  Reglamento deportivo

1) Modificar la implementación de la práctica para completar el dibujo de los demás octantes del círculo.

2) Implementar el algoritmo de punto medio para circulos para el caso del dibujo del circulo desde el punto (r,0)

3) Cree una clase Renderer_Elipse donde dibuje una elipse utilizando la ecuación canónica, ecuaciones paramétricas polares.

4) Diseñe un procedimiento para la implementación paralela del algoritmo del punto medio para generación de círculos.

V) Referencias

  • Donalf Hearn, M. Pauline Baker; Gráficas por Computadora con OpenGL; Pearson Prentice Hall; 3° edición; Madrid 2006.
  • Richard S. Jr., Michael Sweet; Programación en OpenGL una guía de referencia
  • Hosting del proyecto esta en: http://code.google.com/p/graficaporc/ 

You May Also Like

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *