我想找到以角度 theta 旋转 2D 几何向量的最快方法。
我当前的实现使用旋转矩阵数学并且速度很慢:
Vec2 rotate(Vec2 point, float theta)
{
float c = std::cos(theta);
float s = std::sin(theta);
Vec2 result =
{
point.x * c - point.y * s,
point.x * s + point.y * c
};
return result;
}
是否有更有效的解决方案(我愿意牺牲一些准确性)?
我没有评论的声誉,所以我在这里评论。
代替角度,将每行中的酉向量
θx2
存储在数组 cos(θ),sin(θ)
中。通过乘以该向量,您将旋转角度 θ
。
您可能可以传递向量作为参数而不是角度,因此您不需要进行计算。
这取决于代码的其余部分,但一般来说,用角度来思考比用酉向量来思考更复杂、更昂贵。尽量不要使用明确的角度,这样就不需要进行转换。 推广到 3D 时也更容易,并且极端情况也更少。
有一些方法可以优化工作效率:
如果你要以相同的角度旋转数百万个向量,那么你可以将旋转嵌入向量的读取部分,这样每当你读取一个向量时,它就已经在CPU的寄存器中了,所以旋转速度很快,而不会对CPU的缓存造成影响。
如果您要通过多次(但相同)旋转来旋转数百万个向量,那么最好将矩阵相乘作为最终的单次旋转,然后仅将向量旋转一次该单次总旋转。
如果仅用某个公共向量计算数百万个旋转向量一次,那么只需旋转该公共向量即可,就像需要旋转整个世界时旋转相机一样。
如果以某种方式使用极坐标或球坐标是可以的,那么它只是由加/减角度值组成,没有任何乘法。
还有基于硬件的优化: