Java: вычисление угла между двумя точками в градусах

мне нужно рассчитать угол в градусах между двумя точками для моего собственного класса точек, точка a должна быть центральной точкой.

способ:

public float getAngle(Point target) {
    return (float) Math.toDegrees(Math.atan2(target.x - x, target.y - y));
}

6 ответов


вы можете добавить следующее:

public float getAngle(Point target) {
    float angle = (float) Math.toDegrees(Math.atan2(target.y - y, target.x - x));

    if(angle < 0){
        angle += 360;
    }

    return angle;
}

кстати, почему вы хотите не здесь?


Я начал с решения johncarls, но мне нужно было настроить его, чтобы получить именно то, что мне нужно. В основном, мне нужно было вращать его по часовой стрелке, когда угол увеличивался. Мне также нужно было 0 градусов, чтобы указать на север. Его решение приблизило меня, но я решил опубликовать свое решение, если это поможет кому-то еще.

Я добавил несколько дополнительных комментариев, чтобы помочь объяснить мое понимание функции в случае, если вам нужно сделать простые изменения.

/**
 * Calculates the angle from centerPt to targetPt in degrees.
 * The return should range from [0,360), rotating CLOCKWISE, 
 * 0 and 360 degrees represents NORTH,
 * 90 degrees represents EAST, etc...
 *
 * Assumes all points are in the same coordinate space.  If they are not, 
 * you will need to call SwingUtilities.convertPointToScreen or equivalent 
 * on all arguments before passing them  to this function.
 *
 * @param centerPt   Point we are rotating around.
 * @param targetPt   Point we want to calcuate the angle to.  
 * @return angle in degrees.  This is the angle from centerPt to targetPt.
 */
public static double calcRotationAngleInDegrees(Point centerPt, Point targetPt)
{
    // calculate the angle theta from the deltaY and deltaX values
    // (atan2 returns radians values from [-PI,PI])
    // 0 currently points EAST.  
    // NOTE: By preserving Y and X param order to atan2,  we are expecting 
    // a CLOCKWISE angle direction.  
    double theta = Math.atan2(targetPt.y - centerPt.y, targetPt.x - centerPt.x);

    // rotate the theta angle clockwise by 90 degrees 
    // (this makes 0 point NORTH)
    // NOTE: adding to an angle rotates it clockwise.  
    // subtracting would rotate it counter-clockwise
    theta += Math.PI/2.0;

    // convert from radians to degrees
    // this will give you an angle from [0->270],[-180,0]
    double angle = Math.toDegrees(theta);

    // convert to positive range [0-360)
    // since we want to prevent negative angles, adjust them now.
    // we can assume that atan2 will not return a negative value
    // greater than one partial rotation
    if (angle < 0) {
        angle += 360;
    }

    return angle;
}

на основе ответ Саада Ахмеда, вот метод, который можно использовать для любых двух точек.

public static double calculateAngle(double x1, double y1, double x2, double y2)
{
    double angle = Math.toDegrees(Math.atan2(x2 - x1, y2 - y1));
    // Keep angle between 0 and 360
    angle = angle + Math.ceil( -angle / 360 ) * 360;

    return angle;
}

javadoc для математика.Атан (дубль) довольно ясно, что возвращаемое значение может варьироваться от -pi/2 до pi / 2. Поэтому нужно компенсировать это возвращаемое значение.


angle = Math.toDegrees(Math.atan2(target.x - x, target.y - y));

теперь для ориентации круговых значений, чтобы сохранить угол между 0 и 359 может быть:

angle = angle + Math.ceil( -angle / 360 ) * 360

Как насчет чего-то вроде :

angle = angle % 360;