Форум: "Начинающим";
Текущий архив: 2015.12.06;
Скачать: [xml.tar.bz2];
ВнизЗамена Chart - графика для слабых компьютеров? Найти похожие ветки
← →
Who_are_you? © (2014-04-24 14:58) [0]При запуске программы на старом компе Pentium II, Win 98, ОЗУ-128 MБ получил огромные тормоза.
Стал анализировать и выяснил - то что летало на новом компе.
Это Chart. Ждать приходится около 3 минут.
Заремил с десяток строк, начинающиеся на Chart, - выполнение 2 секунды.
Посоветуйте как быстро (в смысле времени выполнения компьютером и времени написания программы) сделать графическое представление (X,Y) цифровых данных? Может у кого есть заготовки, Unit-ы ?
← →
MBo © (2014-04-24 15:31) [1]Выводить не все данные, а выборку из них
Если в чарт сто тысяч точек выводить, постоянно обновляя, то и новый комп будет тормозить
← →
junglecat (2014-04-24 16:18) [2]а у чарта нет чего-нить типа beginupdate / endupdate на время обновления?
← →
Who_are_you? © (2014-04-24 17:10) [3]А выводить нужно 4 графика от 100 до 16 000 точек в секунду ( дискретизация 100Гц -16 кГц).
← →
Ega23 © (2014-04-24 17:16) [4]Зачем 16000 точек на графике? Нельзя упростить?
← →
junglecat (2014-04-24 17:31) [5]а как вообще можно увидеть 16000 точек на одном экране?
← →
Jeer © (2014-04-24 18:55) [6]>А выводить нужно 4 графика от 100 до 16 000 точек в секунду ( >дискретизация 100Гц -16 кГц).
Интересно, как это Вы собираетесь выводить графики с частотой 16 кГц ?
← →
Ega23 © (2014-04-24 18:59) [7]
> а как вообще можно увидеть 16000 точек на одном экране?
Ну, допустим, у меня на экране 2304000 точек. В принципе, влезет порядка 150 таких графиков.
Но зачем?
← →
junglecat (2014-04-24 19:20) [8]даже если представить, что вдруг получилось вывести на монитор 16000 точек/сек, то каким зрением должен обладать смотрящий, чтобы хоть что-то осознать?
← →
Ega23 © (2014-04-24 20:45) [9]
> то каким зрением должен обладать смотрящий, чтобы хоть
> что-то осознать?
Дискретным.
← →
Who_are_you? © (2014-04-25 09:36) [10]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.
Продолжаю поиски. Что взять за основу или самому придумать - еще не решил.
Всем, кто уже отозвался - большое спасибо.
← →
junglecat (2014-04-25 09:50) [11]как минимум, вывод графики надо буферизовать. Рисовать в Bitmap.Canvas, потом StretchDraw
← →
kilkennycat © (2014-04-25 18:56) [12]
> у меня на экране 2304000 точек.
а матрица глаз?
← →
Who_are_you? © (2014-06-04 19:44) [13]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
← →
Who_are_you? © (2014-06-04 19:54) [14]Где-то грабли?
Даю, на всякие пожарные, весь текст.
// êàê ìèíèìóì, âûâîä ãðàôèêè íàäî áóôåðèçîâàòü.
// Ðèñîâàòü â 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.
← →
brother © (2014-06-04 20:22) [15]вы "стретчити" на самого себя, а надо на канву формы (или еще куда)...
← →
brother © (2014-06-04 20:28) [16]И для начала добейтесь нормальной отрисовки по Button1Click, а уж потом всякие другие условия, ибо в FormResize например, не учитывается размер клиентской области формы...
← →
Who_are_you? © (2014-06-04 21:50) [17]Заменил Bitmap.Canvas.StretchDraw
на
Canvas.draw(0,0,bitmap); //отрисовываем сам bitmap
и все заработало.
← →
Who_are_you? © (2014-06-04 21:55) [18]Сделал так:
Canvas.StretchDraw(Rect(0, 0, Bitmap.Width,Bitmap.Height), Bitmap);
работает.
Спасибо brother!
← →
brother © (2014-06-05 17:40) [19]как всегда опять не совсем то)
если Bitmap.Width, Bitmap.Height будут больше размеров формы, то что мы получим? и смылсы отрисовывать через Stretch, если отрисовываемя область равна (?) размеру выводимой области (канва формы)
← →
brother © (2014-06-05 17:42) [20]поясню: Вы реализовали BitBlt через StretchDraw, но зачем?
← →
Who_are_you? © (2014-06-06 12:22) [21]Честно говоря,
так и не понял, чем лучше отображать на стареньком ноуте:
Canvas.draw
или
Canvas.StretchDraw(Rect
Bitmap.Width := ClientWidth;
Bitmap.Height:= ClientHeight;
// очистить форму
Bitmap.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));
// построить график
GrOfFunc;
// Canvas.draw(0,0,bitmap); //отрисовываем сам bitmap
Canvas.StretchDraw(Rect(0, 0, Bitmap.Width,Bitmap.Height), Bitmap);
← →
Who_are_you? © (2014-06-06 12:33) [22]brother © (05.06.14 17:40) [19]
смысл отрисовывать через Stretch, если отрисовываемая область равна (?) размеру выводимой области (канва формы)
Вся канитель из-за пожелания:
(для быстроты выполнения)
junglecat (25.04.14 09:50) [11]
как минимум, вывод графики надо буферизовать. Рисовать в Bitmap.Canvas, потом StretchDraw
← →
MBo © (2014-06-06 12:47) [23]А Вы понимаете, что такое Stretch?
← →
Who_are_you? © (2014-06-06 12:55) [24]MBo © (06.06.14 12:47) [23]
А Вы понимаете, что такое Stretch?
Согласно справочнику:
Методы для вывода картинок на канву - Draw и StretchDraw, В качестве параметров указываются прямоугольник и графический объект для вывода (это может быть TBitmap, TIcon или TMetafile). StretchDraw отличается тем, что растягивает или сжимает картинку так, чтобы она заполнила весь указанный прямоугольник
← →
MBo © (2014-06-06 13:02) [25]Так это самое растяжение требуется или нет?
← →
Who_are_you? © (2014-06-06 14:44) [26]
MBo © (06.06.14 13:02) [25]
Так это самое растяжение требуется или нет?
В данный момент нет.
А а дальнейшем хочу использовать как масштабирование.
← →
Who_are_you? © (2014-06-10 16:44) [27]Отображаю:
Canvas.draw(0,0,bitmap); //отрисовываем сам bitmap
А если так:Image1.Canvas.StretchDraw(Rect(0, 0, Image1.Width,Image1.Height), Bitmap);
то теряется контрастность и пропадают точки.
Ширина и высота в обоих случаях одинаковая.
Может есть лучший вариант?
Я рисую 4-е графика, каждый имеет свой Bitmap, а потом нужно их разместить на форме в определенных местах.
← →
brother © (2014-06-10 17:20) [28]это стретч ужимая картинку выкидиывает пикселы...
← →
brother © (2014-06-10 17:31) [29]зы. скриншоты покажи, что происходит...
← →
Who_are_you? © (2014-06-11 09:36) [30]
brother © (10.06.14 17:20) [28]
это стретч ужимая картинку выкидиывает пикселы...
Спасибо, да, стретч.
Удивительно, уменьшая размер через стретч, плотность должна увеличиваться, а на самом деле выбрасываются точки.
P.S. Cкриншоты не знаю как на этом сайте выложить.
← →
Inovet © (2014-06-11 10:00) [31]> [30] Who_are_you? © (11.06.14 09:36)
> плотность должна увеличиваться, а на самом деле выбрасываются точки.
Откуда же он знает где там у тебя нужные точки, а где не нужные - для него все точки одинаковые.
А сразу выводить как надо почему не получается?
← →
brother © (2014-06-11 11:56) [32]> плотность должна увеличиваться
чего? как было 72dpi,так и остается!
← →
MBo © (2014-06-11 19:43) [33]SetStretchBltMode c HALFTONE поможет улучшить качество сжатого изображения
← →
Who_are_you? © (2014-06-17 12:03) [34]Продолжение: чтение с файла, обработка, замена Chart.
Всем большое спасибо за помощь по быстродействию при работе с файлами в темеДва байта в одно число
Получается, что не нужно читать фрагментами файл, а для быстродействия его нужно прочитать весь, запомнить в матрицу (у меня это n-кбайт строк по 10 байт), а потом делать математ. вычисления и отображать через BitMap.Canvas?
← →
Styx (2014-06-17 16:37) [35]Вам виднее.
← →
Who_are_you? © (2014-06-17 17:22) [36]// 1
Fail_rd :array[1..100,1..8] of byte;
...
Resul:=ReadFile(hInFile,Fail_rd,N_strok_File,Bytes,nil);
// 2
Fail_rd :array of array of byte;
...
SetLength(Fail_rd, 100,8); //
Resul:=ReadFile(hInFile,Fail_rd,N_strok_File,Bytes,nil);
Почему в 1 случае Fail_rd заполняется, а 2-ом Fail_rd заполнен нулями?
Как воспользоваться динам. матрицой?
← →
Германн © (2014-06-17 17:30) [37]
> 2-ом Fail_rd заполнен нулями?
Потому что во втором случае ты считываешь по адресу переменной, которая содержит ссылку на область памяти.
Ну и кроме того ты не сможешь одним вызовом ReadFile считать данные в двумерный динамический массив.
← →
turbouser © (2014-06-17 17:41) [38]
> Fail_rd
Как вы яхту назовете, так она и поплывет =)
← →
Who_are_you? © (2014-06-18 11:43) [39]Согласен, хороший повод посмеяться.
Исправил на File_rd.
Изучаю, как вызовом ReadFile считать данные в двумерный динамический массив.
Если кто-нибудь предложит примеры текста программ, был бы весьма рад !!!
← →
Jeer © (2014-06-18 14:32) [40]Динамический N-мерный массив всегда можно логически представить одномерным.
Исходи из этого.
← →
Германн © (2014-06-18 14:48) [41]
> Jeer © (18.06.14 14:32) [40]
> Динамический N-мерный массив всегда можно логически представить
> одномерным.
> Исходи из этого.
Только не динамический. Двумерный динмассив N*M размещен в N разных областях памяти размером M.
← →
Inovet © (2014-06-18 14:56) [42]> [41] Германн © (18.06.14 14:48)
Значит делаем одномерный и работаем с ним как с н-мерным.
← →
Германн © (2014-06-18 14:58) [43]
> Inovet © (18.06.14 14:56) [42]
А это уже не ко мне. :)
← →
Who_are_you? © (2014-06-18 16:15) [44]Одномерный динамический тоже просто через File_rd не заполнишь.
Если кто-нибудь предложит примеры текста программ, был бы весьма рад !!!
← →
Германн © (2014-06-18 16:24) [45]
> Who_are_you? © (18.06.14 16:15) [44]
> Одномерный динамический тоже просто через File_rd не заполнишь.
>
Это если не умеешь :)Fail_rd :array of byte;
...
SetLength(Fail_rd, 800);
Resul:=ReadFile(hInFile,Fail_rd[0],N_strok_File,Bytes,nil);
← →
reonid © (2014-06-18 18:23) [46]В принципе, у меня есть библиотечка, которая на хорошем
компе нормально отображает несколько сигналов по миллиону точек
и при этом не слишком тормозит при паннинге.
Может, она и потянет (я не знаю, до какой степени
у тебя тормознутый комп)
Но она для внутреннего употребления,
поэтому нет никакой документации.
Если хочешь, пришлю.
← →
й (2014-06-18 20:35) [47]reonid, не эта:
http://kladovka.net.ru/index.cgi?pid=viewprofile&rid=318
? или сильно обновленная версия?
← →
Who_are_you? © (2014-06-18 20:39) [48]
Может, она и потянет (я не знаю, до какой степени
у тебя тормознутый комп)
Что за комп, я написал в начале.В принципе, у меня есть библиотечка, которая на хорошем
компе нормально отображает несколько сигналов по миллиону точек
и при этом не слишком тормозит при паннинге.
Но она для внутреннего употребления,
поэтому нет никакой документации.
Если хочешь, пришлю.
Я бы посмотрел, что от меня требуется?
Здесь E-mail можно выкладывать?
← →
Who_are_you? © (2014-06-18 20:42) [49]reonid?
Ссылка выше - это она?
← →
reonid © (2014-06-18 22:00) [50]Ссылка - это очень старая версия библиотеки,
точнее, её базовая часть.
Класса TRSeries, который я использую быстрой отрисовки, там нет.
Я послал на мэйл на list.ru, который у тебя под ником.
← →
Who_are_you? © (2014-06-19 10:19) [51]
reonid © (18.06.14 22:00) [50]
Я послал на мэйл на list.ru, который у тебя под ником.
Спасибо, получил, разбираюсь.
← →
Who_are_you? © (2014-06-20 14:50) [52]
reonid © (18.06.14 22:00) [50]
Ваш fastChart на один график работает.
А на 2-ва, тем более на 4-е графика у меня не получилось.
← →
reonid © (2014-06-20 16:00) [53]>Ваш fastChart на один график работает.
В смысле не тормозит? или просто удалось запустить?
>А на 2-ва, тем более на 4-е графика у меня не получилось.
Нужны 4 чарта или 4 серии на одном чарте?
← →
Who_are_you? © (2014-06-20 16:13) [54]
Германн © (18.06.14 16:24) [45]
Спасибо Вам за помощь.
Сейчас делаю так:File_rd :array of byte; //дин. матрица
...
Resul:=ReadFile(hInFile,File_rd[0],N_strok_File*8,Bytes,nil);
далее делаю математ. вычисления, запоминаю в:
BitMap1.Canvas.LineTo(x0+Round(Time_Visibl*mx),y0-Round(Uin1*m1));
BitMap2.Canvas.LineTo(x0+Round(Time_Visibl*mx),y0-Round(Uin2*m2));
BitMap3.Canvas.LineTo(x0+Round(Time_Visibl*mx),y0-Round(Uin3*m3));
BitMap4.Canvas.LineTo(x0+Round(Time_Visibl*mx),y0-Round(Uin4*m4));
и обработав 32кб строк, отображаю
Canvas.draw(8,42,BitMap1); //отрисовываем сам bitmap1
Canvas.draw(8,43+BitMap2.Height,BitMap2); //отрисовываем сам bitmap2
Canvas.draw(8,44+2*BitMap3.Height,BitMap3); //отрисовываем сам bitmap3
Canvas.draw(8,45+3*BitMap4.Height,BitMap4); //отрисовываем сам bitmap4
Если в начале темы я писал, что
> Ждать приходится около 3 минут.
,
то сейчас чтение файла, математ. вычисления, отображение проходит за 5 секунд.
Если кто может предложить еще как повысить быстродействие - буду рад.
Для примера: оболочка Делфи 7 появляется на экране через ~1.5 минуты после нажатия Enter.
← →
Who_are_you? © (2014-06-20 16:50) [55]
reonid © (20.06.14 16:00) [53]
>Ваш fastChart на один график работает.
В смысле не тормозит? или просто удалось запустить?
>А на 2-ва, тем более на 4-е графика у меня не получилось.
Нужны 4 чарта или 4 серии на одном чарте?
Подробности такие:
вывод графика идет с тормозами,
сдвиг графика на нормальном компе - это доли секунды, а на указанном в начале темы - около 12 секунд.
Нужны 4 чарта.
← →
reonid © (2014-06-20 17:06) [56]>вывод графика идет с тормозами
а ты число точек варьировал? - у меня в примере 100000 стояло.
>Нужны 4 чарта.
Это примерно так:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls,
DoubleFn, DoubleOp, StdAlgs,
RTypes, RCore, RSeries, RZoom, RTool, _newArea,
PlotCol;
type
TForm1 = class(TForm)
Panel1: TPanel;
Timer1: TTimer;
Panel2: TPanel;
Panel3: TPanel;
Panel4: TPanel;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
FArea1: TRNewWorkArea;
FArea2: TRNewWorkArea;
FArea3: TRNewWorkArea;
FArea4: TRNewWorkArea;
FSeries1: TRSeries;
FSeries2: TRSeries;
FSeries3: TRSeries;
FSeries4: TRSeries;
FPhaseShift: Double;
procedure FillAllSeries;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure FillSeries(Ser: TRSeries; N: Integer; Phase: Double);
var i: Integer;
begin
Ser.Resize(N);
for i := 0 to Ser.Length-1 do
begin
Ser.X[i] := i;
Ser.Y[i] := Sin(i*0.05 + Phase);
end;
//ForEach(Ser.GetArrayAdapter("y"), TUnaryOp.AddGaussianNoise(0.1));
end;
procedure TForm1.FillAllSeries;
begin
FillSeries(FSeries1, 1000, FPhaseShift);
FillSeries(FSeries2, 1000, FPhaseShift+1);
FillSeries(FSeries3, 1000, FPhaseShift+2);
FillSeries(FSeries4, 1000, FPhaseShift+3);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FArea1 := TRNewWorkArea.CreateEx(Self, Panel1, alClient);
FArea1.SetGlobalTool(ZoomTool);
//FArea1.SetGlobalTool(EditTool);
FArea2 := TRNewWorkArea.CreateEx(Self, Panel2, alClient);
FArea3 := TRNewWorkArea.CreateEx(Self, Panel3, alClient);
FArea4 := TRNewWorkArea.CreateEx(Self, Panel4, alClient);
FSeries1 := TRSeries.CreateEx(FArea1.Layer.Root, "", clBlack);
FSeries2 := TRSeries.CreateEx(FArea2.Layer.Root, "", clRed);
FSeries3 := TRSeries.CreateEx(FArea3.Layer.Root, "", clBlue);
FSeries4 := TRSeries.CreateEx(FArea4.Layer.Root, "", clGreen);
//FSeries1.FastMode := True; for more than 10000 points
FillAllSeries;
FArea1.ZoomOut;
FArea2.ZoomOut;
FArea3.ZoomOut;
FArea4.ZoomOut;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
FillAllSeries;
FPhaseShift := FPhaseShift + 0.3;
//FArea1.ZoomOut;
FArea1.Refresh;
FArea2.Refresh;
FArea3.Refresh;
FArea4.Refresh;
end;
end.
← →
Who_are_you? © (2014-06-21 12:30) [57]Who_are_you? © (20.06.14 16:13) [54]
Германн © (18.06.14 16:24) [45]
Спасибо Вам за помощь.
Сейчас делаю так:
File_rd :array of byte; //дин. матрица
...
Resul:=ReadFile(hInFile,File_rd[0],N_strok_File*8,Bytes,nil);
далее делаю математ. вычисления, запоминаю в:
BitMap1.Canvas.LineTo(x0+Round(Time_Visibl*mx),y0-Round(Uin1*m1));
BitMap2.Canvas.LineTo(x0+Round(Time_Visibl*mx),y0-Round(Uin2*m2));
BitMap3.Canvas.LineTo(x0+Round(Time_Visibl*mx),y0-Round(Uin3*m3));
BitMap4.Canvas.LineTo(x0+Round(Time_Visibl*mx),y0-Round(Uin4*m4));
и обработав 32кб строк, отображаю
Canvas.draw(8,42,BitMap1); //отрисовываем сам bitmap1
Canvas.draw(8,43+BitMap2.Height,BitMap2); //отрисовываем сам bitmap2
Canvas.draw(8,44+2*BitMap3.Height,BitMap3); //отрисовываем сам bitmap3
Canvas.draw(8,45+3*BitMap4.Height,BitMap4); //отрисовываем сам bitmap4
Если в начале темы я писал, что
> Ждать приходится около 3 минут.
,
то сейчас чтение файла, математ. вычисления, отображение проходит за 5 секунд.
Если кто может предложить еще как повысить быстродействие - буду рад.
Для примера: оболочка Делфи 7 появляется на экране через ~3 минуты после нажатия Enter. (Уточненные данные)
← →
Германн © (2014-06-22 02:54) [58]
> Германн © (18.06.14 16:24) [45]
> Спасибо Вам за помощь.
Да не за что.
Если понадобится объяснить почему именно так нужно передавать параметр, тут найдутся люди, которые объяснят гораздо лучше чем я. Почти "в стихах". :)
Разве что будет неопределенность с терминами.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2015.12.06;
Скачать: [xml.tar.bz2];
Память: 0.65 MB
Время: 0.003 c