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

标签 c++ algorithm math geometry

<分区>

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

最佳答案

我假设您有一个相当不错的 3d vector 类,并在答案中将其称为 vec3。您首先需要的是平面中的 vector 。有几种方法可以生成一个给定的法平面方程,但我更喜欢这个:

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=(min+1)%3;
  int b=(min+2)%3;

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

此构造保证 dot(n, getPerpendicular(n)) 为零,这是正交条件,同时还保持 vector 的大小尽可能高。请注意,将幅度最小的分量设置为 0 还可以保证您不会得到 0,0,0 vector 作为结果,除非这已经是您的输入。在这种情况下,您的平面会退化。

现在让你的基本 vector 在平面上:

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

现在您可以通过缩放 u 和 v 并将其添加到您在平面上获得的 vector 来生成点。

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 确保您的点计数是对称的,并且您不会错过极端的最后一个点。

关于c++ - 从平面方程生成点网格的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18486840/

相关文章:

c++ - 常规循环到指针循环的转换,如何?

C++二叉树实现——删除指针原因

c++ - 同时使用非原子和原子操作

c++ - 从其他 vector 创建新 vector ,仅使用重复项

c# - 是否有标准算法将重叠对象平衡到桶中?

java - Java 中的开源排队论算法

algorithm - 我可以实现什么样的酷图形算法?

c++ - const 静态成员初始化 - 内部类定义与外部类定义

c++ - Advanced SelectionSort - 在一次迭代中搜索两个元素

java - 为什么我们在获取质因数时不必检查数字是否为质数?