我正在尝试计算用于牙科成像目的的全景投影。
我有一个矩形表面"弯曲"通过分段函数在一个方向上。如果我们从顶部看它,它看起来像一个常规的分段函数。
"分段线性函数"只是由一组3D点定义。 所有点都在同一个平面上。所有3D点所在的平面与曲面正交
(参见左上角窗口的绿线)
我正在寻找适当的方式来平息"它。 (非线性变换)
平坦的表面应该具有相同的长度"作为弯曲的。 (这不是经典的正交投影)
最终,我将使用"平面"作为显示感兴趣信息的画布。
(底部窗口)
最佳,
答案 0 :(得分:1)
我这样看:
我会:
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'
之间的转换
因此ABCD
(x,y)
内的A'B'C'D'. The
计算x = A'.x + dot(P-P0,U0)/|P-P0|
内的每个像素P都很容易:
y
y = (A'.y+B'.y)/2 + dot(P-P),V0)/|P-P0|
非常棘手,需要进行一些调整以满足您的需求(因此结果很顺利)。首先尝试简单的方法(将导致段之间的接缝)
P
现在只需将位置(x,y)
的像素复制到位置V
为了使这更加流畅,您可以V0,V1
在dot(P-P0,U0)/(|P-P0|*|U0|)
之间进行插值,这取决于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>
在内部
<?php
$page['questions'] = array();
while ($getQuestions = $stmt->fetch()) {
$question = array();
$question['id'] = $getQuestions['id'];
$question['content'] = $getQuestions['content'];
// push question into questions
$page['questions'][] = $question;
}
循环#1适用于曲线的所有细分
逐步采用曲线的单个采样点(不是3 ...)