Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Winkelumwandlung

von RedakteurytwinkySeite 1 von 1

Nun, ein Programm, das Winkel von Deg nach Rad umrechnet und umgekehrt, ist schnell gemacht..
..und eigentlich auch einfach, doch es gibt dabei auch einiges zu berücksichtigen.
Es geht hierbei jedoch nicht um die Benutzung der Winkelfunktionen, sondern rein um die Umwandlung zwischen verschiedenen Systemen. Denn es gibt ja nun mal mehrere..
Die ich mir für dieses Programm herausgesucht habe sind:
-Altgrad(also DEG), hier hat ein Vollkreis 360°
Dabei gibt es zwei Unterformen:
-Die Dezimaldarstellung(sollte eigentlich jedem geläufig sein..): 194.1956°
-Die klassische Darstellung mit ° ' " (z.B. 194° 19' 56")
-Neugrad(im Vermessungswesen Vorschrift seit 1972), hier hat ein Vollkreis 400gon
(Die früher auch erlaubte Darstellung mit g c und cc habe ich mir hier erspart, weil sie zu exotisch ist :D)
-Radiant(Rad), hier hat der Vollkreis einen Umfang von 2*Pi
(Es ist die genaueste Form der Darstellung)
-Strich, mit den Unterformen
-West¯ : Hier hat der Vollkreis 6000¯ (Ein westliches Militärsystem)
-Ost¯ : Mit dem Vollkreis 6400¯ (Ein östliches Militärsystem)
-Naut¯ : Mit dem Vollkreis 32¯ (ein nautisches System)
(Damit mal klar wird, was es heißt: Ruder zwo Strich backbord)
Nach dem Aufruf meldet sich das Programm mit einer Eingabemaske, in der der gewünschte (Eingabe-) Winkelmodus eingestellt werden kann. Durch Druck auf 'e' gelangt man dann in den Eingabemodus zur Winkeleingabe, die mit Enter abgeschlossen wird. Das war's schon..
Eine Besonderheit ist der klassische Modus bei Altgrad, dort wird die Eingabe nur akzeptiert, wenn sie im Format ggg° mm' ss" eingegeben wird. Der Winkel wird nach Drücken von Enter in allen Winkelarten berechnet und ausgegeben..
Es sind einige nützliche Funktionen enthalten, die auch als Bausteine in andere Programme passen, schließlich haben sie genauso ihren Weg in dieses Programm gefunden..

'AnzeigeCheck:|Il1 sind Alt-0124, Großes i, kleines L, Eins „ä”ö�üáߎę֚Üñ±¸©ø°
'Läuft so ab 0.17f
Type Real As Double 'Tipp von MVXA, thx, klappt :D
Declare Function dez2gms(byVal DezDeg As Real) As String 'Dezimal konvertieren in ggg° mm' ss", gt
Declare Sub Eingabe()
Declare Function gms2dez(byVal gms As String) As Real 'ggg° mm' ss" in dezimal umwandeln

Declare Sub Hilfe
Declare Sub Init()
Declare Function MakeIt(byVal c As Integer, byVal Anz As Integer) As String
Declare Function MenuChar(byVal s As String, byVal First As Integer=1, byVal nVG As Integer=12) As String
Declare Sub ModeChange(byVal mc As String)
Declare Sub PrintIt(byVal Winkel As String)
Declare Function Replace(byVal Text As String, byVal Suche As String, byVal ErsetzeMit As String) As String
Declare Function Rho(byVal Which As Integer=0) As Real

Const Author="WinkelUmrechnen.Bas ¸2007 by ytwinky, MD                    F1=Hilfe(auch h)"
Const Modes="'dgrown", Pi=4.0*Atn(1.0), Gelb=14, Esc=!"\27", QM=!"\34", FunKey=255
Const LineChar="ÚÃÂÁÀ"

Dim As String Winkel, mc
Dim Shared As Integer WMod=3, NoProtocol, i
Dim Shared As Integer WPos(7)={0, 10, 23, 32, 41, 59, 66, 74}, WModPos(7)={0, 17, 25, 34, 48, 60, 66, 73}
Dim Shared As Integer WFmt(6, 1 To 2)={{3, 4}, {3, 4}, {1, 15}, {4, 1}, {4, 1}, {2, 1}}
Dim Shared As Real aRho(7)={0, 45, 45, 50, Atn(1), 750, 800, 4}, wRad
Dim Shared As String Protokoll
NoProtocol=Command(1)="/-"
Protokoll=Left(Command(0), Len(Command(0))-3) &"Log"
Init()
Do
  Do
    Sleep 1
    mc=lcase(Inkey)
    If mc=Esc Then End
    If mc=Chr(FunKey, 59) Then mc="h"
  Loop Until Instr(Modes &"eh", mc)
  Select Case mc
    Case Esc : End
    Case "h" : Hilfe()
    Case "e" : Eingabe()
    Case Else :ModeChange(mc)
  End Select
Loop

Function dez2gms(byVal dezdeg As Real) As String 'Dezimal konvertieren in ggg° mm' ss"
    Dim fd As Integer=Fix(dezdeg), d As Real=(dezdeg-fd)*60, Grad As String=Right("   " &Str(fd), 3)
  Dim As String Minuten=Right(Str(Fix(d)+100), 2), Sekunden=Right(Str(Fix((d-Fix(d))*60)+100), 2)
  Return Grad &"ø " &Minuten &"' " &Sekunden &QM

End Function 'Alle Berechnungszeilen sind kommentiert :rofl:

Sub Eingabe()
  Dim Winkel As String 'Da kommt die Eingabe rein
  Locate 8, 8
  Print MenuChar("e", 1, Gelb) 'Eingabe auf aktiv setzen
  Locate 8, 16
  Print Space(62) 'ggfs. Reste löschen..
  Locate 8, 16
  Input Winkel 'Eingabe holen
  If Winkel<>"" Then 'ist überhaupt was eingegeben?
    If WMod>1 Then
      wRad=Val(Winkel)/Rho 'umrechnen in das Maß aller Dinge
    Else
      wRad=gms2dez(Winkel)/Rho
    End If
    While wRad>2*Pi 'Falls jemand meint, daß es Winkel gibt, die größer als ein Kreis sein können..
      wRad-=2*Pi '..einfach einen Kreis abziehen
    Wend 'bis es nur EINEN Kreis gibt..
    While wRad<0 'wer einfach nur wissen will, wie ein negativer Winkel positiv aussieht..
      wRad+=2*Pi '..biddeschööön..
    Wend 'nochmal, wenn nötig..
'
'Achtung: Wer das Programm zum Umwandeln negativer Ergebnisse der Arcus-Funktionen einsetzt..
'..darf sich über falsche Ergebnisse nicht wundern..
'Das Programm kann nicht denken, es wandelt um, was ihm aufgetragen wird..
'Atn(Tan(170°)) gibt -10 vollkommen richtig als Ergebnis aus, aber bei Atn muß in diesem Fall 180°
'(also Pi) ergänzt werden, das geht aber aus -10 alleine nicht hervor..
'
    PrintIt(Winkel) 'Ausgeben, was ermittelt werden konnte
  End If
  Locate 8, 8
  Print MenuChar("e") ' Eingabe deaktivieren..
End Sub

Sub Hilfe 'kk
  Dim c As String
  Cls
  Print Author
  Print "Eigentlich sollte WinkelUmrechnen intuitiv zu bedienen sein.."
  Print "
Anyway, hier kommt eine kurze Bedienungs-Anleitung:"
  Print !"
(Wie das Programm aufgerufen wird, ist offensichtlich nicht die Frage..)"
  Print "
Das Programm l&#8222;át sich durch Dr&#65533;cken der Esc-Taste beenden(auch Ctrl-C bzw. Ctrl-&#353;),"
  Print "
auáer wenn es gerade im Eingabe-Modus ist(dann Enter dr&#65533;cken)"
   Print "
Durch Druck auf die jeweils gew&#65533;nschte Taste wird der Winkel-Modus gew&#8222;hlt"
  Print "
Mit 'e' befindet sich das Programm im Eingabe-Modus"
  Print "WinkelKreis auf den Kreis reduziert.."
  Print "Grundlagen:"
  Print "Modus              Vollkreis    Rechter Winkel  Bemerkungen"
  Print "Altgrad"
  Print !"  ø'\34                360ø           90ø         1ø=60' , 1'=60\34"
  Print "  deg                360ø           90ø         weitere Unterteilung entf&#8222;llt"
  Print "Neugrad"
  Print "  gon                400            100         Es gibt keine Unterteilung mehr"
  Print "Bogenmaá(Radiant)"
  Print "  rad                2*Pi           Pi/2        genaueste Darstellung"
  Print "Strichî"
  Print "  ostî               6000           1500        f&#65533;r (ost-)milit&#8222;rische Zwecke ;-)"
  Print "  westî              6400           1600        f&#65533;r (west-)milit&#8222;rische Zwecke :D"
  Print "  nautî              32                8        interessant f&#65533;r Seeleute ^^"
  Print !"Bei Eingabe im ø'\34-Modus MUSS der String folgendes Format haben:gggø mm' ss\34"
  Print "Ein Berechnungs-Log steht in der Datei " &Protokoll;
  Sleep
  Do
    c=Inkey
  Loop Until c=""
  Init()
End Sub

Sub Init() 'kk
  Screen 0:Width 90, 25
  Print MakeIt(1, 76) &"¿"
  Print MenuChar("³" &Author &"³", 76)
  Print MakeIt(2, 7) &MakeIt(3, 21) &MakeIt(3, 8) &MakeIt(3, 17) &MakeIt(3, 19) &"´"
  Print "³Eingabe³         Altgrad     ³Neugrad ³     Bogenmaá    ³       Strich      ³"
  Print MenuChar("³Modus  ³      ø'""   ³  ", 17);MenuChar("deg(ø)³  ");MenuChar("gon   ³       ");
  Print MenuChar("rad       ");
  Print MenuChar("³ ostî ³", 3);MenuChar("westî ³");MenuChar("nautî³")
  Print "³w&#8222;hlen ³174ø 46' 33""³174.7760³194.1956³3.050417351597310³2912.9³3107.1³ 15.5³"
  Print MakeIt(2, 7) &MakeIt(4, 12) &MakeIt(4, 8) &MakeIt(4, 8) &MakeIt(4, 17) &MakeIt(4, 6);
  Print MakeIt(4, 6) &MakeIt(4, 5) &"´"
  Print MenuChar("³Winkeleingabe:" &Space(62) &"³", 8)
  Print MakeIt(5, 76) &"Ù"
  Locate 5, WModPos(WMod), 0
  Print MenuChar(Mid(Modes, WMod, 1), 1, Gelb)
End Sub

Function MakeIt(byVal c As Integer, byVal Anz As Integer) As String
  Return Mid(LineChar, c, 1) &String(Anz, "Ä")

End Function

Function MenuChar(byVal s As String, byVal First As Integer=1, byVal nVG As Integer=12)As String
  If First1 Then Print Mid(s, 1, First-1);
  Color nVG 'Gewünschte Vordergrundfarbe einstellen
  Print Mid(s, First, 1); 'MenuChar ausgeben
  Color 7, 0 ' Normal Weiß auf Schwarz setzen..
  Return Mid(s, First+1) 'Rest zurückgeben..
End Function

Sub ModeChange(byVal mc As String) 'Moduswechsel durchführen..
  i=Instr(Modes, mc)
  If i Then
    Locate 5, WModPos(WMod)
    Print MenuChar(Mid(Modes, WMod, 1), 1) 'alten Modus auf rot setzen
    Locate 5, WModPos(i)
    Print MenuChar(Mid(Modes, i, 1), 1, Gelb) 'neuen Modus aktiv setzen
    WMod=i
  End If
End Sub

Sub PrintIt(byVal Winkel As String) 'Ergebnisse ausgeben..
  Dim DNr As Integer=FreeFile, s As String=dez2gms(wRad*Rho(2))
  Dim As String Einheit(1 To 7)={"",", " gon", " rad", " ost¯", " west¯", " naut¯"}
  If Winkel="" Then Exit Sub 'Fehleingaben nicht protokollieren..
  Locate 6, WPos(1)
  Print s
  For i=2 To 7
    Locate 6, WPos(i)
    Print Using String(WFmt(i-2, 1), "#") &"." &String(WFmt(i-2, 2), "#");wRad*Rho(i)
  Next

  If NoProtocol Then Exit Sub

  Open Protokoll For Append As #DNr
      Print #Dnr, Date &", " &Time &" " &Environ("UserName") &" am " &Environ("ComputerName");
      Print #Dnr, "
Winkel=" &Replace(Winkel, "ø", "°") &Einheit(WMod)
      Print #Dnr, "
|         Altgrad     |Neugrad |     Bogenmaß    |       Strich      |"
      Print #Dnr, "
|      °'""   |  deg(°)|  gon   |       rad       | ost¯ |west¯ |naut¯|"
      Print #Dnr, "|" &Replace(s, "ø", "°");
    For i=2 To 7
        Print #Dnr, "|";
      If i=7 Then   Print #Dnr, " ";
        Print #Dnr, Using String(WFmt(i-2, 1), "#") &"." &String(WFmt(i-2, 2), "#");wRad*Rho(i);
    Next
      Print #Dnr, "|"

  Close #DNr
End Sub

Function Replace(byVal Text As String, byVal Suche As String, byVal ErsetzeMit As String) As String
  Dim i As Integer, s As String=Text
  While Instr(s, Suche)
    i=Instr(s, Suche)
    s=Left(s, i-1) &ErsetzeMit &Mid(s, i+Len(Suche))
  Wend
  Return s
End Function

Function Rho(byVal Which As Integer=0) As Real 'Der Umrechnungsfaktor Rho kann hier keine Konstante sein..
  Return aRho(IIF(Which=0, WMod, Which))/Atn(1)
End Function

..so genug der Vorrede und viel Spaß beim Umwandeln..
Nachwort:
Wer jetzt meint, die Berechnung mit den Doubles sei ja viel zu aufwendig und es würde ausreichen, Real As Single zu Typen, der möge das bitte versuchen..
..und die Ergebnisse dann mit einem Taschenrechner nachrechnen(geht auch mit Calc.Exe/Rechner-Plus). Es macht schon einen Unterschied..
..besonders, wenn man nach der Single-Berechnung das LogFile ansieht..
Apropos LogFile: Das kann ausgeschaltet werden, wenn man das Programm mit dem Parameter /- aufruft..
Wo das LogFile gespeichert wird? Das weiß ich nicht..
..ein Druck auf F1 zeigts aber..
Gruß
ytwinky

 

Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 19.06.2007 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 09.10.2009 von Redakteurytwinky gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen