![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сглаживание графиков [D7, WinXP]
x.pro © (2005-10-16 21:42:00)Здравствуйте, уважаемые!
У меня такая проблема. Я строю график на TImage. Координаты точек беру из ListView.
// принцип такой:
x := listview1.items[i].caption;
y := listview1.items[i].subitems[0];
image1.moveto(x,y)
график получается не гладкий. А мне его нужно таковым сделать. Вопрос: как?
спасибо!
GanibalLector (2005-10-17 02:00:00) [1]Вот еще :
http://www.google.ru/groups?hl=ru&lr=&ie=UTF-8&group=borland.public.delphi.graphics
http://www.google.ru/groups?hl=ru&lr=&ie=UTF-8&group=comp.graphics.algorithms
http://www.antigrain.com/
Германн (2005-10-17 01:17:00) [2]2 x.pro (16.10.05 21:42)
В твоём случае требуется некий "алгоритм интерполяции". Вот это и ищи в поисковиках.
Ответ GanibalLector © (17.10.05 00:01) [3] - есть лишь один из множества вариантов реализации сабжа.
Не в упрек GanibalLector ©, а просто в дополнение, нет универсального алгоритма интерполяции! :(
Fenik (2005-10-17 00:44:00) [3]> GanibalLector © (17.10.05 00:01) [3]
> P.S.Автор : Рыба © (04.09.04 20:06) [5]
Блин, мои клоны меня преследуют.. Автор не Рыба. Я это как Рыба заявляю :)))
А нашел я эту функцию вот здесь - http://homepages.borland.com/efg2lab/Library/UseNet/2001/0504c.txt
x.pro (2005-10-17 00:03:00) [4]СПАСИБО!!!!!
GanibalLector (2005-10-17 00:01:00) [5]
procedure DrawCubicCurve(Canvas: TCanvas; const Points: array of TPoint; Steps: cardinal);
function Interpolate(const p1, p2, p3, p4: TPoint; t: single): TPoint;
function cubic(v1, v2, v3, v4, t: single): single;
begin
result:= v2 + t*((-v1 + v3) +
t*((2*v1 - 2*v2 + v3 - v4) +
t*(-v1 + v2 - v3 + v4)));
end;
begin
Result.x:= round(cubic(p1.x, p2.x, p3.x, p4.x, t));
Result.y:= round(cubic(p1.y, p2.y, p3.y, p4.y, t));
end;
var
i, s: integer;
p, p1, p2, p3, p4: TPoint;
begin
if Length(Points) < 2 then
exit;
Canvas.MoveTo(Points[0].x, Points[0].y);
p2:= Points[0];
p3:= Points[0];
p4:= Points[1];
for i:= 0 to High(Points)-1 do
begin
p1:= p2;
p2:= p3;
p3:= p4;
if i+2 < Length(Points) then
p4:= Points[i+2];
for s:= 1 to Steps do begin
p:= Interpolate(p1, p2, p3, p4, s / Steps);
Canvas.LineTo(p.x, p.y);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
DrawCubicCurve(Image1.Canvas,[Point(5,50),Point(50,20),Point(100,150),Point(150,50)],1);
DrawCubicCurve(Image2.Canvas,[Point(5,50),Point(50,20),Point(100,150),Point(150,50)],5); почувствуй разницу
end;
// чем выше Step тем лучше "гладит"
P.S.Автор : Рыба © (04.09.04 20:06) [5]
x.pro (2005-10-16 22:40:00) [6]Да не принципиально, от куда я беру координаты! Какой мне алгоритм нужно выписать, что бы получилось сглаживание графика? Его то я научился строить, а вот сгладить его это уже больное место....
в listview я просто вношу координаты точек и по ним уже строю.
Fenik (2005-10-16 22:32:00) [7]Не оттуда координаты берешь.