Форум: "Основная";
Текущий архив: 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