2

我正在尝试计算长方体中的点,给定它的中心(这是一个 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)

这不可能是正确的。任何指导将不胜感激!

4

2 回答 2

1

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

于 2014-03-06T12:17:43.037 回答
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 函数,只需展开循环并手动编写它会更具可读性并且通常更持久。

于 2014-03-06T20:36:38.617 回答