Пример #1
0
//! Computes the mass properties of the p3d_polyhedre and fills the appropriate fields inside its structure.
void gpCompute_mass_properties(p3d_polyhedre *poly)
{ 
   if(poly==NULL)
   {
     printf("%s: %d: gpCompute_mass_properties(): input p3d_polyhedre* is NULL.\n",__FILE__,__LINE__);
     return;
   }

   Mass_properties mass_prop;
   VOLINT_POLYHEDRON *p= NULL;

   p= (VOLINT_POLYHEDRON *) malloc(sizeof(VOLINT_POLYHEDRON));

   readPolyhedron(poly, p);
   compMassProperties(p, &mass_prop);

   poly->cmass[0]= mass_prop.r[0];
   poly->cmass[1]= mass_prop.r[1];
   poly->cmass[2]= mass_prop.r[2];

   poly->inertia_axes[0][0]= mass_prop.J[0][0];
   poly->inertia_axes[0][1]= mass_prop.J[0][1];
   poly->inertia_axes[0][2]= mass_prop.J[0][2];

   poly->inertia_axes[1][0]= mass_prop.J[1][0];
   poly->inertia_axes[1][1]= mass_prop.J[1][1];
   poly->inertia_axes[1][2]= mass_prop.J[1][2];

   poly->inertia_axes[2][0]= mass_prop.J[2][0];
   poly->inertia_axes[2][1]= mass_prop.J[2][1];
   poly->inertia_axes[2][2]= mass_prop.J[2][2];

   poly->volume= mass_prop.volume; 

   free(p);
}
Пример #2
0
int main(int argc, char *argv[])
{
  POLYHEDRON p;
  double density, mass;
  double r[3];            /* center of mass */
  double J[3][3];         /* inertia tensor */

  if (argc != 2) {
    printf("usage:  %s <polyhedron geometry filename>\n", argv[0]);
    exit(0);
  }

  readPolyhedron(argv[1], &p);

  compVolumeIntegrals(&p);


  printf("\nT1 =   %+20.6f\n\n", T0);

  printf("Tx =   %+20.6f\n", T1[X]);
  printf("Ty =   %+20.6f\n", T1[Y]);
  printf("Tz =   %+20.6f\n\n", T1[Z]);
  
  printf("Txx =  %+20.6f\n", T2[X]);
  printf("Tyy =  %+20.6f\n", T2[Y]);
  printf("Tzz =  %+20.6f\n\n", T2[Z]);

  printf("Txy =  %+20.6f\n", TP[X]);
  printf("Tyz =  %+20.6f\n", TP[Y]);
  printf("Tzx =  %+20.6f\n\n", TP[Z]);

  density = 1.0;  /* assume unit density */

  mass = density * T0;

  /* compute center of mass */
  r[X] = T1[X] / T0;
  r[Y] = T1[Y] / T0;
  r[Z] = T1[Z] / T0;

  /* compute inertia tensor */
  J[X][X] = density * (T2[Y] + T2[Z]);
  J[Y][Y] = density * (T2[Z] + T2[X]);
  J[Z][Z] = density * (T2[X] + T2[Y]);
  J[X][Y] = J[Y][X] = - density * TP[X];
  J[Y][Z] = J[Z][Y] = - density * TP[Y];
  J[Z][X] = J[X][Z] = - density * TP[Z];

  /* translate inertia tensor to center of mass */
  J[X][X] -= mass * (r[Y]*r[Y] + r[Z]*r[Z]);
  J[Y][Y] -= mass * (r[Z]*r[Z] + r[X]*r[X]);
  J[Z][Z] -= mass * (r[X]*r[X] + r[Y]*r[Y]);
  J[X][Y] = J[Y][X] += mass * r[X] * r[Y]; 
  J[Y][Z] = J[Z][Y] += mass * r[Y] * r[Z]; 
  J[Z][X] = J[X][Z] += mass * r[Z] * r[X]; 

  printf("center of mass:  (%+12.6f,%+12.6f,%+12.6f)\n\n", r[X], r[Y], r[Z]);

  printf("inertia tensor with origin at c.o.m. :\n");
  printf("%+15.6f  %+15.6f  %+15.6f\n", J[X][X], J[X][Y], J[X][Z]);
  printf("%+15.6f  %+15.6f  %+15.6f\n", J[Y][X], J[Y][Y], J[Y][Z]);
  printf("%+15.6f  %+15.6f  %+15.6f\n\n", J[Z][X], J[Z][Y], J[Z][Z]);
  
}