From 3955b513d3bfad35443793715099190a66640073 Mon Sep 17 00:00:00 2001 From: Bill Kuker Date: Thu, 2 Jul 2009 01:19:03 +0000 Subject: [PATCH] Added composite grain type Made multigrain more beanie --- .../billkuker/rocketry/motorsim/Grain.java | 8 +- .../rocketry/motorsim/grain/GrainSet.java | 89 +++++++++++++++++++ .../rocketry/motorsim/grain/MultiGrain.java | 50 ++++++++++- 3 files changed, 142 insertions(+), 5 deletions(-) create mode 100644 src/com/billkuker/rocketry/motorsim/grain/GrainSet.java diff --git a/src/com/billkuker/rocketry/motorsim/Grain.java b/src/com/billkuker/rocketry/motorsim/Grain.java index c67742c..e99505c 100644 --- a/src/com/billkuker/rocketry/motorsim/Grain.java +++ b/src/com/billkuker/rocketry/motorsim/Grain.java @@ -1,12 +1,14 @@ package com.billkuker.rocketry.motorsim; +import java.util.List; + import javax.measure.quantity.Area; import javax.measure.quantity.Length; import javax.measure.quantity.Volume; import org.jscience.physics.amount.Amount; -public interface Grain { +public interface Grain { public java.awt.geom.Area getCrossSection(Amount regression); @@ -15,6 +17,10 @@ public interface Grain { public interface DiscreteRegression{ public Amount optimalRegressionStep(); } + + public interface Composite { + public List getGrains(); + } public Amount surfaceArea(Amount regression); diff --git a/src/com/billkuker/rocketry/motorsim/grain/GrainSet.java b/src/com/billkuker/rocketry/motorsim/grain/GrainSet.java new file mode 100644 index 0000000..7ce7ba0 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/grain/GrainSet.java @@ -0,0 +1,89 @@ +package com.billkuker.rocketry.motorsim.grain; + +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.util.Collections; +import java.util.List; +import java.util.Vector; + +import javax.measure.quantity.Area; +import javax.measure.quantity.Length; +import javax.measure.quantity.Volume; +import javax.measure.unit.SI; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.Grain; + +public class GrainSet implements Grain, Grain.Composite { + + private Vector grains = new Vector(); + + private double flush = 1; + private Amount delay = Amount.valueOf(0, SI.MILLIMETER); + + public GrainSet( Grain... gs ){ + for ( Grain g : gs ) + grains.add(g); + } + + private Amount getAdjustedRegression(Amount regression, int grain){ + return regression.minus(delay.times(grain)).times(Math.pow(flush,grain)); + } + + public Amount surfaceArea(Amount regression) { + Amount ret = Amount.valueOf(0, SI.SQUARE_METRE); + for ( int i = 0; i < grains.size(); i++ ){ + ret = ret.plus(grains.elementAt(i).surfaceArea(getAdjustedRegression(regression, i))); + } + return ret; + } + + public Amount volume(Amount regression) { + Amount ret = Amount.valueOf(0, SI.CUBIC_METRE); + for ( int i = 0; i < grains.size(); i++ ){ + ret = ret.plus(grains.elementAt(i).volume(getAdjustedRegression(regression, i))); + } + return ret; + } + + public Amount webThickness() { + Amount max = Amount.valueOf(0, SI.MILLIMETER);; + for ( int i = 0; i < grains.size(); i++ ){ + Grain g = grains.elementAt(i); + Amount t = g.webThickness().plus(delay.times(i)); + if ( t.isGreaterThan(max)) + max = t; + } + return max; + } + + public java.awt.geom.Area getCrossSection(Amount regression) { + java.awt.geom.Area a = new java.awt.geom.Area(); + for ( int i = 0; i < grains.size(); i++ ){ + Rectangle2D unburntBounds = grains.elementAt(i).getSideView(Amount.valueOf(0, SI.MILLIMETER)).getBounds2D(); + a.add(grains.elementAt(i).getCrossSection(getAdjustedRegression(regression, i))); + a.transform(AffineTransform.getTranslateInstance(0, -(unburntBounds.getHeight() + 5))); + } + return a; + } + + public java.awt.geom.Area getSideView(Amount regression) { + + + java.awt.geom.Area ret = new java.awt.geom.Area(); + + for ( int i = 0 ; i < grains.size() ; i++ ){ + Rectangle2D unburntBounds = grains.elementAt(i).getSideView(Amount.valueOf(0, SI.MILLIMETER)).getBounds2D(); + java.awt.geom.Area g = grains.elementAt(i).getSideView(getAdjustedRegression(regression, i)); + ret.add(g); + ret.transform(AffineTransform.getTranslateInstance(0, -(unburntBounds.getHeight() + 10))); + } + return ret; + } + + public List getGrains() { + return Collections.unmodifiableList(grains); + } + +} diff --git a/src/com/billkuker/rocketry/motorsim/grain/MultiGrain.java b/src/com/billkuker/rocketry/motorsim/grain/MultiGrain.java index 565b15f..c35ec7b 100644 --- a/src/com/billkuker/rocketry/motorsim/grain/MultiGrain.java +++ b/src/com/billkuker/rocketry/motorsim/grain/MultiGrain.java @@ -2,6 +2,11 @@ package com.billkuker.rocketry.motorsim.grain; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import javax.measure.quantity.Area; import javax.measure.quantity.Length; @@ -11,18 +16,45 @@ import javax.measure.unit.SI; import org.jscience.physics.amount.Amount; import com.billkuker.rocketry.motorsim.Grain; +import com.billkuker.rocketry.motorsim.MotorPart; -public class MultiGrain implements Grain { +public class MultiGrain extends MotorPart implements Grain, Grain.Composite, PropertyChangeListener { - private Grain grain; - private int count; + private Grain grain = null; + private int count = 1; + public int getCount() { + return count; + } + + public void setCount(int count) { + int old = this.count; + this.count = count; + firePropertyChange("Count", old, count ); + } + + public void setGrain(Grain g){ + Grain old = grain; + grain = g; + if ( g instanceof MotorPart ){ + ((MotorPart)g).addPropertyChangeListener(this); + } + firePropertyChange("Grain", old, grain); + } + + public Grain getGrain(){ + return grain; + } + private double flush = 1; private Amount delay = Amount.valueOf(0, SI.MILLIMETER); + public MultiGrain(){ + } + public MultiGrain( Grain g, int c ){ - grain = g; count = c; + setGrain(g); } private Amount getAdjustedRegression(Amount regression, int grain){ @@ -66,4 +98,14 @@ public class MultiGrain implements Grain { return ret; } + public List getGrains() { + ArrayList ret = new ArrayList(); + ret.add(grain); + return Collections.unmodifiableList(ret); + } + + public void propertyChange(PropertyChangeEvent evt) { + firePropertyChange(evt); + } + } -- 2.47.2