# Rotationsalgorithmusproblem



## Eichelhäer (11. Jul 2015)

Hallo zusammen,

hab eine Maus-Sprite-Bewegung programmiert. Allerdings hab ich ein Problem beim Drehalgorithmus.

Das ganze sieht so aus, dass ich irgendwohin klicke und sich das Sprite bis in die Richtung dreht, und dann erst losfährt. Funktioniert auch, bis auf den Fall, wenn ich vom Sprite aus gesehen vom 4ten in den 1ten Quadranten will und umgekehrt.

Ich überleg schon die ganze Zeit hin und her aber ich komme nicht drauf, wie ich alle Fälle abdecken kann. Aber seht selbst:


```
package game;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;


public class Tank {

    public double x,y,centerx,centery,speed=3,deltax=0.0,deltay=0.0,ist=0.0;
    public BufferedImage pic;
    public boolean clicked = false;
    public Rectangle bounding;
    public boolean canmove=false,eins,zwei,drei,vier;
    public int i=0;
    public double angle;
   
   
    public Tank(boolean clicked){
       
        this.clicked = clicked;
        try {
            pic = ImageIO.read(getClass().getClassLoader().getResourceAsStream("pics/tank.png"));
        } catch (IOException e) {e.printStackTrace();}
       
       
        x = 100;
        y = 100;
       
        centerx = x - pic.getWidth()/2;
        centery = y - pic.getHeight()/2;
       
        bounding = new Rectangle((int)centerx,(int)centery,20,20);
       
        angle = Math.atan(0.0);
    }
   
    public double angle(){
       
        if(Display.clicked){
            deltax = (Mouse.mousex-pic.getWidth()/2) - centerx;
            deltay = (Mouse.mousey-pic.getHeight()/2) - centery;
           
            if(deltax > 0 && deltay < 0){
                angle = Math.atan(deltay/deltax)+((2*Math.PI));
                eins = true;
            }
            else if(deltax > 0 && deltay > 0){
                angle = Math.atan(deltay/deltax);
                vier = true;
            }
            else if(deltax < 0 && deltay < 0){
                angle = Math.atan(deltay/deltax)+(Math.PI);
                zwei = true;
            }
            else if(deltax < 0 && deltay > 0){
                angle = Math.atan(deltay/deltax)+(Math.PI);
                drei = true;
            }
        }
       
        return angle;
    }
   
    public double rotate(int soll){ //in dieser Methode brauch ich Hilfe!!!!!!
       
        if(Math.abs(soll-ist)>ist){
            if(i==360){
                i=0;
            }   
            else if(i!=soll){
                i++;
                canmove=false;
               
            }
            else if(i==soll){
                canmove=true;
                ist=soll;
            }
           
        }
        if(Math.abs(soll-ist)<ist){
            if(i==0){
                i=360;
            }   
            else if(i!=soll){
                i--;
                canmove=false;
               
            }
            else if(i==soll){
                canmove=true;
                ist = soll;
            }
           
        }
        System.out.println(Math.abs(soll-ist));
        return Math.toRadians(i);
    }
   
    public void update(){
       
            bounding.x = (int) centerx;
            bounding.y = (int) centery;
           
            double distance = Math.sqrt(((deltax)*(deltax))+((deltay)*(deltay)));
           
            if(deltax>0 && distance>speed){
                centerx += Math.cos(angle)*speed;
                centery += Math.sin(angle)*speed;
               
            }
            else if(deltax<=0 && distance>speed){
                centerx += Math.cos(angle)*speed;
                centery += Math.sin(angle)*speed;
            }
    }
   

   
    public void render(Graphics g){
       
        AffineTransform at = AffineTransform.getTranslateInstance(bounding.x,bounding.y);
        at.rotate(rotate((int)Math.toDegrees(angle())),pic.getWidth()/2,pic.getHeight()/2);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(pic,at,null);
        //System.out.println(i);
    }
}
```


Wär schön wenn mir jemand hilft

Gruß Eichelhäer


----------



## Eichelhäer (13. Jul 2015)

Ok ich habe es selbst gelöst und das vollständig.


----------



## Flown (13. Jul 2015)

Vielleicht postest du deine Lösung, damit andere aus deiner Erkenntnis profitieren.


----------



## Eichelhäer (29. Jul 2015)

Die Lösung ist :

double phi = (ist-soll +360)%360;

if(phi>180){.....
else{.... ;


----------

