create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / rocketcomponent / Streamer.java
1 package net.sf.openrocket.rocketcomponent;
2
3 import net.sf.openrocket.l10n.Translator;
4 import net.sf.openrocket.preset.ComponentPreset;
5 import net.sf.openrocket.preset.ComponentPreset.Type;
6 import net.sf.openrocket.startup.Application;
7 import net.sf.openrocket.util.MathUtil;
8
9 public class Streamer extends RecoveryDevice {
10         
11         public static final double DEFAULT_CD = 0.6;
12         
13         public static final double MAX_COMPUTED_CD = 0.4;
14         
15         private static final Translator trans = Application.getTranslator();
16
17         private double stripLength;
18         private double stripWidth;
19         
20         
21         public Streamer() {
22                 this.stripLength = 0.5;
23                 this.stripWidth = 0.05;
24         }
25         
26         
27         public double getStripLength() {
28                 return stripLength;
29         }
30         
31         public void setStripLength(double stripLength) {
32                 if (MathUtil.equals(this.stripLength, stripLength))
33                         return;
34                 this.stripLength = stripLength;
35                 clearPreset();
36                 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
37         }
38         
39         public double getStripWidth() {
40                 return stripWidth;
41         }
42         
43         public void setStripWidth(double stripWidth) {
44                 if (MathUtil.equals(this.stripWidth, stripWidth))
45                         return;
46                 this.stripWidth = stripWidth;
47                 this.length = stripWidth;
48                 clearPreset();
49                 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
50         }
51         
52         @Override
53         public void setLength(double length) {
54                 setStripWidth(length);
55         }
56         
57         
58         public double getAspectRatio() {
59                 if (stripWidth > 0.0001)
60                         return stripLength / stripWidth;
61                 return 1000;
62         }
63         
64         public void setAspectRatio(double ratio) {
65                 if (MathUtil.equals(getAspectRatio(), ratio))
66                         return;
67                 
68                 ratio = Math.max(ratio, 0.01);
69                 double area = getArea();
70                 stripWidth = MathUtil.safeSqrt(area / ratio);
71                 stripLength = ratio * stripWidth;
72                 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
73         }
74         
75         
76         @Override
77         public double getArea() {
78                 return stripWidth * stripLength;
79         }
80         
81         public void setArea(double area) {
82                 if (MathUtil.equals(getArea(), area))
83                         return;
84                 
85                 double ratio = Math.max(getAspectRatio(), 0.01);
86                 stripWidth = MathUtil.safeSqrt(area / ratio);
87                 stripLength = ratio * stripWidth;
88                 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
89         }
90         
91         
92
93         @Override
94         public Type getPresetType() {
95                 return ComponentPreset.Type.STREAMER;
96         }
97
98
99         @Override
100         protected void loadFromPreset(ComponentPreset preset) {
101                 if ( preset.has(ComponentPreset.LENGTH)) {
102                         this.stripLength = preset.get(ComponentPreset.LENGTH);
103                 }
104                 if ( preset.has(ComponentPreset.WIDTH)) {
105                         this.stripWidth = preset.get(ComponentPreset.WIDTH);
106                 }
107                 super.loadFromPreset(preset);
108                 // Fix the length to the stripWidth since RocketComponent assigns ComponentPreset.LENGTH to length.
109                 this.length = this.stripWidth;
110                 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
111         }
112
113
114         @Override
115         public double getComponentCD(double mach) {
116                 double density = this.getMaterial().getDensity();
117                 double cd;
118                 
119                 cd = 0.034 * ((density + 0.025) / 0.105) * (stripLength + 1) / stripLength;
120                 cd = MathUtil.min(cd, MAX_COMPUTED_CD);
121                 return cd;
122         }
123         
124         @Override
125         public String getComponentName() {
126                 return trans.get ("Streamer.Streamer");
127         }
128         
129         @Override
130         public boolean allowsChildren() {
131                 return false;
132         }
133         
134         @Override
135         public boolean isCompatible(Class<? extends RocketComponent> type) {
136                 return false;
137         }
138 }