Professional Documents
Culture Documents
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.media.opengl.*;
/**
*
* @author Eder
*/
public class Renderer_RellenoPoligonal implements GLEventListener
{
@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();
}
/*
* 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(-width, width, -height, height, -1.0, 1.0);
}
@Override
public void dispose(GLAutoDrawable glad) {
// no implementado
}
/*
* Inicializar y presentar el dibujo de OpenGL
*/
@Override
public void display(GLAutoDrawable drawable) {
// Establecer el tamaño y color del punto
gl.glPointSize(1);
gl.glColor3f(0.12f, 0.50f, 0.26f);
dibujarPolilineasCerrada(vertices);
int NroVertices = vertices.size();
System.out.println(NroVertices);
ConvertirConcavo(vertices);
dividirTriangulos(vertices);
// Identificar poligono concavo
if (Concavo_Convexo(vertices).size()>0)
System.out.println("El poligono es concavo");
else
System.out.println("El poligono es convexo");
}
////////////////////////////////////////////////////////
/*Convierte una lista de puntos en una lista de vectores
(uniendo los puntos)*/
private static List<Vector> ListaVectores(List<Punto>
vertices){
List<Vector> Vectores= new ArrayList<Vector>();
for (int i = 0; i < vertices.size()-1; i++)
{
//determnar los vectores
Vectores.add(new Vector(vertices.get(i),
vertices.get(i+1)));
}
Vectores.add(new Vector(vertices.get(vertices.size()-1),
vertices.get(0)));
return Vectores;
}
}
/*Convierte un poligono concavo en uno convexo*/
private void ConvertirConcavo(List<Punto> vertices){
List<Vector> vectores= new ArrayList<Vector>();
vectores=ListaVectores(vertices);
if (Concavo_Convexo(vertices).size()>0){
dibujarInterseccion(Concavo_Convexo(vertices),
vectores);
}
else dibujarPolilineasCerrada(vertices);
}
/////////////////////////////////////////////////
/*
*Dibujar un poligono utilizando polilinea
cerrada
*/
private void dibujarPolilineasCerrada(List<Punto> vertices) {
int numeroVertices = vertices.size();
for (int i = 0; i < numeroVertices - 1; i++) {
int x0 = vertices.get(i).getX();
int y0 = vertices.get(i).getY();
int xn = vertices.get(i + 1).getX();
int yn = vertices.get(i + 1).getY();
lineaBresenham(x0, y0, xn, yn);
}
// cerrar la figura
int x0 = vertices.get(numeroVertices - 1).getX();
int y0 = vertices.get(numeroVertices - 1).getY();
int xn = vertices.get(0).getX();
int yn = vertices.get(0).getY();
lineaBresenham(x0, y0, xn, yn);
}
/*
* Dibujar lÃnea arbitraria con metodo bresenham
*/
public void lineaBresenham(int x0, int y0, int xn, int yn) {
int dx, dy, incrE, incrNE, d, x, y, flag = 0;
//intercambiar(y0,yn);
temp = y0;
y0 = yn;
yn = temp;
}
if (yn < y0) {
y0 = -y0;
yn = -yn;
flag = 10;
}
dy = yn - y0;
dx = xn - x0;
//intercambiar(xn,yn);
temp = xn;
xn = yn;
yn = temp;
//intercambiar(dy,dx);
temp = dy;
dy = dx;
dx = temp;
flag++;
}
x = x0;
y = y0;
d = 2 * dy - dx;
incrE = 2 * dy;
incrNE = 2 * (dy - dx);
while (x < xn + 1) {
escribirPixel(x, y, flag); /* Dibujar punto */
x++; /* siguiente pixel */
if (d <= 0) {
d += incrE;
} else {
y++;
d += incrNE;
}
}
}
/*
* Dibujar un punto
*/
protected void dibujarPunto(int x, int y) {
gl.glPointSize(2);
gl.glBegin(GL.GL_POINTS);
gl.glVertex2i(x, y);
gl.glEnd();
}
}