Gouvernement du Canada
Symbole du gouvernement du Canada

Liens de la barre de menu commune

Équation du centre de gravité en langage C

La version en langage C de l'équation du centre de gravité se divise en trois parties :


Exemple de progamme principal

   
/*****************************************************************************\
| PROGRAMME : QUELCONQUE
| Description : Programme permettant de...
| ****************************************************************************
|  Variables :  dim : Nombre de coordonnées de la surface plane
|               xy  : Coordonnées X et Y de la surface
|               ctr : Coordonnées X et Y du centroïde
\*****************************************************************************/
main () {
	int n;
	double xy[2] [18000], ctr[2];
	
	n = 4;
	xy[0] [0] = 543564;
	xy[1] [0] = 5678654;
	xy[0] [1] = 543735;
	xy[1] [1] = 5678943;
	xy[0] [2] = 543423;
	xy[1] [2] = 5678679;
	xy[0] [3] = 543564;
	xy[1] [3] = 5678654;
	
	centroid (n-1, xy, ctr);
	
	printf("%f\n",ctr[0]);  /* Affichage de la coordonnée X du centre de gravité */
	printf("%f\n",ctr[1]);  /* Affichage de la coordonnée Y du centre de gravité */
}
    

Routine de calcul du centre de gravité


/*****************************************************************************\
| ROUTINE : centroid
| Description : Cette routine retourne le centroïde d'une surface fermée
|               à partir de vecteurs de pente (pente), d'ordonnées à l'origine 
|               (ord), de débuts et de fins de coordonnées X (x1, x2).
|*****************************************************************************
| Variables d'entrée :   dim   : Nombre de coordonnées de la surface
|                        xy    : Coordonnées X et Y de la surface
| Variables de sortie :  ctr   : Coordonnées X et Y du centroïde
| Arguments :            pente : Vecteur de pentes
|                        ord   : Vecteur d'ordonnées à l'origine
|                        x1    : X de début d'un segment
|                        X2    : X de fin d'un segment
\*****************************************************************************/
centroid (int dim, double xy[2] [18000], double ctr[2]) {
	int    i;
	double x1[18000], x2[18000];
	double pente[18000], ord[18000];
	double m1, m2, m3;
	double a, mx, my, suma, summx, summy;
	
	/* début du traitement */
	
	suma  = 0;
	summx = 0;
	summy = 0;
	
	pente_ord (dim, xy, pente, ord, x1, x2);
	
	for (i = 0; i < dim; i++) {
	   m3 = (x2[i]*x2[i]*x2[i])-(x1[i]*x1[i]*x1[i]);
	   m2 = (x2[i]*x2[i])-(x1[i]*x1[i]);
	   m1 = x2[i]-x1[i];
	   mx = ((pente[i]*pente[i])*m3/6)+(((ord[i]*pente[i])*m2)/2) 
	                + (((ord[i]*ord[i])*m1)/2);
	   my = ((pente[i]*m3)/3)+((ord[i]*m2)/2);
	   a  = ((pente[i]/2)*m2)+(ord[i]*m1);
	   suma = suma + a;
	   summx = summx + mx;
	   summy = summy + my;
	   }
	
	/* calcul du centroïde */
	
	ctr[0] = summy/suma;    /* x du centroïde */
	ctr[1] = summx/suma;    /* y du centroïde */
}
    

Subroutine that calculates the slopes and y-intercepts of a plane region


/*****************************************************************************\
| ROUTINE: pente_ord
| Description: Routine permettant de calculer un vecteur de pentes et
|              d'ordonnées à l'origine de segments constituant une surface
|              fermée.
|*****************************************************************************
| Variables d'entrée :   dim   : Nombre de coordonnées de la surface
|                        xy    : Coordonnées X et Y de la surface
| Variables de sortie :  pente : Vecteur de pentes
|                        ord   : Vecteur d'ordonnées à l'origine
|                        x1    : X de début d'un segment
|                        x2    : X de fin d'un segment
| Arguments :            i     : Variable de travail
|                        y1    : Y de début d'un segment
|                        y2    : Y de fin d'un segment
\*****************************************************************************/
pente_ord ( int dim, double xy[2] [18000], double pente[18000], 
            double ord[18000], double x1[18000], double x2[18000]) {
	int i;
	double y1[18000], y2[18000];
	
	/* transfert des coordonnées de la surface */
	
	for (i = 0; i < dim-1; i++) {
	   x1[i] = xy[0] [i];
	   y1[i] = xy[1] [i];
	   x2[i] = xy[0] [i+1];
	   y2[i] = xy[1] [i+1];
	   }
	
	x1[dim-1] = xy[0] [dim-1];
	y1[dim-1] = xy[1] [dim-1];
	x2[dim-1] = xy[0] [0];
	y2[dim-1] = xy[1] [0];
	
	/* calcul des pentes et des ordonnées à l'origine */
	
	for (i = 0; i < dim; i++) {
	   if (x1[i] == x2[i]) {
	      pente[i] = 0;
	      ord[i] = 0;
	   }
	   else {
	      pente[i] = (y2[i] - y1[i]) / (x2[i] - x1[i]);
	      ord[i]   = ((x1[i] * y2[i]) - (x2[i] * y1[i])) / (x1[i] - x2[i]);
	   }
    }
}