diff --git a/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java b/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java index 2fb402a94..ca61c0554 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java @@ -32,11 +32,11 @@ public abstract class SymmetricComponent extends BodyComponent implements BoxBou private double wetArea = Double.NaN; private double planArea = Double.NaN; private double planCenter = Double.NaN; - private double volume = Double.NaN; + protected double volume = Double.NaN; private double fullVolume = Double.NaN; private double longitudinalInertia = Double.NaN; private double rotationalInertia = Double.NaN; - private Coordinate cg = null; + protected Coordinate cg = null; public SymmetricComponent() { super(); @@ -417,7 +417,7 @@ public abstract class SymmetricComponent extends BodyComponent implements BoxBou /** * Performs integration over the length of the component and updates the cached variables. */ - private void calculateProperties() { + protected void calculateProperties() { wetArea = 0; planArea = 0; planCenter = 0; diff --git a/core/src/net/sf/openrocket/rocketcomponent/Transition.java b/core/src/net/sf/openrocket/rocketcomponent/Transition.java index 7f00daf32..e5d3e686a 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Transition.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Transition.java @@ -671,58 +671,46 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } @Override - public double getComponentVolume() { - double volume = super.getComponentVolume(); + protected void calculateProperties() { + super.calculateProperties(); if (getForeShoulderLength() > 0.001) { final double or = getForeShoulderRadius(); final double ir = Math.max(getForeShoulderRadius() - getForeShoulderThickness(), 0); - volume += ringVolume( or, ir, getForeShoulderLength() ); - } - if (isForeShoulderCapped()) { - final double ir = Math.max(getForeShoulderRadius() - getForeShoulderThickness(), 0); - volume += ringVolume(ir, 0, getForeShoulderThickness() ); - } - - if (getAftShoulderLength() > 0.001) { - final double or = getAftShoulderRadius(); - final double ir = Math.max(getAftShoulderRadius() - getAftShoulderThickness(), 0); - volume += ringVolume(or, ir, getAftShoulderLength() ); - } - if (isAftShoulderCapped()) { - final double ir = Math.max(getAftShoulderRadius() - getAftShoulderThickness(), 0); - volume += ringVolume(ir, 0, getAftShoulderThickness() ); - } - - return volume; - } - - @Override - public Coordinate getComponentCG() { - Coordinate cg = super.getComponentCG(); - if (getForeShoulderLength() > 0.001) { - final double ir = Math.max(getForeShoulderRadius() - getForeShoulderThickness(), 0); + cg = cg.average(ringCG(getForeShoulderRadius(), ir, -getForeShoulderLength(), 0, getMaterial().getDensity())); + + volume += ringVolume( or, ir, getForeShoulderLength() ); + } if (isForeShoulderCapped()) { final double ir = Math.max(getForeShoulderRadius() - getForeShoulderThickness(), 0); cg = cg.average(ringCG(ir, 0, -getForeShoulderLength(), getForeShoulderThickness() - getForeShoulderLength(), getMaterial().getDensity())); + + volume += ringVolume(ir, 0, getForeShoulderThickness() ); } if (getAftShoulderLength() > 0.001) { + final double or = getAftShoulderRadius(); final double ir = Math.max(getAftShoulderRadius() - getAftShoulderThickness(), 0); + cg = cg.average(ringCG(getAftShoulderRadius(), ir, getLength(), getLength() + getAftShoulderLength(), getMaterial().getDensity())); + + volume += ringVolume(or, ir, getAftShoulderLength() ); } if (isAftShoulderCapped()) { + final double or = getAftShoulderRadius(); final double ir = Math.max(getAftShoulderRadius() - getAftShoulderThickness(), 0); + cg = cg.average(ringCG(ir, 0, getLength() + getAftShoulderLength() - getAftShoulderThickness(), getLength() + getAftShoulderLength(), getMaterial().getDensity())); + + volume += ringVolume(ir, 0, getAftShoulderThickness() ); } - return cg; }