c++ - 根据角度和距离在空间中找到一个二维点

标签 c++ math geometry

好的....所以我做了一个快速图表来解释我希望完成的事情。可悲的是,数学不是我的强项,我希望你们中的一位向导能给我正确的公式 :) 这是一个 c++ 程序,但实际上我正在寻找公式而不是 c++ 代码。

Diagram

好的,现在基本上,红色圆圈是我们的 0,0 点,我站的地方。蓝色圆圈在我们上方 300 个单位,我假设是 0 度角。我想知道如何使用我选择的角度以及我选择的特定距离找到此图表中某个点的 x、y。

我想知道如何找到绿色圆圈的 x、y,假设为 225 度和 500 个单位。

所以我假设我必须想出一种方法来转置一个在所有点都距离 0,0 500 个单位的圆,而不是根据我想要的角度在该圆上选择一个位置?但是,是的,不知道从那里去哪里。

最佳答案

平面上的一个点可以用两种主要的数学表示法表示,笛卡尔坐标(因此 x,y)和极坐标:使用与中心的距离和角度。通常是 r 和一个希腊字母,但我们使用 w

定义

在通常的约定下,r 是从中心 (0,0) 到您的点的距离,并且 角度按逆时针方向测量(对于正值,顺时针方向为负值),0 是右侧的水平线。

备注

请注意有关极坐标表示中的角度的一些事项:

  • 角度也可以用弧度表示,π 与 180° 的角度相同,因此 π/2 等于 90°,依此类推。 π=3.14(大约)定义为 2π=半径为 1 的圆的周长。

  • 角度可以用整圆为模来表示。一个完整的圆是 2π 或 360°,因此 +90° 与 -270° 相同,+180° 和 -180° 相同,以及 3π/4 和 -5π/4、2π 和 0, 360°和0°等。你可以考虑[-π,π](即[-180,180])或[0,2π](即[0,360])之间的角度,或者根本不限制它们,它不会没关系。

  • 当您的点位于中心 (r=0) 时,角度 w 并未真正定义。

  • r 根据定义始终为正。如果 r 为负,您可以更改其符号并添加半圈(π 或 180°)以获得同一点的坐标。

图表上的点

  • 红色:x=0、y=0 或 r=0 w= 任何值

  • 蓝色:x=0、y=300 或 r=300 和 w=90°

  • green : x=-400, y=-400 or r=-565 and w=225°(近似值,我没有实测)

请注意,对于蓝点,您可以设置 w=-270°,对于绿点,您可以设置 w=-135°,等等。

从一种表示到另一种表示

最后,您需要三角函数公式来在表示之间来回移动。更容易的转换是从极坐标到笛卡尔坐标:

x=r*cos(w)
y=r*sin(w)

因为 cos²+sin²=1,pythagoras 等等,你可以看到 x² + y² = r²cos²(w) + r²sin²(w) = r²,因此要得到 r,使用:

r=sqrt(x²+y²)

最后,为了获得角度,我们使用 cos/sin = tan,其中 tan 是另一个三角函数。从 y/x = r sin(w)/(r cos(w)) = tan(w),你得到:

w = arctan(y/x) [mod π]

tan 是一个以 π 为模的函数,而不是 2π。 arctan 简单地表示函数 tan 的反函数,有时写作 tan^-1 或 atan。

通过反转切线,您会得到介于 -π/2 和 π/2(或 -90° 和 90°)之间的结果:您最终需要将 π 添加到结果中。这是针对 [π/2,π] 和 [-π,π/2]([90,180] 和 [-180,-90])之间的角度完成的。这些值由 cos 的符号表征:因为 x = r cos(w) 你知道 x 在所有这些角度上都是负的。尝试查看这些角度在图表上的位置,这非常简单。因此:

w = arctan(y/x) + (π if x < 0)

最后,如果 x 为 0,则不能除以它。在这种极端情况下,您有

  • 如果 y > 0,w = π/2

  • 如果 y < 0,w = -π/2

关于c++ - 根据角度和距离在空间中找到一个二维点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27179004/

相关文章:

c++ - 我的照明是否正确?

python - 防止在 Python 中四舍五入为零

r - 给定圆上的点,找到可以用穿过圆心的线分开的最少点数

c++ - 哪个更快:调用 glGetUniformLocation 还是使用 std::map?

C++缓冲流IO

c++ - 使对象恰好位于屏幕中央

actionscript-3 - 线触发器的 ActionScript 角度

algorithm - 找到隧道 'center line' ?

c++ - 使用迭代最近点 (ICP) 时如何在点云库 (PCL) 中标记 NULL 数据

r - 如何更改 ggplot 中的标签(图例)?