Lineare Funktion herleiten

  • VB.NET

Es gibt 53 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Lineare Funktion herleiten

    Hallo,

    wollte mal fragen ob jemand eine fertige Funktion zum herleiten einer Linearen Funktion aus zwei Punkten kennt?
    Ziel ist es damit die Y Koordinate eines 3. Punkts (x Wert bekannt) zu finden.

    Gruß Eistee (der langsam mit der Eiswürfel Produktion anfängt :D)
    Ich hoffe ich habe nichts falsch gemacht, C# kannst du ja nehme ich an.

    C-Quellcode

    1. Console.WriteLine("Enter Point1 (Format: x;y):");
    2. string temp = "";
    3. temp = Console.ReadLine();
    4. Point point1 = new Point(Convert.ToInt16(temp.Split(';')[0]), Convert.ToInt16(temp.Split(';')[1]));
    5. Console.WriteLine("Enter Point2 (Format: x;y):");
    6. temp = Console.ReadLine();
    7. Point point2 = new Point(Convert.ToInt16(temp.Split(';')[0]), Convert.ToInt16(temp.Split(';')[1]));
    8. double m = (point2.Y - point1.Y) / (point2.X - point1.X);
    9. Console.WriteLine("Solved m: {0}", m);
    10. double val1 = point1.Y;
    11. double val2 = m * point1.X;
    12. Console.WriteLine("Solving term: {0}", val1 + "=" + val2);
    13. double n = 0;
    14. n = val1 - val2;
    15. Console.WriteLine("Solved f(x): {0}", "y=" + m + "x+" + n);
    16. Console.ReadLine();


    Dort hast du alle Variablen, jetzt kannst du ja deinen x Wert eingeben, und dir mit der funktion den y Wert ausrechnen lassen ;)



    Edit: Screenshot stimmt nicht ganz, hatte da noch zwei Werte Vertauscht (val1 & val2, deswegen müsste es - 1 sein)

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

    Ja danke.
    Bin wie eig. jeden Tag ^^ komplett neben der Spur, dachte mir das ganze wird wieder ein riesen Chaos
    wenn ich mir die Funktion selber schreibe, obwohl sogar in dem von mir genanten Link das ganze fast Abschreibbar steht. :pinch:

    Siehe Funktionsname xD public float Get_y_coord_from_x_coord_from_linear_function_from_two_points(){}

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

    Ich muss hier leider nochmal aufmachen, wobei die Werte an sich korrekt sind:


    Nun das problem ist das ich die Werte irgendwie umdrehen muss, damit das ganze zum Koordinatensystem
    des Bildschirms passt.

    Punkt 2.Y ist mit 333 im Kartesisches Koordinatensystem Oben so wie es gebraucht wird.
    Nur ist das ganze auf dem Bildschirm umgekehrt und Punkt 2 ist unten.

    Ich komm einfach nicht drauf wie man das ganze richtig "umdreht".
    Ich hoffe ihr könnt mir nochmal helfen :)
    Ne also ich bin gerade vollkommen durcheinander.
    Irgendwie stimmt da vorne und hinten was nicht (wie man auch auf dem Bild OBEN erkennen kann, Punkt 2 sitzt nicht korrekt auf der Geraden.

    Einen fehler hab ich schon gefunden, nur kann ich mir den nicht erklären:

    VB.NET-Quellcode

    1. float point1;
    2. float point2;
    3. MessageBox.Show("(" + point2.Y.ToString() + "-" + point1.Y.ToString() + ") / (" + point2.X.ToString() + " - " + point1.X.ToString() + ") = " + ((point2.Y - point1.Y) / (point2.X - point1.X)).ToString());




    Ergebnis ist 0 auch wenn der Taschenrechner z.B. 0.9999 sagt.
    Als ob float oder auch double immer aufgerundet werden (es wird nichts Convertiert o. ä.).
    @FreakJNS:, @SAR-71: Das war es, jetzt muss ich nur noch die Punkte umdrehen.
    Man sieht auf dem Bild Steigung = 1 wobei ja nach unten gezielt wird.

    @~blaze~: Wie meinst du das mit dem Einheitsvector?
    Also was genau soll ich dann damit machen?
    (Und das mit dem Struct ist nichtmal nötig, da XNA den Typ Vector2D/Vector3D von Haus aus mitbringt)
    Also die Werte sehen jetzt so aus, als sei die Berechnung korrekt, die Zahl ist am größten, wenn man Horizontal zielt.
    Nur trotzdem ist die Rotation nicht korrekt, so langsam werde ich irre deswegen.

    Hier mal ein hoffentlich erklärendes Bild:


    Was ich versuche ist für jede Rotation die Y Koordinate des grünen Kreuzes zu finden.
    Das ganze läuft jetzt über die zwei Punkte (Maus/Fadenkreuz und der Müundung).
    Da die X Koordinate immer gleich bleibt (vertikale rote Linie) muss ich ja nur den Y Wert berechnen.
    Also den X Wert in die gefundene Funktion einsetzen.

    Nur für den Punkt der rotierten Mündung muss ja erstmal rotiert werden.
    Also dachte ich mir ich versuche das ganze so:

    1. Winkel Berechnen: float winkel = GetAngleBetween(new Vector2(0, 1), new Vector2(Mouse.GetState().X - spieler.origin_Absolut.X, (Mouse.GetState().Y+63) - spieler.origin_Absolut.Y));

    (Mouse.GetState().Y+63) - spieler.origin_Absolut.Y ist gleich dem grünen Kreuz auf dem Bild.)

    2. Winkel zuweisen: spieler.rotation = MathHelper.Clamp(winkel, -0.8F, 0.8F);

    3. Punkt der rotierten Mündung berechnen:
    Vector2 Rotierte_Muendung = default(Vector2);
    Rotierte_Muendung.X = Convert.ToSingle(Math.Cos(spieler.rotation) * (Muendung_Pos.X - spieler.origin.X) - Math.Sin(spieler.rotation) * (Muendung_Pos.Y - spieler.origin.Y)) + (spieler.position.X + spieler.origin.X);
    Rotierte_Muendung.Y = Convert.ToSingle(Math.Cos(spieler.rotation) * (Muendung_Pos.Y - spieler.origin.Y) + Math.Sin(spieler.rotation) * (Muendung_Pos.X - spieler.origin.X)) + (spieler.position.Y + spieler.origin.Y);

    4. Y-Koordinate (für das durch die Rotation verschobene grünen Kreuz) berechnen: Funktioniert (Beiträge hier drüber)

    5. Winkel erneut berechnen (mit korrekten grünen Kreuz):
    winkel = GetAngleBetween(new Vector2(0, 1), new Vector2(Mouse.GetState().X - spieler.origin_Absolut.X, y_coord));

    6. Winkel erneut zuweisen:
    spieler.rotation = MathHelper.Clamp(winkel, -0.8F, 0.8F);

    Ich kann mir nicht erklären wo der Fehler sein soll, irgendwo muss da ein Logischer fehler sein, nur wo ;(
    Gut, wenn's eh XNA ist, brauchst du dich fast um nichts kümmern. Der Einheitsvektor würde halt die Richtung angeben, in die gezeigt wird. Ein normalisierter Vektor v hat die Länge |v| = 1. Wenn du jetzt in die Richtung schießt, fliegt die Kugel entsprechend nicht nur auf die Position zu, auf die mit dem Fadenkreuz gezeigt wurde. Daher überprüft man normalerweise, ob sich ein Objekt in der Zielrichtung befindet das geht meist am Einfachsten per suspensionPoint + l * direction. Wenn dann halt ein entsprechendes Gleichungssystem für ein Objekt einen Wert >= 0 zurückgibt (und nicht die Leere Lösungsmenge), wird das Objekt getroffen.
    Wenn du eh mit XNA arbeitest, warum nimmst du nicht einfach entsprechende Vertices und verzerrst die der Richtung entsprechend? Könnte man auch per vertex shader lösen. Die UV-Koordinaten bleiben dann halt gleich.

    Gruß
    ~blaze~

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

    so, ich bin jetzt erfolgreich verrückt geworden^^ Habe mal auf WIKI gelesen und bin fündig geworden:
    de.wikipedia.org/wiki/Satz_des_Thales unter Anwendung lesen^^
    de.wikipedia.org/wiki/Kreistangente

    Da würde eben die Position des Kopfes unter angabe der Fadenkreuz-Position rauskommen (sogar zwei mögliche Positionen, aber Kopfüber kannst du ja ausschließen^^). Wenn du die beiden aber erstmal hast ist der Weg zur Mündung oder zum Kreuz nichtmehr weit. Wozu brauchst du das "kleine grüne Kreuz" überhaupt? xD

    FreakJNS schrieb:

    Wozu brauchst du das "kleine grüne Kreuz" überhaupt?
    gute Frage.
    Zu bemerken ist, es gibt ja viele solche grüne Kreuze, weil das grüne Kreuz bezeichnet ja grad einen Tangenten-Punkt einer Kreislinie, und die Tangente ist, wie der Schuss losgeht.

    Nu ist mir aber unklar, was der TE berechnen will: Will er den Tangenten-Lot-Winkel am Mittelpunkt ausrechnen, den man einstellen muß, damit die Tangente auch durchs Ziel verläuft?

    Oder will er ganz allgemein die Tangente berechnen, in Abhängigkeit og Winkels?
    Jedenfalls dieser Winkel scheint mir das Stell-Rädchen zu sein, mit dem man zielt.
    @~blaze~: Im moment geht es nur um die korrekte rotation anhand der Maus mit bezug auf die Mündung.
    Bin mir aber auch nicht sicher ob ob dich korrekt verstanden habe.

    @FreakJNS: Tut mir leid das ich dich damit auch in den Wahnsinn getrieben habe ^^
    Bin jetzt schon 2 Wochen an dem Problem dran und weiß einfach nicht mehr weiter
    (Was soviel bedeutet wie, bin auch schon irre).

    ErfinderDesRades schrieb:

    Zu bemerken ist, es gibt ja viele solche grüne Kreuze,

    Genau! und ich glaube da liegt der Knackpunkt!

    ----------------------------------------------------------------------------------------------------------------------------------------------------
    Wenn ich in der Winkelberechnung das "grünes Kreuz" da definiere, wo sich die Tangente langbewegt, ist genau an dieser stelle richtig rotiert.
    float winkel = GetAngleBetween(new Vector2(0, 1), new Vector2(Mouse.GetState().X - spieler.origin_Absolut.X, (Mouse.GetState().Y+63) - spieler.origin_Absolut.Y));
    Wobei das "grüne Kreuz" hier der 2. Vector Parameter ist: "new Vector2(Mouse.GetState().X - spieler.origin_Absolut.X, (Mouse.GetState().Y+63) - spieler.origin_Absolut.Y)"
    spieler.origin_Absolut ist der Punkt um den sich die Grafik dreht.
    ----------------------------------------------------------------------------------------------------------------------------------------------------

    Wie man auf dem Bild sehen kann:


    Wenn die Tangente auf dem "grünen Kreuz" liegt ist alle in Ordnung (evntl. Rundungsfehler mal außen vor)
    Deswegen wollte ich das Grüne Kreuz immer auf die Tangente anpassen, damit durchgehend richtig rotiert wird (Was ich auch in Post Nr.: 14 versuche)
    Doch leider funktioniert es nicht.

    Nochmal bezüglich des "Satz des Thales", irgendwie werde ich das Gefühl nicht los, das ich genau das gerade versuche.
    Es kann aber auch einfach nur sein das es zu hoch für mich ist :|

    Für alle die meine komplizierte erklärung nicht verstehen hab ich hier das Projekt mal hochgeladen(Anhang).
    (Ist leider C#, da ich glaube das nur extrem wenige das Mango Update für Vb installiert haben).
    Dateien
    ich weiß jetzt nicht, was speziell die grünen und roten Linien auf deinem Bildle bedeuten sollen.

    IMO soltest du den Mittelpunkt der Rotation einzeichen (iwo inne Hüfte), und eine Senkrechte auf der Gewehr-Linie (Tangente), die durch diesen Mittelpunkt geht.
    Diese Senkrechte dürfte im Bereich des Kinns auf die Gewehr-Linie treffen.