从平面方程生成点网格的算法

时间:2013-08-28 11:39:16

标签: c++ algorithm math geometry

我在3D空间中有一个平面方程: ax + by + cz + d = 0我希望用一个规则的分布点从平面上的特定点填充给定半径内的这个平面。在我看来,应该是一个数学优雅的答案,但我没有看到它。用C ++或伪代码回答会更好。

1 个答案:

答案 0 :(得分:4)

我假设你有一个相当不错的3d矢量类,并在答案中称之为vec3。你需要的第一件事是飞机上的矢量。给出正常平面方程有几种方法可以生成一个,但我更喜欢这个:

vec3 getPerpendicular(vec3 n)
{
  // find smallest component
  int min=0;
  for (int i=1; i<3; ++i)
    if (abs(n[min])>abs(n[i]))
      min=i;

  // get the other two indices
  int a=(i+1)%3;
  int b=(i+2)%3;

  vec3 result;
  result[i]=0.f;
  result[a]=n[b];
  result[b]=-n[a];
  return result;
}

这种结构保证了dot(n,getPerpendicular(n))为零,这是正交条件,同时也保持矢量的幅度尽可能高。请注意,将具有最小幅度的组件设置为0也可以保证您不会获得0,0,0向量,除非这已经是您的输入。在这种情况下,你的飞机会堕落。

现在在飞机上获取基本矢量:

vec3 n(a,b,c); // a,b,c from your equation
vec3 u=normalize(getPerpendicular(n));
vec3 v=cross(u, n);

现在你可以通过缩放u和v并将它添加到你在飞机上得到的矢量来生成你的点。

float delta = radius/N; // N is how many points you want max in one direction
float epsilon=delta*0.5f;

for (float y=-radius; y<radius+epsilon; radius+=delta)
   for (float x=-radius; x<radius+epsilon; radius+=delta)
      if (x*x+y*y < radius*radius) // only in the circle
          addPoint(P+x*u+y*v); // P is the point on the plane

epsilon确保你的点数是对称的,你不会错过极端的最后一点。