如何将网格规范化为-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); //尺寸应与原始网格相同
我怎样才能做到这一点?
我知道在编程中迷失是多么容易,完全错过了基础数学的简单性。 但相信我,这真的很简单。
解决问题最直观的方法可能是:
-
确定所有三个坐标轴(即
x
,y
和z
)的最小值和最大值。 此信息包含在多维数据集的八个角顶点中。 将这六个值保存在六个变量中(例如,min_x
,max_x
等)。 -
对于网格中的所有点
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)
。 -
做你在这个中间网格上需要做的事情。
-
通过执行逆操作将所有坐标
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 )
-
清理你所做的任何混乱,并继续你的程序的其余部分。
这很容易,找出哪些库包含这些函数可能要比自己编写它们要多得多。
这很简单 – 使用形状函数。 这是两点的一维示例:
-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