![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Замена Chart - графика для слабых компьютеров? [D7, 95/98, XP]
Who_are_you? © (2014-04-24 14:58:00)При запуске программы на старом компе Pentium II, Win 98, ОЗУ-128 MБ получил огромные тормоза.
Стал анализировать и выяснил - то что летало на новом компе.
Это Chart. Ждать приходится около 3 минут.
Заремил с десяток строк, начинающиеся на Chart, - выполнение 2 секунды.
Посоветуйте как быстро (в смысле времени выполнения компьютером и времени написания программы) сделать графическое представление (X,Y) цифровых данных? Может у кого есть заготовки, Unit-ы ?
Who_are_you? (2014-06-04 21:55:00) [41]Сделал так:
Canvas.StretchDraw(Rect(0, 0, Bitmap.Width,Bitmap.Height), Bitmap);
работает.
Спасибо brother!
Who_are_you? (2014-06-04 21:50:00) [42]Заменил Bitmap.Canvas.StretchDraw
на
Canvas.draw(0,0,bitmap); //отрисовываем сам bitmap
и все заработало.
brother (2014-06-04 20:28:00) [43]И для начала добейтесь нормальной отрисовки по Button1Click, а уж потом всякие другие условия, ибо в FormResize например, не учитывается размер клиентской области формы...
brother (2014-06-04 20:22:00) [44]вы "стретчити" на самого себя, а надо на канву формы (или еще куда)...
Who_are_you? (2014-06-04 19:54:00) [45]Где-то грабли?
Даю, на всякие пожарные, весь текст.
// êàê ìèíèìóì, âûâîä ãðàôèêè íàäî áóôåðèçîâàòü.
// Ðèñîâàòü â Bitmap.Canvas, ïîòîì StretchDraw
unit pas_Low_Graf;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure GrOfFunc;
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
var
BitMap:TBitMap;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
BitMap:=TBitMap.Create;
// GrOfFunc;
end;
//********************************************************
Function f(x:real):real;
begin
f:=2*Sin(x)*exp(x/5);
end;
//********************************************************
// ñòðîèò ãðàôèê ôóíêöèè
procedure TForm1.GrOfFunc;
var
x1,x2:real; // ãðàíèöû èçìåíåíèÿ àðãóìåíòà ôóíêöèè
y1,y2:real; // ãðàíèöû èçìåíåíèÿ çíà÷åíèÿ ôóíêöèè
x:real; // àðãóìåíò ôóíêöèè
y:real; // çíà÷åíèå ôóíêöèè â òî÷êå õ
dx:real; // ïðèðàùåíèå àðãóìåíòà
l,b:integer; // ëåâûé íèæíèé óãîë îáëàñòè âûâîäà ãðàôèêà
w,h:integer; // øèðèíà è âûñîòà îáëàñòè âûâîäà ãðàôèêà
mx,my:real; // ìàñøòàá ïî îñÿì X è Y
x0,y0:integer; // òî÷êà - íà÷àëî êîîðäèíàò
begin // îáëàñòü âûâîäà ãðàôèêà
l:=10; // X - êîîðäèíàòà ëåâîãî âåðõíåãî óãëà
b:=Form1.ClientHeight-20; // Ó - êîîðäèíàòà ëåâîãî âåðõíåãî óãëà
h:=Form1.ClientHeight-40; // âûñîòà
w:=Form1.Width-40; // øèðèíà
x1:=0; // íèæíÿÿ ãðàíèöà äèàïàçîíà àðãóìåíòà
x2:=25; // âåðõíÿÿ ãðàíèöà äèàïàçîíà àðãóìåíòà
dx:=0.01; // øàã àðãóìåíòà
// íàéäåì ìàêñèìàëüíîå è ìèíèìàëüíîå çíà÷åíèÿ
// ôóíêöèè íà îòðåçêå [x1,x2]
y1:=f(x1); // ìèíèìóì
y2:=f(x1); //ìàêñèìóì
x:=x1;
repeat
y := f (x);
if y < y1 then y1:=y;
if y > y2 then y2:=y;
x:=x+dx;
until (x >= x2);
// âû÷èñëèì ìàñøòàá
my:=h/abs(y2-y1); // ìàñøòàá ïî îñè Y
mx:=w/abs(x2-x1); // ìàñøòàá ïî îñè X
x0:=1;
y0:=b-Abs(Round(y1*my)) ;
with Bitmap.Canvas do
//with Form1.Canvas do
begin // îñè
MoveTo(l,b);LineTo(l,b-h);
MoveTo(x0,y0);LineTo(x0+w,y0);
TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));
TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3));
// ïîñòðîåíèå ãðàôèêà
x:=x1;
repeat
y:=f(x);
Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed;
x:=x+dx;
until (x >= x2);
end;
end;
//********************************************************
procedure TForm1.FormPaint(Sender: TObject);
begin
GrOfFunc;
Bitmap.Canvas.StretchDraw(Rect(0, 0, Bitmap.Width,
Bitmap.Height), Bitmap);
end;
//********************************************************
// èçìåíèëñÿ ðàçìåð îêíà ïðîãðàììû
procedure TForm1.FormResize(Sender: TObject);
begin
// î÷èñòèòü ôîðìó
Bitmap.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
// ïîñòðîèòü ãðàôèê
GrOfFunc;
Bitmap.Canvas.StretchDraw(Rect(0, 0, Bitmap.Width,
Bitmap.Height), Bitmap);
end;
//********************************************************
procedure TForm1.Button1Click(Sender: TObject);
begin
GrOfFunc;
Bitmap.Canvas.StretchDraw(Rect(0, 0, Bitmap.Width,
Bitmap.Height), Bitmap);
end;
end.
Who_are_you? (2014-06-04 19:44:00) [46]junglecat (25.04.14 09:50) [11]
как минимум, вывод графики надо буферизовать. Рисовать в Bitmap.Canvas, потом StretchDraw
Заменил в тексте, что выше with Canvas do
на
with Bitmap.Canvas do
и сделал вывод
Bitmap.Canvas.StretchDraw(Rect(0, 0, Bitmap.Width,
Bitmap.Height), Bitmap);
- в результате форма белая: графика нет.
Пожалуйста, предложите 5 строчек рабочих рисования Bitmap.Canvas и отображения Bitmap.Canvas.StretchDraw
kilkennycat (2014-04-25 18:56:00) [47]
> у меня на экране 2304000 точек.
а матрица глаз?
junglecat (2014-04-25 09:50:00) [48]как минимум, вывод графики надо буферизовать. Рисовать в Bitmap.Canvas, потом StretchDraw
Who_are_you? (2014-04-25 09:36:00) [49]C критикой согласен.
Цифру бросил необдуманно.
Посмотрел на график - больше 1000 на каждый график не нужно.
Значит до ~1000 выводим в реальном времени, а более 1кГц - фрагментально или с запоминанием и дальнейшем выводе.
Пока нашел в инете такое предложение:
(автор не известен, а автор комментария Алексей Легкунец, Королевство Delphi)
unit Graf;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormPaint(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Function f(x:real):real;
begin
f:=2*Sin(x)*exp(x/5);
end;
// строит график функции
procedure GrOfFunc;
var
x1,x2:real; // границы изменения аргумента функции
y1,y2:real; // границы изменения значения функции
x:real; // аргумент функции
y:real; // значение функции в точке х
dx:real; // приращение аргумента
l,b:integer; // левый нижний угол области вывода графика
w,h:integer; // ширина и высота области вывода графика
mx,my:real; // масштаб по осям X и Y
x0,y0:integer; // точка - начало координат
begin // область вывода графика
l:=10; // X - координата левого верхнего угла
b:=Form1.ClientHeight-20; //У - координата левого верхнего угла
h:=Form1.ClientHeight-40; // высота
w:=Form1.Width-40; // ширина
x1:=0; // нижняя граница диапазона аргумента
x2:=25; // верхняя граница диапазона аргумента
dx:=0.01; // шаг аргумента
// найдем максимальное и минимальное значения
// функции на отрезке [x1,x2]
y1:=f(x1); // минимум
y2:=f(x1); //максимум
x:=x1;
repeat
y := f (x);
if y < y1 then y1:=y;
if y > y2 then y2:=y;
x:=x+dx; until (x >= x2);
// вычислим масштаб
my:=h/abs(y2-y1); // масштаб по оси Y
mx:=w/abs(x2-x1); // масштаб по оси X
x0:=1;
y0:=b-Abs(Round(y1*my)) ;
with form1.Canvas do
begin // оси
MoveTo(l,b);LineTo(l,b-h);
MoveTo(x0,y0);LineTo(x0+w,y0);
TextOut(l+5,b-h,FloatToStrF(y2,ffGeneral,6,3));
TextOut(l+5,b,FloatToStrF(y1,ffGeneral,6,3));
// построение графика
x:=x1; repeat
y:=f(x);
Pixels[x0+Round(x*mx),y0-Round(y*my)]:=clRed;
x:=x+dx;
until (x >= x2);
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
GrOfFunc; end;
// изменился размер окна программы
procedure TForm1.FormResize(Sender: TObject);
begin
// очистить форму
form1.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
// построить график
GrOfFunc;
end;
end.
Продолжаю поиски. Что взять за основу или самому придумать - еще не решил.
Всем, кто уже отозвался - большое спасибо.
Ega23 (2014-04-24 20:45:00) [50]
> то каким зрением должен обладать смотрящий, чтобы хоть
> что-то осознать?
Дискретным.
junglecat (2014-04-24 19:20:00) [51]даже если представить, что вдруг получилось вывести на монитор 16000 точек/сек, то каким зрением должен обладать смотрящий, чтобы хоть что-то осознать?
Ega23 (2014-04-24 18:59:00) [52]
> а как вообще можно увидеть 16000 точек на одном экране?
Ну, допустим, у меня на экране 2304000 точек. В принципе, влезет порядка 150 таких графиков.
Но зачем?
Jeer (2014-04-24 18:55:00) [53]>А выводить нужно 4 графика от 100 до 16 000 точек в секунду ( >дискретизация 100Гц -16 кГц).
Интересно, как это Вы собираетесь выводить графики с частотой 16 кГц ?
junglecat (2014-04-24 17:31:00) [54]а как вообще можно увидеть 16000 точек на одном экране?
Ega23 (2014-04-24 17:16:00) [55]Зачем 16000 точек на графике? Нельзя упростить?
Who_are_you? (2014-04-24 17:10:00) [56]А выводить нужно 4 графика от 100 до 16 000 точек в секунду ( дискретизация 100Гц -16 кГц).
junglecat (2014-04-24 16:18:00) [57]а у чарта нет чего-нить типа beginupdate / endupdate на время обновления?
MBo (2014-04-24 15:31:00) [58]Выводить не все данные, а выборку из них
Если в чарт сто тысяч точек выводить, постоянно обновляя, то и новый комп будет тормозить