Saturday, July 07, 2012

Solución al Problema 5514 - Circle Through Three Points [http://livearchive.onlinejudge.org] con Java

Solución al Problema 5514 - Circle Through Three Points [http://livearchive.onlinejudge.org] con Java
El link del Problema se encuentra en el siguiente enlace
import java.util.Scanner;

/**
 * 5514 - Circle Through Three Points [http://livearchive.onlinejudge.org]
 * 190 - Circle Through Three Points [http://uva.onlinejudge.org]
 * 
 * @author BreakDark
 * @version 1.1 beta
 */
// ACEPTADO!!! xD
public class Main {
    public static void main(String[] args) {
        Scanner Lee; // para leer los datos de entrada
        double Ax, Ay, Bx, By, Cx, Cy; // para las coordenadas de los puntos
        double h = 0, k = 0, r = 0, c = 0, d = 0, e = 0; // para los datos que
                                                         // se mostraran
        double[][] C = new double[3][3]; // para sacar el determinante
        double[][] D = new double[3][3];
        double[][] E = new double[3][3];
        double[][] dis = new double[3][3];
        double aux; // un auxiliar para ahorrar operaciones
        String linea; // para la linea que se mostrara al final

        // AQUI INICIA EL PROGRAMA
        Lee = new Scanner(System.in);
        while(Lee.hasNext()){
            Ax = Double.parseDouble(Lee.next());
            Ay = Double.parseDouble(Lee.next());
            Bx = Double.parseDouble(Lee.next());
            By = Double.parseDouble(Lee.next());
            Cx = Double.parseDouble(Lee.next());
            Cy = Double.parseDouble(Lee.next());
            // creamos las matriz discriminante
            dis[0][0] = Ax;
            dis[0][1] = Ay;
            dis[0][2] = 1;
            dis[1][0] = Bx;
            dis[1][1] = By;
            dis[1][2] = 1;
            dis[2][0] = Cx;
            dis[2][1] = Cy;
            dis[2][2] = 1;
            // copiamos antes de modificar las matrices
            C = copia(dis);
            D = copia(dis);
            E = copia(dis);
            // creamos la matriz D
            C[0][0] = -(Ax * Ax + Ay * Ay);
            C[1][0] = -(Bx * Bx + By * By);
            C[2][0] = -(Cx * Cx + Cy * Cy);
            // creamos la matriz E
            D[0][1] = -(Ax * Ax + Ay * Ay);
            D[1][1] = -(Bx * Bx + By * By);
            D[2][1] = -(Cx * Cx + Cy * Cy);
            // creamos la matriz F
            E[0][2] = -(Ax * Ax + Ay * Ay);
            E[1][2] = -(Bx * Bx + By * By);
            E[2][2] = -(Cx * Cx + Cy * Cy);
            // hallamos las soluciones
            aux = det(dis);
            c = det(C) / aux;
            d = det(D) / aux;
            e = det(E) / aux;
            h = c / 2;// -c/2;
            k = d / 2;// -d/2;
            r = Math.sqrt(h * h + k * k - e);
            // aqui mostramos el resultado
            // formato 1
            // para h
            linea = "(x ";
            if(h >= 0)
                linea += String.format("+ %.3f", h);
            else
                linea += String.format("- %.3f", Math.abs(h));
            linea += ")^2 + (y ";
            // para k
            if(k >= 0)
                linea += String.format("+ %.3f", k);
            else
                linea += String.format("- %.3f", Math.abs(k));
            linea += ")^2 = ";
            // para r
            linea += String.format("%.3f^2\n", r);
            System.out.print(linea.replace(',', '.'));
            // formato 2
            linea = "x^2 + y^2 ";
            // para c
            if(c >= 0)
                linea += String.format("+ %.3fx ", c);
            else
                linea += String.format("- %.3fx ", Math.abs(c));
            // para d
            if(d >= 0)
                linea += String.format("+ %.3fy ", d);
            else
                linea += String.format("- %.3fy ", Math.abs(d));
            // para e
            if(e >= 0)
                linea += String.format("+ %.3f = 0\n", e);
            else
                linea += String.format("- %.3f = 0\n", Math.abs(e));
            System.out.print(linea.replace(',', '.'));
            // if(Lee.hasNext())
            System.out.println();
        }
    }
    /**
     * Realiza una copia de la matriz mat de 3 por 3
     * 
     * @author BreakDark
     * @param mat
     *            matriz a copiar
     * @return matriz con los mismos elementos de mat
     */
    private static double[][] copia(double[][] mat) {
        double[][] res = new double[3][3];
        byte i, j;
        for(i = 0; i < 3; i++)
            for(j = 0; j < 3; j++)
                res[i][j] = mat[i][j];
        return res;
    }
    /**
     * Funcion que halla el determinante de una matriz de 3 por 3
     * 
     * @author BreakDark
     * @param mat
     *            Es una matriz de 3 por 3
     * @return el determinante de mat
     */
    private static double det(double[][] mat) {
        return (mat[0][0] * mat[1][1] * mat[2][2] + mat[0][1] * mat[1][2] * mat[2][0] + mat[0][2] * mat[1][0] * mat[2][1] - mat[0][0] * mat[1][2]
                * mat[2][1] - mat[0][1] * mat[1][0] * mat[2][2] - mat[0][2] * mat[1][1] * mat[2][0]);
    }
}

No comments: