Cuboid中的C ++点(按位AND)

时间:2014-03-06 10:43:25

标签: c++ bit-manipulation bitwise-and

我正在尝试计算长方体中的点,给定它的中心(这是一个Vector3)以及沿x,y和z轴的边长。我在math.stackexchange.com上找到了以下内容:https://math.stackexchange.com/questions/107778/simplest-equation-for-drawing-a-cube-based-on-its-center-and-or-other-vertices表示我可以使用以下公式:

https://math.stackexchange.com/questions/107778/simplest-equation-for-drawing-a-cube-based-on-its-center-and-or-other-vertices World类的构造函数是:

World::World(Vector3 o, float d1, float d2, float d3) : origin(o)
{
  // If we consider an edge length to be d, we need to find r such that
  // 2r = d in order to calculate the positions of each vertex in the world.
  float r1 = d1 / 2,
      r2 = d2 / 2,
      r3 = d3 / 2;

  for (int i = 0; i < 8; i++)
  {
    /* Sets up the vertices of the cube.
     *
     * @see http://bit.ly/1cc2RPG
     */
    float x = o.getX() + (std::pow(-1, i&1) * r1),
          y = o.getY() + (std::pow(-1, i&2) * r2),
          z = o.getZ() + (std::pow(-1, i&4) * r3);

    points[i] = Vector3(x, y, z);
    std::cout << points[i] << "\n";
  }
}

我将以下参数传递给构造函数:

Vector3 o(0, 0, 0);
World w(o, 100.f, 100.f, 100.f);

所有8个顶点的输出坐标为:

(50, 50, 50)
(-50, 50, 50)
(50, 50, 50)
(-50, 50, 50)
(50, 50, 50)
(-50, 50, 50)
(50, 50, 50)
(-50, 50, 50)

哪个不正确。任何指导都将非常感谢!

2 个答案:

答案 0 :(得分:1)

问题在于&来电中的按位pow: 在yz组件中,它们始终分别返回0和2或4。 -1 ^ 2 = -1 ^ 4 = 1,这就是为什么这些组件的符号始终为正。您可以尝试使用(i&2)!=0(i&2) >> 1作为y组件。 z组件也是如此。

答案 1 :(得分:0)

改变这个:

float x = o.getX() + (std::pow(-1, i&1) * r1),
      y = o.getY() + (std::pow(-1, i&2) * r2),
      z = o.getZ() + (std::pow(-1, i&4) * r3);

对此:

float x = o.getX() + (std::pow(-1, (i     ) & 1) * r1), // pow(-1, 0) == 1, pow(-1, 1) == -1
      y = o.getY() + (std::pow(-1, (i >> 1) & 1) * r2), // pow(-1, 0) == 1, pow(-1, 1) == -1
      z = o.getZ() + (std::pow(-1, (i >> 2) & 1) * r3); // pow(-1, 0) == 1, pow(-1, 1) == -1

甚至对此:

float x = o.getX() + (std::pow(-1, (i     )) * r1), // pow(-1, {0, 2, 4, 6}) == 1, pow(-1, {1, 3, 5, 7}) == -1
      y = o.getY() + (std::pow(-1, (i >> 1)) * r2), // pow(-1, {0, 2}) == 1, pow(-1, {1, 3}) == -1
      z = o.getZ() + (std::pow(-1, (i >> 2)) * r3); // pow(-1, 0) == 1, pow(-1, 1) == -1

问题在于,即使你掩盖的值识别天气与否,也需要否定长度。它们的位置值不正确,无法从-1的取幂中获得所需的属性。

如上所述重写代码将解决这个问题,但是它更具可读性,并且通常更加永久,只需展开循环并手动写入,如果每个都是加法或减法而不使用pow函数。