Similaridade.GraficosSimilaridade.java Source code

Java tutorial

Introduction

Here is the source code for Similaridade.GraficosSimilaridade.java

Source

/*
 * 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 Similaridade;

import Uteis.Configuracoes;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Paint;
import modelo.CapturaAtual;
import modelo.HarmAtual;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

/**
 *
 * @author rebonatto
 */
public class GraficosSimilaridade {
    /*
    TIRADOVM: utilizado para verificar se o firmware retirou o valor medio das amostras e fez ajustes na FFT
    0 -> no tirou a VM
    1 -> tirou a VM
    */

    private static int TIRADOVM = 1;

    public static JFreeChart criaGrafico2LinhasComDeslocada(CapturaAtual onda1, CapturaAtual onda2,
            int deslocamento, double correlacao, Paint cor1, Paint cor2) {
        String eixoy = new String("Current ");
        // verifica se  fase ou fuga
        if (onda1.getCodEvento().getCodEvento() == 1) { // evento 1  de fuga
            eixoy = eixoy.concat("(mA)");
        } else {
            eixoy = eixoy.concat("(A)");
        }
        XYDataset dataset = newDataset2OndasComDeslocada(onda1, onda2, deslocamento, correlacao);

        // create the chart...
        final JFreeChart chart = ChartFactory.createXYLineChart(null, // chart title
                "Time (ms)", // x axis label
                eixoy, // y axis label
                dataset, // data
                PlotOrientation.VERTICAL, true, // include legend
                false, // tooltips
                false // urls
        );

        chart.setBackgroundPaint(Color.white);

        // get a reference to the plot for further customisation...
        final XYPlot plot = chart.getXYPlot();

        // Definindo valores no eixo y
        double min = (double) DatasetUtilities.findMinimumRangeValue(dataset);
        double max = (double) DatasetUtilities.findMaximumRangeValue(dataset);

        plot.getRangeAxis().setRange(min - min * 0.005, //min
                max + min * 0.005);
        plot.setBackgroundPaint(Color.WHITE);
        plot.setDomainGridlinePaint(Color.LIGHT_GRAY);
        plot.setRangeGridlinePaint(Color.LIGHT_GRAY);

        final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();

        renderer.setBaseStroke(new BasicStroke(1.0f));
        for (int i = 0; i < dataset.getSeriesCount(); i++) {
            renderer.setSeriesLinesVisible(i, true);
            renderer.setSeriesShapesVisible(i, false);
        }
        // Ajustar para todas as cores padro, pelo menos 10
        renderer.setSeriesPaint(0, cor1);
        renderer.setSeriesPaint(1, cor2);

        /* Cdigo para ter linhas tracejadas 
        renderer.setSeriesStroke(1, 
            new BasicStroke(1.0f, BasicStroke.CAP_ROUND, BasicStroke.CAP_ROUND,
                            20.0f, new float[] {5.0f}, 0.0f) );
               
        renderer.setDrawSeriesLineAsPath(true); 
        /* Final do Codigo para tracejadas */

        plot.setRenderer(renderer);

        return chart;
    }

    public static XYDataset newDataset2OndasComDeslocada(CapturaAtual onda1, CapturaAtual onda2, int deslocamento,
            double correlacao) {
        //metodo que cria um CategoryDataset para ser usado em grafico de linhas                
        float valOnda1[] = new float[Configuracoes.PONTOSONDA];
        float valOnda2[] = new float[Configuracoes.PONTOSONDA];
        float sen1[] = new float[Configuracoes.HARMONICAS];
        float cos1[] = new float[Configuracoes.HARMONICAS];
        float sen2[] = new float[Configuracoes.HARMONICAS];
        float cos2[] = new float[Configuracoes.HARMONICAS];
        int i;

        float s1, s2, tempo[] = new float[Configuracoes.PONTOSONDA];
        XYSeriesCollection result = new XYSeriesCollection();

        for (i = 0; i < Configuracoes.HARMONICAS; i++) {
            sen1[i] = 0;
            cos1[i] = 0;
            sen2[i] = 0;
            cos2[i] = 0;
        }

        i = 0;
        for (HarmAtual oa : onda1.getHarmAtual()) {
            sen1[i] = oa.getSen();
            cos1[i] = oa.getCos();
            i++;
        }

        i = 0;
        for (HarmAtual oa : onda2.getHarmAtual()) {
            sen2[i] = oa.getSen();
            cos2[i] = oa.getCos();
            i++;
        }

        XYSeries series1 = new XYSeries(String.valueOf(onda1.getCodCaptura()));
        XYSeries series3 = new XYSeries("Shift " + String.valueOf(onda2.getCodCaptura()));

        tempo[0] = 0; //(float) 1 / 60;
        for (i = 0; i < Configuracoes.PONTOSONDA; i++) {
            if (TIRADOVM == 0) {
                s1 = onda1.getValorMedio() / 2;
                s2 = onda2.getValorMedio() / 2;
            } else {
                s1 = onda1.getValorMedio();
                s2 = onda2.getValorMedio();
            }

            for (int x = 0; x < Configuracoes.HARMONICAS; x++) {
                if (TIRADOVM == 0) {
                    s1 += (float) (sen1[x] * Math.sin(2 * Math.PI * ((x + 1) * Configuracoes.FREQBASE) * tempo[i]))
                            + (cos1[x] * Math.cos(-2 * Math.PI * ((x + 1) * Configuracoes.FREQBASE) * tempo[i]));
                    s2 += (float) (sen2[x] * Math.sin(2 * Math.PI * ((x + 1) * Configuracoes.FREQBASE) * tempo[i]))
                            + (cos2[x] * Math.cos(-2 * Math.PI * ((x + 1) * Configuracoes.FREQBASE) * tempo[i]));
                } else {
                    s1 += (float) (sen1[x] * Math.sin(2 * Math.PI * ((x + 1) * Configuracoes.FREQBASE) * tempo[i]))
                            + (cos1[x] * Math.cos(2 * Math.PI * ((x + 1) * Configuracoes.FREQBASE) * tempo[i]));
                    s2 += (float) (sen2[x] * Math.sin(2 * Math.PI * ((x + 1) * Configuracoes.FREQBASE) * tempo[i]))
                            + (cos2[x] * Math.cos(2 * Math.PI * ((x + 1) * Configuracoes.FREQBASE) * tempo[i]));
                }
            }
            if (TIRADOVM == 0) {
                valOnda1[i] = (int) ((s1 * (2.0)) / 256.0);
                valOnda1[i] = (valOnda1[i] - onda1.getOffset());
                valOnda2[i] = (int) ((s2 * (2.0)) / 256.0);
                valOnda2[i] = (valOnda2[i] - onda2.getOffset());

            } else {
                valOnda1[i] = (s1);
                valOnda2[i] = (s2);
            }
            valOnda1[i] = (valOnda1[i]) / onda1.getGain();
            valOnda2[i] = (valOnda2[i]) / onda2.getGain();

            series1.add(tempo[i] * 1000, valOnda1[i]);

            if (i == (Configuracoes.PONTOSONDA - 1)) {
                break;
            }
            tempo[i + 1] = (tempo[i] + (float) (1.0 / (60 * 256)));
        }

        int j = 0;
        if (correlacao < 0) {
            for (i = 0; i < Configuracoes.PONTOSONDA; i++) {
                if ((i + deslocamento) <= (Configuracoes.PONTOSONDA - 1)) {
                    series3.add(tempo[i] * 1000, -1 * valOnda2[i + deslocamento]);
                } else {
                    series3.add(tempo[i] * 1000, -1 * valOnda2[j++]);
                }
            }
        } else {
            for (i = 0; i < Configuracoes.PONTOSONDA; i++) {
                if ((i + deslocamento) <= (Configuracoes.PONTOSONDA - 1)) {
                    series3.add(tempo[i] * 1000, valOnda2[i + deslocamento]);
                } else {
                    series3.add(tempo[i] * 1000, valOnda2[j++]);
                }
            }
        }

        result.addSeries(series1);
        result.addSeries(series3);

        return result;
    }
}