C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Добавить математику в цикл  (Прочитано 2347 раз)
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Добавить математику в цикл
« : 15 Сентябрь 2015, 11:19:56 »

График строиться с большим кол-вом точек. Хочется сохранить прямые линии на графике и при этом не выводить все точки.
Если расскоментировать строчки в цикле ниже, то теряются прямые участки на графике в этом втором цикле.
Можно ли как-то модифицировать цикл, чтобы убирать точки с одинаковыми показаниями, но при этом сохранить достоверность графика (прямые линии/возрастание/убывание). Было бы идеально не выводить точки в красной рамке на рисунке.
Спасибо.
Код
int i;
double Val = 0;
double PreviosVal = 0;
TDateTime Head;
for(i = 0; i UniMainModule()->ClientDataSetGraphic->RecordCount; i++)
{
 
 Val = UniMainModule()->ClientDataSetGraphic->FieldByName(L"temperature")->AsFloat;
 Head = UniMainModule()->ClientDataSetGraphic->FieldByName(L"curenttime")->AsDateTime;
 //if(PreviosVal != Val)
UniLineSeries1->Add(Val, Head);
 
 //PreviosVal = Val;
 UniMainModule()->ClientDataSetGraphic->Next();
}
 
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Добавить математику в цикл
« Ответ #1 : 15 Сентябрь 2015, 12:52:09 »

Средствами чарта никак. Это просто отображалка.
Надо самому выводя очередную точку сравнить её ординату с прошлой - если не изменилась, то и не выводить.
Добавлять точки конечно же методом AddXY чтобы абсцисса указывалась принудительно.

Твой код кажется так и делает.. Значит сравнивать нужно на попадание в диапазон:
if (fabs(last-current) > delta) то добавляем точку
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Добавить математику в цикл
« Ответ #2 : 15 Сентябрь 2015, 14:55:32 »

А что если "бегать" по точкам ClientDataSet-а?
Правда график совсем по другому теперь выглядит.  
Код
 int i;
double Val = 0;
TDateTime Head;
for(i = 0; i UniMainModule()->ClientDataSetGraphic->RecordCount; i++)
{
 //первая точка
 if(i == 0)
 {
  Val = UniMainModule()->ClientDataSetGraphic->FieldByName(L"temperature")->AsFloat;
  Head = UniMainModule()->ClientDataSetGraphic->FieldByName(L"curenttime")->AsDateTime;
  UniLineSeries1->Add(Val, Head);
  UniMainModule()->ClientDataSetGraphic->Next();
 }
 
 if(i != UniMainModule()->ClientDataSetGraphic->RecordCount)
{
//анализ точки и ее окружения
//текущая точка
double DotNow = UniMainModule()->ClientDataSetGraphic->FieldByName(L"temperature")->AsFloat;
//предыдущая точка
UniMainModule()->ClientDataSetGraphic->Prior();
double DotPrevious = UniMainModule()->ClientDataSetGraphic->FieldByName(L"temperature")->AsFloat;
//точка после текущей
UniMainModule()->ClientDataSetGraphic->Next();
UniMainModule()->ClientDataSetGraphic->Next(); //встать на следущую точку
double DotNext = UniMainModule()->ClientDataSetGraphic->FieldByName(L"temperature")->AsFloat;
//и вернуться к текущей
UniMainModule()->ClientDataSetGraphic->Prior();
if(DotNow == DotPrevious && DotNow == DotNext)
  {
UniMainModule()->ClientDataSetGraphic->Next();
continue;
  }
 
 Head = UniMainModule()->ClientDataSetGraphic->FieldByName(L"curenttime")->AsDateTime;
 UniLineSeries1->Add(DotNow, Head);
 
}
 
 UniMainModule()->ClientDataSetGraphic->Next();
 
}
 
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Добавить математику в цикл
« Ответ #3 : 15 Сентябрь 2015, 16:03:32 »

По моему что-то не правильно. А что если точек всего две или три...
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Добавить математику в цикл
« Ответ #4 : 15 Сентябрь 2015, 16:17:25 »

Задача поставлена некорректно. Что значит много точек, мало точек.... Хочется-то чего?

На чарте линейные участки (не только горизонтальные) можно описывать лишь двумя крайними точками. Линию между ними он и сам нарисует.

Если точек всего две, то и выкидать нечего.
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Добавить математику в цикл
« Ответ #5 : 15 Сентябрь 2015, 16:52:44 »

Код
Хочется-то чего?

Того, что показано в первом посте на рисунке. Откинуть точки на прямых участках. Я так понимаю достоверность графика не нарушиться если будут откинуты одинаковые значения на прямых участках.
Если подводные камни в этом коде:
Код
int i;
double Val = 0;
TDateTime Head;
double DotNow = 0;
double DotPrevious = 0;
double DotNext = 0;
 
for(i = 0; i UniMainModule()->ClientDataSetGraphic->RecordCount; i++)
{
 //если только три точки - все их и выводим
 if(UniMainModule()->ClientDataSetGraphic->RecordCount 3)
  {
Val = UniMainModule()->ClientDataSetGraphic->FieldByName(L"temperature")->AsFloat;
Head = UniMainModule()->ClientDataSetGraphic->FieldByName(L"curenttime")->AsDateTime;
UniLineSeries1->Add(Val, Head);
UniMainModule()->ClientDataSetGraphic->Next();
continue;
  }
 
 //сюда попадаем если точек больше чем три и
 //первую точку надо нарисовать и перейти на вторую
 if(i == 0)
 {
  Val = UniMainModule()->ClientDataSetGraphic->FieldByName(L"temperature")->AsFloat;
  Head = UniMainModule()->ClientDataSetGraphic->FieldByName(L"curenttime")->AsDateTime;
  UniLineSeries1->Add(Val, Head);
  UniMainModule()->ClientDataSetGraphic->Next();
  continue;
 }
 
 //если точка последняя нарисуем ее без анализа
 if(i == UniMainModule()->ClientDataSetGraphic->RecordCount)
 {
  Val = UniMainModule()->ClientDataSetGraphic->FieldByName(L"temperature")->AsFloat;
  Head = UniMainModule()->ClientDataSetGraphic->FieldByName(L"curenttime")->AsDateTime;
  UniLineSeries1->Add(Val, Head);
  //UniMainModule()->ClientDataSetGraphic->Next();
  break;
 }
 
 //сюда попадаем если точек больше трех и делаем анализ значений
 //анализ точки и ее окружения
//текущая точка
DotNow = UniMainModule()->ClientDataSetGraphic->FieldByName(L"temperature")->AsFloat;
//предыдущая точка
UniMainModule()->ClientDataSetGraphic->Prior();
DotPrevious = UniMainModule()->ClientDataSetGraphic->FieldByName(L"temperature")->AsFloat;
//точка после текущей
UniMainModule()->ClientDataSetGraphic->Next(); //вернемся на текущую
UniMainModule()->ClientDataSetGraphic->Next(); //встать на следущую точку
DotNext = UniMainModule()->ClientDataSetGraphic->FieldByName(L"temperature")->AsFloat;
 
//и вернуться к текущей для дальнейшей работы цикла
UniMainModule()->ClientDataSetGraphic->Prior();
 
//анализ и откидывание повторяющихся значений
if(DotNow == DotPrevious && DotNow == DotNext)
  {
UniMainModule()->ClientDataSetGraphic->Next();
continue;
  }
 
//рисуем если есть отличия
Head = UniMainModule()->ClientDataSetGraphic->FieldByName(L"curenttime")->AsDateTime;
UniLineSeries1->Add(DotNow, Head);
 
 
 UniMainModule()->ClientDataSetGraphic->Next();
}
 
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Добавить математику в цикл
« Ответ #6 : 15 Сентябрь 2015, 18:23:07 »

Сорри, пытать код некогда. Но "достоверность" действительно не нарушится.
А зачем вообще нужно выкидывать точки? Хочется показать моменты измерения узлами?
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Добавить математику в цикл
« Ответ #7 : 15 Сентябрь 2015, 18:38:41 »

Цитировать
А зачем вообще нужно выкидывать точки?

Потому что в реальности точек может быть ОЧЕНЬ много - долгое построение, каша и т.п.

P.S.
Нет мой код вроде не до конца правильный...
« Последнее редактирование: 15 Сентябрь 2015, 19:22:03 от SilverFish » Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Добавить математику в цикл
« Ответ #8 : 16 Сентябрь 2015, 10:25:55 »

Мой алгоритм становиться бесполезным, если все показания разные. На рисунке ниже график с разными показаниями и огромным числом точек. Все точки выводятся на график. Точки перекрывают друг друга, отсюда и жирные линии.
Можно ли придумать алгоритм, что если точка перекрывает соседнюю, то не выводить ее? Хотелось бы иметь график, на котором точки бы не перекрывали друг друга. Может надо анализировать размер чарта в пикселях и размер точки в пикселях и как-то это использовать?
Как правильно решить такую задачу?
Спасибо.
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Добавить математику в цикл
« Ответ #9 : 17 Сентябрь 2015, 09:22:59 »

Ну так а зачем же тогда выводить эти кружочки если их хочется частично выбросить?
Оставить одну лишь линию.
Вопрос редактирования данных для их отображения "интимен". Он зависит от чувства прекрасного, технических требований и физического обоснования этих данных ))
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


« Ответ #10 : 17 Сентябрь 2015, 11:01:30 »

Ничего не поняла из вашего сообщения.
Повторюсь: как получить похожий график, без наложения точек друг на друга? Какой алгоритм поможет понять, что точка перекрывает соседнию и ее тогда надо отбросить?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.134 секунд. Запросов: 21.