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.