Button zu bestimmter Position bewegen mit gleicher Geschwindigkeit



  • Ich habe ein Programm gesprieben. In diesem Programm gibt es einen Button und einen Punkt. Der Button soll sich zu diesem Punkt bewegen, aber immer mit der gleichen Geschwindigkeit v. Wenn der Button angekommen ist, soll ein neuer Punkt gezeichnet werden. Dort soll der Button wieder hinfahren. Wieder mit v. v soll immer gleich bleiben.... Mit dem Zeichen bzw Hinfahren habe ich kein Problem, nur mit der gleichen Geschwindigkeit da haperts.
    Jee weiter der Button entfernt ist desto schneller ist der Button, je näher desto langsamer.

    Mir fehlt es an einer mathematischen Formel.
    Ich habe mir gedacht, dass ich ein Rechtwinkliges Dreieck aufstelle und das der Weg den der Button fährt die Hypothenuse ist. Nur muss der Button nur alle 100ms den gleichen Abschnitt auf der Hypothenuse zurücklegen. -> Da ist der Problempunkt.

    Komme echt nicht weiter... Könntet ihr mir helfen?

    ich stelle trotzdem noch das Programm rein:

    [cs]using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace ButtonZuPunkt
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            public int x = 0, y = 0;
            public int v = 100;
            public int difx = 0, dify = 0, butx, buty, kx = 0, ky = 0, dist = 0;
    
            private void Form1_Paint(object sender, PaintEventArgs e)
            {
    
                e.Graphics.FillEllipse(new SolidBrush(Color.Red), x, y, 5, 5);
                e.Graphics.DrawLine(new Pen(Color.Blue), x, y, button1.Location.X, button1.Location.Y);
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Random r = new Random();
                x = r.Next(0, 500);
                y = r.Next(200, 700) - 200;
                Refresh();
                butx = button1.Location.X;
                difx = x - butx;
                buty = button1.Location.Y;
                dify = y - buty;
                dist = Convert.ToInt32(Math.Sqrt(Math.Pow(difx, 2)) + Math.Sqrt(Math.Pow(difx, 2)));
                kx = difx / 25;
                ky = dify/ 25 ;
                if (ky == 0)
                {
                    ky++;
                }
                if (ky < 0)
                {
                    Bewegung.Interval = dist / ky * -1;
                }
                else
                {
                    Bewegung.Interval = dist / ky;
                }
                Bewegung.Start();
            }
    
            private void Bewegung_Tick(object sender, EventArgs e)
            {
                butx += kx;
                buty += ky;
                button1.Location = new Point(butx, buty);
                if ((butx + 10 > x) && (butx - 10 < x) && (buty + 10 > y) && (buty - 10 < y))
                {
                    Bewegung.Stop();
                }
            }
    
        }
    }
    [/cs]
    

    mfg



  • Du hast Rundungsprobleme, da du ja int (statt float oder double) benutzt (für kx, ky, butx, buty).

    Und dein Bewegungsintervall soll doch sicherlich konstant sein, z.B. 40 ms (d.h. der Button fährt dann immer innerhalb einer Sekunde (25 * 40) zu dem Punkt hin).

    Wenn du aber eine gleichmäßige Pixelgeschwindigkeit haben willst, dann mußt du noch die Distanz (dist) in die Berechnung von kx und ky einfließen lassen...



  • Ich will immer die selbe Pixelgeschwindigkeit haben.
    So zb dass der Button immer 4 Pixel pro 100ms auf der Hypothenuse fährt... Das ist nur ziemlich schwierig für mich, da die x Pixelgeschwindigkeit nicht immer 1 sein kann, da es nie genau auf einer Linie mit dem Button liegt....

    Gibt es vielleicht irgendeine Mathematische Formel?

    mfg



  • Du brauchst keine andere Formel, sondern (wie schon geschrieben) nur einen anderen Datentyp:

    float butx, buty, kx, ky;
    
    float factor = 4.0; // in Pixel pro Zeitschritt
    kx = factor * difx / dist;
    ky = factor * dify / dist;
    
    // in Bewegung_Tick
    butx += kx;
    buty += ky;
    

    Wie ich jetzt erst sehr ist doch deine Distanz-Berechnung falsch:

    float dist = Math.Sqrt(difx * difx + dify * dify);
    

    Du hattest quasi einfach "difx + dify" berechnet (nur etwas umständlicher -).



  • Vielen Dank 😉
    Ich musste nur die ganzen Floats in doubles machen(wegen inkompatiblen Datentypen bei Math.Sqrt) und eine gewisse ungenauigkeit hinnehmen(button1.Location erwartete 2 int WErte >.<), aber sonst: ALLES PERFEKT. Vielen Dank.


Log in to reply