2017-06-07 5 views
1

Je suis en train de calculer une projection panoramique pour objectif d'imagerie dentaire.Aplatir surface courbe

I ont une surface rectangulaire dans une direction « courbe » par une fonction par morceaux. Si nous le regardons par le haut, cela ressemble à une fonction régulière par morceaux.

La « fonction linéaire par morceaux » est juste défini par un ensemble de points 3D. Tous les points sont dans le même plan. Le plan où tous les points 3D assis est perpendiculaire à la surface courbe

(voir la ligne verte dans la fenêtre en haut à gauche)

enter image description here

Je cherche la bonne façon de « aplatir » il. (Non linéaire de transformation)

La surface plane doit avoir la même « longueur » comme une courbe. (Ce n'est pas une projection orthogonale classique)

En fin de compte, je vais utiliser la « surface plane » comme une toile pour afficher les informations d'intérêt.

(fenêtre Bas)

enter image description here

Best,

+0

Il nous serait très difficile de dire quelque chose de significatif à moins de donner les détails de la «fonction par morceaux» qui définit la transformation. –

+0

Donc la "fonction linéaire par morceaux" est juste définie par un ensemble de points 3D. Tous les points sont dans le même plan. Le plan où tous les points 3D sont assis est orthogonal à la surface incurvée. Est ce que ça aide? Merci – Nicolas

+0

sont les points échantillonnés avec une densité constante? – Spektre

Répondre

1

Je le vois comme ceci:

img

Je voudrais:

  1. prendre 3 points consécutifs P0,P1,P2 de votre courbe
  2. Compute 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| 
    

    si A,B est juste P0 +/- V0 et C,D est P1 +/- V1. Dans le produit croisé tout vecteur non parallèle avec U0,U1 j'ai choisi (0,0,1) mais dans le cas où il si parallèle choisi tout autre ...

  3. font l'ABCD un recangle

    Ainsi par exemple calculer 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 est la taille de segment de rectangle. Vous pouvez également utiliser |U0|,|V0| mais dans ce cas, le début x sera la longueur de la courbe intégrée.

  4. Compute transformation entre ABCD et A'B'C'D'

    donc pour chaque pixel P dans ABCD Compute (x,y) intérieur A'B'C'D'. The x` est facile:

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

    y est délicate et a besoin de quelques ajustements à la suite de votre besoins (donc le résultat est lisse à votre goût). Pour commencer essayer approche simple (conduira à coutures entre les segments)

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

    Maintenant, il suffit de copier le pixel à la position P dans votre image cible à la position (x,y)

    Pour rendre plus lisse que vous pouvez faire V interpolées entre V0,V1 en fonction de la dot(P-P0,U0)/(|P-P0|*|U0|) afin qu'il change de façon transparente.

    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| 
    

    Si vous avez besoin d'aide pour déterminer si le point est à l'intérieur alors pixel P est à l'intérieur si

    dot(P-P0,U0)/(|P-P0|*U0) = <0.0,1.0> 
    
  5. boucle n ° 1 pour tous les segments de la courbe

    étape par échantillon unique point de la courbe (pas par 3 ...)

+0

Merci beaucoup, c'est à peu près la grande image que j'avais en tête - je dois l'implémenter dans JS/WebGL maintenant :) – Nicolas