Web 開発用の C ライブラリである Wt を使用して、.wav ファイルをアップロードし、その値をグラフに出力しようとしています。それを動的に行う方法、つまり、既に作成されているチャートにポイントを追加する方法はありますか?
2 に答える
はい、それを行う方法があります。Windows タスク マネージャーの [パフォーマンス] タブのように、メモリの使用状況を監視し、その情報をグラフに出力するコードを書いたことがあります。ブーストスレッドを使用して継続的に更新しました。チャートの問題を正しい方向に導く可能性のあるコードを次に示します。
WCartesianChart が必要です
Wt::Chart::WCartesianChart* _chart_memory_display;
さて、チャートの初期化は実際には非常にトリッキーです。それを行う関数を書きました。注:これは #define PERFORMANCE_HISTORY 100 を使用します。これはチャートが格納するデータの量です。制限がないことを知っている限り、最後の 100 ポイントが必要でした。
Wt::Chart::WCartesianChart* CreateCartesianChart(WContainerWidget* parent)
{
WStandardItemModel *model = new WStandardItemModel(PERFORMANCE_HISTORY, 2, parent);
//Create the scatter plot.
Wt::Chart::WCartesianChart* chart = new Wt::Chart::WCartesianChart(parent);
//Give the chart an empty model to fill with data
chart->setModel(model);
//Set which column holds X data
chart->setXSeriesColumn(0);
//Get the axes
Wt::Chart::WAxis& x_axis = chart->axis(Wt::Chart::Axis::XAxis);
Wt::Chart::WAxis& y1_axis = chart->axis(Wt::Chart::Axis::Y1Axis);
Wt::Chart::WAxis& y2_axis = chart->axis(Wt::Chart::Axis::Y2Axis);
//Modify axes attributes
x_axis.setRange(0, PERFORMANCE_HISTORY);
x_axis.setGridLinesEnabled(true);
x_axis.setLabelInterval(PERFORMANCE_HISTORY / 10);
y1_axis.setRange(0, 100);
y1_axis.setGridLinesEnabled(true);
y1_axis.setLabelInterval(10);
y2_axis.setRange(0, 100);
y2_axis.setVisible(true);
y2_axis.setLabelInterval(10);
//Set chart type
chart->setType(Wt::Chart::ChartType::ScatterPlot);
// Typically, for mathematical functions, you want the axes to cross at the 0 mark:
chart->axis(Wt::Chart::Axis::XAxis).setLocation(Wt::Chart::AxisValue::ZeroValue);
chart->axis(Wt::Chart::Axis::Y1Axis).setLocation(Wt::Chart::AxisValue::ZeroValue);
chart->axis(Wt::Chart::Axis::Y2Axis).setLocation(Wt::Chart::AxisValue::ZeroValue);
// Add the lines
Wt::Chart::WDataSeries s(1, Wt::Chart::SeriesType::LineSeries);
chart->addSeries(s);
//Size the display size of the chart, has no effect on scale
chart->resize(300, 300);
return chart;
}
基本的に、WT チャートにはモデルと、データを受け取る準備ができたデータ系列が必要です。認識できない関数のドキュメントを読むことを強くお勧めします。ピースをまとめるのに時間がかかりました。また、WT ウィジェット ギャラリーもチェックしてください。チャートとコード サンプルがあります。
さて、実際の更新のために、別の関数を書きました。
void UpdateChartDisplay(Wt::WAbstractItemModel* data_model, double data)
{
//Update the old data
for(unsigned int i = 0; i < PERFORMANCE_HISTORY; i++)
{
//Move all data back one index
data_model->setData(i, 0, i);
data_model->setData(i, 1, data_model->data(i+1, 1));
}
//Get the last index of the data
int insertion_point = PERFORMANCE_HISTORY - 1;
//Insert new data at the last index
data_model->setData(insertion_point, 0, insertion_point);
data_model->setData(insertion_point, 1, data);
}
ここで、data_model は、更新中のチャートの単なるモデルです。
_chart_memory_display->model()
入ってくる二重は、グラフに追加されているデータそのものです。毎秒この関数を呼び出して新しいデータを渡すブーストスレッドがあります。実行中はタスクマネージャーとまったく同じように見えます。動的に更新しようとしているのか、単にデータを入力しようとしているのかはわかりませんが、これが役に立ち、正しい方向に進むことを願っています!
モデルがあり、そのモデルを更新すると、グラフがビューとして自動的に更新されると思います。
独自のモデルを作成し、そこでビジネス ロジックを実行します。Wt にグラフ ビューを処理させます。