Merge pull request #1650 from SiboVG/issue-1649
[#1649] Fix scaling of MassObject with autoRadius
This commit is contained in:
commit
2d783a41cc
@ -65,6 +65,25 @@ public abstract class MassObject extends InternalComponent {
|
||||
return length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the length, ignoring the auto radius setting.
|
||||
* @param length new length
|
||||
*/
|
||||
public void setLengthNoAuto(double length) {
|
||||
for (RocketComponent listener : configListeners) {
|
||||
if (listener instanceof MassObject) {
|
||||
((MassObject) listener).setLengthNoAuto(length);
|
||||
}
|
||||
}
|
||||
|
||||
length = Math.max(length, 0);
|
||||
if (MathUtil.equals(this.length, length)) {
|
||||
return;
|
||||
}
|
||||
this.length = length;
|
||||
fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
|
||||
}
|
||||
|
||||
public void setLength(double length) {
|
||||
for (RocketComponent listener : configListeners) {
|
||||
if (listener instanceof MassObject) {
|
||||
|
@ -126,8 +126,11 @@ public class ScaleDialog extends JDialog {
|
||||
SCALERS_NO_OFFSET.put(FreeformFinSet.class, list);
|
||||
|
||||
// MassObject
|
||||
addScaler(MassObject.class, "Length", SCALERS_NO_OFFSET);
|
||||
addScaler(MassObject.class, "Radius", SCALERS_NO_OFFSET);
|
||||
list = new ArrayList<>(1);
|
||||
list.add(new MassObjectScaler());
|
||||
SCALERS_NO_OFFSET.put(MassObject.class, list);
|
||||
//addScaler(MassObject.class, "LengthNoAuto", SCALERS_NO_OFFSET);
|
||||
addScaler(MassObject.class, "Radius", "isRadiusAutomatic", SCALERS_NO_OFFSET);
|
||||
addScaler(MassObject.class, "RadialPosition", SCALERS_OFFSET);
|
||||
|
||||
// MassComponent
|
||||
@ -704,6 +707,25 @@ public class ScaleDialog extends JDialog {
|
||||
|
||||
}
|
||||
|
||||
private static class MassObjectScaler implements Scaler {
|
||||
@Override
|
||||
public void scale(RocketComponent component, double multiplier, boolean scaleMass) {
|
||||
if (scaleMass) {
|
||||
MassObject c = (MassObject) component;
|
||||
if (c.isRadiusAutomatic()) {
|
||||
double volume = Math.PI * Math.pow(c.getRadiusNoAuto(), 2) * c.getLengthNoAuto();
|
||||
double scaledVolume = volume * MathUtil.pow3(multiplier);
|
||||
c.setRadius(c.getRadiusNoAuto() * multiplier);
|
||||
c.setLengthNoAuto(scaledVolume / (Math.PI * Math.pow(c.getRadiusNoAuto(), 2)));
|
||||
c.setRadiusAutomatic(true);
|
||||
} else {
|
||||
c.setLength(c.getLength() * multiplier);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class FreeformFinSetScaler implements Scaler {
|
||||
|
||||
@Override
|
||||
|
Loading…
x
Reference in New Issue
Block a user