/*************************************************************************************************************************************/ /* */ /* T E S T D U C A L C U L D E S M O M E N T S D ' I N E R T I E : */ /* */ /* */ /* Author of '$xtc/inertie.01$c' : */ /* */ /* Jean-Francois COLONNA (LACTAMME, AAAAMMJJhhmmss). */ /* */ /*************************************************************************************************************************************/ extern double sqrt(); #define dimX 3 #define dimY 3 #define MATRICE(x,y) \ matrice[y][x] #define Xc \ ((dimX-1)/2) #define Yc \ ((dimY-1)/2) #define X \ (x - Xc) #define Y \ (y - Yc) #define NIVEAU_1 1 #define NIVEAU_2 2 #define NIVEAU_3 3 #define inertie(niveau_bas,niveau_central,niveau_haut) \ { \ double matrice[dimY][dimX]; \ int x,y; \ \ double Ixx=0,Ixyx=0,Iyy=0; \ \ double a,b,c; \ double discriminant; \ \ double s1=0,s2=0; \ \ double v1X,v1Y; \ double v2X,v2Y; \ \ printf("\n\n"); \ \ for (x=0 ; x<dimX ; x++) \ { \ for (y=0 ; y<dimY ; y++) \ { \ if (y < Yc) \ { \ MATRICE(x,y) = niveau_bas; \ /* Initialisation de la partie basse de la matrice... */ \ } \ else \ { \ } \ \ if (y == Yc) \ { \ MATRICE(x,y) = niveau_central; \ /* Initialisation de la ligne mediane de la matrice... */ \ } \ else \ { \ } \ \ if (y > Yc) \ { \ MATRICE(x,y) = niveau_haut; \ /* Initialisation de la partie haute de la matrice... */ \ } \ else \ { \ } \ } \ } \ \ for (y=0 ; y<dimY ; y++) \ { \ printf("\n"); \ for (x=0 ; x<dimX ; x++) \ { \ printf(" %.4f",MATRICE(x,y)); \ } \ } \ \ for (x=0 ; x<dimX ; x++) \ { \ for (y=0 ; y<dimY ; y++) \ { \ Ixx = Ixx + ((Y*Y)*MATRICE(x,y)); \ Ixyx = Ixyx + ((X*Y)*MATRICE(x,y)); \ Iyy = Iyy + ((X*X)*MATRICE(x,y)); \ /* Calcul des moments d'inertie. */ \ } \ } \ \ printf("\n Ixx=%.4f",Ixx); \ printf("\n Ixyx=%.4f",Ixyx); \ printf("\n Iyy=%.4f",Iyy); \ \ a = 1; \ b = -(Ixx+Iyy); \ c = (Ixx*Iyy) - (Ixyx*Ixyx); \ discriminant = (b*b) - (4*a*c); \ \ if (discriminant >= 0) \ { \ s1 = ((-b) + sqrt(discriminant)) / (2*a); \ s2 = ((-b) - sqrt(discriminant)) / (2*a); \ /* Calcul des deux valeurs propres... */ \ printf("\n s1=%.4f",s1); \ printf("\n s2=%.4f",s2); \ \ if (discriminant >= 0) \ { \ double l1,l2; \ \ double v3X,v3Y; \ double v4X,v4Y; \ \ double l3,l4; \ \ if (Ixyx != 0) \ { \ v1X = 1; \ v1Y = -((Ixx-s1) / Ixyx); \ l1 = sqrt((v1X*v1X) + (v1Y*v1Y)); \ v1X = v1X / l1; \ v1Y = v1Y / l1; \ \ v2X = 1; \ v2Y = -((Ixx-s2) / Ixyx); \ l2 = sqrt((v2X*v2X) + (v2Y*v2Y)); \ v2X = v2X / l2; \ v2Y = v2Y / l2; \ /* Calcul des deux vecteurs propres... */ \ \ printf("\n v1=(%.4f,%.4f)",v1X,v1Y); \ printf("\n v2=(%.4f,%.4f)",v2X,v2Y); \ \ v3X = v1X + v2X; \ v3Y = v1Y + v2Y; \ l3 = sqrt((v3X*v3X) + (v3Y*v3Y)); \ v3X = v3X / l3; \ v3Y = v3Y / l3; \ \ v4X = v1X - v2X; \ v4Y = v1Y - v2Y; \ l4 = sqrt((v4X*v4X) + (v4Y*v4Y)); \ v4X = v4X / l4; \ v4Y = v4Y / l4; \ /* Calcul de deux vecteurs a 45 degres des vecteurs propres... */ \ \ printf("\n v3=(%.4f,%.4f)",v3X,v3Y); \ printf("\n v4=(%.4f,%.4f)",v4X,v4Y); \ } \ else \ { \ printf("\n Ixyx est nul"); \ } \ } \ else \ { \ printf("\n le discriminant est nul"); \ } \ } \ else \ { \ printf("\n le discriminant est negatif"); \ } \ \ } \ /* Procedure de calcul des moments d'inertie d'une certaine matrice... */ int main() { inertie(NIVEAU_2,NIVEAU_2,NIVEAU_2); inertie(NIVEAU_1,NIVEAU_2,NIVEAU_1); inertie(NIVEAU_1,NIVEAU_2,NIVEAU_3); }