unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Mask, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
BitBtn1: TBitBtn;
MaskEdit1: TMaskEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function SinCos(x:double):double;
function IndexVorzeichen(x:double):double;
var
Form1: TForm1;
Werte:array[0..900] of double;
Q :integer;
f:textfile;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var s:string;
x : integer;
begin
// Sinuswerte als txt datei speichern
assignfile(f, 'Werte.txt');
rewrite(f);
for x := 0 to 900 do
begin
s:=floattostr(sin((x/10)*(Pi/180)));
writeln(f,s);
end;
closefile(f);
end;
procedure TForm1.Button1Click(Sender: TObject);
var s : string;
x,v, Ym, ySin, yCos, xSin , xCos : integer;
winkel,
Rad, SinWert, CosWert : double;
begin
// Txtfile auslesen und in Array speichern
assignfile(f, 'werte.txt');
reset(f);
for x := 0 to 900 do
begin
readln(f, s);
werte[x]:=strtofloat(s);
end;
closefile(f);
// Eingelesen
// Einlesen des Edit in Variable
winkel := strtofloat(maskedit1.Text);
if winkel > 360 then ShowMessage('falsche Eingabe');
// Umrechnen des Winkels in
Rad
Rad := winkel*Pi/180;
// Quadrant aus Winkeln bestimmen
case (round(10*winkel)) of
0..900 : begin Q := 1;
v := 1;
end;
901..1800 : begin Q := 2;
v := -1;
end;
1801..2700 : begin Q := 3;
v := -1;
end;
2701..3600 : begin Q := 4;
v := 1;
end;
end;
SinWert := IndexVorzeichen(10*winkel); // ?????????????????
CosWert := v*sqrt(1-(SinWert*SinWert));
label1.Caption:='SinWert : '+floattostr(SinWert);
label2.Caption:='CosWert : '+floattostr(CosWert);
label3.Caption:='
Rad : '+floattostr(
Rad)+'
rad';
label4.Caption:='Quadrant : '+floattostr(Q);
// #################### Funktionen zeichnen ######################
Ym:=Image1.Height div 2;
Image1.Canvas.FillRect(rect(0,0,image1.Width,image1.Height));
// Koordinatenkreuz
Image1.Canvas.MoveTo(0,Ym);
image1.Canvas.LineTo(image1.Width,Ym);
for Q := 1 to 4 do // zahler für Ober/Unterhalb der x-Achse(Case anweisungen)
begin
for x:=0 to 900 do // zahler für Array-Pointer
begin
//x-Koords
xSin := (Q-1)*90+round(x/10);
xCos := xSin-90;
if xCos < 0 then //x-Pixel < 0 ans Ende hängen
xCos := xCos+360;
//y-Koords
ySin := round(Ym-SinCos(x));
yCos := round(Ym-SinCos(x));
//Zeichnen von Auswahl
image1.Canvas.MoveTo(round(winkel),0);
image1.Canvas.LineTo(round(winkel),200);
//Zeichnen der Funktionen
image1.Canvas.Pixels[xSin,ySin]:=clred;
image1.Canvas.Pixels[xCos,yCos]:=clHighlight;
end;
end;
end;
//################################ Index+Vorzeichen
function IndexVorzeichen(x:double):double;
var a : integer;
begin
a:=round(x);
case Q of
1: begin result := werte[a];
end;
2: begin result := werte[1800-a];
end;
3: begin result := -werte[a-1800];
end;
4: begin result := -werte[3600-a];
end;
end;
end;
//################################ Sinus-Fkt
function SinCos(x:double):double;
var a : integer;
begin
a:=round(x);
case Q of
1: begin result := 90*werte[a];
end;
2: begin result := 90*werte[900-a];
end;
3: begin result := -90*werte[a];
end;
4: begin result := -90*werte[900-a];
end;
end;
end;
end.