Ein paar Prozeduren für Mathe (Winkel & wissens. Schreibw.)
Verfasst: 22.11.2009 19:43
Tachchen,
hier mal ein Auszug aus meinem Mathe-Include, von dem ich denke das ihr es auch gebrauchen könnt:
Wissenschaftliches Runden und Wissenschaftliche Schreibweise
Beispiel:
Beispiel:
AngleDifference gibt mir also den (kleinsten) Wert (mit Vorzeichen) zurück den ich dazunehmen muss, damit von von Angle1 zu Angle2 kommt.
Das ist nützlich wenn sich ein "Objekt" zu einem Ziel drehen soll, damit es die kürzeste Drehung macht
hier mal ein Auszug aus meinem Mathe-Include, von dem ich denke das ihr es auch gebrauchen könnt:
Wissenschaftliches Runden und Wissenschaftliche Schreibweise
Code: Alles auswählen
; Wissenschafliches Runden
Procedure.d RoundSci(Value.d, Precision=1)
If Value = 0
ProcedureReturn Value
Else
Protected Log10.d = Log10(Abs(Value)) - Precision + 1
Protected Exponent = Round(Log10, #PB_Round_Down)
ProcedureReturn Round(Value*Pow(10, -Exponent), #PB_Round_Nearest) * Pow(10, Exponent)
EndIf
EndProcedure
; Wissenschafliche Schreibweise
Procedure.s StrSci(Value.d, NbDecimals=-1, Prefix$="e")
Protected String$, Exponent
If Value = 0
Exponent = 0
Else
Protected Log10.d = Log10(Abs(Value))
Exponent = Round(Log10, #PB_Round_Down)
EndIf
Value * Pow(10, -Exponent)
Prefix$ + Str(Exponent)
If NbDecimals = -1
String$ = StrD(Value)
Else
String$ = StrD(Value, NbDecimals)
EndIf
If FindString(String$, ".", 1)
String$ = RTrim(String$, "0")
String$ = RTrim(String$, ".")
EndIf
ProcedureReturn String$+Prefix$
EndProcedure
Procedure.d ValSci(String$, Prefix$="e")
If Prefix$ = "e"
ProcedureReturn ValD(String$)
Else
Protected Position = FindString(String$, Prefix$, 1)
If Position
ProcedureReturn ValD(Left(String$,Position-1)) * Pow(10, Val(Mid(String$,Position+Len(Prefix$))))
Else
ProcedureReturn ValD(String$)
EndIf
EndIf
EndProcedure
Code: Alles auswählen
For n = 0 To 3
Debug "234.567 mit Genauigkeit "+Str(n)+" ist : "+StrD(RoundSci(234.567, n))
Next
Debug "---"
For n = 0 To 3
Debug "765.432 mit Genauigkeit "+Str(n)+" ist : "+StrD(RoundSci(765.432, n))
Next
Debug "---"
For n = -10 To 10 Step 5
Debug StrD(#PI*Pow(10,n))+" ist wissenschaftlich : "+StrSci(#PI*Pow(10,n))
Next
Debug "---"
Debug "Andere Schreibweisen für : "+StrD(#PI*1e5)
Debug StrSci(#PI*1e5, 0)
Debug StrSci(#PI*1e5, 3)
Debug StrSci(#PI*1e5, 6)
Debug StrSci(#PI*1e5, 1, "*10^")
Debug "---"
Debug ValSci("2.5e5")
Debug ValSci("2.5*10^5", "*10^")
Rechnen mit Winkeln234.567 mit Genauigkeit 0 ist : 0.0000000000
234.567 mit Genauigkeit 1 ist : 200.0000000000
234.567 mit Genauigkeit 2 ist : 230.0000000000
234.567 mit Genauigkeit 3 ist : 235.0000000000
---
765.432 mit Genauigkeit 0 ist : 1000.0000000000
765.432 mit Genauigkeit 1 ist : 800.0000000000
765.432 mit Genauigkeit 2 ist : 770.0000000000
765.432 mit Genauigkeit 3 ist : 765.0000000000
---
0.0000000003 ist wissenschaftlich : 3.1415926536e-10
0.0000314159 ist wissenschaftlich : 3.1415926536e-5
3.1415926536 ist wissenschaftlich : 3.1415926536e0
314159.2653589793 ist wissenschaftlich : 3.1415926536e5
31415926535.8979300000 ist wissenschaftlich : 3.1415926536e10
---
Andere Schreibweisen für : 314159.2653589793
3e5
3.142e5
3.141593e5
3.1*10^5
---
250000.0
250000.0
Code: Alles auswählen
; Modulo für Fließkommazahlen
Macro ModF(Value, Factor)
( (Value) - Int((Value)/(Factor))*(Factor) )
EndMacro
#AngleUnit_Rad = 2*#PI
#AngleUnit_Dec = 360
#AngleUnit_Grad = 400
; Umrechnen der Winkelmaße
Macro ConvertAngle(Angle, UnitIn, UnitOut)
( (Angle) * (UnitOut) / (UnitIn) )
EndMacro
; Korregiert einen Winkel in das standard Intervall
Procedure.f RealAngle(Angle.f, Unit.f=#AngleUnit_Rad)
If Angle < 0
ProcedureReturn ModF(Angle, Unit) + Unit
Else
ProcedureReturn ModF(Angle, Unit)
EndIf
EndProcedure
; Gibt den Winkelunterschied zurück
Procedure.f AngleDifference(Angle1.f, Angle2.f, Unit.f=#AngleUnit_Rad)
Protected Difference.f
Angle1 = RealAngle(Angle1, Unit)
Angle2 = RealAngle(Angle2, Unit)
Difference = Angle2 - Angle1
If Difference > Unit/2
Difference - Unit
ElseIf Difference < -Unit/2
Difference + Unit
EndIf
ProcedureReturn Difference
EndProcedure
Code: Alles auswählen
Debug ConvertAngle(#PI, #AngleUnit_Rad, #AngleUnit_Dec) ; Ergibt 180.0
Debug ConvertAngle(90, #AngleUnit_Dec, #AngleUnit_Grad) ; Ergibt 100
Debug "---"
Debug RealAngle(-90, #AngleUnit_Dec) ; Ergibt 270.0
Debug RealAngle(-400, #AngleUnit_Dec) ; Ergibt 320.0
Debug RealAngle(400, #AngleUnit_Dec) ; Ergibt 40.0
Debug RealAngle(5*#PI) ; Ergibt #PI
Debug "---"
Debug AngleDifference(20, 40, #AngleUnit_Dec) ; Ergibt 20
Debug AngleDifference(180, 90, #AngleUnit_Dec) ; Ergibt -90
Debug AngleDifference(359, 1, #AngleUnit_Dec) ; Ergibt 2
Debug AngleDifference(80, 280, #AngleUnit_Dec) ; Ergibt -160
Das ist nützlich wenn sich ein "Objekt" zu einem Ziel drehen soll, damit es die kürzeste Drehung macht