【问题标题】:Normalising angle between negative y-axis and vector归一化负 y 轴和向量之间的角度
【发布时间】:2021-08-19 15:36:07
【问题描述】:

从图片:我要计算 alpha,定义为连接两点的线与 y 轴之间的角度,在图像中可以看到的方向上的范围为 0 到 180,范围为0 到 -180 的对面(箭头从当前起点指向手指 1)。

(atan2((x1 - x), (y - y1)) * 180/ M_PI );

我设法用这个公式做到了这一点,只是在 atan2 函数中反转 x 和 y 引用,但这仅在第一个点 (x,y) 相对于第二个点位于“右下角”时才有效。 在这种情况下,我得到了确切的预期结果。在所有其他人中,显然我得到了错误的价值观。我怎样才能将其标准化以获得始终相同的值?

【问题讨论】:

  • 我投票结束这个问题,因为 - 尽管问题标签 [c++] - 它似乎只是关于数学,而不是关于任何软件实现。

标签: c++ math angle atan2


【解决方案1】:

定义:

  • 我们有两个点 P1 和 P2(Finger1,Finger2)
  • 我们引入一个向量 v:P2 - P1

计算v的斜率m:

m = v.y / v.x;
  • 如果 m
  • 如果 m > 0:斜率从左下角到右上角增加
  • 如果 m == 0:常数
  • 如果 v.x == 0: m 未定义

由于逆向量v(-v)的斜率值相同(符号不同),我们可以使用m的绝对值。

正x轴与向量v的夹角θ:

theta = atan(abs(m));

角度α为:

alpha = M_PI_2 - theta;

这基本上就是atan2 所做的,但是atan2 给你一个在[-π, π] 范围内的值。通过上面的代码,我们得到了一个在 [0, π / 2] 范围内的值。

y 轴是从上到下呈现在屏幕上,反之亦然。数学是一样的。但这意味着,您在同一系统中收到您的 P1 和 P2。如果不是,那么您必须镜像 x 轴上的点,这会改变点的 y 坐标的符号。

详细版本:

alpha = M_PI_2 - (atan(abs((P2.y - P1.y) / (P2.x - P1.x)))); //radians

【讨论】:

  • 非常感谢您的解释!所以,只是为了理解我是否理解正确,在我的情况下,我需要使用 theta = atan2(abs(x2-x1),abs)y2-y1)) 然后? alpha = M_PI_2 - theta 旋转它以使其相对于 Y 轴?但是,如果我们希望它以顺时针的方式是积极的,那么方向呢?这是个问题吗?
  • 忘记 atan2。我们想要一个 [0, pi / 2] 范围内的值。斜率为 (dY / dX)。你得到一个正值或负值。我们想要一个正值,这就是为什么我们取斜率的绝对值:abs(dY / dX)。因为 m = tan(theta) => theta = atan(abs(m))。现在我们有了 x 轴和斜率之间的角度,但你想要另一半,这就是我们从 90 度减去它的原因,即 pi / 2。
  • 我已经添加了计算的详细版本。
  • 我使用的是 atan2,因为这个问题需要我给出一个介于 -179...0....179 之间的角度作为解决方案,正值范围在绘制的 alpha 方向上跨度>
  • atan2 为您提供 [-pi, pi] 范围内的值。但是atan2 被声明为atan2(double y, double x),你切换了x 和y 坐标,为什么?因为您的屏幕从上到下打印 y 轴?无论您如何绘制图表,数学都是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多