Java: CALCUL DE l'angle entre deux points en degrés

je dois calculer l'angle en degrés entre deux points pour ma propre classe de points, le point a doit être le point central.

méthode:

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

Test 1: // retourne 45

Point a = new Point(0, 0);
    System.out.println(a.getAngle(new Point(1, 1)));

Test 2: // retourne -90, attendu: 270

Point a = new Point(0, 0);
    System.out.println(a.getAngle(new Point(-1, 0)));

Comment puis-je convertir le résultat en un nombre entre 0 et 359?

35
demandé sur Aich 2012-04-02 06:37:22

6 réponses

vous pouvez ajouter ce qui suit:

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;
}

d'ailleurs, pourquoi ne pas utiliser un double ici?

62
répondu John Ericksen 2014-05-10 14:02:36

j'ai commencé avec la solution johncarls, mais j'ai dû l'ajuster pour obtenir exactement ce dont j'avais besoin. Surtout, j'en avais besoin pour tourner dans le sens des aiguilles d'une montre quand l'angle augmentait. J'avais aussi besoin de 0 degrés pour pointer vers le nord. Sa solution m'a rapproché, mais j'ai décidé de poster ma solution aussi bien au cas où il aide quelqu'un d'autre.

j'ai ajouté quelques commentaires supplémentaires pour expliquer ma compréhension de la fonction dans le cas où vous devez faire des modifications simples.

/**
 * 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;
}
23
répondu Joseph Snow 2013-05-02 14:31:04

basé sur Saad Ahmed réponse , voici une méthode qui peut être utilisé pour deux points.

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;
}
2
répondu Steven Vascellaro 2017-09-28 13:16:23

le javadoc pour Math.atan (double) est assez clair que la valeur de retour peut varier de-pi/2 à pi/2. Vous devez donc compenser pour cette valeur de retour.

1
répondu Spencer Kormos 2012-04-02 02:52:19
angle = Math.toDegrees(Math.atan2(target.x - x, target.y - y));

maintenant pour l'orientation des valeurs circulaires pour garder l'angle entre 0 et 359 peut être:

angle = angle + Math.ceil( -angle / 360 ) * 360
1
répondu Saad Ahmed 2015-02-04 08:17:02

en Ce qui concerne quelque chose comme :

angle = angle % 360;
0
répondu Julian 2014-06-10 17:08:41