【发布时间】:2012-11-18 10:05:56
【问题描述】:
我正在寻找一种快速有效的方法来确定向量 B 是否介于向量 A 和向量 C 的小角度之间。通常我会使用垂直点积来确定每条线 B 的哪一边位于但在此case 不是那么简单,原因如下:
- 没有一个向量可以被认为是标准化的,标准化它们是我希望避免的额外步骤。
- 我不清楚哪一边是最小的角度,所以很难说哪一边是好的。
- A 和 B 可能共线或正好相隔 180 度,在这种情况下我想返回 false。
- 当我在 3D 环境中工作时,我很容易将其简化为 2D,如果这样可以让事情变得更容易,更重要的是更快。此测试将用于需要尽可能快地运行的算法。
如果有一些简单有效的方法来确定我的垂直向量应该指向哪个方向,我可以使用这两个点积进行测试。
到目前为止,我一直在考虑但没有取得多大成功的另一种方法是使用矩阵。理论上,根据我对矩阵变换的理解,我应该能够使用 A 和 C 作为基向量。然后将 B 乘以矩阵 I 应该能够通过 X 和 Y 是否都为正来测试 B 所在的象限。如果我能让这种方法发挥作用,它可能是最好的,因为一个矩阵乘法应该比两个点积更快,而且我不必担心哪一边的角度最小。
问题出在我的测试中,我不能简单地使用 A 和 C 作为基础并将其正常相乘并获得正确的行为。我真的不确定我在这里做错了什么。我已经多次遇到“向量空间”这个术语,据我所知,它似乎是一个与矩阵变换非常相似的概念,不需要正交基或正交基。它和矩阵一样吗?如果没有,是否有更好的方法,我将如何使用它?
只是为了更直观地解释我在说什么:
@Aki Suihkonen 我似乎无法让它工作。编写了一个我可以运行的模拟案例,看看我是否无法弄清楚
对于这种情况使用
斧头 2.9579773 斧头 3.315979
Cx 2.5879822 Cy 5.1630249
对于 B,我围绕四个象限旋转,向量将空间划分为。
我得到的迹象:
- 第一季度--
- 第二季度+-
- 第三季度+-
- 第四季度--
假设我在环境中以与图像相同的方向旋转,我很确定我做了。
【问题讨论】:
-
您为此使用什么语言/环境?优化始终取决于上下文。
-
你为什么不尝试用高斯方法求解向量方程xA+yC=B?如果解决方案存在,正 x 和 y 都表示 B 位于 A 和 C 之间。
-
我正在使用 C++,但我目前对数学上的优化很感兴趣。
-
如果要旋转 A,[B],C 使 B 面向“上”即 y>0, x=0,则条件为 sign(Ax)!=sign(Cx) .无论如何,“中间”的含义有一些主观性(例如,如果三个向量只是任意的,并且 a 和 c 都面向 b 的“后向”。(认为粗体黑线是 A 和 C 以及向量 B指向“q3”。)它在中间吗?公式说是。另一个额外的标准是,当 A 和 C 旋转 B 时,A 和 C 的 x 符号也必须为正。(和 y 符号必须不同)