如何将网格规范化为-1到1,然后从规范化网格恢复为原始网格?

我有一个X,Y,Z格式的网格模型。 让我们说。

Points *P; 

在第一步中,我想将此网格规范化为(-1,-1,-1)到(1,1,1)。 这里标准化意味着将此网格拟合到(-1,-1,-1)到(1,1,1)的框中。

然后我对标准化网格进行一些处理,最后我想将尺寸恢复为与原始网格相似。

步骤1: P =原始网格尺寸;

步骤2: nP =归一化(P); //从(-1,-1,-1)到(1,1,1)

步骤3: cnP =用(nP)做某事,顶点数增加或减少。

步骤4:原始网格尺寸=恢复(cnP); //尺寸应与原始网格相同

我怎样才能做到这一点?

我知道在编程中迷失是多么容易,完全错过了基础数学的简单性。 但相信我,这真的很简单。

解决问题最直观的方法可能是:

  1. 确定所有三个坐标轴(即xyz )的最小值和最大值。 此信息包含在多维数据集的八个角顶点中。 将这六个值保存在六个变量中(例如, min_xmax_x等)。

  2. 对于网格中的所有点p = (x,y,z) ,计算

     q = ( 2.0*(x-min_x)/(max_x-min_x) - 1.0 2.0*(y-min_y)/(max_y-min_y) - 1.0 2.0*(z-min_z)/(max_z-min_z) - 1.0 ) 

    现在q等于p转换为区间(-1,-1,-1) -- (+1,+1,+1)

  3. 做你在这个中间网格上需要做的事情。

  4. 通过执行逆操作将所有坐标q = (xx, yy, zz)回原始网格:

     p = ( (xx+1.0)*(max_x-min_x)/2.0 + min_x (yy+1.0)*(max_y-min_y)/2.0 + min_y (zz+1.0)*(max_z-min_z)/2.0 + min_z ) 
  5. 清理你所做的任何混乱,并继续你的程序的其余部分。

这很容易,找出哪些库包含这些函数可能要比自己编写它们要多得多。

这很简单 – 使用形状函数。 这是两点的一维示例:

 -1 <= u <= +1 x(u) = x1*(1-u)/2.0 + x2*(1+u)/2.0 x(-1) = x1 x(+1) = x2 

您可以使用Jacobean在坐标系之间进行转换。

让我们看看它在2D中的样子:

 -1 <= u <= =1 -1 <= v <= =1 x(u, v) = x1*(1-u)*(1-v)/4.0 + x2*(1+u)*(1-v)/4.0 + x3*(1+u)*(1+v)/4.0 + x4*(1-u)*(1+v)/4.0 y(u, v) = y1*(1-u)*(1-v)/4.0 + y2*(1+u)*(1-v)/4.0 + y3*(1+u)*(1+v)/4.0 + y4*(1-u)*(1+v)/4.0