98fe11fd0cb94c35bf7c1a5ec225e5a1eb6ae897
[sw/motorsim] / src / com / billkuker / rocketry / motorsim / grain / MultiPort.java
1 package com.billkuker.rocketry.motorsim.grain;\r
2 \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
7 \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
12 \r
13 import org.jscience.physics.amount.Amount;\r
14 \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
21 \r
22 public class MultiPort extends ExtrudedShapeGrain implements Validating {\r
23         \r
24         private Amount<Length> oD = Amount.valueOf(30, SI.MILLIMETER);\r
25         \r
26         \r
27         private Amount<Length> coreD = Amount.valueOf(3, SI.MILLIMETER);\r
28         \r
29         private Amount<Length> r1D = Amount.valueOf(2, SI.MILLIMETER);\r
30         private Amount<Length> r1Offset = Amount.valueOf(5, SI.MILLIMETER);\r
31         private int r1Count = 4;\r
32         \r
33         private Amount<Length> r2D = Amount.valueOf(1, SI.MILLIMETER);\r
34         private Amount<Length> r2Offset = Amount.valueOf(10, SI.MILLIMETER);\r
35         private int r2Count = 8;\r
36 \r
37         private Amount<Angle> ringTwoRot = Amount.valueOf(22.5, NonSI.DEGREE_ANGLE);\r
38         \r
39         @Override\r
40         public void validate() throws ValidationException {\r
41                 // TODO Auto-generated method stub\r
42                 \r
43         }\r
44         \r
45         public MultiPort(){\r
46                 try {\r
47                         setLength(Amount.valueOf(70, SI.MILLIMETER));\r
48                 } catch (PropertyVetoException e) {\r
49                         e.printStackTrace();\r
50                 }\r
51                 generateGeometry();\r
52         }\r
53         \r
54         private void generateGeometry(){\r
55                 double odmm = oD.doubleValue(SI.MILLIMETER);\r
56                 double cdmm = coreD.doubleValue(SI.MILLIMETER);\r
57                 double r1dmm = r1D.doubleValue(SI.MILLIMETER);\r
58                 double r1off = r1Offset.doubleValue(SI.MILLIMETER);\r
59                 \r
60                 double r2dmm = r2D.doubleValue(SI.MILLIMETER);\r
61                 double r2off = r2Offset.doubleValue(SI.MILLIMETER);\r
62                 \r
63                 double r2rot = ringTwoRot.doubleValue(SI.RADIAN);\r
64                 \r
65                 xsection = new BurningShape();\r
66                 Shape outside = new Ellipse2D.Double(-odmm/2, -odmm/2, odmm, odmm);\r
67                 xsection.add(outside);\r
68                 xsection.inhibit(outside);\r
69                 xsection.subtract(new Ellipse2D.Double(-cdmm/2, -cdmm/2, cdmm, cdmm));\r
70                 webThickness = null;\r
71                 \r
72                 for ( int i = 0; i < r1Count; i++ ){\r
73                         Shape port = new Ellipse2D.Double(r1off-r1dmm/2,-r1dmm/2,r1dmm,r1dmm);\r
74                         xsection.subtract(port, AffineTransform.getRotateInstance(i*(2.0*Math.PI/r1Count)));\r
75                 }\r
76                 \r
77                 for ( int i = 0; i < r2Count; i++ ){\r
78                         Shape port = new Ellipse2D.Double(r2off-r2dmm/2,-r2dmm/2,r2dmm,r2dmm);\r
79                         xsection.subtract(port, AffineTransform.getRotateInstance(r2rot + i*(2.0*Math.PI/r2Count)));\r
80                 }\r
81         }\r
82 \r
83         \r
84         public static void main(String args[]){\r
85                 Grain g;\r
86                 new GrainPanel(g = new MultiPort()).showAsWindow();\r
87                 new Editor(g).showAsWindow();\r
88         }\r
89 \r
90         public Amount<Length> getoD() {\r
91                 return oD;\r
92         }\r
93 \r
94         public void setoD(Amount<Length> oD) {\r
95                 this.oD = oD;\r
96         }\r
97 \r
98         public Amount<Length> getCoreD() {\r
99                 return coreD;\r
100         }\r
101 \r
102         public void setCoreD(Amount<Length> coreD) {\r
103                 this.coreD = coreD;\r
104         }\r
105 \r
106         public Amount<Length> getR1D() {\r
107                 return r1D;\r
108         }\r
109 \r
110         public void setR1D(Amount<Length> r1d) {\r
111                 r1D = r1d;\r
112         }\r
113 \r
114         public Amount<Length> getR1Offset() {\r
115                 return r1Offset;\r
116         }\r
117 \r
118         public void setR1Offset(Amount<Length> r1Offset) {\r
119                 this.r1Offset = r1Offset;\r
120         }\r
121 \r
122         public int getR1Count() {\r
123                 return r1Count;\r
124         }\r
125 \r
126         public void setR1Count(int r1Count) {\r
127                 this.r1Count = r1Count;\r
128         }\r
129 \r
130         public Amount<Length> getR2D() {\r
131                 return r2D;\r
132         }\r
133 \r
134         public void setR2D(Amount<Length> r2d) {\r
135                 r2D = r2d;\r
136         }\r
137 \r
138         public Amount<Length> getR2Offset() {\r
139                 return r2Offset;\r
140         }\r
141 \r
142         public void setR2Offset(Amount<Length> r2Offset) {\r
143                 this.r2Offset = r2Offset;\r
144         }\r
145 \r
146         public int getR2Count() {\r
147                 return r2Count;\r
148         }\r
149 \r
150         public void setR2Count(int r2Count) {\r
151                 this.r2Count = r2Count;\r
152         }\r
153 \r
154         public Amount<Angle> getRingTwoRot() {\r
155                 return ringTwoRot;\r
156         }\r
157 \r
158         public void setRingTwoRot(Amount<Angle> ringTwoRot) {\r
159                 this.ringTwoRot = ringTwoRot;\r
160         }\r
161 }\r