| 
| 
 | Вопрос # 2 319/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!Пишу программу для построения графиков функции. В связи с чем у меня возникли вопросы.
 1. Как составить процедуру для разметки осей?
 2. Необходимо реализовать возможность вывода на одно координатное поле нескольких графиков. Не знаю как. У меня получается только каждый график выводить отдельно.
 3. Необходимо реализовать масштабирование, настройки цвета и типа линии графиков.
 (Настройки цвета линий графиков я реализовала, а вот масштабирование и тип линии не получается).
 В приложении код построения линий координат и код выбора цвета линии.
 Буду очень благодарна за помощь и объяснение.
 Приложение:Переключить в обычный режим    cx,cy:longint; procedure MyLine(x1,y1,x2,y2:real);procedure GetCxCy(var cx,cy:integer);Procedure CoordLines(cx,cy:integer);Procedure MyPixel(x,y:real;color:Tcolor);   Procedure TfmAll.MyPixel(x,y:Real;color:Tcolor);begin imWork.canvas.pixels[Round(cx+x),round(cy-y)]:=Color;end; Procedure TfmAll.CoordLines(cx,cy:Integer);beginmyline(-cx,0,cx,0);myline(0,-cy,0,cy);end; procedure TfmAll.GetCxCy(var cx,cy:integer);begincx:=imWork.Width div 2; cy:=imWork.Height div 2;end; procedure TfmAll.MyLine(x1,y1,x2,y2:real); beginimWork.Canvas.MoveTo(round(cx+x1),round(cy-y1));imWork.Canvas.lineTo(round(cx+x2),round(cy-y2)); end;      name plPenWidth = 24Height = 22BevelOuter = bvNoneColor = clBlack    name = ColorDialog if ColorDialog.execute thenbegin imWork.Canvas.pen.color:=ColorDialog.color;plPen.color:=ColorDialog.color; end; 
|  |   Вопрос задала: Brigina (статус: Посетитель)Вопрос отправлен: 20 января 2009, 04:27
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 27; последнее сообщение — 22 января 2009, 13:55; участников в обсуждении: 3. Страницы: [1] [2] [Следующая »]  
|   | min@y™ (статус: Доктор наук), 20 января 2009, 08:19 [#1]:Зачем изобретать велосипед, если всё вышеописанное (и ещё много чего) уже отлично реализовано в компоненте TChart? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 20 января 2009, 11:07 [#2]:Абослютно не понимаю, в чем проблема. Если можете нарисовать один график, то кто мешает нарисовать два. Если не получается, то что как именно не получается. Разметку осей.... нарисовать полоски и подписать циферки? или не знаем о функции TextOut ?
 Масштабирование... ну тут чистая геометрия, где то 9-10 класс. Пишите, где проблемы, иначе помочь не сможем.
 
 А собственно кода рисования графика я собственно и не увидел. Например я ожидал увидеть массив точек (или хоть какаю то их генерацию...)
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Brigina (статус: Посетитель), 20 января 2009, 13:36 [#3]:Каждый график строится в своем окне. Когда я нажимаю на кнопку  "Построить" у меня пропадает предыдушее изображение. А еще почему не меняется цвет заливки, хотя цвет графика меняется? Где-то у меня ошибка? Но заодно меняется  цвет осей, а мне бы хотелось, чтобы они были черными. И не получается сделать кнопки для выбора типа линии графиков. Я их пробовала добавить на панель инструментов, они не срабатывают. Как применить для разметки функцию TextOut я не знаю. Маштабирование я имею ввиду, добавить кнопку на панель инструментов, чтобы нажав на нее, картинка увеличивалась. Привожу коды модулей. Извините, если что не так.
 
 
 
 unit Uall;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ExtCtrls, ExtDlgs, ImgList, ComCtrls, ToolWin;
 
 type
 TfmAll = class(TForm)
 Panel1: TPanel;
 ToolBar1: TToolBar;
 plBrush: TPanel;
 plPen: TPanel;
 tbClear: TToolButton;
 tbSave: TToolButton;
 imWork: TImage;
 ImageList1: TImageList;
 ColorDialog: TColorDialog;
 SavePictureDialog: TSavePictureDialog;
 procedure plBrushClick(Sender: TObject);
 procedure plPenClick(Sender: TObject);
 procedure tbClearClick(Sender: TObject);
 procedure tbSaveClick(Sender: TObject);
 procedure FormClose(Sender: TObject; var Action: TCloseAction);
 procedure FormCreate(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 cx,cy:longint;
 procedure MyLine(x1,y1,x2,y2:real);
 procedure GetCxCy(var cx,cy:integer);
 procedure CoordLines(cx,cy:integer);
 procedure MyPixel(x,y:real;color:Tcolor);
 
 end;
 
 var
 fmAll: TfmAll;
 
 implementation
 
 {$R *.dfm}
 
 {}
 procedure TfmAll.MyPixel(x,y:Real;color:Tcolor);
 begin
 imWork.canvas.pixels[Round(cx+x),round(cy-y)]:=Color;
 end;
 
 {построение осей}
 procedure TfmAll.CoordLines(cx,cy:Integer);
 begin
 myline(-cx,0,cx,0);
 myline(0,-cy,0,cy);
 end;
 
 {начало координат}
 procedure TfmAll.GetCxCy(var cx,cy:integer);
 begin
 cx:=imWork.Width div 2;
 cy:=imWork.Height div 2;
 end;
 
 {границы изменения аргумента функции,
 границы изменения значения функции}
 procedure TfmAll.MyLine(x1,y1,x2,y2:real);
 begin
 imWork.Canvas.MoveTo(round(cx+x1),round(cy-y1));
 imWork.Canvas.LineTo(round(cx+x2),round(cy-y2));
 end;
 
 {цвет кисти}
 procedure TfmAll.plBrushClick(Sender: TObject);
 begin
 if ColorDialog.execute then
 begin
 imWork.Canvas.brush.color:=ColorDialog.color;
 plBrush.color:=ColorDialog.color;
 end;
 end;
 
 {цвет карандаша}
 procedure TfmAll.plPenClick(Sender: TObject);
 begin
 if ColorDialog.execute then
 begin
 imWork.Canvas.pen.color:=ColorDialog.color;
 plPen.color:=ColorDialog.color;
 end;
 end;
 
 {очистить}
 procedure TfmAll.tbClearClick(Sender: TObject);
 begin
 imWork.Picture:=nil;
 imWork.Canvas.Pen.Color:=plPen.color;
 imWork.Canvas.Brush.Color:=plBrush.color;
 end;
 
 {сохранить рисунок}
 procedure TfmAll.tbSaveClick(Sender: TObject);
 begin
 if SavePictureDialog.Execute then
 imWork.Picture.bitmap.SaveToFile(SavePictureDialog.filename);
 end;
 
 procedure TfmAll.FormClose(Sender: TObject; var Action: TCloseAction);
 begin
 cleanupinstance;
 release;
 end;
 
 procedure TfmAll.FormCreate(Sender: TObject);
 begin
 imWork.Picture:=nil;
 color:=clWhite;
 imWork.Canvas.brush.Color:=clWhite;
 imWork.Canvas.pen.Color:=clBlack;
 GetCxCy(cx,cy);
 end;
 
 end.
 
 unit Umain;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus;
 
 type
 TfmMain = class(TForm)
 MainMenu1: TMainMenu;
 N1: TMenuItem;
 N2: TMenuItem;
 N3: TMenuItem;
 N4: TMenuItem;
 N5: TMenuItem;
 N6: TMenuItem;
 miWindow: TMenuItem;
 N8: TMenuItem;
 N9: TMenuItem;
 procedure N2Click(Sender: TObject);
 procedure N8Click(Sender: TObject);
 procedure N9Click(Sender: TObject);
 procedure N4Click(Sender: TObject);
 procedure N5Click(Sender: TObject);
 procedure N6Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
 
 var
 fmMain: TfmMain;
 
 implementation
 uses Unit1, Unit2, Unit3;
 {$R *.dfm}
 
 procedure TfmMain.N2Click(Sender: TObject);
 begin
 Close; {Файл\Выход - выход из программы}
 end;
 
 procedure TfmMain.N8Click(Sender: TObject);
 begin
 Tile; {Окна плиткой}
 end;
 
 procedure TfmMain.N9Click(Sender: TObject);
 begin
 Cascade; {Окна каскадом}
 end;
 
 {Построение графика функции в явном виде}
 procedure TfmMain.N4Click(Sender: TObject);
 begin
 application.CreateForm(TfmFun1,fmFun1);
 fmFun1.show;
 end;
 
 {Построение графика функции в параметрическом виде}
 procedure TfmMain.N5Click(Sender: TObject);
 begin
 application.CreateForm(TfmFun2,fmFun2);
 fmFun2.show;
 end;
 
 {Построение графика функции в полярных координатах}
 procedure TfmMain.N6Click(Sender: TObject);
 begin
 application.CreateForm(TfmFun3,fmFun3);
 fmFun3.show;
 end;
 
 end.
 
 {График 1}
 unit Unit1;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Uall, ExtDlgs, ImgList, ComCtrls, ToolWin, ExtCtrls, StdCtrls;
 
 type
 TfmFun1 = class(TfmAll)
 Label1: TLabel;
 edMinX: TEdit;
 Label2: TLabel;
 edMaxX: TEdit;
 Label3: TLabel;
 edD: TEdit;
 Button1: TButton;
 Image1: TImage;
 procedure Button1Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
 
 var
 fmFun1: TfmFun1;
 
 implementation
 
 {$R *.dfm}
 
 procedure TfmFun1.Button1Click(Sender: TObject);
 var
 kx,ky:real;
 x,y,minX,maxX:real;
 d,dx,dy:real;
 function f(x:real):real;
 var
 temp:real;
 begin
 temp:=x*cos(x);
 f:=temp;
 end;
 begin
 tbClearClick(sender);
 GetCxCy(cx,cy);
 CoordLines(cx,cy);
 maxX:=strtofloat(edMaxX.text);
 minX:=strtofloat(edMinX.text);
 dx:=MaxX-MinX;
 dy:=dx;
 kx:=(2*cx)/dx;
 ky:=(2*cy)/dy;
 d:=dx/strtoint(edD.text);
 x:=MinX;
 y:=f(x);
 while x<=maxX do
 begin
 myline(kx*x,ky*y,kx*(x+d),ky*f(x+d));
 x:=x+d;
 y:=f(x);
 Application.ProcessMessages;
 end;
 end;
 
 
 
 end.
 
 {График 2}
 unit Unit2;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Uall, ExtDlgs, ImgList, ComCtrls, ToolWin, ExtCtrls, StdCtrls;
 
 type
 TfmFun2 = class(TfmAll)
 Label1: TLabel;
 edA: TEdit;
 Label2: TLabel;
 edB: TEdit;
 Label3: TLabel;
 edD: TEdit;
 Button1: TButton;
 Image1: TImage;
 procedure Button1Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
 
 var
 fmFun2: TfmFun2;
 
 implementation
 
 {$R *.dfm}
 
 procedure TfmFun2.Button1Click(Sender: TObject);
 var t,x,y,d,maxT:real;
 a,b:integer;
 function fx(t:real):real;
 var temp:real;
 begin
 temp:=(a+b)*cos(t)-a*cos((a+b)*t/a);
 fx:=temp;
 end;
 function fy(t:real):real;
 var temp:real;
 begin
 temp:=(a+b)*sin(t)-a*sin((a+b)*t/a);
 fy:=temp;
 end;
 function nod(a,b:integer):integer;
 begin
 if (a=0)or(b=0) then nod:=a+b
 else
 begin
 if a>b then nod:=nod(b,a mod b)
 else nod:=nod(a,b mod a);
 end;
 end;
 begin
 tbClearClick(sender);
 GetCxCy(cx,cy);
 coordlines(cx,cy);
 a:=strtoint(edA.text);
 b:=strtoint(edB.text);
 d:=strtofloat(edD.text);
 t:=0;
 x:=fx(t);
 y:=fy(t);
 if (b mod a)=0 then maxT:=2*pi
 else maxT:=2*pi*(a/nod(a,b));
 while t<=maxT do
 begin
 myline(x,y,fx(t+d),fy(t+d));
 x:=fx(t+d);
 y:=fy(t+d);
 t:=t+d;
 application.processMessages;
 end;
 end;
 
 
 end.
 
 {График 3}
 unit Unit3;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Uall, ExtDlgs, ImgList, ComCtrls, ToolWin, ExtCtrls, StdCtrls;
 
 type
 TfmFun3 = class(TfmAll)
 Label1: TLabel;
 edA: TEdit;
 Label2: TLabel;
 edK: TEdit;
 Label3: TLabel;
 edD: TEdit;
 Button1: TButton;
 procedure Button1Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
 
 var
 fmFun3: TfmFun3;
 
 implementation
 
 {$R *.dfm}
 
 procedure TfmFun3.Button1Click(Sender: TObject);
 var t,x,y,d,k,maxT:real;
 a:integer;
 function fx(t:real):real;
 var temp:real;
 begin
 temp:=a*sin(k*t)*cos(t);
 fx:=temp;
 end;
 
 function fy(t:real):real;
 var temp:real;
 begin
 temp:=a*sin(k*t)*sin(t);
 fy:=temp;
 end;
 
 begin
 tbClearClick(sender);
 GetCxCy(cx,cy);
 coordlines(cx,cy);
 a:=strtoint(edA.text);
 k:=strtofloat(edK.text);
 d:=strtofloat(edD.text);
 t:=0;
 x:=fx(t);
 y:=fy(t);
 if frac(k)=0 then maxT:=2*pi
 else if k>1 then maxT:=4*pi*k
 else maxT:=4*pi/k;
 while t<=maxT do
 begin
 myline(x,y,fx(t+d),fy(t+d));
 x:=fx(t+d);
 y:=fy(t+d);
 t:=t+d;
 application.processMessages;
 end;
 end;
 
 end.
 |  
|   | Вадим К (статус: Академик), 20 января 2009, 13:59 [#4]:А можно это оформить в виде архивчика и выложить где нибудь? только exe не надо туда добавлять. Но даже так могу сказать, что код ужасный, для каждой функции оформлена своя форма.... с почти идентичным кодом...
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 20 января 2009, 14:21 [#5]:Ну чем TChart-то не устраивает, а? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Brigina (статус: Посетитель), 20 января 2009, 14:22 [#6]:Спасибо что взялись мне помочь! Для меня это очень важно. Что-то сильно сложного мне и не нужно. Я делаю эту программу по книжке,а там было так. Вот, а теперь мне нужно ее усовершенствовать.
 Я ведь еще только учусь.
 Архив с программой разместила по адресу http://webfile.ru/2567611
 |  
|   | Вадим К (статус: Академик), 20 января 2009, 14:23 [#7]:Ну хочет человек научиться строить графики, что тут плохого? Иногда, что бы использовать чужие велосипеды и уметь гнуть их до нужной кондиции, надо уметь написать свой, хотя бы с квадратными колёсами и двигателем с боинга. Другое дело, если пишеться продакшн код... Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Brigina (статус: Посетитель), 20 января 2009, 14:24 [#8]:А чем TChart лучше? |  
|   | Вадим К (статус: Академик), 20 января 2009, 14:28 [#9]:Он просто умеет строить разные графики, масштабировать и прочие прелести. Даже вертеть графики   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Brigina (статус: Посетитель), 20 января 2009, 15:02 [#10]:Попробую потом и им тоже сделать. |  
|   | min@y™ (статус: Доктор наук), 20 января 2009, 15:26 [#11]:Посмотри сначала его возможности. Может после этого и не понадобится велосипед с квадратными колёсами и двигателем с боинга (© Вадим К). Скомпили и запусти демо-проект, который в файле <Каталог Delphi >\Demos\TeeChart\teedemo.dpr, и посмотри, что можно наворотить с помощью этого компонента. Даже прислать могу готоый EXE, если не сможешь найти.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Brigina (статус: Посетитель), 21 января 2009, 13:39 [#12]:>\Demos\TeeChart\teedemo.dpr посмотрела. Мне не понравилось, если честно. И это не совсем то, что нужно. Дело ведь не в эффектах. И потом, я хочу доделать свое. Пусть с квадратными колесами, но тем не менее.
 Нашла процедуру для выбора типов линий. Но у меня она не работает.
 procedure TForm1.SetPenStyle(Sender: TObject);
 begin
 with Image.Canvas.Pen do
 begin
 if Sender = SolidPen then Style := psSolid
 else if Sender = DashPen then Style := psDash
 else if Sender = DotPen then Style := psDot
 else if Sender = DashDotPen then Style := psDashDot
 else if Sender = DashDotDotPen then Style := psDashDotDot
 else if Sender = ClearPen then Style := psClear;
 end;
 end;
 |  
|   | Вадим К (статус: Академик), 21 января 2009, 14:38 [#13]:это работает только в том случае, если толщина линии один пиксель. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Brigina (статус: Посетитель), 21 января 2009, 15:05 [#14]:Не работает все равно почему-то  хоть и толщина 1. |  
|   | Вадим К (статус: Академик), 21 января 2009, 15:16 [#15]:показывайте код, который вызывает эту процедуру. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 21 января 2009, 15:27 [#16]:DashPen, DotPen, DashDotPen и т.п. - это, как я понял, TRadioButton'ы. Проверь, вполняется ли этот обработчик их собития OnClick. Может он не вызывается, потому что банально не назначен в инспекторе? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Brigina (статус: Посетитель), 21 января 2009, 16:13 [#18]:Задала толщину рисования координат Pen.Width:=2, чтобы они оставались сплошными. Но наверное есть другой способ? Я пока тренируюсь на другом графике, чтобы не испортить свою программу.
 |  
|   | Brigina (статус: Посетитель), 21 января 2009, 16:21 [#19]:DashPen, DotPen, DashDotPen и т.п - TSpeedButton |  
|   | min@y™ (статус: Доктор наук), 21 января 2009, 16:57 [#20]:Ну, а выполнение доходит до этого обработчика? Поставь там брейкпойнт на строке "if Sender = SolidPen then..." и потыкай на кнопки. Остановится там выполнение или нет? Если нет, то чначи этот обработчик не назначен собитиям OnClick кнопок. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |