Comment normaliser un maillage en -1 à 1, puis revenir d’un maillage normalisé à celui d’origine?

J’ai un modèle de maillage au format X, Y, Z. Disons.

Points *P; 

Dans un premier temps, je veux normaliser ce maillage en (-1, -1, -1) en (1, 1, 1). Ici normaliser signifie insérer ce maillage dans une boîte de (-1, -1, -1) à (1, 1, 1).

puis, après cela, je traite un maillage normalisé, pour finir, je souhaite rétablir les dimensions similaires à celles du maillage original.

étape 1: P = Dimensions du maillage d’origine;

étape 2: nP = Normalize (P); // de (-1, -1, -1) à (1, 1, 1)

étape 3: cnP = faire quelque chose avec (nP), le nombre de sumts a augmenté ou diminué.

étape 4: Dimensions de la maille d’origine = Revert (cnP); // la dimension doit être identique au maillage d’origine

Comment puis je faire ça?

Je sais combien il est facile de se perdre dans la programmation et de manquer complètement la simplicité des calculs sous-jacents. Mais croyez-moi, c’est vraiment simple.

La manière la plus intuitive de résoudre votre problème est probablement la suivante:

  1. Déterminez les valeurs minimale et maximale des trois axes de coordonnées ( x , y et z ). Cette information est contenue dans les huit sumts de votre cube. Enregistrez ces six valeurs dans six variables (par exemple, min_x , max_x , etc.).

  2. Pour tous les points p = (x,y,z) dans le maillage, calculez

     q = ( 2.0*(x-min_x)/(max_x-min_x) - 1.0 2.0*(y-min_y)/(max_y-min_y) - 1.0 2.0*(z-min_z)/(max_z-min_z) - 1.0 ) 

    maintenant q est égal à p traduit dans l’intervalle (-1,-1,-1) -- (+1,+1,+1) .

  3. Faites ce que vous devez faire sur cette grid intermédiaire.

  4. Convertissez toutes les coordonnées q = (xx, yy, zz) dans la grid d’origine en effectuant l’opération inverse:

     p = ( (xx+1.0)*(max_x-min_x)/2.0 + min_x (yy+1.0)*(max_y-min_y)/2.0 + min_y (zz+1.0)*(max_z-min_z)/2.0 + min_z ) 
  5. Nettoyez tous les dégâts que vous avez causés et continuez avec le rest de votre programme.

C’est si simple qu’il faut probablement beaucoup plus de travail pour déterminer quelle bibliothèque contient ces fonctions que pour les écrire vous-même.

C’est facile – utilisez les fonctions de forme. Voici un exemple 1D pour deux points:

 -1 <= u <= +1 x(u) = x1*(1-u)/2.0 + x2*(1+u)/2.0 x(-1) = x1 x(+1) = x2 

Vous pouvez transformer des systèmes de coordonnées à l'aide du jacobean.

Voyons à quoi ça ressemble en 2D:

 -1 <= u <= =1 -1 <= v <= =1 x(u, v) = x1*(1-u)*(1-v)/4.0 + x2*(1+u)*(1-v)/4.0 + x3*(1+u)*(1+v)/4.0 + x4*(1-u)*(1+v)/4.0 y(u, v) = y1*(1-u)*(1-v)/4.0 + y2*(1+u)*(1-v)/4.0 + y3*(1+u)*(1+v)/4.0 + y4*(1-u)*(1+v)/4.0