
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
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
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/