生成垂直于向量的任意向量的好方法是什么?假设生成的向量应该是有效的(即除非给定向量是(0.0, 0.0, 0.0)- 这种情况的输出应该是error)?
我知道有无限组可能的向量(例如参见此处)。我想要的是对于任何输入向量来说都是严格且无错误的。
我尝试的是设置,这里p和n是垂直向量:p[0] = 0.5*(n[0] + n[1]; p[1] = 0.5*(n[0] - n[1])然后求解点积方程来找到,但是当是p[2]时这是有缺陷的。目前我只能想到乏味地创建所有案例检查 - 但一定有更好、更优雅的解决方案吗?n[2]0
选择与给定向量不共线的任意向量。对于“刚性的东西”,你可以有一个固定的规则。例如,选择 (1, 0, 0),除非对于某些 x,向量是 (x, 0, 0);否则选择 (0, 1, 0)。1然后取任意向量与输入向量的叉积。这将产生一个垂直向量。(当然,这只适用于 3D,但这似乎就是您正在处理的内容。)
\n\n或者(这适用于任何维度),沿坐标轴选择单位向量,该单位向量与输入向量产生最小(大小)点积。将此单位向量称为e,并将输入向量称为x。那么e \xe2\x88\x92 ( e \xe2\x80\xa2 x ) x将垂直于x。(很容易检查点积是否为零:不失一般性地假设x是单位向量。则 ( e \xe2\x88\x92 ( e \xe2\x80\xa2 x ) x ) \xe2\x80\xa2 x = ( e \xe2\x80\xa2 x ) \xe2\x88\x92 ( e \xe2\x80\xa2 x )( x \xe2\x80\xa2 x ) = ( e \xe2\ x80\xa2 x ) \xe2\x88\x92 ( e \xe2\x80\xa2 x )(1) = 0。)
\n\n1更好的规则是选择 (1, 0, 0)、(0, 1, 0) 或 (0, 0, 1) 中与输入向量形成最小点积(大小)的那个。这将为您提供更好的数值稳定性。
\n