代码之家  ›  专栏  ›  技术社区  ›  bcmpinc

如何有效地计算将单位立方体映射到自身的反射和旋转?

  •  0
  • bcmpinc  · 技术社区  · 6 年前

    对于基于八叉树的稀疏体素八叉树渲染器,我希望能够旋转和镜像八叉树的各个节点。尽管它不是真正的八叉树,但由于节点是共享的,并且允许将它们自己包含为子树。否则我可以简单地将转换应用到八叉树本身。

    我还没有决定如何对转换进行编码,尽管应该可以将其编码为单个32位整数(甚至是6位整数,因为只有48个可能的转换)。然后,转换可以作为函数应用,该函数将立方体的每个角点映射到转换后的位置。即。

    int transform(int corner, int transformation) {
      // magic happens here
      return result;
    }
    

    此外,我还应该有一个功能 combine 将转换结合在一起 transform(corner, combine(a,b)) 等于 transform(transform(corner, b), a)

    由于这些函数将被每秒调用10亿次,因此它们应该很快。尽管转换的调用频率大约是合并的4倍。该算法是递归的,因此如果转换编码使用多个32位整数,则将其放入堆栈会产生额外的运行时开销。

    到目前为止,我已经发现这个问题可以分解为位翻转(bit flipping)和位置换(bit permutation)(我还不知道如何有效地执行)。不过,同时进行这两种操作可能更有效。

    我打算在C++代码中使用这个代码,它已经使用了SSE4.1内核。尽管不使用内部函数或只需要SSE3的解决方案是首选的。最后,速度是最重要的。我会试着用 http://quick-bench.com/ 比较解决方案。

    0 回复  |  直到 6 年前