2017-06-07 40 views
1

私は歯科撮影のためのパノラマ投影を計算しようとしています。曲面を平らにする

私は、区分的な機能によって一方向に「湾曲した」矩形面を持っています。上から見ると、それは普通の区分的な関数のように見えます。

「区分線形関数」は、3D点の集合によってちょうど定義されます。 すべての点は同じ平面にあります。私は「フラット化」するための適切な方法を探しています

(左上のウィンドウに緑色の線を参照)

enter image description here

すべての3Dポイントが座る平面、曲面に直交しますそれ。 (非線形変換)

平らな面は、曲がった面と同じ「長さ」を持つ必要があります。 (これは古典的な正射影ではありません)

最終的には、関心のある情報を表示するために「平面」をキャンバスとして使用します。

(下部のウィンドウ)

enter image description here

ベスト、

+0

変換を定義する「区分的関数」の詳細を指定しない限り、意味のあるものを言うのは非常に難しいでしょう。 –

+0

「区分線形関数」は、3D点の集合によってちょうど定義されます。 すべての点は同じ平面にあります。すべての3D点が座る平面は曲面に直交します。それは役に立ちますか?ありがとう – Nicolas

+0

は一定の密度でサンプリングされたポイントですか? – Spektre

答えて

1

私はこのようにそれを参照してください。

img

Iだろう:

  1. があなたの曲線
  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| 
    

    から3つの後件ポイントP0,P1,P2を取るのでA,BがあるだけでP0 +/- V0C,DP1 +/- V1です。外積で私は(0,0,1)を選んだU0,U1を持つ任意のベクトル非並列を使用しますが、場合には、それは並列で、他を選んだ...

  3. をSI ABCD recangle

    だから例えば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. ABCD計算(x,y)A'B'C'D'. The内部のX '内の各画素PのためにそうABCDA'B'C'D'

    間の計算変換は簡単です:

    x = A'.x + dot(P-P0,U0)/|P-P0| 
    

    yはトリッキーで、あなたに合ったいくつかの調整を必要としますニーズ(あなたの好みに合わせて結果が滑らかです)。スタータは、単純なアプローチ(セグメント間の継ぎ目につながる)

    y = (A'.y+B'.y)/2 + dot(P-P),V0)/|P-P0| 
    

    は今だけ、これはより多くのあなたがVの間で補間することができます滑らかにするために位置(x,y)

    であなたの目標画像に位置Pの画素をコピーしようとするために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> 
    
  5. ループ#1曲線のポイント(3ではなく...)

+0

ありがとう、それは私が心に留めていた大きな写真です - JS/WebGLでこれを実装する必要があります:) – Nicolas

関連する問題