首页 > 后端开发 > C++ > 如何直接计算两个向量之间的顺时针角度?

如何直接计算两个向量之间的顺时针角度?

Susan Sarandon
发布: 2024-11-23 17:24:19
原创
918 人浏览过

How to Directly Calculate the Clockwise Angle Between Two Vectors?

直接计算向量之间的顺时针角度

传统上,计算向量之间的角度涉及使用点积,这会产生向量之间的内角0° 和 180°。然而,这种方法需要使用条件语句来确定实际的顺时针角度。

二维情况

在 2D 中,存在一种简单的方法:

dot = x1*x2 + y1*y2      # Dot product between [x1, y1] and [x2, y2]
det = x1*y2 - y1*x2      # Determinant
angle = atan2(det, dot)  # atan2(y, x) or atan2(sin, cos)
登录后复制

行列式与角度的正弦成正比,补充了点积与余弦。角度的方向与坐标系的方向一致,正角度表示左手系统(例如计算机图形)中的顺时针旋转。交换输入会改变角度的符号。

三维情况

在 3D 中,旋转角度由垂直于所涉及的两个向量的轴定义。一种约定将正角度分配给将轴与正角度对齐的旋转。使用此约定:

dot = x1*x2 + y1*y2 + z1*z2    # Between [x1, y1, z1] and [x2, y2, z2]
lenSq1 = x1*x1 + y1*y1 + z1*z1
lenSq2 = x2*x2 + y2*y2 + z2*z2
angle = acos(dot/sqrt(lenSq1 * lenSq2))
登录后复制

嵌入 3D 的平面

当向量位于具有已知法向量 _n_ 的平面内时,会发生另一种特殊情况。适应二维计算,我们考虑 _n_:

dot = x1*x2 + y1*y2 + z1*z2
det = x1*y2*zn + x2*yn*z1 + xn*y1*z2 - z1*y2*xn - z2*yn*x1 - zn*y1*x2
angle = atan2(det, dot)
登录后复制

请注意,n 必须具有单位长度。

三重积形式

行列式也可以表示为三元组产品:

det = n · (v1 × v2)
登录后复制

这个公式提供了另一种视角,叉积与角度的正弦成正比,并且垂直于平面,有效地与 _n_ 对齐。然后,点积测量具有正确符号的结果向量的长度。

范围 0° – 360°

大多数 atan2 实现返回角度范围为 [-π, π] 弧度或 [-180°, 180°] 度。对于正角度 [0°、360°],将 2π 添加到任何负结果。或者,atan2(-det, -dot) π 可以无条件地用于正角度。

以上是如何直接计算两个向量之间的顺时针角度?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板