Added finocyl grain option
authorBill Kuker <bkuker@billkuker.com>
Tue, 23 Jun 2009 18:19:18 +0000 (18:19 +0000)
committerBill Kuker <bkuker@billkuker.com>
Tue, 23 Jun 2009 18:19:18 +0000 (18:19 +0000)
src/com/billkuker/rocketry/motorsim/grain/Finocyl.java [new file with mode: 0644]

diff --git a/src/com/billkuker/rocketry/motorsim/grain/Finocyl.java b/src/com/billkuker/rocketry/motorsim/grain/Finocyl.java
new file mode 100644 (file)
index 0000000..b2295c7
--- /dev/null
@@ -0,0 +1,131 @@
+package com.billkuker.rocketry.motorsim.grain;\r
+\r
+import java.awt.Shape;\r
+import java.awt.geom.AffineTransform;\r
+import java.awt.geom.Ellipse2D;\r
+import java.awt.geom.Rectangle2D;\r
+import java.beans.PropertyVetoException;\r
+\r
+import javax.measure.quantity.Length;\r
+import javax.measure.unit.SI;\r
+\r
+import org.jscience.physics.amount.Amount;\r
+\r
+import com.billkuker.rocketry.motorsim.grain.util.BurningShape;\r
+import com.billkuker.rocketry.motorsim.grain.util.ExtrudedShapeGrain;\r
+import com.billkuker.rocketry.motorsim.visual.Editor;\r
+import com.billkuker.rocketry.motorsim.visual.GrainPanel;\r
+\r
+public class Finocyl extends ExtrudedShapeGrain {\r
+       private Amount<Length> oD = Amount.valueOf(30, SI.MILLIMETER);\r
+       private Amount<Length> iD = Amount.valueOf(10, SI.MILLIMETER);\r
+       private Amount<Length> finWidth = Amount.valueOf(2, SI.MILLIMETER);\r
+       private Amount<Length> finDiameter = Amount.valueOf(20, SI.MILLIMETER);\r
+       private int finCount = 5;\r
+       \r
+       public Finocyl(){\r
+               try {\r
+                       setLength(Amount.valueOf(70, SI.MILLIMETER));\r
+               } catch (PropertyVetoException e) {\r
+                       e.printStackTrace();\r
+               }\r
+               generateGeometry();\r
+       }\r
+       \r
+       private void generateGeometry(){\r
+               double odmm = oD.doubleValue(SI.MILLIMETER);\r
+               double idmm = iD.doubleValue(SI.MILLIMETER);\r
+               double fwmm = finWidth.doubleValue(SI.MILLIMETER);\r
+               double fdmm = finDiameter.doubleValue(SI.MILLIMETER);\r
+               \r
+               xsection = new BurningShape();\r
+               Shape outside = new Ellipse2D.Double(-odmm/2, -odmm/2, odmm, odmm);\r
+               xsection.add(outside);\r
+               xsection.inhibit(outside);\r
+               xsection.subtract(new Ellipse2D.Double(-idmm/2, -idmm/2, idmm, idmm));\r
+               webThickness = null;\r
+               \r
+               for ( int i = 0; i < finCount; i++ ){\r
+                       Shape fin = new Rectangle2D.Double(-fwmm/2,0,fwmm,fdmm/2);\r
+                       xsection.subtract(fin, AffineTransform.getRotateInstance(i*(2.0*Math.PI/finCount)));\r
+               }\r
+       }\r
+       \r
+       public Amount<Length> getOD() {\r
+               return oD;\r
+       }\r
+\r
+       public void setOD(Amount<Length> od) throws PropertyVetoException {\r
+               if (od.equals(this.oD))\r
+                       return;\r
+               fireVetoableChange("od", this.oD, od);\r
+               Amount<Length> old = this.oD;\r
+               this.oD = od;\r
+               generateGeometry();\r
+               firePropertyChange("OD", old, oD);\r
+       }\r
+\r
+       public Amount<Length> getID() {\r
+               return iD;\r
+       }\r
+\r
+       public void setID(Amount<Length> id) throws PropertyVetoException {\r
+               if (id.equals(this.iD))\r
+                       return;\r
+               fireVetoableChange("id", this.iD, id);\r
+               Amount<Length> old = this.iD;\r
+               iD = id;\r
+               generateGeometry();\r
+               firePropertyChange("ID", old, iD);\r
+       }\r
+       \r
+       public Amount<Length> getFinWidth() {\r
+               return finWidth;\r
+       }\r
+\r
+       public void setFinWidth(Amount<Length> finWidth) throws PropertyVetoException {\r
+               if (finWidth.equals(this.finWidth))\r
+                       return;\r
+               fireVetoableChange("finWidth", this.finWidth, finWidth);\r
+               Amount<Length> old = this.finWidth;\r
+               this.finWidth = finWidth;\r
+               generateGeometry();\r
+               firePropertyChange("finWidth", old, finWidth);\r
+       }\r
+       \r
+       \r
+       public Amount<Length> getFinDiameter() {\r
+               return finDiameter;\r
+       }\r
+\r
+       public void setFinDiameter(Amount<Length> finDiameter) throws PropertyVetoException {\r
+               if (finDiameter.equals(this.finDiameter))\r
+                       return;\r
+               fireVetoableChange("finDiameter", this.finDiameter, finDiameter);\r
+               Amount<Length> old = this.finDiameter;\r
+               this.finDiameter = finDiameter;\r
+               generateGeometry();\r
+               firePropertyChange("finDiameter", old, finDiameter);\r
+       }\r
+       \r
+       \r
+       public int getFinCount() {\r
+               return finCount;\r
+       }\r
+\r
+       public void setFinCount(int finCount) throws PropertyVetoException {\r
+               if (finCount==this.finCount)\r
+                       return;\r
+               fireVetoableChange("finCount", this.finCount, finCount);\r
+               int old = this.finCount;\r
+               this.finCount = finCount;\r
+               generateGeometry();\r
+               firePropertyChange("finCount", old, finCount);\r
+       }\r
+       \r
+       public static void main(String args[]) throws Exception {\r
+               Finocyl e = new Finocyl();\r
+               new Editor(e).showAsWindow();\r
+               new GrainPanel(e).showAsWindow();\r
+       }\r
+}\r