Foro de elhacker.net

Programación => Java => Mensaje iniciado por: dxdiag90 en 13 Septiembre 2017, 23:25 pm



Título: Intercesión o cruce de 2 polígonos
Publicado por: dxdiag90 en 13 Septiembre 2017, 23:25 pm
Buen día comunidad, necesito que un programa indique si dos polígonos se tocan en dos puntos, será posible realizarlo por medio de estos códigos que me facilitan?
Sería muy afortunado si alguien me ayudara, gracias de antemano.
Código:

/*%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package calculointereseccion;

/**
 *
 */
public class CalculoIntereseccion {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        
        
        double n1 = 123;
        double n2 = 356;
        
        Punto p1 = new Punto(n1 , n2);
        
        Punto p2 = new Punto();
        p2.setCoordX(123);
        p2.setCoordY(356);
        
        Punto listaPuntos1[] = new Punto [2];
        listaPuntos1 [0] = p1;
        listaPuntos1 [1] = p2;
                
        Poligono poligono1 = new Poligono("Mi primer poligono", "VERDE", listaPuntos1);
        poligono1.imprimirPoligono ();        
        
        
        
        
    }
    
}


/*%%%%%%%%%%%%%%%%%%%%%%%%%%%*/


/*%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

package calculointereseccion;


public class Poligono {
    
    private String nombre;
    private String color;
    private Punto listaPuntos [];
    
    public Poligono (String nombreIn , String colorIn ,Punto listaPuntosIn []){
        nombre = nombreIn;
        color = colorIn;
        listaPuntos = listaPuntosIn;
    }
    
    public boolean interseccionPoligonos (Poligono otroPoligono){
        boolean intersectan = false;
        
        Punto listaTmpOtroPol [] = otroPoligono.getListaPuntos();
        
        
        for (int x=0; x < listaPuntos.length ; x++){
            Punto p1 = listaPuntos [x];    
            Punto p2 = null;
            if (x != listaPuntos.length-1){
                 p2 = listaPuntos [x+1];
            }else {
                 p2 = listaPuntos [0];
            }
            Linea lineaTmpPoligono1 = new Linea(p1, p2);
            
            
            for (int j=0; j < listaTmpOtroPol.length ; j++){
                        
                Punto p1otroPol = listaTmpOtroPol [x];    
                Punto p2otroPol = null;
                if (x != listaTmpOtroPol.length-1){
                     p1otroPol = listaTmpOtroPol [x+1];
                }else {
                     p2otroPol = listaTmpOtroPol [0];
                }
                Linea lineaTmpOtroPoligono = new Linea(p1otroPol, p2otroPol);
                boolean seIntersectanLasLineas = lineaTmpPoligono1.seInterectan(lineaTmpOtroPoligono);
                if ( seIntersectanLasLineas == true){
                    intersectan = true;
                    break;
                }
                
            }
            
            
        }
        
        return intersectan;
    }
    
    
    public void imprimirPoligono () {
        System.out.println("INICIO POLIGONO________");
        for (int pos =0; pos < listaPuntos.length ; pos++){
            Punto tmp =  listaPuntos [pos];
            tmp.imprimirPunto();
        }
        System.out.println("___________FIN POLIGONO");
    }
    
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public Punto[] getListaPuntos() {
        return listaPuntos;
    }

    public void setListaPuntos(Punto[] listaPuntos) {
        this.listaPuntos = listaPuntos;
    }
    
    
    
    
    
}

/*%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

/*%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package calculointereseccion;

/**
 *
 */
public class Linea {
    
    private Punto pInicial;
    private Punto pFinal;
    
    public Linea (Punto p1, Punto p2){
        pInicial = p1;
        pFinal = p2;
    
    }
    
    
    public double pendiente (){
        double pendiente = 0;
        pendiente = pFinal.getCoordY() - pInicial.getCoordY() / pFinal.getCoordX() - pInicial.getCoordX();
        return pendiente;
    }
    
    public boolean seInterectan (Linea otraLinea){
        boolean interseccion = false;
        
        
        
        return interseccion;
    }
    
    public void imprimirLinea (){
        System.out.println("INICIO LINEA___________");
        System.out.print("PUNTO INICIAL: ");
        pInicial.imprimirPunto();
        System.out.print("PUNTO FINAL: ");
        pFinal.imprimirPunto();
        System.out.println("___________FIN LINEA");
        
    }
    
    public Punto getpInicial() {
        return pInicial;
    }

    public void setpInicial(Punto pInicial) {
        this.pInicial = pInicial;
    }

    public Punto getpFinal() {
        return pFinal;
    }

    public void setpFinal(Punto pFinal) {
        this.pFinal = pFinal;
    }
    
    
    
}


/*%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

/*%%%%%%%%%%%%%%%%%%%%%%%%%%%*/

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package calculointereseccion;


public class Punto {
    
    private double coordX;
    private double coordY;
    
    public Punto (){
        coordX = 0;
        coordY = 0;
    }
    
    
    //CONSTRUCTOR
    public Punto (double coordXIn, double coordYIn){
        coordX = coordXIn;
        coordY = coordYIn;
        
    }
    
    
    public void imprimirPunto (){
        
        System.out.println(" COORD X:" + coordX +" COORD Y:" + coordY );
    
    }

    public double getCoordX() {
        return coordX;
    }

    public void setCoordX(double coordX) {
        this.coordX = coordX;
    }

    public double getCoordY() {
        return coordY;
    }

    public void setCoordY(double coordY) {
        this.coordY = coordY;
    }
    
    
    
    
    
}

/*%%%%%%%%%%%%%%%%%%%%%%%%%%%*/


Título: Re: Intercesión o cruce de 2 polígonos
Publicado por: Serapis en 14 Septiembre 2017, 18:23 pm
No he mirado el código, creo que si te lo han facilitado y te dicen que funciona, tu mismo debes verificar si es verdad que funciona o no...

Veamos... un polígono es un área encerrada sobre líneas rectas... a pruimera impresión, un polígono, puede considerarse como un punto grande, pero que tiene 'varios centros'.

Si sabes detectar la colisión de dos rectángulos, la segunda operación es tratar de verificar esto. Es decir si el área que ocupa un polígono no está 'encima' de otro, no merece la pena perder tiempo en comprobar más.

O dicho de otro modo, al caso conviene 'cuadrar' el polígono, obteniendo 4 puntos, los puntos más lejanos en las 4 orientaciones, o dicho de modo simple, encerrar el polígono en un rectángulo.

Si la comparación de esos rectángulos, no se intersectan, no vamos más allá y solo cuando sí, es cuando vale el gasto de tiempo en verificar en profundidad la colision entre polígonos.

A grandes rasgos en pseudocódigo:

1 - Cuando se crean los polígonos o cuando se modifica su tamaño o forma, se calcula el rectángulo que lo encierra (es decir, esto no debe calcularse cada vez que se quiera determinar una colisión, es redundante... se calcula una sola vez y se mantiene mientras no cambie). Esto se hace por cada polígono para el que deba ser verifcada una colisión:
Código:

Estructura Rectangulo
    Izquierda
    Superior
    Derecha
    Inferior
Fin Estructura

// Dados los puntos de un polígono, devuelve el rectángulo en el que encaja (ojo, con la posición actual)
Rectangulo = Funcion EncerrarPoligonoEnRectangulo(Punto Puntos)
    Rectangulo r, Punto p
    // el primer punto asume los límites iniciales, que serán actualizados por el que los supere.
    r.Izquierda = p(0).X
    r.Superior = p(0).Y
    r.Derecha = p(0).X
    r.Inferior = p(0).Y

    Por cada p en Puntos
        Si (p.X < r.Izquierda) luego
            r.Izquierda = p.x
        Sino
            Si (p.X > r.Derecha) luego
                r.Derecha = p.X
            Fin si
        Fin si

        Si (p.Y < r.Superior) luego
            r.Superior = p.Y
        Sino
            Si (p.Y > r.Inferior) luego
                r.Inferior = p.Y
            Fin si
        Fin si
    Siguiente

    // OJO: antes d ehacer la devolución lo movemos al origen, para evitar restas en lo sucesivo, solo sumas.
    Devolver MoverRectanguloAOrigen(r)
Fin funcion

// Desplaza el rectángulo al origen (la esquina superior izquierda se posiciona en el eje de cordenadas)
// NOTA: que esto equivale a poner las medidas del rectangulo (mide.Ancho, Mide.Alto) y posición (x = 0, y = 0)
Rectangulo = Funcion MoverRectanguloAOrigen(Rectangulo r)
     r.Derecha = r.Derecha - r.Izquierda
     r.Izquierda = 0

     r.Inferior = r.Inferior - r.Superior
     r.Superior = 0

     Devolver r
Fin funcion

// Otra función para desplazar adonde sea (desde el origen)...
Rectangulo = Funcion MoverRectanguloDesdePosOrigen(Rectangulo r, Posicion p)
    r.Izquierda =p.X
    r.Derecha = (r.Derecha + p.X)

    r.Superior = p.Y
    r.Inferior = (r.Inferior + p.Y)

    Devolver r
Fin funcion

// Otra función para desplazar adonde sea (desde donde está ahora)...
Rectangulo = Funcion MoverRectanguloDesdePosActual(Rectangulo r, Posicion p)
    r.Izquierda = (r.Izquierda + p.X)
    r.Derecha = (r.Derecha + p.X)

    r.Superior = (r.Superior + p.Y)
    r.Inferior = (r.Inferior + p.Y)

    Devolver r
Fin funcion

...ahora tengo que salir, continúo a la noche, más bien de madrugada...