Math 展平曲面
我正试图计算一个用于牙科成像的全景投影 我有一个矩形曲面,通过分段函数在一个方向上“弯曲”。如果我们从上面看,它看起来像一个规则的分段函数 “分段线性函数”仅由一组3D点定义。 所有的点都在同一平面上。所有三维点所在的平面与曲面正交 (请参见左上角窗口中的绿线) 我正在寻找合适的方法来“压平”它。(非线性变换) 平面应具有与曲面相同的“长度”。(它不是经典的正交投影) 最后,我将使用“平面”作为画布来显示感兴趣的信息 (底部窗口) 最好的,我是这样看的: 我想:Math 展平曲面,math,transformation,surface,flatten,Math,Transformation,Surface,Flatten,我正试图计算一个用于牙科成像的全景投影 我有一个矩形曲面,通过分段函数在一个方向上“弯曲”。如果我们从上面看,它看起来像一个规则的分段函数 “分段线性函数”仅由一组3D点定义。 所有的点都在同一平面上。所有三维点所在的平面与曲面正交 (请参见左上角窗口中的绿线) 我正在寻找合适的方法来“压平”它。(非线性变换) 平面应具有与曲面相同的“长度”。(它不是经典的正交投影) 最后,我将使用“平面”作为画布来显示感兴趣的信息 (底部窗口) 最好的,我是这样看的: 我想: 从曲线中取三个后续点P0、
P0、P1、P2
U0、V0、U1、V1
U0 = P1-P0
U1 = P2-P1
V0 = cross(U0,(0,0,1)); V0=half_height/|V0|
V1 = cross(U1,(0,0,1)); V1=half_height/|V1|
所以A,B
就是P0+/-V0
,C,D
就是P1+/-V1
。在叉积中,使用任何与U0、U1
不平行的向量,我选择(0,0,1)
,但如果它是平行的,则选择任何其他ABCD
重新弯曲
例如,计算A'B'C'D'
A'.x = B'.x = index_of(P0) * sizex
C'.x = D'.x = index_of(P0) * sizex + sizex
A'.y = D'.y = sizey
B'.y = C'.y = 0
其中,sizex,sizey
是矩形段的大小。您也可以使用|U0 |,|V0 |
,但在这种情况下,起始x
将是积分曲线长度ABCD
和A'B'C'D'
之间的转换
U0 = P1-P0
U1 = P2-P1
V0 = cross(U0,(0,0,1)); V0=half_height/|V0|
V1 = cross(U1,(0,0,1)); V1=half_height/|V1|
因此,对于ABCD
compute(x,y)
内的每个像素pA'B'C'D'。
x`很简单:
x = A'.x + dot(P-P0,U0)/|P-P0|
y
很棘手,需要进行一些调整以满足您的需要(因此结果很平滑,符合您的喜好)。首先,尝试简单的方法(将导致分段之间的接缝)
现在只需将位置p
处的像素复制到位置(x,y)
为了使这更平滑,您可以根据点(p-P0,U0)/(| p-P0 |*| U0 |)使V
在V0,V1
之间插值,这样它将无缝地改变
t = dot(P-P0,U0)/(|P-P0|*|U0|)
V = V0 + (V1-V0)*t
y = (A'.y+B'.y)/2 + dot(P-P),V)/|P-P0|
如果需要帮助确定点是否在内部,则像素p
在内部如果
dot(P-P0,U0)/(|P-P0|*U0) = <0.0,1.0>
dot(P-P0,U0)/(P-P0 |*U0)=
除非你给出定义变换的“分段函数”的细节,否则我们很难说出任何有意义的话。因此,“分段线性函数”只是由一组3D点定义的。所有的点都在同一平面上。所有三维点所在的平面与曲面正交。这有用吗?感谢使用恒定密度采样的点吗?非常感谢,这正是我所想的大图-现在在JS/WebGL中实现了这一点:)