Winkel zwischen 2 Positionen berechnen



  • Hi, ich habe folgenden Code zur Bewegung meines Spielers:

    void MoveTowardsPoint(int xNewPoint, int yNewPoint)
    {
    	if(xPos < xNewPoint)
    		xPos++;
    	if(yPos < yNewPoint)
    		yPos++;
    	if(xPos > xNewPoint)
    		xPos--;
    	if(yPos > yNewPoint)
    		yPos--;
    }
    

    Das Problem ist hier, dass er sich je nachdem wie sich der Neue Punkt verschiebt, immer nur im 45° Winkel verschiebt (sozusagen die Form eines gedrehten Quadrats. Ich möchte aber runde Bewegungen haben. Das muss man sich doch irgendwie mit den Winkelfunktionen errechnen. Ich weiß aber nicht wie. Könnt ihr mir helfen?

    Also:

    Punkt 1: Pos(100 / 100)
    Punkt 2: Pos(232 / 492)

    Zu berechnen: Winkel von Punkt 1 zu 2. Vielleicht kann ich das mit der Steigung versuchen?

    D.h.: Δy / Δx .

    mfg Critical



  • Ich glaube, was du eigentlich suchst, das ist der Bresenham-Algorithmus.

    Ansonsten einfach mal die Tangensfunktion anschauen (bzw. seine Umkehrfunktion).

    Dein DeltaY/DeltaX gibt dir doch schon an, wie viel Y-Änderung bei X-Änderung stattfindet.



  • jo, soll der winkel zwischen dem vektor und der 1. koordinatenachse gesucht werden? dann:

    tan^-1([e]Delta[/e]y/[e]Delta[/e]x) = ges. winkel
    


  • Was ist eine "runde Bewegung"? Mach mal ne Skizze!



  • Ich hätte irgendwie wissen müssen dass es mit dem Bresenham Algorithmus zusammenhängt. Ja ich konnte den Bresenham Algorithmus erfolgreich einbinden, aber der Funktioniert nur, wenn der Startpunkt beim Nullpunkt ist. Ich möchte aber z.B. den Spieler auch mal in der Mitte haben.

    void MoveTowardsPoint(int xNewPoint, int yNewPoint)
    {
    	const int deltax = xNewPoint-xPos;
    	const int deltay = yNewPoint-yPos;
    
    	static int x = xPos;
    	static int y = yPos;
    	static int error = deltax / 2;
    
    	if (x < xNewPoint)
    	{
    		x++;
    		error -= deltay;
    		if (error < 0)
    		{
    			y++;
    			error += deltax;
    		}
    		xPos = x;
    		yPos = y;
    	}
    }
    

    x/yPos = Spielerposition x / y.

    Wie kann ich den Umschreiben, sodass der auch in andere Richtungen geht? Da muss man die große If-Schleife ändern, aber weil ich nicht verstehe, wie der Funktioniert (da wird nichtmal erklärt, warum man diese Fehlervariable anlegen muss), weiß ich auch nicht, wie ich die Werte ändern muss. Diese Funktion ist voll Funktionsfähig, wenn der Startpunkt links oben (0/0) ist.

    Edit: Hier die http://img225.imageshack.us/img225/3127/skizzebb1.png
    Edit2: Keine Sorg, die große if-Schleife wurde umgeschrieben (war vorher ne while Schleife), weil ich Timer benutze. Warum ich hier keine while-Schleife benutze, sollte klar sein.

    mfg Critical



  • Wenn dein Startpunkt nicht im Koordinatenursprung liegt, dann musst du dein Koordinatensystem so verschieben, dass es der Fall ist.



  • Aber ich kann aus dem Stück Code nicht rauslesen, wo der Startpunkt ist. Ich kann nur soviel sagen, dass wenn die x Koordinate des Spielers kleiner als die Zielkoordinate ist, dass er das durchführen soll. Wie ich das jedoch nach links umschreibe verstehe ich nicht:

    /...
    if (x < xNewPoint)
    {
        x++;
        error -= deltay;
        if (error < 0)
        {
            y++;
            error += deltax;
        }
        xPos = x;
        yPos = y;
    }
    else
    {
        x++;
        //Was muss ich ab hier  ändern?
    }
    /...
    

    Eigentlich müsste ja alles umgedreht werden?



  • Keiner ne Antwort?



  • Na ja, der Winkel zwischen beiden Punkten bringt dir ja nicht viel, der stellt ja im Grunde auch nur die Steigung da (tangens vom Winkel = Steigung), und somit könntest du nur eine lineare Bewegung erreichen.

    Aber wenn du 2 Punkte hast, kannst du doch daraus eine Kreisgleichung bilden und mit dieser den Weg berechnen?! Oder du versuchst es mit quadratischer Interpolation.

    Aber versuch mal bitte, mit einer Skizze deutlich zu machen, wie genau du das willst.



  • Oben steht ne Skizze schon drin. Ich möchte einfach nur diesen Bresenham Algorithmus so haben, dass er auch nach links und oben geht, weil so wie ich ihn da habe geht der nur, wenn der Startpunkt ganz oben links im Fenster (0,0) ist.

    Ich möchte, dass wenn da Winkel = 180 angegeben ist, dass sich z.B. ein Objekt gerade nach links bewegt. Wenn jedoch der Winkel z.B. 50° ist, dann soll er die x und y werte so anpassen, dass er sich im 50° Winkel bewegt.

    Edit: So ich habe es jetzt mit den Winkelfunktionen gelöst:

    x=x+cos(Direction*3.14/180)*2;
    y=y-sin(Direction*3.14/180)*2;



  • Achso, ich dachte, du wolltest eine runde Bewegung haben (Kreisähnlich)

    Also dann ist dein Weg schonmal richtig, allerdings, warum rechnest du das dann mal 2?
    Mit Steigung wäre es dann natürlich auch gegangen, wenn du die Zielkoordinaten angibst.



  • Naja mal 2 für den Radius oder? D.h. wenn ich jetzt *5 Angebe bewegt er sich 5 Pixel schnell pro FPS.


Log in to reply