当前位置: 首页 > 面试题库 >

JFreeChart:DynamicTimeSeries,周期为n毫秒

史修明
2023-03-14
问题内容

我正在尝试定义一个接口,以在其中绘制外部设备接收到的一些值。这些值以可以通过接口设置的频率接收。当然,绘图的周期应根据用户定义的周期而改变。因此,我开始定义followint图表:

int periodMs = 200;
MilliDTSC dataset = new MilliDTSC(1,100, new MultipleOfMillisecond(periodMs));
dataset.setTimeBase(new MultipleOfMillisecond(periodMs))
dataset.addSeries(zeroSeries()),0,"Zero data") // zeroSeries returs a series with values set to 0
JFreeChart chart = createChart(dataset) // create the chart and set ranges and legends
ChartPanel panel = new ChartPanel(panel);

MilliDTSC是下面的类,如此处所示:

public class MilliDTSC extends DynamicTimeSeriesCollection{
  public MilliDTSC(int nSeries, int nMoments, RegularTimePeriod timeSample){
    super(nSeries, nMoments, timeSample);
    if(timeSample instanceof Millisecond)
      this.pointsInTime = new Millisecond[nMoments]
    else if (timeSample instanceof MultipleOfMillisecond)
      this.pointsInTime = new MultipleOfMillisecond[nMoments]
  }
}

MultipleOfMillisecond 是以下类别:

public class MultipleOfMilliseconds extends Millisecond{
  MulitpleOfMilliseconds(int periodMs){
    this.periodMs = periodMs
  }

  public RegularTimePeriod previous(){
    RegularTimePeriod result = null;
    if(getMillisecond() - periodMs >= FIRST_MILLISECOND_IN_SECOND)
      result = new Millisecond((int)getMillisecond - periodMs, getSecond());
    else{
      Second previous = (Second)getSecond().previous();
      if(previous!=null)
        result = new Millisecond((int)(getMillisecond() - periodMS + LAST_MILLISECOND_IN_SECOND + 1), previous);
    }
    return result;
  }
  // similar for next()
}

我通过以下方式将样本添加到系列中:

dataset.advanceTime();
dataset.appendData(newData);

我期望的是,一旦将周期固定为200毫秒,图表就会在X标签上报告大约5个时间值:

00:00:00.000 00:00:05.000 00:00:10.000 00:00:15.000 00:00:20.000

我希望每个“空间”中有25个样本。

相反,发生的是每个“空间”都有25个样本,但图表在X标签上报告了以下值:

00:00:00.000 00:00:00.025 00:00:00.050 00:00:00.075 00:00:00.100

似乎周期是1毫秒,但是我要添加200毫秒的采样。

我该如何解决这个问题?如果我不清楚,请告诉我。谢谢!!


问题答案:

我认为是因为您有:

public class MultipleOfMilliseconds extends Millisecond
//                                          ^^^^^^^^^^^

这是true

if(timeSample instanceof Millisecond)

如果您更改测试的顺序,那么可能会更好:

if(timeSample instanceof MultipleOfMillisecond)
  this.pointsInTime = new MultipleOfMillisecond[nMoments];
else if (timeSample instanceof Millisecond)
  this.pointsInTime = new Millisecond[nMoments];


 类似资料:
  • 问题内容: 我正在尝试定义一个必须每n毫秒更新一次的图表的applet。例如,每500毫秒。这是代码的一部分: 启动应用程序时,它返回第二行引发的NullPointerException。如果我将“毫秒”替换为“秒”,它将起作用。 问题是:如何设置无异常的n毫秒周期? 谢谢 问题答案: 似乎未针对初始化,但您可以在子类构造函数中进行初始化:

  • 问题内容: 我有一个等于日期的字符串,表示为自Unix纪元以来的毫秒数。 我正在尝试将其输出到dmY。 我得到的字符串是“ 1227643821310”,并被告知结果应等于 2-12-2008 ,但我不断得到的结果是 25-11-2008 我的代码如下: 关于为什么会这样的任何想法? 问题答案: 您已经做对了,1227643821根本不是2008年12月12日,的确是2008年11月25日。

  • 问题内容: 我对当前UTC时间以毫秒为单位不感兴趣,也无需弄乱时区。我的原始日期已经存储为UTC时间戳。 我在UTC时间“ 2012-06-14 05:01:25”中存储了一个日期。我对日期时间不感兴趣,但对日期部分感兴趣。因此,在用Java检索日期并排除小时,分钟和秒之后,我剩下的是“ 2012-06-14”。 如何将其转换为UTC毫秒? 问题答案: 编辑:我错过了“忽略一天中的时间”部分。它现

  • 我发现一个类似的问题张贴,但没有一个合适的答案。 我想有正弦波缓冲器,做音频合成,并想为缓冲器设计一个最佳大小,以避免在采样中测量的正弦波周期是非整数的伪影。 例如,正弦频率为4440.0Hz,采样率为44100,每1/440*44100个采样,或每100.22727272727272727272个采样重复一次。如果您简单地创建一个100(或101)个样本的循环缓冲区来包含一个正弦周期,那么回放会

  • 问题内容: 我正在开发节拍器应用程序。用户可以在运行时选择bpm,我的应用程序将相应地播放“滴答”声。“滴答”是一个节拍器“拍”(mp3)。我尝试使用Handler和MediaPlayer来实现它,但是节拍器一点也不精确。因此,我考虑了更改整个方法:当用户选择新的bpm值时,我通过每N毫秒重复X次滴答声,然后循环遍历此运行时创建的声音来合成新声音。这是有效的替代方法吗?如何在Android中实现?

  • 假设我有一些账单,上面有开始日期和结束日期。 我要检查的商业规则是 例如,3月10日到4月9日大约相隔一个月,所以我用它来检查任何两个连续的账单开始日期(4月10日和3月10日)是否相隔一个月。 现在我的问题是求周期的长度。例如,假设我有以下数据集 我正在使用JodaTime库,所以我说类似这样的话 它返回0,这是正确的,但没有用处。 结果是1,尽管相隔一天。 有什么更好的方法来做到这一点?我可以