Lineare Funktion - die Drölfste

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets3646.

    Lineare Funktion - die Drölfste

    Nabend/Gute Nacht an alle :)

    Es geht mal wieder um die Lineare Funktion, Es soll eine Liste mit Punkten, welche zwischen zwei Punkte liegen, gefüllt werden.
    Die Anzahl der zu ermittelnden Punkte, soll die Distanz zwischen den beiden Punkten bestimmen.

    VB.NET-Quellcode

    1. Dim deltaX As Integer = Math.Abs(StartPosition.X - ZielPosition.X)
    2. Dim deltaY As Integer = Math.Abs(StartPosition.Y - ZielPosition.Y)
    3. Dim dist As Double = Math.Sqrt(Math.Pow(deltaX, 2) + Math.Pow(deltaY, 2))
    4. anzahlSchritte = CInt(dist / 5)


    Punkt1 = StartPosition
    Punkt2 = ZielPosition

    Steigung:

    VB.NET-Quellcode

    1. Dim m As Single = (CSng(zielPosition.Y) - CSng(StartPosition.Y)) / (CSng(zielPosition.X) - CSng(StartPosition.X))


    Die Liste (route) mit den Punkten füllen:

    VB.NET-Quellcode

    1. For z As Integer = 0 To anzahlSteps - 1
    2. Dim x As Single = StartPosition.X + (z * ((ZielPosition.X - StartPosition.X) / anzahlSteps))
    3. Dim y As Single = m * x + (StartPosition.Y - m * StartPosition.X) 'm*x+n [n = Y1-M*X1]
    4. route.Add(New Point(CInt(Math.Truncate(x)), CInt(Math.Truncate(y))))
    5. Next


    Das ganze Funktioniert auch halbwegs, mehr aber auch nicht.


    Der Kreis Oben Links ist immer (in der Demonstration) der Punkt1 = StartPosition.
    So Senkrechter die Strecke, desto weniger bewegen sich die Werte auf das Ziel zu.

    Soll heißen Liegen Punkt1 & Punkt2 auf einer Waagerechten Linie (gleicher Y-Wert) ist die Route Perfekt
    Liegen die Punkte, Punkt1 & Punkt2 auf einer Senkrechten Linie (gleicher X-Wert) ist die Rounte nicht vorhanden.

    In dem Fall sind alle Punkte in route = Punkt1 = Startpunkt

    (Links die Route bei einer Waagerechten Strecke (Perfekt), Rechts die Route bei einer Senkrechten Strecke)
    [Die Route ist in diesem Bild etwas mehr gekürtzt (dist/30) anstatt (dist/5) damit man die Werteveränderung Links, in der kleinen Liste besser sieht]


    Die Übersicht, die Linie Stellt die ~Werte in der Route nach der Berechnung an:

    (Die Gerade Senkrecht runter, wird garnicht gezeichnet, da alle Werte in Route = dem Startpunkt sind, siehe (rechte)Liste)

    Ich hoffe ihr könnt mir nocheinmal bei meinem ewigen Kampf mit der Mathematik helfen.
    Danke Gruß Long-Island-Iced-Tea

    PS: Das CInt kommt vom Übersetzer.

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

    Also in Vektoren ausgedrückt wärs einfach das:

    C-Quellcode

    1. Vector2[] GetPointsOnLine(Vector2 start, Vector2 end, int count)
    2. {
    3. var result = new Vector2[count];
    4. Vector2 step = (end - start) / count;
    5. for (int i = 0; i < count; i ++)
    6. result[i] = start + i * step;
    7. return result;
    8. }
    Leg dir einfach ne Vector2-Struktur an, die das kann (sowas solltest du sowieso haben), dann bist du quasi schon fertig.
    Ein Vektor ist im Prinzip ja auch nichts anderes als ein Punkt, nur dass eine gute Vector2-Struktur mehr Funktionen und Operatoren besitzen sollte, als die olle PointF-Struktur aus System.Drawing. Wie gesagt, du wirst so ne Struktur später sowieso noch für anderes brauchen, und die ist recht leicht zu erstellen, du kannst die berechneten Vektoren ja dann ganz einfach in PointFs umwandeln. Es gibt keinen Grund, warum man es sich schwerer als nötig machen sollte. ;)
    Ist sowieso nervig dieses getuhe mit dem Vorscheiben wie man etwas umzusetzen hat.
    Eig. sollte ja auch Java benutzt werden, aber da mach ich dann völlig dicht. Java ist einfach, sry für den ausdrück, Ranz!
    Deswegen wollte ich es zuerst mit C# machen.
    Aber wenn es nicht einmal da klappt, kann er mich mal und er bekommt den .NET Vector2 Structure zu fressen.
    Jo, Java ist wirklich der größte Ranz überhaupt.
    Aber dein Lehrer (oder wer auch immer) hat dir aufgetragen, dass du keine Vectorrechnungen verwenden darfst? Kann ich mir eigentlich nicht vorstellen, vermutlich war er sich einfach nur nicht im Klaren, dass dus auch so lösen kannst. :P Jedenfalls ists ja im Prinzip genau das selbe, ohne eine solche Struktur müsstest du halt X und Y separat berechnen.

    Edit: übrigens, meine Lösung von oben ist inklusive des Startpunktes, aber exklusive des Endpunktes. Wenn du den noch mit drin haben willst, dann musst du entweder mit 1 weniger teilen und dann auch einen Schleifendurchlauf weniger durchführen, und dann an den letzten Index den Endpunkt setzen, oder du vergrößerst das array um eins und setzt dann an den letzten Index den Endpunkt.