Initial commit
[debian/openrocket] / src / net / sf / openrocket / rocketcomponent / Parachute.java
1 package net.sf.openrocket.rocketcomponent;
2
3 import net.sf.openrocket.material.Material;
4 import net.sf.openrocket.util.MathUtil;
5 import net.sf.openrocket.util.Prefs;
6
7 public class Parachute extends RecoveryDevice {
8
9         public static final double DEFAULT_CD = 0.8;
10         
11         private double diameter;
12         
13         private Material lineMaterial;
14         private int lineCount = 6;
15         private double lineLength = 0.3;
16
17         
18         public Parachute() {
19                 this.diameter = 0.3;
20                 this.lineMaterial = Prefs.getDefaultComponentMaterial(Parachute.class, Material.Type.LINE);
21                 this.lineLength = 0.3;
22         }
23
24
25         public double getDiameter() {
26                 return diameter;
27         }
28         
29         public void setDiameter(double d) {
30                 if (MathUtil.equals(this.diameter, d))
31                         return;
32                 this.diameter = d;
33                 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
34         }
35         
36         
37         public final Material getLineMaterial() {
38                 return lineMaterial;
39         }
40         
41         public final void setLineMaterial(Material mat) {
42                 if (mat.getType() != Material.Type.LINE) {
43                         throw new IllegalArgumentException("Attempted to set non-line material "+mat);
44                 }
45                 if (mat.equals(lineMaterial))
46                         return;
47                 this.lineMaterial = mat;
48                 if (getLineCount() != 0)
49                         fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
50                 else
51                         fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
52         }
53         
54                 
55         public final int getLineCount() {
56                 return lineCount;
57         }
58         
59         public final void setLineCount(int n) {
60                 if (this.lineCount == n)
61                         return;
62                 this.lineCount = n;
63                 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
64         }
65         
66         public final double getLineLength() {
67                 return lineLength;
68         }
69         
70         public final void setLineLength(double length) {
71                 if (MathUtil.equals(this.lineLength, length))
72                         return;
73                 this.lineLength = length;
74                 if (getLineCount() != 0)
75                         fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
76                 else
77                         fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
78         }
79
80
81         @Override
82         public double getComponentCD(double mach) {
83                 return DEFAULT_CD;  // TODO: HIGH:  Better parachute CD estimate?
84         }
85         
86         @Override
87         public double getArea() {
88                 return Math.PI * MathUtil.pow2(diameter/2);
89         }
90         
91         public void setArea(double area) {
92                 if (MathUtil.equals(getArea(), area))
93                         return;
94                 diameter = Math.sqrt(area / Math.PI) * 2;
95                 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
96         }
97         
98         @Override
99         public double getComponentMass() {
100                 return super.getComponentMass() + 
101                         getLineCount() * getLineLength() * getLineMaterial().getDensity();
102         }
103
104         @Override
105         public String getComponentName() {
106                 return "Parachute";
107         }
108
109         @Override
110         public boolean isCompatible(Class<? extends RocketComponent> type) {
111                 return false;
112         }
113
114 }