Merge pull request #407 from teyrana/fix_negative_inertia

[fixes #406] SymmetricComponent no longer generates negative inertias
This commit is contained in:
Wes Cravens 2018-05-31 09:34:37 -05:00 committed by GitHub
commit d8fb48ee4c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -273,7 +273,7 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial
@Override @Override
public double getRotationalUnitInertia() { public double getRotationalUnitInertia() {
if (rotationalInertia < 0) { if (rotationalInertia < 0) {
if (getComponentVolume() > 0.0000001) if (getComponentVolume() > 0.0000001) // == 0.1cm^3
integrateInertiaVolume(); integrateInertiaVolume();
else else
integrateInertiaSurface(); integrateInertiaSurface();
@ -425,19 +425,18 @@ public abstract class SymmetricComponent extends BodyComponent implements Radial
final double inner; final double inner;
final double dV; final double dV;
if (filled || r1 < thickness || r2 < thickness) { final double hyp = MathUtil.hypot(r2 - r1, l);
final double height = thickness * hyp / l;
if (filled || r1 < height || r2 < height ) {
inner = 0; inner = 0;
dV = pil3 * (r1 * r1 + r1 * r2 + r2 * r2); dV = pil3 * (r1 * r1 + r1 * r2 + r2 * r2);
} else { } else {
final double hyp = MathUtil.hypot(r2 - r1, l);
final double height = thickness * hyp / l;
dV = pil * height * (r1 + r2 - height); dV = pil * height * (r1 + r2 - height);
inner = Math.max(outer - height, 0); inner = Math.max(outer - height, 0.);
} }
rotationalInertia += dV * (pow2(outer) + pow2(inner)) / 2; rotationalInertia += dV * (pow2(outer) + pow2(inner)) / 2;
longitudinalInertia += dV * ((3 * (pow2(outer) + pow2(inner)) + pow2(l)) / 12 longitudinalInertia += dV * ((3 * (pow2(outer) + pow2(inner)) + pow2(l)) / 12 + pow2(x + l / 2));
+ pow2(x + l / 2));
vol += dV; vol += dV;