获取单个平面中两个矢量之间角度的有效方法
Efficient way to get the angle between two vectors in a single plane?
如果我知道向量的x和z值是相同的,因此,我只关心从y平面上的差异测量的"垂直"角度,与计算点积相比,有更有效的方法吗?
我目前使用点积法的代码如下:
float a_mag = a.magnitude();
float b_mag = b.magnitude();
float ab_dot = a.dot(b);
float c = ab_dot / (a_mag * b_mag);
// clamp d to from going beyond +/- 1 as acos(+1/-1) results in infinity
if (c > 1.0f) {
c = 1.0;
} else if (c < -1.0) {
c = -1.0;
}
return acos(c);
我希望能够去掉这些平方根
假设您的两个向量位于u = (x, y1, z)
和v = (x, y2, z)
,并且您对这两个向量所跨越的平面上的平面角度感兴趣。你必须计算点积和幅度,但你可以节省一些操作:
u.v = x.x + y1.y2 + z.z
u^2 = x.x + y1.y1 + z.z
v^2 = x.x + y2.y2 + z.z
所以我们应该预先计算:
float xz = x*x + z*z, y11 = y1*y1, y12 = y1*y2, y22 = y2*y2;
float cosangle = (xz + y12) / sqrt((xz + y11) * (xz + y22));
float angle = acos(cosangle);
如果x和z的值不变,那么计算非常简单:只需使用基本的三角法。
设点为(x, y1, z)
和(x, y2, z)
。你可以找到向量与ZX平面的夹角。设角度分别为t1
和t2
。然后:
w = sqrt(x^2 + z^2)
tan(t1) = y1 / w
So t1 = atan(y1 / w)
Similarly t2 = atan(y2 / w)
The angle is (t2 - t1)
有一个陷阱:当x和z都为零时,tan
s是未定义的。。。但是这种琐碎的情况可以容易地单独处理。
不幸的是,似乎没有办法避免平方根。
相关文章:
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 不同的类或结构初始化方法之间的性能差异是什么?
- #include < conio.h> 和 getch() 方法之间的关系是什么?
- 是否有一种标准方法来计算两个 asctime() 值之间的天数
- 在C++事务之间存储大量字符数据的有效方法
- 定义类模板构造函数的两种方法之间的区别
- std::list 的两个 insert() 方法签名之间的实现差异
- 使瓷砖之间没有边框的最佳方法?
- 两个类之间的共享方法
- 在C++和Python之间交换数据的最快方法是什么?
- 计算两个uint8_t变量之间差值的最快方法是什么?
- 在 c++ 中,在线程之间共享数据容器的最佳方法是什么?
- 获取字符串大小的各种方法之间的比较
- 在 C 中并行化嵌套循环的几种方法之间的差异,C++使用 OpenMP
- 在两个Raspberry Pis C 之间发送重复命令的方法
- 分流场算法C++方法之间未正确传递?
- 根据编译时条件在类型之间选择类型的惯用方法
- C++对象构造方法之间的差异
- 有没有一种方法可以在基于枚举的可变参数模板函数之间进行选择,这比将函数包装在结构中更简单
- 在QTcpSocket和python套接字之间交换数据的正确方法是什么?