2013-06-25 75 views
2

我读这个post关于得到2个点之间的角度,并想知道。我认为atan2是为atan2(y,x)定义的,它是atan2(deltaX,deltaY),现在为什么是x?2点与atan2之间的角度

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

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

    return angle; 
} 
+0

出于好奇:你怎么定义两个点之间的角度? –

+0

@MarcoForberg,通过定义一个通过其中一个点的轴并测量该轴与连接点的线段之间的角度。通常这被称为[方位角](https://en.wikipedia.org/wiki/Bearing_(navigation))。 – Richard

回答

11

Math.java它定义为

public static double atan2(double y, double x) { 
    return StrictMath.atan2(y, x); // default impl. delegates to StrictMath 
    } 

,这将返回该反时针角度相对于X轴。

如果你换了这两个,你会得到相对于X轴的时钟方向角。

在笛卡尔坐标系中,我们考虑了相对于X轴的反时钟方位角。这就是Math.java如上所述使用它的原因。

+0

谢谢,我真的很困惑 – vuvu

+0

@vuvu欢迎您 –

2

交换的参数的顺序意味着,而不是(逆时针)的与X轴的夹角你与Y轴(顺时针方向)的角度。这没有错,只是不寻常的。

0

尝试了这一点:

// ... code 
Target start = new Target(); 
     start.setX(0); 
     start.setY(0); 
     Target aLine = new Target(); 
     Target bLine = new Target(); 
     aLine.setX(-65000); 
     aLine.setY(ress.getObstacle().getLine()); 
     bLine.setX(65000); 
     bLine.setY(ress.getObstacle().getLine()); 
     Line2D line = new Line2D.Float(aLine.getX(), aLine.getY(), bLine.getX(), bLine.getY()); 

     List<Target> list = new ArrayList<Target>(); 

     if (!(ress.getObstacle().getLine() == 0)) { 
      //check if points are there , if yes just reinitialize a linea-lineb and calculate the same in for: 

      String a = ""; 
      try { 
       a = ress.getObstacle().getA().toStrin`enter code here`g(); 
      } catch (NullPointerException e) { 

      } 
      if (!(a == "")) { 
       aLine.setX(ress.getObstacle().getA().getX()); 
       aLine.setY(ress.getObstacle().getLine()); 
       bLine.setX(ress.getObstacle().getB().getX()); 
       bLine.setY(ress.getObstacle().getLine()); 
       Line2D lineNew = new Line2D.Float(aLine.getX(), aLine.getY(), bLine.getX(), bLine.getY()); 

       for (Target t : ress.getTargets()) { 
        Line2D line2 = new Line2D.Float(start.getX(), start.getY(), t.getX(), t.getY()); 
        if (!line2.intersectsLine(lineNew)) { 
         list.add(t); 
        } 
       } 
      } else { 
     //-------------------start old part---------------------------------- 
       for (Target t : ress.getTargets()) { 
         Line2D line2 = new Line2D.Float(start.getX(), start.getY(), t.getX(), t.getY()); 
         if (!line2.intersectsLine(line)) { 
          list.add(t); 
         } 
       } 
       ///////-------end old part 
      } 

     } else { 
      double angA = Math.toDegrees(StrictMath.atan2(ress.getObstacle().getA().getX() - start.getX(), ress.getObstacle().getA().getY() - start.getY())); 
      double angB = Math.toDegrees(StrictMath.atan2(ress.getObstacle().getB().getX() - start.getX(), ress.getObstacle().getB().getY() - start.getY())); 

      Boolean up = (ress.getObstacle().getA().getY()>0)&(ress.getObstacle().getB().getY()>0); 
      Boolean left = (ress.getObstacle().getA().getX()<0)&(ress.getObstacle().getB().getX()<0); 
      Boolean right = (ress.getObstacle().getA().getX()>0)&(ress.getObstacle().getB().getX()>0); 

      for (Target t : ress.getTargets()) { 
       double angT = Math.toDegrees(StrictMath.atan2(t.getX() - start.getX(), t.getY() - start.getY())); 

       if (up) { 

        if (!((angT > Math.min(angA,angB)) & (angT < Math.max(angB,angA)))) 
         list.add(t); 
       } else 
        if (right || left) { 
        if (!((angT > Math.min(angA,angB)) & (angT< Math.max(angB,angA)))) { 
         list.add(t); 
        } 
       } else 
        { 
         if (((angT > Math.min(angA,angB)) & (angT< Math.max(angB,angA)))) { 
          list.add(t); 
         } 
        } 
      } 
     } 


     sol.setTargets(list);