平整曲面

时间:2017-06-07 08:37:01

标签: math transformation surface flatten

我正在尝试计算用于牙科成像目的的全景投影。

我有一个矩形表面"弯曲"通过分段函数在一个方向上。如果我们从顶部看它,它看起来像一个常规的分段函数。

"分段线性函数"只是由一组3D点定义。 所有点都在同一个平面上。所有3D点所在的平面与曲面正交

(参见左上角窗口的绿线)

enter image description here

我正在寻找适当的方式来平息"它。 (非线性变换)

平坦的表面应该具有相同的长度"作为弯曲的。 (这不是经典的正交投影)

最终,我将使用"平面"作为显示感兴趣信息的画布。

(底部窗口)

enter image description here

最佳,

1 个答案:

答案 0 :(得分:1)

我这样看:

img

我会:

  1. 从曲线中获取3个后续点P0,P1,P2
  2. 计算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 +/- V0C,DP1 +/- V1。在交叉产品中使用与U0,U1不平行的任何向量我选择(0,0,1)但是如果它并行选择任何其他...

  3. 使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将是积分曲线长度。

  4. 计算ABCDA'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,V1dot(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;        
        }
    
  5. 循环#1适用于曲线的所有细分

    逐步采用曲线的单个采样点(不是3 ...)