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