旋转几何向量最快的方法是什么?

问题描述 投票:0回答:2

我想找到以角度 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;
}

是否有更有效的解决方案(我愿意牺牲一些准确性)?

c++ performance math optimization geometry
2个回答
6
投票

我没有评论的声誉,所以我在这里评论。

代替角度,将每行中的酉向量

θx2
存储在数组
cos(θ),sin(θ)
中。通过乘以该向量,您将旋转角度
θ

您可能可以传递向量作为参数而不是角度,因此您不需要进行计算。

这取决于代码的其余部分,但一般来说,用角度来思考比用酉向量来思考更复杂、更昂贵。尽量不要使用明确的角度,这样就不需要进行转换。 推广到 3D 时也更容易,并且极端情况也更少。


1
投票

有一些方法可以优化工作效率:

  • 如果你要以相同的角度旋转数百万个向量,那么你可以将旋转嵌入向量的读取部分,这样每当你读取一个向量时,它就已经在CPU的寄存器中了,所以旋转速度很快,而不会对CPU的缓存造成影响。

  • 如果您要通过多次(但相同)旋转来旋转数百万个向量,那么最好将矩阵相乘作为最终的单次旋转,然后仅将向量旋转一次该单次总旋转。

  • 如果仅用某个公共向量计算数百万个旋转向量一次,那么只需旋转该公共向量即可,就像需要旋转整个世界时旋转相机一样。

  • 如果以某种方式使用极坐标或球坐标是可以的,那么它只是由加/减角度值组成,没有任何乘法。


还有基于硬件的优化:

  • SSE/AVX 矢量化代码或简单的 CPU OpenCL 内核(每个核心一次进行多次乘法)
  • 用于 GPU 的 CUDA/OpenCL/Compute-shader(例如 Vulkan)
© www.soinside.com 2019 - 2024. All rights reserved.