问题标签 [atan2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
14465 浏览

c++ - GLSL 上的强大 atan(y,x) 用于将 XY 坐标转换为角度

在 GLSL(特别是我正在使用的 3.00)中,有两个版本 atan()atan(y_over_x)只能返回 -PI/2、PI/2 之间的角度,而atan(y/x)可以考虑所有 4 个象限,因此角度范围涵盖了从 -PI 开始的所有内容, PI,很像atan2()C++。

我想使用第二个atan将 XY 坐标转换为角度。但是,atan()在 GLSL 中,除了不能处理 when 之外x = 0,还不是很稳定。尤其是在x接近零的情况下,除法可能会溢出,从而导致相反的结果角度(您会得到接近 -PI/2 的东西,而您假设会得到大约 PI/2)。

我们可以在 GLSL 之上构建一个好的、简单的实现atan(y,x)以使其更健壮吗?

0 投票
1 回答
1598 浏览

c++ - 有符号字符 ATAN2 和 ATAN 近似值

基本上,我一直在尝试制作两个近似函数。在这两种情况下,我都输入了“x”和“y”组件(以处理那些讨厌的 n/0 和 0/0 条件),并且需要得到一个 Signed Char 输出。在 ATAN2 的情况下,它应该提供 +/-PI 的范围,在 ATAN 的情况下,范围应该是 +/- PI/2。

我花了整个昨天的时间试图把我的头包起来。在 excel 中玩耍以找到基于近似值的整体良好算法后:

我想出了以下代码:

令我绝望的是,实现的错误高达 180 度,而且几乎无处不在。(在转换为有符号字符格式后,我将它与库中的 ATAN2F 进行了比较。)

我从这个网站得到了一般要点:http: //geekshavefeelings.com/posts/fixed-point-atan2

谁能告诉我哪里出错了?以及我应该如何在没有这些疯狂的情况下接近 ATAN 变体(应该更精确,因为它看起来超过一半的范围)。

我目前在 Windows 上使用 QT creator 4.8.1。这段特定代码的最终平台最终将是一个没有 FPU 的微控制器,ATAN 功能将是使用的主要功能之一。因此,具有合理误差的效率(ATAN2 为 +/-2 度,ATAN 为 +/-1 度。这些是目前的猜测,所以我可能会增加范围,但是,90 度绝对是不可接受的!)是目标的游戏。

提前感谢您的任何帮助!

编辑:为了澄清一下,ATAN2 和 ATAN 的输出输出到有符号的 char 值,但是这两种类型的范围是不同的范围。

ATAN2 应具有从 -128 (-PI) 到 127 (+PI - PI/128) 的范围。

ATAN 的范围从 -128 (-PI/2) 到 127 (+PI/2 - PI/256)。

因此,两者的输出值可以被认为是两种不同的数据类型。

很抱歉有任何混淆。

EDIT2:将隐式 int 数字显式转换为带符号的 char 常量。

0 投票
1 回答
149 浏览

atan2 - 确定线段的坐标

我如何使用atan2来确定线段结束的坐标,知道它开始的坐标 ( x, y)、线段的角度和线段的长度?

你能告诉我一个解决方案,它不必只用atan2 ...

0 投票
1 回答
773 浏览

c++ - SFML atan2 功能和减速

基本上,使用此代码后发生的情况是我的船被直接拉到屏幕底部,并且就像地面有重力一样,我不明白我做错了什么

0 投票
1 回答
3169 浏览

python - 图像旋转的Python角度计算

我正在开发一个应用程序,该应用程序首先需要稍微旋转图像以将其歪斜。

我在两点 (x1, y1) 和 (x2,y2) 之间检测到一条垂直线。垂直线并非完全垂直 - 第二个 x 坐标略小于或略大于顶部 x,因此该线具有斜率。

我正在尝试计算线条斜率的角度,以便我可以旋转图像,然后重新检测线条,使其完全垂直。为此,我在 Python 中使用 OpenCV。

不幸的是,我在计算线的斜率时遇到问题,因此图像的旋转不准确。

我检测图像中垂直线斜率的功能如下:

我旋转图像以使线条垂直的代码如下:

但是旋转的角度是 249 度、89 度等,而它们应该只有几度。

如果有人可以帮助我找到解决此问题的方法,以便我可以正确纠正图像的倾斜,那将不胜感激。

0 投票
1 回答
401 浏览

c++ - 使用 aTan2 将对象朝向其目的地

我创建了一个以惯性向目的地移动的对象。我在让物体面对它的目的地时遇到了很多麻烦。我的代码很简单,它计算角度,将其转换为度数并将该角度传递给 Matrix4 Rotate 函数,该函数调整 localTransform(场景图)。

问题是对象产生,然后无休止地旋转。它缓慢地朝着目标前进,但只是继续旋转。我已经在没有翻译的情况下对其进行了测试,它无论在现场旋转。我所需要的只是让物体面对它的目的地。我的翻译/旋转功能正常工作,我用它来旋转一个对象,让一个对象随其父对象的旋转产生并朝那个方向前进。它们与 GLM 库提供 1:1 结果。

我已经尝试交换 aTan2 中的顺序,删除度数转换,(尽管什么也没做,Rotate 函数需要度数)并交换平移/旋转顺序。

localTransform 是组合的旋转/缩放/平移矩阵。row[3]column[1] 是 Y。[3][0] 是 X。

关于如何处理这个问题的任何建议?这都是在 2D 坐标中,但是旋转是在 Z 轴上完成的。

0 投票
3 回答
18859 浏览

python - 使用 math.atan2 计算线段之间的角度(Python)

我正在研究空间分析问题,该工作流程的一部分是计算连接线段之间的角度。

每条线段仅由两个点组成,每个点都有一对 XY 坐标(笛卡尔坐标)。这是来自 GeoGebra 的图像。我总是对获得 0 到 180 范围内的正角感兴趣。但是,我会根据输入线段中顶点的顺序得到各种角度。

在此处输入图像描述

我使用的输入数据以坐标元组的形式提供。根据顶点创建顺序,每条线段的最后/结束点可能不同。以下是 Python 代码中的一些案例。我得到它们的线段的顺序是随机的,但是在元组的元组中,第一个元素是起点,第二个是终点。DE例如,线段将具有((1,1.5),(2,2))并且(1,1.5)是起点,因为它在坐标元组中具有第一个位置。

但是,我需要确保我将在等之间获得相同的DE,DF角度ED,DF

我编写了一个小函数,它将线条的组合作为 args 并计算它们之间的角度。我正在使用math.atan2似乎最适合这个的。

我得到的输出是:

如您所见,根据线段中顶点的顺序和线段顺序,我得到不同的值。我试图通过找出源线具有什么样的关系并翻转线,编辑角度等来对角度进行后处理。我已经结束了十几个这样的情况,在某些时候它们开始重叠,我无法再找出 -119.744 应该变成 60.255(锐角)还是保留为 119.744(钝角)等。

是否有任何离散的方法来处理我收到的输出角度值math.atan2以仅获得 0 到 180 范围内的正值? 如果不是,我应该采取什么样的其他方法?

0 投票
2 回答
7744 浏览

matlab - 如何在 MatLab 中计算两个 2D 向量之间的方向角?

我正在尝试实现一个脚本来分析我的一些数据。我有三个点(p1,p2,p3)的位置信息。我想从向量 p1p2 中找到点 p3 的角位移,如下图所示:

角度

p3a、p3b、p3c、p3d 显示 p3 可能的相对位置。如图所示,我希望输出角度的符号来描述它与向量 p1p2 的相对位置。

我正在使用的代码如下(根据图表改编):

当 p3 位于 p3a 时,这可以正常工作,给出正确大小的负角(-77 度)。但是,当 p3 位于 p3d 时,它会输出一个大的正角(+150 度),而不是所需的大负角。

0 投票
1 回答
555 浏览

matlab - 扩展卡尔曼滤波器 - 更新步骤中的错误

我必须在实际上没有很好的数学理解的情况下实现 EKF。(太好了……不是……)到目前为止,我一直做得很好,但是自从我尝试实施预测步骤后,事情就开始出错了。

  1. 使用 EKF(红色)的智能体向随机方向发射
  2. 最终一些变量(pose、Sigma、S、K)变成了 NaN,模拟失败了

在此处输入图像描述

我的代码基于 Thrun 在页面上的“概率机器人”中的代码。204. 这是代码中似乎把事情搞砸的部分

我完全一无所知......任何想法和提示将不胜感激。谢谢你。

更新

代理射击的原因是计算两个角度之间的差异时的“错误”。这些是使用 atan2 计算的。虽然我知道问题出在哪里,但我仍然不知道如何解决它。

让我们想象一下,在为两个对象计算 atan2 之后,我得到了 a = 135 和 b = 45 的值。我计算了它们之间的差异,分别为 90 度和 270 度,但代理仍然没有按照预期的方式行事. 我以前从未真正遇到过atan2。我对计算 atan2 值之间差异的理解是否错误?这是我的理解的说明:

在此处输入图像描述

0 投票
3 回答
4056 浏览

java - Java:确定两点之间的角度

好的,首先道歉,因为我知道这种问题已经不止一次被问过。然而,即使在查看了其他问题和答案之后,我也无法让它适用于我的情况。请参阅下面的示例: 图。1

我只是想计算出 P1 和 P2 之间的角度,假设 0 度如上所示,这样我就可以在 2 之间指向正确方向的箭头。所以我做这样的事情......

结果是:-45,应该是 45?然而,这不仅仅是我不认为它返回否定结果的情况,例如,如果我将 P1 更改为 300,300(低于 P2),那么角度应该为 0,但返回为 -90。

所以我只是想知道是否有人可以指出我做错了什么来计算这个,或者甚至可以这样做吗?