Jak opisac osie układu współrzędnych?

0

Moja pytanie dotyczy jak opisac osie takiego programu. Osie układu wpspółrzędnych?

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Spin, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel: TPanel;
    edXmin: TEdit;
    edXmax: TEdit;
    lbXmin: TLabel;
    lbXmax: TLabel;
    edMX: TSpinEdit;
    edMY: TSpinEdit;
    lbMX: TLabel;
    lbMY: TLabel;
    rb1: TRadioButton;
    rb2: TRadioButton;
    rb3: TRadioButton;
    rb4: TRadioButton;
    procedure edXminExit(Sender: TObject);
    procedure edXmaxExit(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure rb1Click(Sender: TObject);
    procedure rb2Click(Sender: TObject);
    procedure rb3Click(Sender: TObject);
    procedure rb4Click(Sender: TObject);
  private
    { Private declarations }
  public
    Xmin, Xmax, Ymin, Ymax: Double;
    XEmin, XEmax, YEmin, YEmax: Integer;
    function XE(X: Double): Integer;

    function YE(Y: Double): Integer;
    function f(X: Double): Double;
    procedure ZnajdzMinMaxY;
    function f1(X: Double): Double;
    function f2(X: Double): Double;
    function f3(X: Double): Double;

    { Public declarations }

  end;
var
  Form1: TForm1;

implementation

function TForm1.XE(X: Double): Integer;
begin
  Result := Round((X - Xmin) * (XEmax - XEmin) / (Xmax - Xmin) + Xemin);
end;

function TForm1.YE(Y: Double): Integer;
begin
  Result := Round((Y - Ymin) * (YEmin - YEmax) / (Ymax - Ymin) + YEmax);
end;

function TForm1.f(X: Double): Double;
begin
  if rb1.Checked then
    f := f1(x);
  if rb2.Checked then
    f := f2(x);
  if rb4.Checked then
    f := f3(x);
end;

function TForm1.f1(x: double): double;
begin
  Result := sin(abs(cos(2 * x) + cos(x * x)))
end;

function TForm1.f2(x: double): double;
begin
  Result := sqr(sin(3 * x) - cos(3 * x)) + sin(5 * x)
end;

function TForm1.f3(x: double): double;
begin
  Result := sqr(2 * (sin(2 * x))) * (2 * (cos(2 * x)))
end;

procedure TForm1.ZnajdzMinMaxY;
var
  Krok, X: Double;
begin
  Ymin := F(XMin); {przyjmujemy na początek, że pierwsza wartość jest najmniejsza}
  Ymax := Ymin; {i największa}
  Krok := (Xmax - Xmin) / (XEMax - XEMin); {ustalamy krok poszukiwania wartości funkcji}
  X := Xmin; {rozpoczynamy od pierwszego punktu rysowanego wykresu}
  repeat
    X := X + Krok; {przechodzimy do kolejnego punktu}
    if F(X) > Ymax then
      Ymax := F(x); {porównujemy wartość funkcji z wartością dotąd największą i ewentualnie zapamiętujemy ją jako nowe maksimum}
    if F(X) < Ymin then
      Ymin := F(x); {jw. tylko wartość najmniejsza i minimum}
  until X >= Xmax; {powtarzamy do momentu osiągnięcia punktu końcowego wykresu}
end;

{$R *.dfm}

procedure TForm1.edXminExit(Sender: TObject);
begin
  Xmin := StrToFloat(edXmin.Text);
  ZnajdzMinMaxY;
  Refresh; {odświeżenie rysunku}
end;

procedure TForm1.edXmaxExit(Sender: TObject);
begin
  Xmax := StrToFloat(edXmax.Text);
  ZnajdzMinMaxY;
  Refresh;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  {wraz ze zmianą rozmiaru formy zmienia się wielkość obszaru rysowania}
  XEMin := edMX.Value;
  XEMax := ClientWidth - edMX.Value;
  Yemax := ClientHeight - edMY.Value;
  Yemin := Panel.Height + edMY.Value;
  ZnajdzMinMaxY;
  Refresh;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Xmin := 0;
  Xmax := 1;
  FormResize(Sender);
  ZnajdzMinMaxY;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  X, Krok: Double;
begin
  with Canvas do
  begin
    Pen.Width := 1;
    Brush.Color := clsilver;
    Rectangle(XEmin, YeMin, XeMax, YeMax); {narysowanie prostokąta w którym będzie rysowany wykres}
    X := Xmin; {określenie wartości startowej}
    Krok := (Xmax - Xmin) / (XEMax - XEMin); {krok rysowania}

    {rysowanie wykresu od punktu startowego do Xmax}
    repeat
      MoveTo(Xe(X), Ye(f(X)));
      X := X + Krok;
      LineTo(Xe(X), Ye(f(X)));
    until X >= Xmax;

    {rysowanie osi X}
    Pen.Width := 2;
    if Xmin > 0 then
    begin
      MoveTo(XEMin, YEMin);
      LineTo(XEMin, YEMax);
    end
    else if Xmax < 0 then
    begin
      MoveTo(XEMax, YEMin);
      LineTo(XEMax, YEMax);
    end
    else
    begin
      MoveTo(XE(0), YEMin);
      LineTo(XE(0), YEMax);
    end;

    {rysowanie osi Y}
    if Ymin > 0 then
    begin
      MoveTo(XEMin, YEMax);
      LineTo(XEMax, YEMax);
    end
    else if Ymax < 0 then
    begin
      MoveTo(XEMin, YEMin);
      LineTo(XEMax, YEMin);
    end
    else
    begin
      MoveTo(XEmin, YE(0));
      LineTo(XEMax, YE(0));
    end
  end;
end;

procedure TForm1.rb1Click(Sender: TObject);
begin
  refresh;
  FormResize(Sender);
end;

procedure TForm1.rb2Click(Sender: TObject);
begin
  refresh;
  FormResize(Sender);
end;

procedure TForm1.rb3Click(Sender: TObject);
begin
  refresh;
  FormResize(Sender);
end;

procedure TForm1.rb4Click(Sender: TObject);
begin
  refresh;
  FormResize(Sender);
end;

end.
0

Dzięki...;) ale juz sam doszedłem jak to zrobic. A chodziło mi o to jak zrobic żeby osie miały nazwy, czyli X i Y i zeby była pokazana skala czyli na przecięciu się osi 0 i 1 i tyle.

Ale dzięki za zainteresowanie
Pozdrawiam. ;;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1