Merge pull request #1650 from SiboVG/issue-1649

[#1649] Fix scaling of MassObject with autoRadius
This commit is contained in:
SiboVG 2022-09-10 23:03:49 +02:00 committed by GitHub
commit 2d783a41cc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 43 additions and 2 deletions

View File

@ -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) {

View File

@ -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
@ -703,6 +706,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 {