//! 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); }
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]); }