From 7d4f8ec52ca92ab7508e9cc4e77a685f76b0a52f Mon Sep 17 00:00:00 2001 From: Bill Kuker Date: Tue, 23 Jun 2009 18:19:18 +0000 Subject: [PATCH] Added finocyl grain option --- .../rocketry/motorsim/grain/Finocyl.java | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 src/com/billkuker/rocketry/motorsim/grain/Finocyl.java diff --git a/src/com/billkuker/rocketry/motorsim/grain/Finocyl.java b/src/com/billkuker/rocketry/motorsim/grain/Finocyl.java new file mode 100644 index 0000000..b2295c7 --- /dev/null +++ b/src/com/billkuker/rocketry/motorsim/grain/Finocyl.java @@ -0,0 +1,131 @@ +package com.billkuker.rocketry.motorsim.grain; + +import java.awt.Shape; +import java.awt.geom.AffineTransform; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; +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.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 Finocyl extends ExtrudedShapeGrain { + private Amount oD = Amount.valueOf(30, SI.MILLIMETER); + private Amount iD = Amount.valueOf(10, SI.MILLIMETER); + private Amount finWidth = Amount.valueOf(2, SI.MILLIMETER); + private Amount finDiameter = Amount.valueOf(20, SI.MILLIMETER); + private int finCount = 5; + + public Finocyl(){ + 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); + double fwmm = finWidth.doubleValue(SI.MILLIMETER); + double fdmm = finDiameter.doubleValue(SI.MILLIMETER); + + 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; + + for ( int i = 0; i < finCount; i++ ){ + Shape fin = new Rectangle2D.Double(-fwmm/2,0,fwmm,fdmm/2); + xsection.subtract(fin, AffineTransform.getRotateInstance(i*(2.0*Math.PI/finCount))); + } + } + + public Amount getOD() { + return oD; + } + + public void setOD(Amount od) throws PropertyVetoException { + if (od.equals(this.oD)) + return; + fireVetoableChange("od", this.oD, od); + Amount old = this.oD; + this.oD = od; + generateGeometry(); + firePropertyChange("OD", old, oD); + } + + public Amount getID() { + return iD; + } + + public void setID(Amount id) throws PropertyVetoException { + if (id.equals(this.iD)) + return; + fireVetoableChange("id", this.iD, id); + Amount old = this.iD; + iD = id; + generateGeometry(); + firePropertyChange("ID", old, iD); + } + + public Amount getFinWidth() { + return finWidth; + } + + public void setFinWidth(Amount finWidth) throws PropertyVetoException { + if (finWidth.equals(this.finWidth)) + return; + fireVetoableChange("finWidth", this.finWidth, finWidth); + Amount old = this.finWidth; + this.finWidth = finWidth; + generateGeometry(); + firePropertyChange("finWidth", old, finWidth); + } + + + public Amount getFinDiameter() { + return finDiameter; + } + + public void setFinDiameter(Amount finDiameter) throws PropertyVetoException { + if (finDiameter.equals(this.finDiameter)) + return; + fireVetoableChange("finDiameter", this.finDiameter, finDiameter); + Amount old = this.finDiameter; + this.finDiameter = finDiameter; + generateGeometry(); + firePropertyChange("finDiameter", old, finDiameter); + } + + + public int getFinCount() { + return finCount; + } + + public void setFinCount(int finCount) throws PropertyVetoException { + if (finCount==this.finCount) + return; + fireVetoableChange("finCount", this.finCount, finCount); + int old = this.finCount; + this.finCount = finCount; + generateGeometry(); + firePropertyChange("finCount", old, finCount); + } + + public static void main(String args[]) throws Exception { + Finocyl e = new Finocyl(); + new Editor(e).showAsWindow(); + new GrainPanel(e).showAsWindow(); + } +} -- 2.30.2