Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Замена Chart - графика для слабых компьютеров? [D7, 95/98, XP]


Страницы:   1 2 3

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]

Выводить не все данные, а выборку из них

Если в чарт сто тысяч точек выводить, постоянно обновляя, то и новый комп будет тормозить


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо