1 package net.sf.openrocket.rocketcomponent;
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;
9 public class Parachute extends RecoveryDevice {
10 private static final Translator trans = Application.getTranslator();
12 public static final double DEFAULT_CD = 0.8;
14 private double diameter;
16 private Material lineMaterial;
17 private int lineCount = 6;
18 private double lineLength = 0.3;
23 this.lineMaterial = Prefs.getDefaultComponentMaterial(Parachute.class, Material.Type.LINE);
24 this.lineLength = 0.3;
28 public double getDiameter() {
32 public void setDiameter(double d) {
33 if (MathUtil.equals(this.diameter, d))
36 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
40 public final Material getLineMaterial() {
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);
48 if (mat.equals(lineMaterial))
50 this.lineMaterial = mat;
51 if (getLineCount() != 0)
52 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
54 fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
58 public final int getLineCount() {
62 public final void setLineCount(int n) {
63 if (this.lineCount == n)
66 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
69 public final double getLineLength() {
73 public final void setLineLength(double length) {
74 if (MathUtil.equals(this.lineLength, length))
76 this.lineLength = length;
77 if (getLineCount() != 0)
78 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
80 fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
85 public double getComponentCD(double mach) {
86 return DEFAULT_CD; // TODO: HIGH: Better parachute CD estimate?
90 public double getArea() {
91 return Math.PI * MathUtil.pow2(diameter / 2);
94 public void setArea(double area) {
95 if (MathUtil.equals(getArea(), area))
97 diameter = MathUtil.safeSqrt(area / Math.PI) * 2;
98 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
102 public double getComponentMass() {
103 return super.getComponentMass() +
104 getLineCount() * getLineLength() * getLineMaterial().getDensity();
108 public String getComponentName() {
110 return trans.get("Parachute.Parachute");
114 public boolean allowsChildren() {
119 public boolean isCompatible(Class<? extends RocketComponent> type) {