jueves, 28 de abril de 2016

Java: Tabla de distancias euclideanas a punto de referencia en espacio n-dimensional

El siguiente código de Java genera una tabla de distancias en un espacio n-dimensional desde n puntos hacia un punto de referencia conocido. Esta técnica encuentra aplicación dentro de la generación de clústeres de datos donde se toma en cuenta la proximidad como criterio de agrupamiento.

Sean los puntos: A y B en un espacio n dimensional, las representaciones de cada punto se harán en base a sus coordenadas:

Para punto A: (a1, a2, a3, ... , an)
Para punto B: (b1, b2, b3, ..., bn)

La distancia entre los puntos A y B utilizando distancia euclideana:

D(A-B) = RAIZ_CUADRADA ( (a1 - b1)^2 + (a2 - b2)^2 + ... + (an - bn)^2 )

El programa es flexible en cuanto al número de dimensiones que tendrá el espacio y el número de puntos conocidos y está limitado a solo un punto de referencia.

Código:

import java.util.Scanner;

/**
 *
 * @author: Joaquín Bolaños
 * Genera una tabla de distancias desde un punto de referencia hacia puntos conocidos.
 * El número de dimensiones del espacio y el número de puntos conocidos se ajustan como
 * parámteros introducidos por el usuario.
 *
 * Para calcular las distancias se aplica la distancia de Euclides:
 * Sea puntoReferencia (x, y) un punto de referencia del espacio de dos dimensiones.
 * Sea puntoEspacio un punto del espacio conocido (a,b) del espacio de dos dimensiones.
 * La distancia entre puntoReferencia y puntoEspacio = raizcuadrada ((x-a)^2 + (y-b)^2)
 * Los parámetros del programa son:
 *
 * nDimensiones: Número de dimensiones del espacio (Dependiendo su valor, así será el número de coordenadas por *punto).
 * nPuntos: El número de puntos conocidos del espacio.
 *
 * Todas las distancias se calculan hacia un único punto de referencia, cuyas coordenadas
 * también introduce el usuario.
 *
 */

public class EuclidesDistancia {
    public static void main(String[] args) {      
        double coordenada = 0; // Almacena un valor de coordenada
        int nPuntos = 0;  // Número de puntos conocidos
        int nDimensiones = 0;  // Número de coordenadas por punto del espacio
        double sumaCuadrados = 0; // Acumulador de cuadrados para calcular distancia
        double distancia = 0; // Variable que guarda las distancias
     
        Scanner lector = new Scanner(System.in);
     
        // Introduciendo parámetros base
        System.out.print("¿De cuántas dimensiones es el espacio?: ");
        nDimensiones = lector.nextInt();
        System.out.print("Digite el número de puntos conocidos en el sistema de dos coordenadas:");
        nPuntos = lector.nextInt();
           
        // Generando las tablas en base a los parámetros base
     
        // tabla de puntos conocidos. En esta tabla también se guardan las distancias
        double[][] tabla = new double [nPuntos][nDimensiones+1];
     
        // coordenadas del punto de referencia
        double[][] referencia = new double [1][nDimensiones];
     
        // Captura de coordenadas del punto de referencia:
        System.out.println("CAPTURA DEL PUNTO DE REFERENCIA");
        for (int i=0; i        {
            System.out.print("Digite la coordenada " + (i + 1) + " del punto de referencia:");
            coordenada = lector.nextDouble();
            referencia[0][i] = coordenada;          
        }
        System.out.println("");
     
        // Captura de los puntos conocidos y de una sola vez se calcula y almacena la distancia respectiva:
        System.out.println("CAPTURA DE PUNTOS CONOCIDOS");
        for (int i=0; i        {
            for (int j=0; j            {              
                System.out.print("Digite la coordenada " + (j+1) + " del punto " + (i + 1) + ": ");
                coordenada = lector.nextDouble();
                sumaCuadrados = sumaCuadrados + (Math.pow((referencia[0][j] - coordenada),2));
                tabla[i][j] = coordenada;
            }
            distancia = Math.sqrt(sumaCuadrados);
            tabla[i][nDimensiones] = distancia;
            System.out.println("");        
            sumaCuadrados = 0;
        }
     
        // Se recorre y muestra el arreglo de los puntos conocidos junto con las distancias
        // respectivas de cada uno hacia el punto de referencia:
        System.out.println("");
        System.out.println("TABLA DE DISTANCIAS");
        System.out.println("Punto - CoordX - CoordY - Distancia");
        for (int i = 0; i        {
            System.out.print("" + (i+1));
            System.out.print(" - ");
            for (int j=0; j<=nDimensiones; j++)
            {
                System.out.print("" + tabla[i][j]);
                System.out.print(" - ");
            }
            System.out.println("");
        }
    }

}


Ejecución (para un espacio de tres dimensiones, con cuatro puntos conocidos):











No hay comentarios:

Publicar un comentario

Seguidores