0

我有一个 X、Y、Z 格式的网格模型。可以说。

Points *P;

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

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

step-1: P = 原始网格尺寸;

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

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

step-4: 原始网格尺寸 = Revert(cnP); // 尺寸应与原始网格相同

我怎样才能做到这一点?

4

2 回答 2

3

它很容易使用形状函数。这是两点的一维示例:

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

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

让我们看看它在 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
于 2012-09-09T02:17:18.053 回答
3

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

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

  1. x确定所有三个坐标轴(即y和)的最小值和最大值z。此信息包含在立方体的八个角顶点中。将这六个值保存在六个变量中(例如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. 清理你造成的任何混乱并继续你的程序的其余部分。

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

于 2012-09-09T12:08:18.410 回答