package auxiliar;

public class Conversor {

    public static double[] converterEscalaCanvasParaEscalaMetro(int pixelLinha, int pixelColuna,
            int imageWidth, int imageHeight,/* Em pixels */
            double ambienteWidth, double ambienteHeight) {

        double pxLinha = pixelLinha;
        double pxColuna = pixelColuna;
        double larguraImagem = imageWidth;
        double alturaImagem = imageHeight;
        double larguraAmbiente = ambienteWidth;
        double alturaAmbiente = ambienteHeight;

        double pontoLinha = (pxLinha / larguraImagem) * larguraAmbiente;
        double pontoColuna = (pxColuna / alturaImagem) * alturaAmbiente;


        double[] ponto = new double[2];
        ponto[0] = pontoLinha;
        ponto[1] = pontoColuna;

        return ponto;
    }

    public static int[] converterEscalaMetroParaEscalaCanvas(double coordX, double coordY,
            int canvasWidth, int canvasHeight,/* Em pixels */
            double ambienteWidth, double ambienteHight) {

        double valorCoordX = coordX;
        double valorCoordY = coordY;
        double larguraImagem = canvasWidth;
        double alturaImagem = canvasHeight;
        double larguraAmbiente = ambienteWidth;
        double alturaAmbiente = ambienteHight;
                //  (a/maxAntigo)x novoMax
        int pxLinha = (int) ((valorCoordY / alturaAmbiente) * alturaImagem);
        int pxColuna = (int) ((valorCoordX / larguraAmbiente) * larguraImagem);
        //System.out.println("X  "+valorCoordX + " " + larguraImagem);
        //System.out.println("Y  "+valorCoordY + " " + alturaImagem);
        int[] ponto = new int[2];
        ponto[0] = pxColuna;
        ponto[1] = pxLinha;

        return ponto;
    }

    public static int[] converterEscalaCanvasParaEscalaImagem(int coordX,int coordY,
                                  int escalaAnteriorX, int escalaAnteriorY,
                                  int escalaNovaX,int escalaNovaY){
        double local_coordX = coordX;
        double local_coordY = coordY;
        double local_escalaAnteriorX= escalaAnteriorX;
        double local_escalaAnteriorY = escalaAnteriorY;
        double local_escalaNovaX = escalaNovaX;
        double local_escalaNovaY = escalaNovaY;

        //  (a/maxAntigo)x novoMax
        int pontoNaLargura = (int)( (local_coordX / local_escalaAnteriorX)* local_escalaNovaX);
        int pontoNaAltura = (int)( (local_coordY / local_escalaAnteriorY) * local_escalaNovaY);
        
        int[] ponto = new int[2];
        ponto[0] = pontoNaLargura;
        ponto[1] = pontoNaAltura;
        
        return ponto;

    }

    public static int[] converterEscalaMetroParaEscalaImagem(double coordX,double coordY,
                                  double escalaAnteriorX, double escalaAnteriorY,
                                  int escalaNovaX,int escalaNovaY){
        double local_coordX = coordX;
        double local_coordY = coordY;
        double local_escalaAnteriorX= escalaAnteriorX;
        double local_escalaAnteriorY = escalaAnteriorY;
        double local_escalaNovaX = escalaNovaX;
        double local_escalaNovaY = escalaNovaY;

        //  (a/maxAntigo)x novoMax
        int pontoNaLargura = (int)( (local_coordX / local_escalaAnteriorX)* local_escalaNovaX);
        int pontoNaAltura = (int)( (local_coordY / local_escalaAnteriorY) * local_escalaNovaY);

        int[] ponto = new int[2];
        ponto[0] = pontoNaLargura;
        ponto[1] = pontoNaAltura;

        return ponto;

    }

    public static double[] converterEscalaImagemParaEscalaMetro(int coordXEmPx,int coordYEmPx,
                                  int escalaImagemXEmPx, int escalaImagemYEmPx,
                                  double escalaNovaX,double escalaNovaY){
        //tem que transformar em double para a divisão funcionar ¬¬'
        double local_coordX = coordXEmPx;
        double local_coordY = coordYEmPx;
        double local_escalaAnteriorX= escalaImagemXEmPx;
        double local_escalaAnteriorY = escalaImagemYEmPx;
        double local_escalaNovaX = escalaNovaX;
        double local_escalaNovaY = escalaNovaY;

        
        //  (a/maxAntigo)x novoMax
        double pontoNaLargura = (double)(local_coordX / local_escalaAnteriorX)* local_escalaNovaX;
        double pontoNaAltura = (double) (local_coordY / local_escalaAnteriorY) * local_escalaNovaY;
        
        double[] ponto = new double[2];
        ponto[0] = pontoNaLargura;
        ponto[1] = pontoNaAltura;
        
        return ponto;

    }
    
    public static double[] coordPolarParaCartesiana(double modulo, double angulo) {
        double x = modulo*Math.cos(Math.toRadians(angulo));
        double y = modulo*Math.sin(Math.toRadians(angulo));

            if((x<0.000001 && x>0)||(x>-0.000001 && x<0))
                x=0;
            if((y<0.000001 && y>0)||(y>0.000001 && y<0))
                y=0;
        
        double[] coord = new double[2];
        coord[0]=x;
        coord[1]=y;

        return coord;
    }

    public static double[] coordCartesianaParaPolar(double x, double y){

                double modulo = Math.sqrt( Math.pow(x,2)+Math.pow(y,2) ) ;
                double angulo = Math.toDegrees(Math.atan2(y,x));

                //como angulo está entre 180 e -180:
                angulo = ajustarAnguloParaEscala_0_360(angulo);

                /*if(x<0 && y>0){//est� no segundo quadrante
                    angulo = Math.abs(angulo)+90;
                    System.out.println("angulo segundo quadrante:"+angulo);
                }
        else if(x<0 && y<0){//est� no terceiro quadrante
                    angulo = angulo+180;
                    System.out.println("angulo terceiro quadrante:"+angulo);
                }
        else if(x>0 && y<0){//est� no quarto quadrante
                    angulo = angulo+360;
                    System.out.println("angulo quarto quadrante:"+angulo);
                }*/

        double[] coord = new double[2];
        coord[0]=modulo;
        coord[1]=angulo;

        return coord;
    }

    public static double ajustarAnguloParaEscala_0_360(double angulo){
                double novoAngulo = angulo;
//
                while ( (novoAngulo>360) || (novoAngulo<0) ){

                    if(novoAngulo>360)
                        novoAngulo = angulo-360;
                    if(novoAngulo<0)//transforma num ângulo positivo
                        novoAngulo = angulo+360;

                }
                
                return novoAngulo;
        }

    
    public static void main(String[] args) {
        double[] vel =coordCartesianaParaPolar(0, (-1));
        System.out.println("vel:"+vel[0]+","+vel[1]);
        vel = coordPolarParaCartesiana(vel[0], vel[1]);
        System.out.println("vel:"+vel[0]+","+vel[1]);

        int[] pos;
        //converterEscalaImagemParaEscalaMetro(633,143,  1400,840,  1400.0,840.0);
        pos=converterEscalaMetroParaEscalaImagem(1500,900,1400.0,840.0,1400,840);
        System.out.println("pos:"+pos[0]+","+pos[1]);

         double porcentagemDePixelsIguais = 85;
         double droga = (double) 100/85;
         System.out.println("Droga: "+ droga);
         double porcentagemDePixelsIguais2 = droga* porcentagemDePixelsIguais;
         System.out.println("Porcentagem2: "+ porcentagemDePixelsIguais2);
    }

}
