1 package com.billkuker.rocketry.motorsim.grain;
\r
3 import java.awt.Shape;
\r
4 import java.awt.geom.AffineTransform;
\r
5 import java.awt.geom.Ellipse2D;
\r
6 import java.beans.PropertyVetoException;
\r
8 import javax.measure.quantity.Angle;
\r
9 import javax.measure.quantity.Length;
\r
10 import javax.measure.unit.NonSI;
\r
11 import javax.measure.unit.SI;
\r
13 import org.jscience.physics.amount.Amount;
\r
15 import com.billkuker.rocketry.motorsim.Grain;
\r
16 import com.billkuker.rocketry.motorsim.Validating;
\r
17 import com.billkuker.rocketry.motorsim.grain.util.BurningShape;
\r
18 import com.billkuker.rocketry.motorsim.grain.util.ExtrudedShapeGrain;
\r
19 import com.billkuker.rocketry.motorsim.visual.Editor;
\r
20 import com.billkuker.rocketry.motorsim.visual.GrainPanel;
\r
22 public class MultiPort extends ExtrudedShapeGrain implements Validating {
\r
24 private boolean inhibitOutside = true;
\r
26 private Amount<Length> oD = Amount.valueOf(30, SI.MILLIMETER);
\r
28 private Amount<Length> coreD = Amount.valueOf(3, SI.MILLIMETER);
\r
30 private Amount<Length> r1D = Amount.valueOf(2, SI.MILLIMETER);
\r
31 private Amount<Length> r1Offset = Amount.valueOf(5, SI.MILLIMETER);
\r
32 private int r1Count = 4;
\r
34 private Amount<Length> r2D = Amount.valueOf(1, SI.MILLIMETER);
\r
35 private Amount<Length> r2Offset = Amount.valueOf(10, SI.MILLIMETER);
\r
36 private int r2Count = 8;
\r
38 private Amount<Angle> ringTwoRot = Amount.valueOf(22.5, NonSI.DEGREE_ANGLE);
\r
41 public void validate() throws ValidationException {
\r
42 // TODO Auto-generated method stub
\r
46 public MultiPort() {
\r
48 setLength(Amount.valueOf(70, SI.MILLIMETER));
\r
49 } catch (PropertyVetoException e) {
\r
50 e.printStackTrace();
\r
55 private void generateGeometry() {
\r
56 double odmm = oD.doubleValue(SI.MILLIMETER);
\r
57 double cdmm = coreD.doubleValue(SI.MILLIMETER);
\r
58 double r1dmm = r1D.doubleValue(SI.MILLIMETER);
\r
59 double r1off = r1Offset.doubleValue(SI.MILLIMETER);
\r
61 double r2dmm = r2D.doubleValue(SI.MILLIMETER);
\r
62 double r2off = r2Offset.doubleValue(SI.MILLIMETER);
\r
64 double r2rot = ringTwoRot.doubleValue(SI.RADIAN);
\r
66 xsection = new BurningShape();
\r
67 Shape outside = new Ellipse2D.Double(-odmm / 2, -odmm / 2, odmm, odmm);
\r
68 xsection.add(outside);
\r
70 if (isInhibitOutside())
\r
71 xsection.inhibit(outside);
\r
73 xsection.subtract(new Ellipse2D.Double(-cdmm / 2, -cdmm / 2, cdmm, cdmm));
\r
74 webThickness = null;
\r
76 for (int i = 0; i < r1Count; i++) {
\r
77 Shape port = new Ellipse2D.Double(r1off - r1dmm / 2, -r1dmm / 2,
\r
81 AffineTransform.getRotateInstance(i
\r
82 * (2.0 * Math.PI / r1Count)));
\r
85 for (int i = 0; i < r2Count; i++) {
\r
86 Shape port = new Ellipse2D.Double(r2off - r2dmm / 2, -r2dmm / 2,
\r
90 AffineTransform.getRotateInstance(r2rot + i
\r
91 * (2.0 * Math.PI / r2Count)));
\r
95 public static void main(String args[]) {
\r
97 new GrainPanel(g = new MultiPort()).showAsWindow();
\r
98 new Editor(g).showAsWindow();
\r
101 public Amount<Length> getoD() {
\r
105 public void setoD(Amount<Length> oD) {
\r
107 generateGeometry();
\r
110 public Amount<Length> getCoreD() {
\r
114 public void setCoreD(Amount<Length> coreD) {
\r
115 this.coreD = coreD;
\r
116 generateGeometry();
\r
119 public Amount<Length> getR1D() {
\r
123 public void setR1D(Amount<Length> r1d) {
\r
125 generateGeometry();
\r
128 public Amount<Length> getR1Offset() {
\r
132 public void setR1Offset(Amount<Length> r1Offset) {
\r
133 this.r1Offset = r1Offset;
\r
134 generateGeometry();
\r
137 public int getR1Count() {
\r
141 public void setR1Count(int r1Count) {
\r
142 this.r1Count = r1Count;
\r
143 generateGeometry();
\r
146 public Amount<Length> getR2D() {
\r
150 public void setR2D(Amount<Length> r2d) {
\r
152 generateGeometry();
\r
155 public Amount<Length> getR2Offset() {
\r
159 public void setR2Offset(Amount<Length> r2Offset) {
\r
160 this.r2Offset = r2Offset;
\r
161 generateGeometry();
\r
164 public int getR2Count() {
\r
168 public void setR2Count(int r2Count) {
\r
169 this.r2Count = r2Count;
\r
170 generateGeometry();
\r
173 public Amount<Angle> getRingTwoRot() {
\r
177 public void setRingTwoRot(Amount<Angle> ringTwoRot) {
\r
178 this.ringTwoRot = ringTwoRot;
\r
179 generateGeometry();
\r
182 public boolean isInhibitOutside() {
\r
183 return inhibitOutside;
\r
186 public void setInhibitOutside(boolean inhibitOutside) {
\r
187 this.inhibitOutside = inhibitOutside;
\r
188 generateGeometry();
\r