Program Statik1;       {********************************************}
                       {*               (C) TB-TechSoft            *}
{$I Grafik3.inc}       {*    T.Beekhuis,Adlerstr.6a,2400 Luebeck   *}
{$I Turtle3.inc}       {********************************************}


{-------------------------------------------------------------------}


           TYPE
                      Index=Array [1..10] of Real;

           VAR
                    Winkel : Index;
                   Groesse : Index;
                     Fx,Fy : Index;
                Fr,FrX,FrY : Real;
                       X,Y : Real;
                 ResWinkel : Real;
                 M,W,I,n,Z : Integer;
                    Teiler : Real;
                     Menue : String[1];

           CONST
                         PI=3.14159;
                     Faktor=0.017453292;


           LABEL
                  Ruecksprung,Neustart;



{-------------------------------------------------------------------}


Procedure VORSTELLUNG;

Begin
ClrScr;

Writeln('        **************************************************');
Writeln('        *                                                *');
Writeln('        *           STATIK-PROGRAMM 1 (ZKS)  (v.3)       *');
Writeln('        *                                                *');
Writeln('        *           (C) TB-Technical-Software            *');
Writeln('        *                                                *');
Writeln('        **************************************************');

              Delay(1000);                       {VERZOEGERUNG}

GotoXY(1,10);
Writeln('         Mit diesem Programm wird die RESULTIERENDE KRAFT  ');
Writeln;
Writeln('         <Fr> mehrerer Einzelkraefte im zentralen Kraefte-');
Writeln;
Writeln('         system [X-Y] nach Groesse und Richtung berechnet.');

              Delay(4000);

GotoXY(1,18);
Writeln('         Geben Sie die Werte ein und quittieren Sie die Ein-');
Writeln;
Writeln('         gabe mit <ENTER>.          ');

              Delay(3000);

End;


{-------------------------------------------------------------------}


Procedure EINGABE;

Begin
ClrScr;

  GotoXY(12,23);    LowVideo;
  Write(' Druecken Sie nach Eingabe <ENTER> ');
                    NormVideo;

n:=2;                                            {TESTVORGABE}
GotoXY(1,1);
Write('Mit welcher Anzahl von Kraeften wollen Sie arbeiten : '); Readln(n);
Writeln;
Writeln;

I:=1;
For Z:=1 to n do
  Begin
    Writeln('Kraft ',I,' : ');
    Write('Nennen Sie Bitte die Groesse   : '); Read(Groesse[Z]);
    Writeln(' N');
    Write('Unter welchem Winkel wirkt sie : '); Read(Winkel[Z]);
    Writeln(' Grad');
    Writeln;
    I:=I+1;
  End;

Delay(800);
ClrScr;

End;


{-------------------------------------------------------------------}


Procedure RECHNEN;                               {RECHENTEIL}

Begin


M:=2;  Teiler:=1;                                {X/Y-Komponenten}
For Z:=1 to n do
  Begin
    Fy[Z]:=sin(Winkel[Z]*Faktor)*Groesse[Z];
    Fx[Z]:=cos(Winkel[Z]*Faktor)*Groesse[Z];
  End;


FrY:=0;                                          {Y-Summe}
For Z:=1 to n do
  Begin
    FrY:=FrY+Fy[Z];
  End;


FrX:=0;                                          {X-Summe}
For Z:=1 to n do
  Begin
    FrX:=FrX+Fx[Z];
  End;


ResWinkel:=(ArcTan(FrY/FrX))/Faktor;             {Winkel v. Fr}

Fr:=sqrt(sqr(FrX)+sqr(FrY));                     {Resultierende Fr}


    IF (FrX >=  0) and (FrY >=  0) then             {QUADRANT I}
       Begin
         ResWinkel:=ResWinkel;
       End;

    IF (FrX <= 0) and (FrY >= 0) then               {QUADRANT II}
       Begin
         ResWinkel:=180+ResWinkel;
       End;

    IF (FrX <= 0) and (FrY <= 0) then               {QUADRANT III}
       Begin
         ResWinkel:=180+ResWinkel;
       End;

    IF (FrX >= 0) and (FrY <= 0) then               {QUADRANT IV}
       Begin
         ResWinkel:=360+ResWinkel;
       End;

    IF Trunc(Fr)=0 then                             {BEGRENZUNG}
       Begin
         ResWinkel:=0;
       End;

End;


{-------------------------------------------------------------------}


Procedure AUSGABE;                               {AUSGABETEIL}

Begin

GotoXY(1,5);
Writeln('        ==================================================');
Writeln;
Writeln('          Die Kraft Fr betraegt ',Fr:6:2,' N;');
Writeln;
Writeln('          sie wirkt unter dem Winkel von ',ResWinkel:4:2,' GRAD');
Writeln;
Writeln('        ==================================================');

GotoXY(12,22);     LowVideo;
Writeln(' Bitte druecken Sie <ENTER>  um die Grafik ');
GotoXY(12,23);
Writeln('                 zu aktivieren.            ');
                   NormVideo;
Readln;
ClrScr;

End;


{----------------------Grafikerweiterung----------------------------}

procedure pfeil;                                 {VECTORENSPITZE}
begin
  turnleft(15);
  back(25);
  turnleft(75);
  forwd(13);
  turnright(105);
  forwd(25);
  turnleft(15);
end;

procedure Vector(Radius,Winkel,Art : Integer);   {VECTORENAUFBAU}
VAR    I:Integer;
Begin
  SetHeading(East);
  TurnLeft(Winkel);

  If Art=0 then
  Begin
    PenDown;   Forwd(Radius);
  End;

  If Art=1 then
  Begin
    For I:=1 to 5 do
    Begin
      PenDown;Forwd(Round(Radius/10));
      PenUp;  Forwd(Round(Radius/10));
    End;
  End;

  PenDown;  Pfeil;
End;

{------------------Ende der Grafikerweiterung-----------------------}


Procedure GRAFIK;                                {GRAFIKTEIL}

Begin

InitGrafik;                                      {GRAFIK-AKTIVIERUNG}
SetPosition(0,0);

Origin(2,2); SetHeading(North); Forwd(396);      {RAHMEN}
TurnRight(90); Forwd(636); TurnRight(90);
Forwd(396); TurnRight(90); Forwd(636);

Origin(488,2); SetHeading(North); Forwd(50);     {SCHRIFTFELD}
TurnRight(90); Forwd(150);


Origin(360,200);                                 {NULLPUNKT SETZEN}

SetPosition(-180,0);                             {X-ACHSE}
SetHeading(WEST);
Pfeil;
SetHeading(EAST);
Forwd(360);
Pfeil;

SetPosition(0,-180);                             {Y-ACHSE}
SetHeading(SOUTH);
Pfeil;
Back(360);
SetHeading(NORTH);
Pfeil;

SetPosition(0,0);                                {NULL-PUNKT}
SetHeading(EAST);

Vector(Round(Fr/Teiler),Round(ResWinkel),1);     {Resultierende Fr}
PenUp; Forwd(12); TAG; Write('Fr'); TAGoff;
PenDown;


I:=1;
For Z:=1 to n do                                 {Aktionskraefte}
  Begin
    Origin(360,200);
    Vector(Round(Groesse[Z]/Teiler),Round(Winkel[Z]),0);
    PenUp; Forwd(12); TAG; Write('F',I); TAGoff;
    Back(Round(Groesse[Z]/Teiler)); PenDown; I:=I+1;
  End;

End;


{-------------------------------------------------------------------}


Procedure BESCHRIFTUNG;                          {BESCHRIFTUNGSTEIL}

Begin

SetPosition(170,-8);                             {BESCHRIFTUNG X-ACHSE}
GrafOut(CHR(88));

SetPosition(10,180);                             {BESCHR. Y-ACHSE}
GrafOut(CHR(89));


GotoXY(64,24);                                   {BESCHR.SCHRIFTFELD}
Write('(C) TB-TechSoft');


I:=1;  W:=2;                                     {AUFLISTEN DER KRAEFTE}
For Z:=1 to n do
  Begin
    GotoXY(4,W);
    Write('F',I,' : ',Groesse[Z]:4:2,' N');
    W:=W+1;  I:=I+1;
  End;


I:=1;                                            {AUFLISTEN DER WINKEL}
For Z:=1 to n do
  Begin
    GotoXY(4,W);
    Write(CHR(97),I,' : ',Winkel[Z]:3:2,' Grad');
    W:=W+1;  I:=I+1;
  End;


GotoXY(60,2);                                    {AUSGABE Fr/ar}
Write('Fr : ',Fr:6:2,' N');

GotoXY(60,4);
Write('ar : ',ResWinkel:4:2,' Grad');

If Teiler <> 1 then                              {Masstab}
Begin
  GotoXY(60,6);
  LowVideo;
  Write(' Masstab ',Teiler:1:1,' : 1 ');
  NormVideo;
End;

GotoXY(4,21);                                    {MENUE}
Write  ('Dokumentation : <D>');
GotoXY(4,22);
Write  ('Masstab       : <M>');
GotoXY(4,23);
Write  ('Neue Rechnung : <N>');
GotoXY(4,24);
Write  ('Abbruch       : <A>');
GotoXY(1,25);
Read(Kbd,Menue);

SetPosition(0,0);                                {RUECKSETZEN DER TURTLE}
SetHeading(NORTH);

End;


{-------------------------------------------------------------------}


Begin                                            {HAUPTPROGRAMM}

VORSTELLUNG;
  NEUSTART:
EINGABE;
RECHNEN;
AUSGABE;
  RUECKSPRUNG:
GRAFIK;
BESCHRIFTUNG;

  If Menue in ['N','n'] then
    Begin
      Menue:='';
      Goto Neustart;
    End;


  If Menue in ['A','a'] then
    Begin
      ClrScr;
      Write('Ende des Arbeitsprogrammes');
                   LowVideo;
    GotoXY(15,10);Writeln('                                                  ');
    GotoXY(15,11);Writeln('  "S T A T I K  I :     Zentrales Kraeftesystem"  ');
    GotoXY(15,12);Writeln('                                                  ');
                   NormVideo;
      Delay(2000);
      ClrScr;
      Halt;
    End;


  If Menue in ['M','m'] then
    Begin
      ClrScr;
      Writeln('Bitte nennen Sie den gewuenschten Faktor  ');
      Write('mit dem vergroessert / verkleinert werden soll : ');
      Read(Teiler);  ClrScr;
      Write('Eingestellter Masstab :   ',Teiler:1:1,' : 1   ( Autostart )');
      Delay(1200);  Goto Ruecksprung;
    End;


  If Menue in ['D','d'] then
    Begin
      I:=1;

      Writeln(LST,Chr(14),'DOKUMENTATION :');
      Write(LST,Chr(20),Chr(10));

      For Z:=1 to n do
        Begin
          Writeln(LST,'Aktionskraft F',I,'     : ', Groesse[Z]:6:2,' N');
          Writeln(LST,'Winkel zur X-Achse  : ',Winkel[Z]:4:2,' Grad');
          Write(LST,Chr(10));
          I:=I+1;
        End;

      Writeln(LST,'Resultierende Kraft : ',Fr:6:2,' N');
      Writeln(LST,'   unter Alpha/res. = ',ResWinkel:4:2,' Grad');

      Goto Ruecksprung;

    End;

End.