Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2013, 05:59   #1
MariaD
Пользователь
 
Аватар для MariaD
 
Регистрация: 10.01.2013
Сообщений: 56
Вопрос Delphi.Canvas.Построение графиков в Image

Изначально оси находились слева и внизу Image.для моей программы они должны быть по центру.Сделано.но черточки идут криво(от старых центров) график чертится внизу тоже.как график привязать к новому центру координат?


Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Edit2: TEdit;
    Edit3: TEdit;
    Label2: TLabel;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure GetDataForArea;
    procedure DrawArea;
    procedure DrawOsX;
    procedure DrawOsY;
    procedure DrawFunc;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  os = record                  //запись оси
    x0,y0,xk,yk:integer;         //х,у нач и конеч
    argMin,argMax:real;
    kSh,dSh,hSh:integer;         //кол штрихов,длина шагов, высота штрихов
    raz:integer;
    StL,Stxk,Styk:integer; Stalf:real;
  end;
  func = record                         //
    gMASxy:array[0..100] of Tpoint;     // массив точек
    MASy,MASx:array[0..100] of real;    // массивы значений для х и у
    yMax,yMin,xMax,xMin:real;          //
    kt:real;                         //кол точек
    ki:integer;                     //кол точек для цикла
    Mx,My:real;
    sh:real;                      //шаг

  end;
  oblast = record             //область
    x0,y0,xk,yk:integer;
    otstup:integer;
  end;

var
  Form1: TForm1;
  osX,osY:os;
  F:func;
  Area:oblast;
implementation

{$R *.dfm}
function ff(x:real):real;    //график
begin
ff:=x*cos(x)+sin(x);
 end;
procedure GetDataForOsX;
begin
  OsX.x0:=Area.x0;
  OsX.xk:=Area.xk; OsX.yk:=Area.yk div 2; OsX.y0:=Area.yk div 2;
  OsX.raz:=OsX.xk-OsX.x0;
end;

procedure GetDataForOsY;
begin
 OsY.x0:=Area.xk div 2;
  OsY.xk:=Area.xk  div 2;   OsY.yk:=Area.y0;  OsY.y0:=Area.yk;
  OsY.raz:=OsY.y0-OsY.yk;
end;

procedure TForm1.GetDataForArea;
begin
  with Area do begin
    x0:=Area.otstup;
    y0:=Area.otstup;
    xk:=Image1.Width-otstup;
    yk:=Image1.Height-otstup;
  end;
end;

procedure TForm1.DrawArea;
begin
  GetDataForArea;
  Image1.Canvas.Pen.Color:=clYellow;
  Image1.Canvas.Rectangle(area.x0,area.y0,area.xk,area.yk);
end;

procedure TForm1.DrawOsX;
Var i,x,dx:integer;
begin
  GetDataForOsX;
  Image1.Canvas.Pen.Color:=clBlack;
  Image1.Canvas.MoveTo(OsX.x0,OsX.y0);
  Image1.Canvas.LineTo(OsX.xk,OsX.yk);
  x:=OsX.x0; dx:=(OsX.xk-OsX.x0)div OsX.kSh;
  For i:=1 to OsX.ksh do begin
    Image1.Canvas.MoveTo(x,OsX.y0+OsX.hSh div 2);
    Image1.Canvas.LineTo(x,OsX.y0-OsX.hSh div 2);
    x:=x+dx;
  end;
end;
procedure TForm1.DrawOsY;
Var i,y,dy:integer;
begin
  GetDataForOsY;
  Image1.Canvas.Pen.Color:=clBlack;
  Image1.Canvas.MoveTo(OsY.x0,OsY.y0);
  Image1.Canvas.LineTo(OsY.xk,OsY.yk);
  y:=OsY.y0; dy:=(OsY.yk-OsY.y0)div OsY.kSh;
  For i:=1 to OsY.ksh do begin
    Image1.Canvas.MoveTo(OsY.x0-OsY.hSh div 2,y);
    Image1.Canvas.LineTo(OsY.x0+OsY.hSh div 2,y);
    y:=y+dy;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var  i:integer; dx,x:real;
begin
  F.sh:= strToint(Edit1.Text);
  F.xMin:=StrToInt(Edit2.Text);
  F.xMax:=StrToInt(Edit3.Text);
  F.kt:=(F.xMax-F.xMin)*f.sh +1;
  x:=F.xMin;dx:=(F.xMax-F.xMin)/(F.kt - 1);
  F.yMin:=1e+38;
  F.yMax:=-1e+38;
  f.ki:=trunc(f.kt);
  For i:=1 to F.ki do begin
      F.MASy[i]:=ff(x); F.MASx[i]:=x;
      if f.MasY[i]<f.yMin then F.yMin:=F.MasY[i];
      if f.MasY[i]>f.yMax then F.yMax:=F.MasY[i];

      x:=x+dx;
  end;

end;

procedure GetMxMy;
begin
  F.Mx:=(Osx.xk-Osx.x0)/(F.xMax-F.xMin);
  F.My:=(Osy.y0-Osy.yk)/(F.yMax-F.yMin);
end;

procedure TForm1.DrawFunc;
var x,y,i:integer;
begin
  x:=area.otstup+round(F.Mx*F.masx[1]);
  y:=area.otstup+osY.raz-round(F.My*(F.masy[1]-f.yMin));
  Image1.Canvas.MoveTo(x,y);
  for i:=2 to f.ki do begin
    x:=area.otstup+round(F.Mx*F.masx[i]);
    y:=area.otstup+osY.raz-round(F.My*(F.masy[i]-f.yMin));
    Image1.Canvas.lineTo(x,y);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  DrawArea;
  DrawOsX;
  DrawOsY;
  GetMxMy;
  DrawFunc;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Area.otstup:=15;
  osX.hSh:=9; osX.kSh:=9;
  osY.hSh:=9; osY.kSh:=9;

end;

end.
MariaD вне форума Ответить с цитированием
Старый 04.04.2013, 06:38   #2
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Опасайтесь деления на ноль в своих программах.
Допустим здесь свободно может быть ноль.
Код:
x:=F.xMin;dx:=(F.xMax-F.xMin)/(F.kt - 1);
Используйте условные операторы.
Код:
if (F.kt - 1)<>0 then dx:=(F.xMax-F.xMin)/(F.kt - 1) 
else dx:=(F.xMax-F.xMin)
Центр координат перенести очень легко. Для абсциссы нужно каждой точке координаты "Y" прибавлять Image1.Height div 2. Для ординаты нужно каждой точке координаты "Х" прибавлять Image1.Width div 2.
Тоже самое нужно проделать с графиком. К каждой точке графика прибавляйте width и height.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построение графиков в Delphi 7 Verusen1ka Помощь студентам 2 23.01.2012 08:50
Построение графиков и диаграмм Delphi Dima-91 Помощь студентам 4 16.11.2010 20:18
Построение графиков <3myworld Microsoft Office Excel 2 18.03.2010 07:48
Программа "Построение графиков" Delphi zefir1594 Помощь студентам 4 31.10.2009 18:03