Laboratorio 018: Algoritmos de recorte

publicado a la‎(s)‎ 14 ago. 2012 12:55 por Hernan Nina Hanco   [ actualizado el 3 jun. 2014 15:58 ]

I) Objetivo

  • Implementar los algoritmos de recorte.

II) Marco conceptual

    Ver Guía de Computación Gráfica


III) Prácticas

1) Dibujar un poligono.
package geometrias.rellenoareas;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author hernan
 */
public class Poligono {

    private List<Punto> vertices;
    private List<Punto> vectores;
    private List<Punto> productosVectoriales;
    private List<Punto> vectoresExtension;

    /*
     * 
     */
    public Poligono(List<Punto> vertices) {
        this.vertices = vertices;
    }
    /*
     * Hallar vectores de poligono
     */

    public List<Punto> getVectoresExtension() {
        return vectoresExtension;
    }

    public List<Punto> hallarVectores() {
        // cálcular vectores del poligono
        vectores = new ArrayList<Punto>();
        int nroVertices = vertices.size();
        for (int i = 0; i < nroVertices - 1; i++) {
            Punto vector = diferenciaVector(vertices.get(i+1), vertices.get(i));
            vectores.add(vector);
        }
        // calcular el últiimo vector
        Punto ultimoVector = diferenciaVector(vertices.get(0), vertices.get(nroVertices - 1));
        vectores.add(ultimoVector);
        return vectores;
    }
    
    /*
     * Hallar vectores resultante del producto vectorial
     */
    public List<Punto> hallarVectoresProductoVectorial()
    {
        List<Punto> temp= new ArrayList<Punto>();
        List<Punto> temp1 = new ArrayList<Punto>();
        
        int numeroVectores = this.vectores.size();
        for (int i=0;i<numeroVectores-1;i++)
        {
            Punto producto = productoVectorial(vectores.get(i), vectores.get(i+1));
            if (producto.getZ()<0)
            {
                temp1.add(vectores.get(i));
            }
            temp.add(producto);
        }
        // ultimo punto
        Punto ultimoPunto = productoVectorial(vectores.get(numeroVectores-1), vectores.get(0));
        temp.add(ultimoPunto);
        this.vectoresExtension = temp1;
        return temp;
    }

    /*
     * Hallar el vector
     */
    public Punto diferenciaVector(Punto p1, Punto p2) {
        Punto p = new Punto(p1.getX() - p2.getX(),
                p1.getY() - p2.getY(),
                p1.getZ() - p2.getZ());
        return p;
    }
    public Punto productoVectorial(Punto vector1, Punto vector2)
    {
        return new Punto(
                vector1.getY()*vector2.getZ() - vector1.getZ()*vector2.getY(),
                - (vector1.getX()*vector2.getZ() - vector1.getZ()*vector2.getX()),
                vector1.getX()*vector2.getY() - vector1.getY()*vector2.getX()
                );
    }

    public static void main(String[] args) {
        List<Punto> vertices = new ArrayList<Punto>();
        vertices.add(new Punto(0, 0, 0));
        vertices.add(new Punto(1, 0, 0));
        vertices.add(new Punto(2, 1, 0));
        vertices.add(new Punto(3, 0, 0));
        vertices.add(new Punto(3, 3, 0));
        vertices.add(new Punto(0, 3, 0));


        Poligono poligono = new Poligono(vertices);
        List<Punto> vectores = poligono.hallarVectores();
        System.out.println("Vectores: " + vectores);
        List<Punto> productos = poligono.hallarVectoresProductoVectorial();
        System.out.println("Productos: " + productos);
        System.out.println("Vector extension: " + poligono.vectoresExtension);
    }
}
IV) Tarea
  • Implementar programas con algoritmos de Recorte de Nicholl-Lee-Nicholl y Cohem Sutherland.
Comments