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