1 package net.sf.openrocket.rocketcomponent;
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;
9 public class Streamer extends RecoveryDevice {
11 public static final double DEFAULT_CD = 0.6;
13 public static final double MAX_COMPUTED_CD = 0.4;
15 private static final Translator trans = Application.getTranslator();
17 private double stripLength;
18 private double stripWidth;
22 this.stripLength = 0.5;
23 this.stripWidth = 0.05;
27 public double getStripLength() {
31 public void setStripLength(double stripLength) {
32 if (MathUtil.equals(this.stripLength, stripLength))
34 this.stripLength = stripLength;
36 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
39 public double getStripWidth() {
43 public void setStripWidth(double stripWidth) {
44 if (MathUtil.equals(this.stripWidth, stripWidth))
46 this.stripWidth = stripWidth;
47 this.length = stripWidth;
49 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
53 public void setLength(double length) {
54 setStripWidth(length);
58 public double getAspectRatio() {
59 if (stripWidth > 0.0001)
60 return stripLength / stripWidth;
64 public void setAspectRatio(double ratio) {
65 if (MathUtil.equals(getAspectRatio(), ratio))
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);
77 public double getArea() {
78 return stripWidth * stripLength;
81 public void setArea(double area) {
82 if (MathUtil.equals(getArea(), area))
85 double ratio = Math.max(getAspectRatio(), 0.01);
86 stripWidth = MathUtil.safeSqrt(area / ratio);
87 stripLength = ratio * stripWidth;
88 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
94 public Type getPresetType() {
95 return ComponentPreset.Type.STREAMER;
100 protected void loadFromPreset(ComponentPreset preset) {
101 if ( preset.has(ComponentPreset.LENGTH)) {
102 this.stripLength = preset.get(ComponentPreset.LENGTH);
104 if ( preset.has(ComponentPreset.WIDTH)) {
105 this.stripWidth = preset.get(ComponentPreset.WIDTH);
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);
115 public double getComponentCD(double mach) {
116 double density = this.getMaterial().getDensity();
119 cd = 0.034 * ((density + 0.025) / 0.105) * (stripLength + 1) / stripLength;
120 cd = MathUtil.min(cd, MAX_COMPUTED_CD);
125 public String getComponentName() {
126 return trans.get ("Streamer.Streamer");
130 public boolean allowsChildren() {
135 public boolean isCompatible(Class<? extends RocketComponent> type) {