2015-03-28 2 views
1

Я хочу построить синусоидальную волну, но вместо этого мое приложение создает плоскую линию. Когда я использую серию со случайным значением от jchartfree, все работает нормально. Я также использую отладчик, чтобы проверить, хороши ли значения. Значения отличаются от нуляПлоская линия вместо волны

public void createDataset() { 
    XYSeriesCollection dataset = new XYSeriesCollection(); 
    XYSeries series1 = new XYSeries("Object 1"); 

    double A = 1;      
    double T = 1;      
    double Fs = 10;     
    double f = 200;      
    int rozmiar = (int) (T*Fs); 

    double[] x = new double[rozmiar]; 

    for (int i = 0; i < rozmiar; i++) 
    { 
     x[i] = A * Math.sin(2 * Math.PI * f * i/Fs); 
     series1.add(i, x[i]); 
    } 

    dataset.addSeries(series1); 

    data = dataset; 
} 
//... 
public void createChartPanel() { 
    //pWykres = new JPanel(); 
    //if(java.util.Arrays.asList(getComponents()).contains(pWykres)){ 
     //getContentPane().remove(pWykres); 
    //} 
    if(pWykres != null){ 
     pWykres.removeAll(); 
     pWykres.revalidate(); 
    } 

    String chartTitle = "Objects Movement Chart"; 
    String xAxisLabel = "X"; 
    String yAxisLabel = "Y"; 

    JFreeChart chart = ChartFactory.createXYLineChart(chartTitle, 
      xAxisLabel, yAxisLabel, dataset); 

    customizeChart(chart); 

    pWykres = new ChartPanel(chart); 
    getContentPane().add(pWykres, BorderLayout.CENTER); 
    setSize(620, 460); 
    //validate(); 
    pWykres.repaint(); 
} 
//endregion 
//...  
//region 
private void customizeChart(JFreeChart chart) { 
    XYPlot plot = chart.getXYPlot(); 
    XYSplineRenderer renderer; 
      renderer = new XYSplineRenderer(); 
      renderer.setSeriesShapesVisible(0, false); 

    // sets paint color for each series 
    renderer.setSeriesPaint(0, Color.RED); 

    // sets thickness for series (using strokes) 
    renderer.setSeriesStroke(0, new BasicStroke(1.0f)); 

    // sets paint color for plot outlines 
    //plot.setOutlinePaint(Color.BLUE); 
    //plot.setOutlineStroke(new BasicStroke(2.0f)); 

    // sets renderer for lines 
    plot.setRenderer(renderer); 

    // sets plot background 
    plot.setBackgroundPaint(Color.WHITE); 

    // sets paint color for the grid lines 
    plot.setRangeGridlinesVisible(true); 
    plot.setRangeGridlinePaint(Color.BLACK); 

    plot.setDomainGridlinesVisible(true); 
    plot.setDomainGridlinePaint(Color.BLACK); 
} 

ответ

3

Вы принимаете синус значений, которые всегда целые кратные 2 * PI, поэтому все эти значения будут (приблизительно) равна нулю, следовательно, ваш график будет выглядеть на плоской, если он не является масштабируются, чтобы отобразить эти крошечные значения (которые являются только ошибками с плавающей запятой).

x[i] = A * Math.sin(2 * Math.PI * f * i/Fs); 

, где A = 1 и f/Fs = 20 и i является целым числом

Например:

Math.sin(0)    // 0.0 
Math.sin(2 * Math.PI) // -2.4492935982947064E-16 (approximately zero) 
Math.sin(4 * Math.PI) // -4.898587196589413E-16 (approximately zero) 

Для того, чтобы увидеть характерную форму синусоидальной волны, необходимо варьировать вклад в функция sin с гораздо меньшими приращениями, например pi/10 или менее.

+0

Вы правы. Я не заметил. Я ошибся, выполняя формулу из моего старого кода на C#. Я просто удалил f из формулы, и теперь все отлично. – GarryMoveOut

Смежные вопросы