From 6bf731226e9672a0806c3491bfd612c3167f3ce0 Mon Sep 17 00:00:00 2001 From: Bill Kuker Date: Thu, 4 Nov 2010 17:38:31 +0000 Subject: [PATCH] Add Star grain --- .../visual/workbench/MotorEditor.java | 2 + .../rocketry/motorsim/grain/Star.java | 121 ++++++++++++++++++ test.html | 3 + 3 files changed, 126 insertions(+) create mode 100644 src/com/billkuker/rocketry/motorsim/grain/Star.java create mode 100644 test.html diff --git a/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java b/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java index 690beb1..988ad6c 100644 --- a/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java +++ b/gui/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java @@ -57,6 +57,7 @@ import com.billkuker.rocketry.motorsim.grain.Finocyl; import com.billkuker.rocketry.motorsim.grain.Moonburner; import com.billkuker.rocketry.motorsim.grain.MultiGrain; import com.billkuker.rocketry.motorsim.grain.RodAndTubeGrain; +import com.billkuker.rocketry.motorsim.grain.Star; import com.billkuker.rocketry.motorsim.io.MotorIO; import com.billkuker.rocketry.motorsim.visual.BurnPanel; import com.billkuker.rocketry.motorsim.visual.Editor; @@ -84,6 +85,7 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener { { grainTypes.add(CoredCylindricalGrain.class); grainTypes.add(Finocyl.class); + grainTypes.add(Star.class); grainTypes.add(Moonburner.class); grainTypes.add(RodAndTubeGrain.class); grainTypes.add(CSlot.class); diff --git a/src/com/billkuker/rocketry/motorsim/grain/Star.java b/src/com/billkuker/rocketry/motorsim/grain/Star.java new file mode 100644 index 0000000..dc1d125 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/grain/Star.java @@ -0,0 +1,121 @@ +package com.billkuker.rocketry.motorsim.grain; + +import java.awt.Shape; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.GeneralPath; +import java.beans.PropertyVetoException; + +import javax.measure.quantity.Length; +import javax.measure.unit.SI; + +import org.jscience.physics.amount.Amount; + +import com.billkuker.rocketry.motorsim.Validating; +import com.billkuker.rocketry.motorsim.grain.util.BurningShape; +import com.billkuker.rocketry.motorsim.grain.util.ExtrudedShapeGrain; +import com.billkuker.rocketry.motorsim.visual.Editor; +import com.billkuker.rocketry.motorsim.visual.GrainPanel; + +public class Star extends ExtrudedShapeGrain implements Validating { + private Amount oD = Amount.valueOf(30, SI.MILLIMETER); + private Amount iD = Amount.valueOf(5, SI.MILLIMETER); + private Amount pD = Amount.valueOf(15, SI.MILLIMETER); + private int pointCount = 5; + + public Star(){ + try { + setLength(Amount.valueOf(70, SI.MILLIMETER)); + } catch (PropertyVetoException e) { + e.printStackTrace(); + } + generateGeometry(); + } + + private void generateGeometry(){ + double odmm = oD.doubleValue(SI.MILLIMETER); + double idmm = iD.doubleValue(SI.MILLIMETER)/2.0; + double pdmm = pD.doubleValue(SI.MILLIMETER)/2.0; + + xsection = new BurningShape(); + Shape outside = new Ellipse2D.Double(-odmm/2, -odmm/2, odmm, odmm); + xsection.add(outside); + xsection.inhibit(outside); + //xsection.subtract(new Ellipse2D.Double(-idmm/2, -idmm/2, idmm, idmm)); + webThickness = null; + + GeneralPath p = new GeneralPath(); + double theta = 0; + double dTheta = (2.0 * Math.PI) / ( pointCount * 2.0 ); + p.moveTo(0, idmm); + for ( int i = 0; i < pointCount; i++ ){ + theta += dTheta; + p.lineTo(pdmm*Math.sin(theta), pdmm*Math.cos(theta)); + theta += dTheta; + p.lineTo(idmm*Math.sin(theta), idmm*Math.cos(theta)); + } + p.closePath(); + xsection.subtract(new Area(p)); + } + + public Amount getOD() { + return oD; + } + + public void setOD(Amount od) throws PropertyVetoException { + if (od.equals(this.oD)) + return; + this.oD = od; + generateGeometry(); + } + + public Amount getID() { + return iD; + } + + public void setID(Amount id) throws PropertyVetoException { + if (id.equals(this.iD)) + return; + iD = id; + generateGeometry(); + } + + public Amount getPointDiameter() { + return pD; + } + + public void setPointDiameter(Amount pd) throws PropertyVetoException { + if (pd.equals(this.pD)) + return; + pD = pd; + generateGeometry(); + } + + public int getPointCount(){ + return pointCount; + } + + public void setPointCount(final int points){ + pointCount = points; + generateGeometry(); + } + + + public static void main(String args[]) throws Exception { + Star e = new Star(); + new Editor(e).showAsWindow(); + new GrainPanel(e).showAsWindow(); + } + + @Override + public void validate() throws ValidationException{ + if ( iD.equals(Amount.ZERO) ) + throw new ValidationException(this, "Invalid iD"); + if ( oD.equals(Amount.ZERO) ) + throw new ValidationException(this, "Invalid oD"); + if ( getLength().equals(Amount.ZERO) ) + throw new ValidationException(this, "Invalid Length"); + if ( iD.isGreaterThan(oD) ) + throw new ValidationException(this, "iD > oD"); + } +} diff --git a/test.html b/test.html new file mode 100644 index 0000000..af91040 --- /dev/null +++ b/test.html @@ -0,0 +1,3 @@ + +
PVC9
Rating:58% G-157Total Impulse:120 NsSpecific Impulse:126 s
Max Thrust:219 NAverage Thrust:157 NMax Pressure:3.3 MPa
Thrust
+ -- 2.30.2