Page 1 of 1

wxFreeChart перерисовать график

Posted: Sun Feb 23, 2014 9:06 pm
by bvv12
У меня задача каждую секунду на экран вывести массив точек (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 раз в секунду, то графическое окно очень тормозится .

Re: wxFreeChart перерисовать график

Posted: Mon Feb 24, 2014 12:17 pm
by bishop.gis
Вот насколько я понял память на холст где рисуется графика выделяется однократно. Да и для значений не обязательно каждый раз выделять память - если их количество не меняется, а меняются только цифры - переписывайте прямо в памяти, а потом перерисовываейте контрол.

Re: wxFreeChart перерисовать график

Posted: Mon Feb 24, 2014 12:34 pm
by bvv12
bishop.gis wrote:Вот насколько я понял память на холст где рисуется графика выделяется однократно. Да и для значений не обязательно каждый раз выделять память - если их количество не меняется, а меняются только цифры - переписывайте прямо в памяти, а потом перерисовываейте контрол.
Да , количество вывода точек всегда одинаково (4000 точек). Надо массив за один раз перерисовать. Не очень понимаю как реализовать вашу идею. Могли бы показать пример кода? Я также добавил свой тестовый пример test.cpp, там есть функция RedrawData хотел в ней перерисовать график.

Re: wxFreeChart перерисовать график

Posted: Tue Feb 25, 2014 10:03 pm
by bvv12
В общем сделал, то что мне надо. Может кому пригодится.
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();