Einzelnen Beitrag anzeigen

Kenny77

Registriert seit: 4. Dez 2010
7 Beiträge
 
#14

AW: Erstellen einer Tabelle mit Sinus- und Cosinus Werten

  Alt 5. Dez 2010, 19:03
hehe glaube du studierst maschinenbau in bielefeld oder?
Nungut , da meines Wissens nach die Tabelle als Textdatei erstellt und dann erst in ein Array geladen werden soll zeig ich dir einfach mal meine Lösung.
Aber die Aufgabe umfasste nur den Teil der Werte Ausgabe und Berechnung, deswegen lass den Zeichnen Teil lieber weg.

Am besten nutzt Du das nur als Hilfe und machst es selber. Die Prüfung wird sich sonst an Dir rechen.

hier meine Lösung :

Code:
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.

Geändert von Kenny77 ( 5. Dez 2010 um 19:11 Uhr)
  Mit Zitat antworten Zitat