Tutorial
Winkelumwandlung
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„át sich durch Dr�cken der Esc-Taste beenden(auch Ctrl-C bzw. Ctrl-š),"
Print "auáer wenn es gerade im Eingabe-Modus ist(dann Enter dr�cken)"
Print "Durch Druck auf die jeweils gew�nschte Taste wird der Winkel-Modus gew„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„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�r (ost-)milit„rische Zwecke ;-)"
Print " westî 6400 1600 f�r (west-)milit„rische Zwecke :D"
Print " nautî 32 8 interessant f�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„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 ytwinky angelegt.
- Die aktuellste Version wurde am 09.10.2009 von ytwinky gespeichert.
|
|