[OpenSource] MathUtils 2.4.3 - erweiterte Mathematikbibliothek

    • Release
    • Open Source

    Es gibt 104 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

      @faxe1008
      Das bedeutet einfach nur, dass alle Vektoren nun eine Equals-Methode bereitstellen. Sie ist bei allen gleich implementiert und ruft Vector.CheckForEquality auf. Das ist meine Lösung, nachdem Extension Operatoren ja nicht funktionieren (vielleicht hast du meinen Thread dazu gesehen).
      In diesem Update ist nur eine, wenn auch interessante, Funktion hinzugekommen: mit der Lib können nun lineare Gleichungssystem gelöst werden. Verwendet wird dabei der Gauß-Jordan-Algorithmus (danke ~blaze~), der nun auch dazu dient, die Inverse Matrix zu bilden. Dies sollte einen signifikanten Performanceschub geben, vor allem bei großen Matrizen.
      Der Thread von ErfinderDesRades in den Tipps und Tricks, in dem er beschreibt, wie man einen Formelparser programmiert, hat mich auf die Idee gebracht, sowas auch in meinen MathUtils einzubauen (natürlich selbst gecodet). Deswegen können ab sofort mit MathHelper.Eval Formeln geparsed werden.
      Der Algorithmus beherrscht die Operatoren/Funktionen: +, -, *, /, ^, Sqrt, Root, Sin, Cos, Tan, Asin, Acos, Atan, SinH, CosH, TanH, Ln, Log, Abs, Int.
      Geschwindigkeitstest mit je 100000 Versuchen:

      Quellcode

      1. sin(45 + 45) -312 * (((3) + 3) / 2): 0,000116s
      2. 3-4*2+1/2*7+5*4-3/2*6*4: 0,000138s

      Ein eingegebener Term muss 100% korrekt sein, da ich keine Klammerkorrektur o.ä. eingebaut habe, und sonst irgendwelche unvorhersehbaren Fehler auftreten werden.
      Als Dezimaltrennzeichen dient der Punkt ('.') .

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

      Nächstes Update

      Es gab schon wieder einen kritischen Bug im Formelparser. Hoffentlich hört das mal irgendwann auf. :cursing:
      Jedenfalls ist er behoben und ich weiß jetzt, dass man niemals dies tun sollte, um einen Stack in eine Liste zu leeren:

      C-Quellcode

      1. for (int i = o; i < stack.Count; i++)
      2. list.Add(stack.Pop());

      Nebenbei habe ich den Code auch noch etwas optimiert und umstrukturiert. Der ganze Parser-Stuff ist jetzt in einer eigenen Klasse Parser. Außerdem habe ich den fehlenden Mod-Operator % hinzugefügt. Ferner ist das Dezimaltrennzeichen nun von der Systemsprache abhängig und als Argumenttrennzeichen dient deswegen das Semikolon ;.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()

      Nach langer Zeit hab ich mal wieder was hieran weitergearbeitet.

      Dazugekommen sind eine Matrix3x3-Klasse, die wie die Matrix4x4 nur für 2D-Vektoren funktioniert, und eine Rational-Klasse. Diese kann, wie der Name schon sagt, rationale Zahlen darstellen, und zwar in beliebiger Genauigkeit. Sie ist in ihrem Verhalten an den BigInteger aus dem System.Numerics-Namespace angelehnt.
      Außerdem habe ich einige Funktionen bei den Vektoren verbessert, so dass man sie jetzt leichter verwenden kann.
      @Artentus: Wirklich klasse Arbeit.

      Also ich bekomm es nichtmal hin die Berechnung der Ableitungen einer Funktion in Code zu gießen :S aber was Du hier schafft ist echt toll :thumbsup:

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eistee“ ()

      Jo wär nicht schlecht ^^
      Sitz da gerade selber dran, aber sobald ich ein Problem im Ablauf gelöst habe taucht ein neues auf :cursing:
      Und durch dieses, ich nenn es jetzt mal rumgefixxe, bläht sich der Code immer weiter auf und wird wie immer total unstrukturiert ^^
      Für mich immer noch das Zeichen das ich einfach nicht Programmieren kann :whistling:
      Bei mir funktioniert die TestApp irgendwie nicht :S. Immer wenn ich sie starte, stürzt sie gleich wieder ab ("TestApp funktioniert nicht mehr") und wenn ich sie dekompiliere, kommt sowas dabei raus (Codeausschnitt):
      Spoiler anzeigen

      VB.NET-Quellcode

      1. Private Sub PaintLoop()
      2. Dim closure$__ As Form1._Closure$__1 = New Form1._Closure$__1()
      3. Dim array As Vector4() = New Vector4(4)
      4. Dim arg_43_0_cp_0 As Vector4() = array
      5. Dim arg_43_0_cp_1 As Integer = 0
      6. Dim vector As Vector4 = New Vector4(-0.3, -0.3, 1.4, 1.0)
      7. arg_43_0_cp_0(arg_43_0_cp_1) = vector
      8. Dim arg_7D_0_cp_0 As Vector4() = array
      9. Dim arg_7D_0_cp_1 As Integer = 1
      10. Dim vector2 As Vector4 = New Vector4(0.3, -0.3, 1.4, 1.0)
      11. arg_7D_0_cp_0(arg_7D_0_cp_1) = vector2
      12. Dim arg_B7_0_cp_0 As Vector4() = array
      13. Dim arg_B7_0_cp_1 As Integer = 2
      14. Dim vector3 As Vector4 = New Vector4(0.3, 0.3, 1.4, 1.0)
      15. arg_B7_0_cp_0(arg_B7_0_cp_1) = vector3
      16. Dim arg_F1_0_cp_0 As Vector4() = array
      17. Dim arg_F1_0_cp_1 As Integer = 3
      18. Dim vector4 As Vector4 = New Vector4(-0.3, 0.3, 1.4, 1.0)
      19. arg_F1_0_cp_0(arg_F1_0_cp_1) = vector4
      20. Dim source As Vector4() = array
      21. array = New Vector4(4)
      22. Dim arg_137_0_cp_0 As Vector4() = array
      23. Dim arg_137_0_cp_1 As Integer = 0
      24. vector4 = New Vector4(-0.3, -0.3, 2.0, 1.0)
      25. arg_137_0_cp_0(arg_137_0_cp_1) = vector4
      26. Dim arg_171_0_cp_0 As Vector4() = array
      27. Dim arg_171_0_cp_1 As Integer = 1
      28. vector3 = New Vector4(0.3, -0.3, 2.0, 1.0)
      29. arg_171_0_cp_0(arg_171_0_cp_1) = vector3
      30. Dim arg_1AB_0_cp_0 As Vector4() = array
      31. Dim arg_1AB_0_cp_1 As Integer = 2
      32. vector2 = New Vector4(0.3, 0.3, 2.0, 1.0)
      33. arg_1AB_0_cp_0(arg_1AB_0_cp_1) = vector2
      34. Dim arg_1E5_0_cp_0 As Vector4() = array
      35. Dim arg_1E5_0_cp_1 As Integer = 3
      36. vector = New Vector4(-0.3, 0.3, 2.0, 1.0)
      37. arg_1E5_0_cp_0(arg_1E5_0_cp_1) = vector
      38. Dim source2 As Vector4() = array
      39. Dim vector5 As Vector3 = New Vector3(0.0, 0.0, 1.7)
      40. Dim num As Double = 1.5707963267948966 / CDec(Stopwatch.Frequency)
      41. closure$__.$VB$Local_getClientCoordinates = Sub(v As Vector4)
      42. Dim vector6 As Vector3 = v.ProjectPerspective(Me.ClientSize)
      43. Dim result As PointF = New PointF(CSng(vector6.get_X()), CSng(vector6.get_Y()))
      44. Return result
      45. End Sub
      46. Dim num2 As Long = 0L
      47. Dim stopwatch As Stopwatch = New Stopwatch()
      48. Dim num3 As Double = 0.0
      49. While True
      50. Dim closure$__2 As Form1._Closure$__1._Closure$__2 = New Form1._Closure$__1._Closure$__2(closure$__2)
      51. closure$__2.$VB$NonLocal_$VB$Closure_ClosureVariable_1 = closure$__
      52. stopwatch.Start()
      53. Thread.Sleep(5)
      54. num3 += num * CDec(num2)
      55. num3 = num3 Mod 6.2831853071795862
      56. closure$__2.$VB$Local_m = Matrix4x4.Translation(vector5) * Matrix4x4.Rotation(num3, num3, num3) * Matrix4x4.Translation(-vector5)
      57. Me.points1 = source.[Select](Function(v As Vector4) closure$__2.$VB$NonLocal_$VB$Closure_ClosureVariable_1.$VB$Local_getClientCoordinates(v * closure$__2.$VB$Local_m)).ToArray(Of PointF)()
      58. Me.points2 = source2.[Select](Function(v As Vector4) closure$__2.$VB$NonLocal_$VB$Closure_ClosureVariable_1.$VB$Local_getClientCoordinates(v * closure$__2.$VB$Local_m)).ToArray(Of PointF)()
      59. If Me.IsHandleCreated Then
      60. Me.BeginInvoke(Sub()
      61. Me.Invalidate()
      62. End Sub)
      63. End If
      64. stopwatch.[Stop]()
      65. num2 = stopwatch.ElapsedTicks
      66. stopwatch.Reset()
      67. End While
      68. End Sub

      Ist dir da beim Erstellen vielleicht ein Fehler unterlaufen?
      das heißt zwar opensource, ist hier aber im ShowRoom, und wie ich die Sources von Github kriege, habich noch nicht verstanden, und auch die zips im StartPost entpacken sich scheints zu nur unvollständigen Solutions.
      Also gibts da iwo ein zip, was man entpackt, und dann hat man die Sources der TestApp, und die Dll ebenfalls als eingebundenes Dll-Projekt verfügbar?
      Es ist im Showroom, weil man auch einfach die fertige DLL runterladen und dann benutzen kann.
      Den Source von GitHub runterladen geht so:
      Dann bekommt man genau das selbe, wie wenn man im Startpost die Projektdateien runterlädt.
      Ich habe absichtlich nur MathUtils in das Archiv gepackt, denn 1. ist die Testanwendung schon uralt und ich habe sie seit dem ersten Release nicht mehr geupdatet und 2. ist die Projektmappe inzwischen zugemüllt mit allen möglichen kleinen Anwendungen, die keiner braucht.
      Die alte Testanwendung war außerdem schlecht programmiert (war nur schnell für Demozwecke zusammengebastelt) und sie würde auch nicht mehr alles aus der Lib abdecken, da seit dem Release doch einiges dazugekommen ist.
      Das ist eine Lib für spezielle mathematische Funktionen, was willst du da mit ner blöden Testanwendung? Das Zeug hat nur nen Nutzen, wenn du ein sehr spezielles Problem hast, aus einer Testanwendung kannst du nichts schließen.
      Um die Lib zu verwenden braucht man halt auch das entsprechende Mathematische Wissen, das lässt sich durch eine Testanwendung nicht vermitteln. Und wenn du es hast, dann sind alle Funktionen selbsterklärend, zumal ich sie alle sehr ausführlich mit XML-Kommentaren verstehen habe.
      na, aus einer TestAnwendung kann ich sehen, ob das richtig rechnet.
      Ich hab übrigens schonmal eine Vereinfachung für dein CustomPoligon.cs:

      C-Quellcode

      1. public IEnumerator<Point2D> GetEnumerator()
      2. {
      3. return ((IList<Point2D>) points).GetEnumerator();
      4. }
      das macht den PolygonEnumerator überflüssig.