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

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
bvv12
In need of some credit
In need of some credit
Posts: 6
Joined: Mon Dec 30, 2013 3:08 pm

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

Post by bvv12 » Sun Feb 23, 2014 9:06 pm

У меня задача каждую секунду на экран вывести массив точек (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 раз в секунду, то графическое окно очень тормозится .
Attachments
test.cpp
(1.65 KiB) Downloaded 145 times
Last edited by bvv12 on Mon Feb 24, 2014 12:26 pm, edited 1 time in total.

User avatar
bishop.gis
Earned a small fee
Earned a small fee
Posts: 20
Joined: Fri May 25, 2012 6:47 pm

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

Post by bishop.gis » Mon Feb 24, 2014 12:17 pm

Вот насколько я понял память на холст где рисуется графика выделяется однократно. Да и для значений не обязательно каждый раз выделять память - если их количество не меняется, а меняются только цифры - переписывайте прямо в памяти, а потом перерисовываейте контрол.

bvv12
In need of some credit
In need of some credit
Posts: 6
Joined: Mon Dec 30, 2013 3:08 pm

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

Post by bvv12 » Mon Feb 24, 2014 12:34 pm

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

bvv12
In need of some credit
In need of some credit
Posts: 6
Joined: Mon Dec 30, 2013 3:08 pm

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

Post by bvv12 » Tue Feb 25, 2014 10:03 pm

В общем сделал, то что мне надо. Может кому пригодится.
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 182 times

Post Reply