У меня задача каждую секунду на экран вывести массив точек (4000шт).
В примерах библиотеки я увидел
plot = new XYPlot();
dataset = new XYSimpleDataset();
dataset->AddSerie((double *) data, WXSIZEOF(data))
Посмотрев на функцию AddSerie я у видел что выделяется каждый раз память.
void XYSimpleDataset::AddSerie(double *data, size_t count)
{
AddSerie(new XYSerie(data, count));
}
А как выделить один раз память память с помощью AddSerie(new XYSerie(data, count));
а потом рисовать новый график используя эту же область выделенной памяти, только менять значения элементов ?
Пробовал по точечно строить график с помощью функции series->AddXY(xi, y); вызывал в цикле 4000 раз в секунду, то графическое окно очень тормозится .
wxFreeChart перерисовать график Topic is solved
- bishop.gis
- Earned a small fee
- Posts: 20
- Joined: Fri May 25, 2012 6:47 pm
Re: wxFreeChart перерисовать график
Вот насколько я понял память на холст где рисуется графика выделяется однократно. Да и для значений не обязательно каждый раз выделять память - если их количество не меняется, а меняются только цифры - переписывайте прямо в памяти, а потом перерисовываейте контрол.
Re: wxFreeChart перерисовать график
Да , количество вывода точек всегда одинаково (4000 точек). Надо массив за один раз перерисовать. Не очень понимаю как реализовать вашу идею. Могли бы показать пример кода? Я также добавил свой тестовый пример test.cpp, там есть функция RedrawData хотел в ней перерисовать график.bishop.gis wrote:Вот насколько я понял память на холст где рисуется графика выделяется однократно. Да и для значений не обязательно каждый раз выделять память - если их количество не меняется, а меняются только цифры - переписывайте прямо в памяти, а потом перерисовываейте контрол.
Re: wxFreeChart перерисовать график
В общем сделал, то что мне надо. Может кому пригодится.
1) Добавил свою функцию ChangeData в библиотечный класс XYSerie:
void XYSerie::ChangeData (double *data, size_t count)
{
if (m_data != NULL) {
wxDELETEA(m_data);
m_data = new double[2 * count];
memcpy(m_data, data, 2 * count * sizeof(double));
m_count = count;
}
}
2) Модифицировал деструктор
XYSerie::~XYSerie()
{
if (m_data != NULL)
wxDELETEA(m_data);
}
3) Теперь перерисовать можно вот так (более потробно в прикреплённом файле)
dataset->BeginUpdate();
series->ChangeData((double *) data, WXSIZEOF(data));
dataset->EndUpdate();
1) Добавил свою функцию ChangeData в библиотечный класс XYSerie:
void XYSerie::ChangeData (double *data, size_t count)
{
if (m_data != NULL) {
wxDELETEA(m_data);
m_data = new double[2 * count];
memcpy(m_data, data, 2 * count * sizeof(double));
m_count = count;
}
}
2) Модифицировал деструктор
XYSerie::~XYSerie()
{
if (m_data != NULL)
wxDELETEA(m_data);
}
3) Теперь перерисовать можно вот так (более потробно в прикреплённом файле)
dataset->BeginUpdate();
series->ChangeData((double *) data, WXSIZEOF(data));
dataset->EndUpdate();
- Attachments
-
- test_ok.cpp
- (1.69 KiB) Downloaded 266 times