Перемещение Java в 2d

#java #2d

#java #2d

Вопрос:

Я уже использовал нечто подобное для перемещения в 2d-проектах раньше, и это всегда работало. Я использую его прямо сейчас, и он дает мне правильные углы для некоторых выходных данных и неправильные углы. Я думаю, что в моей тригонометрии просто какая-то ошибка, которую я неправильно понял. Хотя я проверял это около миллиона раз. Возможно, просто автоматическое исправление ошибки в моей голове. Вот несколько примеров вывода и злых кодов.

 this(x,y): (500.0, 250.0)
dest(x,y): (400.0, 300.0)
DeltX: 100.0
DeltY: -50.0
Angle: 0.46364760900080615 //about 26.56°, should be 206.56° (26.56 pi) i think
XVELOC: 0.08944272
YVELOC: 0.04472136

public void Update(long deltaTime){
        if(this.destination == null){
            return;
        }

        this.x  = this.x_velocity * deltaTime;
        this.y  = this.y_velocity * deltaTime;

        if(Math.abs(this.x-destination.x) < 1 amp;amp; Math.abs(this.y-destination.y) < 1){
            destination.arrive(this);
        }
    }

    public void setPath(){
        if(this.destination == null){
            return;
        } 

        double delta_x = (double) (this.x-this.destination.x);
        double delta_y = (double) (this.y-this.destination.y);
        int sign_x = (int)Math.signum(delta_x);
        int sign_y = (int)Math.signum(delta_y);
        double radian_angle = Math.atan((delta_x/delta_y));
        if(sign_x > 0 amp;amp; sign_y > 0)
            radian_angle  = Math.PI;
        else if(sign_x > 0 amp;amp; sign_y < 0)
            radian_angle  = Math.PI/2;
        else if(sign_x < 0 amp;amp; sign_y > 0)
            radian_angle  = 3*Math.PI/2;

        System.out.println("DeltX: " delta_x);
        System.out.println("DeltY: " delta_y);
        System.out.println("Angle: " radian_angle);

        this.x_velocity = this.max_velocity*(float)Math.cos(radian_angle);
        this.y_velocity = this.max_velocity*(float)Math.sin(radian_angle);

        System.out.println("XVELOC: " x_velocity);
        System.out.println("YVELOC: " y_velocity);
    }
  

Комментарии:

1. Для получения более подробной информации, разместите SSCCE .

Ответ №1:

Попробуйте использовать atan2 — это сделано для того, чтобы справиться с этим за вас

 double delta_x = (double) (this.x-this.destination.x);
double delta_y = (double) (this.y-this.destination.y);
double radian_angle = Math.atan2(delta_y,delta_x); // arguements are y,x not x,y
  

http://download.oracle.com/javase/6/docs/api/java/lang/Math.html#atan2(double, double)

Комментарии:

1. @Bob Я сижу здесь и думаю: «Я надеюсь, что в Java есть atan2. Я надеюсь, что в Java есть atan2 » . 🙂

2. @glowcoder, почти стоит опубликовать javadoc для atan2 в виде блочной цитаты. Огромное количество особых случаев, которые обрабатываются этой единственной строкой, являются основным мотиватором.

3. Хорошо, теперь это произошло, но это должно было быть atan2 (delta_y, delta_x)