Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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]

Где-то грабли?
Даю, на всякие пожарные, весь текст.


// &#234;&#224;&#234; &#236;&#232;&#237;&#232;&#236;&#243;&#236;, &#226;&#251;&#226;&#238;&#228; &#227;&#240;&#224;&#244;&#232;&#234;&#232; &#237;&#224;&#228;&#238; &#225;&#243;&#244;&#229;&#240;&#232;&#231;&#238;&#226;&#224;&#242;&#252;.
//  &#208;&#232;&#241;&#238;&#226;&#224;&#242;&#252; &#226; Bitmap.Canvas, &#239;&#238;&#242;&#238;&#236; 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;

//********************************************************
// &#241;&#242;&#240;&#238;&#232;&#242; &#227;&#240;&#224;&#244;&#232;&#234; &#244;&#243;&#237;&#234;&#246;&#232;&#232;
procedure TForm1.GrOfFunc;
var
x1,x2:real;       // &#227;&#240;&#224;&#237;&#232;&#246;&#251; &#232;&#231;&#236;&#229;&#237;&#229;&#237;&#232;&#255; &#224;&#240;&#227;&#243;&#236;&#229;&#237;&#242;&#224; &#244;&#243;&#237;&#234;&#246;&#232;&#232;
y1,y2:real;       // &#227;&#240;&#224;&#237;&#232;&#246;&#251; &#232;&#231;&#236;&#229;&#237;&#229;&#237;&#232;&#255; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255; &#244;&#243;&#237;&#234;&#246;&#232;&#232;
x:real;           // &#224;&#240;&#227;&#243;&#236;&#229;&#237;&#242; &#244;&#243;&#237;&#234;&#246;&#232;&#232;
y:real;           // &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#229; &#244;&#243;&#237;&#234;&#246;&#232;&#232; &#226; &#242;&#238;&#247;&#234;&#229; &#245;
dx:real;          // &#239;&#240;&#232;&#240;&#224;&#249;&#229;&#237;&#232;&#229; &#224;&#240;&#227;&#243;&#236;&#229;&#237;&#242;&#224;

l,b:integer;      // &#235;&#229;&#226;&#251;&#233; &#237;&#232;&#230;&#237;&#232;&#233; &#243;&#227;&#238;&#235; &#238;&#225;&#235;&#224;&#241;&#242;&#232; &#226;&#251;&#226;&#238;&#228;&#224; &#227;&#240;&#224;&#244;&#232;&#234;&#224;
w,h:integer;      // &#248;&#232;&#240;&#232;&#237;&#224; &#232; &#226;&#251;&#241;&#238;&#242;&#224; &#238;&#225;&#235;&#224;&#241;&#242;&#232; &#226;&#251;&#226;&#238;&#228;&#224; &#227;&#240;&#224;&#244;&#232;&#234;&#224;
mx,my:real;       // &#236;&#224;&#241;&#248;&#242;&#224;&#225; &#239;&#238; &#238;&#241;&#255;&#236; X &#232; Y
x0,y0:integer;    // &#242;&#238;&#247;&#234;&#224; - &#237;&#224;&#247;&#224;&#235;&#238; &#234;&#238;&#238;&#240;&#228;&#232;&#237;&#224;&#242;

begin                          // &#238;&#225;&#235;&#224;&#241;&#242;&#252; &#226;&#251;&#226;&#238;&#228;&#224; &#227;&#240;&#224;&#244;&#232;&#234;&#224;
l:=10;                         // X - &#234;&#238;&#238;&#240;&#228;&#232;&#237;&#224;&#242;&#224; &#235;&#229;&#226;&#238;&#227;&#238; &#226;&#229;&#240;&#245;&#237;&#229;&#227;&#238; &#243;&#227;&#235;&#224;
b:=Form1.ClientHeight-20;      // &#211; - &#234;&#238;&#238;&#240;&#228;&#232;&#237;&#224;&#242;&#224; &#235;&#229;&#226;&#238;&#227;&#238; &#226;&#229;&#240;&#245;&#237;&#229;&#227;&#238; &#243;&#227;&#235;&#224;
h:=Form1.ClientHeight-40;  // &#226;&#251;&#241;&#238;&#242;&#224;
w:=Form1.Width-40;         // &#248;&#232;&#240;&#232;&#237;&#224;
x1:=0;                        // &#237;&#232;&#230;&#237;&#255;&#255; &#227;&#240;&#224;&#237;&#232;&#246;&#224; &#228;&#232;&#224;&#239;&#224;&#231;&#238;&#237;&#224; &#224;&#240;&#227;&#243;&#236;&#229;&#237;&#242;&#224;
x2:=25;                       // &#226;&#229;&#240;&#245;&#237;&#255;&#255; &#227;&#240;&#224;&#237;&#232;&#246;&#224; &#228;&#232;&#224;&#239;&#224;&#231;&#238;&#237;&#224; &#224;&#240;&#227;&#243;&#236;&#229;&#237;&#242;&#224;
dx:=0.01;                     // &#248;&#224;&#227; &#224;&#240;&#227;&#243;&#236;&#229;&#237;&#242;&#224;

// &#237;&#224;&#233;&#228;&#229;&#236; &#236;&#224;&#234;&#241;&#232;&#236;&#224;&#235;&#252;&#237;&#238;&#229; &#232; &#236;&#232;&#237;&#232;&#236;&#224;&#235;&#252;&#237;&#238;&#229; &#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255;
// &#244;&#243;&#237;&#234;&#246;&#232;&#232; &#237;&#224; &#238;&#242;&#240;&#229;&#231;&#234;&#229; [x1,x2]
y1:=f(x1); // &#236;&#232;&#237;&#232;&#236;&#243;&#236;
y2:=f(x1); //&#236;&#224;&#234;&#241;&#232;&#236;&#243;&#236;
x:=x1;
repeat
 y := f (x);
 if y < y1 then y1:=y;
 if y > y2 then y2:=y;
 x:=x+dx;
until (x >= x2);
// &#226;&#251;&#247;&#232;&#241;&#235;&#232;&#236; &#236;&#224;&#241;&#248;&#242;&#224;&#225;
my:=h/abs(y2-y1); // &#236;&#224;&#241;&#248;&#242;&#224;&#225; &#239;&#238; &#238;&#241;&#232; Y
mx:=w/abs(x2-x1); // &#236;&#224;&#241;&#248;&#242;&#224;&#225; &#239;&#238; &#238;&#241;&#232; X
x0:=1;
y0:=b-Abs(Round(y1*my)) ;
with Bitmap.Canvas do
//with Form1.Canvas do
begin              // &#238;&#241;&#232;
 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));
 // &#239;&#238;&#241;&#242;&#240;&#238;&#229;&#237;&#232;&#229; &#227;&#240;&#224;&#244;&#232;&#234;&#224;
 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;

//********************************************************
// &#232;&#231;&#236;&#229;&#237;&#232;&#235;&#241;&#255; &#240;&#224;&#231;&#236;&#229;&#240; &#238;&#234;&#237;&#224; &#239;&#240;&#238;&#227;&#240;&#224;&#236;&#236;&#251;
procedure TForm1.FormResize(Sender: TObject);
begin
// &#238;&#247;&#232;&#241;&#242;&#232;&#242;&#252; &#244;&#238;&#240;&#236;&#243;
Bitmap.Canvas.FillRect(Rect(0,0,ClientWidth,ClientHeight));

// &#239;&#238;&#241;&#242;&#240;&#238;&#232;&#242;&#252; &#227;&#240;&#224;&#244;&#232;&#234;
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
2-1398337114
Who_are_you?
2014-04-24 14:58
2015.12.06
Замена Chart - графика для слабых компьютеров?


15-1428065850
БарЛог
2015-04-03 15:57
2015.12.06
Электрика для дома. Так получилось.


2-1403259271
Imagination
2014-06-20 14:14
2015.12.06
Несколько действий для одной кнопки


15-1428874204
Юрий
2015-04-13 00:30
2015.12.06
С днем рождения ! 13 апреля 2015 понедельник


2-1403357120
cr@nk
2014-06-21 17:25
2015.12.06
Консольное приложение и количество строк на экране





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский