【问题标题】:algorithm of calculating the slope between line relatively to center coordinate计算直线相对于中心坐标的斜率的算法
【发布时间】:2010-11-03 09:35:08
【问题描述】:

请帮助计算斜率的算法 所以我们有一个笛卡尔坐标系。 X 就在 Y 的顶部。有一条线穿过坐标中心。 需要确定相对于轴 OX 的角度。

这就是我正在做的事情

  1. 某些函数转移到原点(顶行)和行尾
  2. 确定 dx, dy
  3. Hildren 在 atan2 (dy, dx) 中放出两个参数
  4. 以弧度返回结果。

但是!我 atan2 只能在 180 度范围内工作。 180后往另一个方向走。

所以问题是:找到角度的正确算法是什么?我需要采用 dy、dx 的大小吗?如何计算所有 360 度及更多的反正切?我很高兴听到特定的算法或代码片段。 谢谢!

static inline CGFloat angleBetweenLinesInRadians2 (CGPoint line1Start, CGPoint line1End)
{
CGFloat dx = 0, dy = 0;

dx = line1End.x - line1Start.x; / / whether to do fabs (line1End.x - line1Start.x);
dy = line1End.y - line1Start.y;

CGFloat rads = atan2 (dy, dx); / / whether to do fabs (rads)

return rads;
}

【问题讨论】:

    标签: geometry atan2


    【解决方案1】:

    atan2() 应该返回区间 [-pi,pi] 中的值(即 [-180, 180] ),并与 x 和 y 的符号一起计算象限。 (C++ ref)

    所以从技术上讲,你有 360 度。

    【讨论】:

    • 所以问题是:找到角度的正确算法是什么?是否需要以 dy、dx 的幅度取值?
    • 不要使用幅度 - 只需使用带有正确符号的 dy 和 dw,atan2() 将返回正确的角度值。如果您希望所有角度为正值(即从 [-180,180] 转换为 [0,360]),只需保持正值不变,并将 360 添加到负值。例如,-90° 将给出 270°。
    • 对不起,我的意思是我需要计算dx,dy的绝对值吗?
    • dy = fabs(line1End.y - line1Start.y)
    • 不,你不应该,因为 atan2() 使用 dy 和 dx 的符号来给你正确的角度值。
    【解决方案2】:

    0 到 360 度角的计算公式:

    f(x,y)=180-90*(1+sign(x))* (1-sign(y^2))-45*(2+sign(x))*sign(y)

        -180/pi()*sign(x*y)*atan((abs(x)-abs(y))/(abs(x)+abs(y)))
    
        x=x2-x1 and y=y2-y1 .
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 2017-06-01
      相关资源
      最近更新 更多