Geometry 确定三角形的角度

Geometry 确定三角形的角度,geometry,Geometry,鉴于以下问题: 我有两种解决方案: 首先是计算绝对角度的差值,然后重新规范化角度。坏主意,2X atan2()速度慢,重新规范化效率低 angle=climp_到_范围(atan2(P1.y,P1.x)-atan2(P0.y,P0.x)) 二是计算点积,归一化,计算arccos()。这也是个坏主意,因为角度符号是不正确的 angle=acos(点(P0,P1)/sqrt(点(P0,P0)*点(P1,P1)) 我觉得应该有一些公式。如何有效地解决给定问题?可以只使用一个atan2,但同时

鉴于以下问题:

我有两种解决方案:

首先是计算绝对角度的差值,然后重新规范化角度。坏主意,2X atan2()速度慢,重新规范化效率低

  • angle=climp_到_范围(atan2(P1.y,P1.x)-atan2(P0.y,P0.x))
二是计算点积,归一化,计算arccos()。这也是个坏主意,因为角度符号是不正确的

  • angle=acos(点(P0,P1)/sqrt(点(P0,P0)*点(P1,P1))

我觉得应该有一些公式。如何有效地解决给定问题?

可以只使用一个
atan2
,但同时使用向量的叉积和标量积:

angle = atan2(Cross(P0, P1), Dot(P0, P1);

可以只使用一个
atan2
,但同时使用向量的叉积和标量积:

angle = atan2(Cross(P0, P1), Dot(P0, P1);
你真的需要以弧度/度为单位的角度,而不是作为单位向量或旋转矩阵吗

xy单位矢量可以表示角度而不是绝对方向;角度是垂直(或水平)轴与单位矢量之间的角度。与简单的乘法/加法/减法相比,Trig函数非常慢,与div/sqrt相比仍然很慢,因此将角度表示为向量通常是一件好事

您可以使用
交叉点(P0,P1)
点(P0,P1)
计算其分量,但随后将其规格化为xy单位向量,而不是对其使用atan2

另请参见gamedev.SE上的,以及


这很容易用SIMD进行矢量化,比SIMD
atan2
更容易
rsqrtps
的存在主要是为了加速
x*=1.0/sqrt(foo)
(并对
y
值的SIMD向量重复使用相同的乘法器)进行归一化。但是,
rsqrtps
的精度非常低,所以您经常需要牛顿-拉斐逊迭代来优化。最新的CPU(Skylake)具有良好的FP sqrt/div吞吐量,因此您可以使用
\u mm\u sqrt\u ps
规范化这种简单的方式,并将优化留待以后进行。请参阅。

是否确实需要以弧度/度为单位的角度,而不是作为单位向量或旋转矩阵

xy单位矢量可以表示角度而不是绝对方向;角度是垂直(或水平)轴与单位矢量之间的角度。与简单的乘法/加法/减法相比,Trig函数非常慢,与div/sqrt相比仍然很慢,因此将角度表示为向量通常是一件好事

您可以使用
交叉点(P0,P1)
点(P0,P1)
计算其分量,但随后将其规格化为xy单位向量,而不是对其使用atan2

另请参见gamedev.SE上的,以及



这很容易用SIMD进行矢量化,比SIMD
atan2
更容易
rsqrtps
的存在主要是为了加速
x*=1.0/sqrt(foo)
(并对
y
值的SIMD向量重复使用相同的乘法器)进行归一化。但是,
rsqrtps
的精度非常低,所以您经常需要牛顿-拉斐逊迭代来优化。最新的CPU(Skylake)具有良好的FP sqrt/div吞吐量,因此您可以使用
\u mm\u sqrt\u ps
规范化这种简单的方式,并将优化留待以后进行。请参阅。

@Yves Daoust我向您道歉。我太匆忙了,错过了你已经给出的关键时刻,于是自动写下了我的答案。(现在无法删除已接受的答案)@Mbo您的答案更好。它有一些插图代码(末端没有一个闭合支架)。他的回答甚至没有提到交叉积的参数顺序,因此被认为质量较低。我请他改正,他删除了他的回答,因为他引用了“设置接受条件是不可接受的”。@Yves Daoust我道歉。我太匆忙了,错过了你已经给出的关键时刻,于是自动写下了我的答案。(现在无法删除已接受的答案)@Mbo您的答案更好。它有一些插图代码(末端没有一个闭合支架)。他的回答甚至没有提到交叉积的参数顺序,因此被认为质量较低。我请他更正,他删除了他的答案,因为他引用了“设置接受条件是不可接受的”。