je souhaite effectuer les rotations des éléments d'un tableau 3D dans un repère sphérique.
Pour cela, j'ai créé cette fonction à partir des formules données ici :
Code : Tout sélectionner
public static void SphericalRotations(double[][][] array, double theta, double phi, double[][][] result)
{
int x, y, z, px, py, pz ;
int sizex = result[0][0].length ; // Dimensions du tableau résultat.
int sizey = result[0].length ;
int sizez = result.length ;
int ami = array[0][0].length >> 1 ; // Centre du tableau d'origine
int amy = array[0].length >> 1 ;
int amz = array.length >> 1 ;
int resmx = sizex >> 1 ; // Centre du tableau résultat
int resmy = sizey >> 1 ;
int resmz = sizez >> 1 ;
double cx, cy, cz, st, sp, r ;
for (z=0 ; z < sizez ; z++)
for (y=0 ; y < sizey ; y++)
for (x=0 ; x < sizex ; x++)
{
cx = x - resmx ; // Coordonnées cartésienne centrées.
cy = y - resmy ;
cz = z - resmz ;
r = Math.sqrt(cx*cx + cy*cy + cz*cz) ; // Transformation en coordonnées sphériques.
sp = Math.acos(cz / r) ;
st = Math.atan2(cy, cx) ;
sp -= phi ; // Rotations en sphérique.
st -= theta ;
cx = r * Math.sin(sp) * Math.cos(st) ; // Retour en cartésien.
cy = r * Math.sin(sp) * Math.sin(st) ;
cz = r * Math.cos(sp) ;
px = ami + (int)(cx+0.5) ; // Vérifications pour éviter les débordements.
if ( px < 0 || array[0][0].length <= px ) continue ;
py = amy + (int)(cy+0.5) ;
if ( py < 0 || array[0].length <= py ) continue ;
pz = amz + (int)(cz+0.5) ;
if ( pz < 0 || array.length <= pz ) continue ;
result[z][y][x] = array[pz][py][px] ;
}
}
- pour chaque élément de mon tableau
- je calcule les coordonnées sphériques (depuis les coordonnées cartésiennes)
- je fais la rotation en coordonnées sphérique (simple soustraction)
- je repasse en coordonnées cartésiennes
- je copie dans mon résultat la case du tableau de départ correspondante.
Les rotations en fonction de theta (autour de l'axe Z) fonctionnent parfaitement, mais j'ai un résultat totalement aberrant pour la rotation avec phi (inclinaison par rapport à l'axe Z).
Est ce que quelqu'un pourrait m'expliquer mon erreur ?