Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

Сглаживание графиков в TChart.   Найти похожие ветки 

 
ньюбик   (2004-12-01 18:43) [0]

Имеется массив из N точек (N как правило колеблется от 10 до 20).
Получается ломаная на графике. Как бы её сгладить? Интересует простенький алгоритм (а ещё лучше функция, возвращающая массив из N*5 (или *4, *6, *7 или вообще параметризировать) точек... Если бы в этой функции были параметры, в зависимости от которых характер сглаживания меняется - было бы вообще замечательно.


 
begin...end ©   (2004-12-01 18:46) [1]

> ньюбик   (01.12.04 18:43)

> Получается ломаная на графике. Как бы её сгладить?

Аппроксимировать. Чем - это зависит от характера зависимости, которую эту ломаная выражает.


 
ньюбик   (2004-12-01 19:07) [2]

>begin...end ©   (01.12.04 18:46)
>это зависит от характера зависимости, которую эту ломаная выражает.

Характер зависимости... хм. Дело в том, что никакой зависимости как бы нет :) Зависимости, выраженной какой-то четко-заданной функцией нету. Данные - это, например, величина дохода предприятия от времени.. Настолько многофакторная штука, что я не берусь судить о характере зависимости.
Пример:
http://sailor.1gb.ru/other/delphi/ex_graph.gif

Мне не нужно очень точно. Простенький алгоритмик... подскажите пожалуйста.


 
begin...end ©   (2004-12-01 19:12) [3]

> [2] ньюбик   (01.12.04 19:07)

Да вот в том то и дело, что простеньким тут, ИМХО, не обойтись... Может, сплайны...


 
Molchanov   (2004-12-01 19:41) [4]

Код не мой, где взял - не помню. Работает

type
 tSmoothLevel = (Smooth3, Smooth5, Smooth7);
 taSmooth = array [0..1023] of Double;

Function Smooth (MaxI: SmallInt; Level: tSmoothLevel; Yi: taSmooth): taSmooth;
var i: SmallInt;
   Smoo: taSmooth;
begin
 Case Level of
   Smooth3 : begin
 for i:=0 to MaxI-1 do begin
   If i = 0 then Smoo[i] := (5*Yi[i] + 2*Yi[i+1] - Yi[i+2]) / 6
   else if i = MaxI-1 then Smoo[i] := (5*Yi[i] + 2*Yi[i-1] - Yi[i-2]) / 6
   else  Smoo[i] := (Yi[i] + Yi[i-1] + Yi[i+1]) / 3;
 end;
      end;
   Smooth5 : begin
 for i:=0 to MaxI-1 do begin
   If i = 0 then
     Smoo[i] := (3*Yi[i] + 2*Yi[i+1] + Yi[i+2] - Yi[i+4]) / 5
   else If i = MaxI-1 then
     Smoo[i] := (3*Yi[i] + 2*Yi[i-1] + Yi[i-2] - Yi[i-4]) / 5
   else if i = 1 then
     Smoo[i] := (4*Yi[i-1] + 3*Yi[i] + 2*Yi[i+1] + Yi[i+2]) / 10
   else if i = MaxI-2 then
     Smoo[i] := (4*Yi[i+1] + 3*Yi[i] + 2*Yi[i-1] + Yi[i-2]) / 10
   else Smoo[i] := (Yi[i-2] + Yi[i-1] + Yi[i] + Yi[i+1] + Yi[i+2]) / 5;
 end;
      end;
   Smooth7 : begin
 for i:=0 to MaxI-1 do begin
   If i = 0 then Smoo[i] :=
     (39*Yi[i] + 8*Yi[i+1] - 4*(Yi[i+2] + Yi[i+3] - Yi[i+4]) + Yi[i+5] - 2*Yi[i+6]) / 42
   else if i = MaxI-1 then Smoo[i] :=
     (39*Yi[i] + 8*Yi[i-1] - 4*(Yi[i-2] + Yi[i-3] - Yi[i-4]) + Yi[i-5] - 2*Yi[i-6]) / 42
   else if i = 1 then Smoo[i] :=
     ( 8*Yi[i-1] + 19*Yi[i] + 16*Yi[i+1] + 6*Yi[i+2] - 4*Yi[i+3] - 7*Yi[i+4] + 4*Yi[i+5]) / 42
   else if i = MaxI-2 then Smoo[i] :=
     ( 8*Yi[i+1] + 19*Yi[i] + 16*Yi[i-1] + 6*Yi[i-2] - 4*Yi[i-3] - 7*Yi[i-4] + 4*Yi[i-5]) / 42
   else if i = 2 then Smoo[i] :=
     (-4*Yi[i-2] + 16* Yi[i-1] + 19*Yi[i] + 12*Yi[i+1] + 2*Yi[i+2] - 4*Yi[i+3] + Yi[i+4]) / 42
   else if i = MaxI-3 then Smoo[i] :=
     (-4*Yi[i+2] + 16* Yi[i+1] + 19*Yi[i] + 12*Yi[i-1] + 2*Yi[i-2] - 4*Yi[i-3] + Yi[i-4]) / 42
   else Smoo[i] :=
     ( 7*Yi[i] + 6*(Yi[i+1] + Yi[i-1]) + 3*(Yi[i-2] + Yi[i+2]) - 2*(Yi[i-3] + Yi[i+3])) / 21;
   end;
      end;
 end;
 Result := Smoo;
end;


 
ньюбик   (2004-12-01 23:21) [5]

2 Molchanov:

Спасибо большое! Это уже что-то! Правда немного не то, что мне было нужно...

Было:
http://sailor.1gb.ru/other/delphi/ex_graph.gif
Стало:
http://sailor.1gb.ru/other/delphi/ex_graph2.gif

Т.е. в этом алгоритме выходных точек столько же сколько входных. И делает он именно сглаживание (т.е. убирает резкие колебания).

Мне же нужно было несколько не это. Мне нужен такой алгоритм, чтобы увеличивал кол-во точек в несколько раз. За счет апроксимаций или чего-то ещё - не знаю. Чтобы был график более гладкий, "круглый", детальный.. Так что вопрос остается открытым. Но всё равно спасибо.


 
Ньюбик   (2004-12-03 17:38) [6]

Помучался немножко, и сделал:)
Было:
http://sailor.1gb.ru/other/delphi/ex_graph.gif
Стало:
http://sailor.1gb.ru/other/delphi/ex_graph3.gif

Всем спасибо :)



Страницы: 1 вся ветка

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.037 c
14-1101837012
maxz
2004-11-30 20:50
2004.12.19
зарубежные софт-каталоги


14-1101507416
Homa_Programer
2004-11-27 01:16
2004.12.19
авось поможет


14-1101812533
by
2004-11-30 14:02
2004.12.19
Монархия или демократия. Когда мы пошли в разные стороны?


1-1102070708
Mishenka
2004-12-03 13:45
2004.12.19
Компонент с PopupMenu


14-1101399274
vopros
2004-11-25 19:14
2004.12.19
Иду на Зенит через 30 минут