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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2013, 04:52   #1
MariaD
Пользователь
 
Аватар для MariaD
 
Регистрация: 10.01.2013
Сообщений: 56
Вопрос График функции в Image.[Delphi]

центральный штрих на осях совпадает с другой осью только если отступ =0.а если равен какой-либо величине то несовпадает. как сделать отступ и чтобы штрихи правильно лежали?и при начерчении 10 штрихов(от -5 до 5) график строился от (-4 до 4)



Код:
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;
    Label4: 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;
  Label4.Caption :=inttostr(x div 2);
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])+osx.xk div 2;
  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])+osx.xk div 2;
    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:=0;
  osX.hSh:=9; osX.kSh:=8;
  osY.hSh:=9; osY.kSh:=8;

end;

end.
Изображения
Тип файла: jpg 10.jpg (11.3 Кб, 133 просмотров)
MariaD вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
график функции в delphi 7 Студентос Помощь студентам 9 09.12.2012 00:00
График функции chart (Delphi) Vitalya_1993 Помощь студентам 0 02.01.2012 22:41
График Функции Delphi chezz Помощь студентам 8 11.04.2010 17:43
Увеличить график функции [Delphi] StudeHt Помощь студентам 0 19.12.2009 13:25
График функции (delphi 7) Demav Помощь студентам 12 02.07.2009 08:43