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 Amount<Length> oD = Amount.valueOf(30, SI.MILLIMETER);
\r
27 private Amount<Length> coreD = Amount.valueOf(3, SI.MILLIMETER);
\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
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
37 private Amount<Angle> ringTwoRot = Amount.valueOf(22.5, NonSI.DEGREE_ANGLE);
\r
40 public void validate() throws ValidationException {
\r
41 // TODO Auto-generated method stub
\r
47 setLength(Amount.valueOf(70, SI.MILLIMETER));
\r
48 } catch (PropertyVetoException e) {
\r
49 e.printStackTrace();
\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
60 double r2dmm = r2D.doubleValue(SI.MILLIMETER);
\r
61 double r2off = r2Offset.doubleValue(SI.MILLIMETER);
\r
63 double r2rot = ringTwoRot.doubleValue(SI.RADIAN);
\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
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
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
84 public static void main(String args[]){
\r
86 new GrainPanel(g = new MultiPort()).showAsWindow();
\r
87 new Editor(g).showAsWindow();
\r
90 public Amount<Length> getoD() {
\r
94 public void setoD(Amount<Length> oD) {
\r
98 public Amount<Length> getCoreD() {
\r
102 public void setCoreD(Amount<Length> coreD) {
\r
103 this.coreD = coreD;
\r
106 public Amount<Length> getR1D() {
\r
110 public void setR1D(Amount<Length> r1d) {
\r
114 public Amount<Length> getR1Offset() {
\r
118 public void setR1Offset(Amount<Length> r1Offset) {
\r
119 this.r1Offset = r1Offset;
\r
122 public int getR1Count() {
\r
126 public void setR1Count(int r1Count) {
\r
127 this.r1Count = r1Count;
\r
130 public Amount<Length> getR2D() {
\r
134 public void setR2D(Amount<Length> r2d) {
\r
138 public Amount<Length> getR2Offset() {
\r
142 public void setR2Offset(Amount<Length> r2Offset) {
\r
143 this.r2Offset = r2Offset;
\r
146 public int getR2Count() {
\r
150 public void setR2Count(int r2Count) {
\r
151 this.r2Count = r2Count;
\r
154 public Amount<Angle> getRingTwoRot() {
\r
158 public void setRingTwoRot(Amount<Angle> ringTwoRot) {
\r
159 this.ringTwoRot = ringTwoRot;
\r