Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

Сглаживание графиков в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.121 c
8-1096127059
maxXP
2004-09-25 19:44
2004.12.19
Изменение размера видео при воспроизведении


14-1101463912
MBo
2004-11-26 13:11
2004.12.19
Пятничные задачи. Очередные проблемы Васи Пупкина


4-1099291899
Dimka_a
2004-11-01 09:51
2004.12.19
Как узнать размер файла?


3-1100614292
CHTR
2004-11-16 17:11
2004.12.19
Не могу вытащить картинку из BLOB поля


1-1102058321
dream
2004-12-03 10:18
2004.12.19
Проблема с TreeView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский