Главная страница
    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.037 c
1-1102367669
Поручик
2004-12-07 00:14
2004.12.19
Что-то я торможу (


9-1092932198
JUS
2004-08-19 20:16
2004.12.19
Дайте ссылку, где я могу скачать компоненту PowerDraw 3


1-1102076409
Mouserx
2004-12-03 15:20
2004.12.19
Помогите состыковатся с DLL написаной на C


1-1102438089
redlord
2004-12-07 19:48
2004.12.19
как в delphi использовать двоичное представление числа


3-1100772558
MakNik
2004-11-18 13:09
2004.12.19
dxDBGrid





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский