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;
8 public class Parachute extends RecoveryDevice {
9 private static final Translator trans = Application.getTranslator();
11 public static final double DEFAULT_CD = 0.8;
13 private double diameter;
15 private Material lineMaterial;
16 private int lineCount = 6;
17 private double lineLength = 0.3;
22 this.lineMaterial = Application.getPreferences().getDefaultComponentMaterial(Parachute.class, Material.Type.LINE);
23 this.lineLength = 0.3;
27 public double getDiameter() {
31 public void setDiameter(double d) {
32 if (MathUtil.equals(this.diameter, d))
35 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
39 public final Material getLineMaterial() {
43 public final void setLineMaterial(Material mat) {
44 if (mat.getType() != Material.Type.LINE) {
45 throw new IllegalArgumentException("Attempted to set non-line material " + mat);
47 if (mat.equals(lineMaterial))
49 this.lineMaterial = mat;
50 if (getLineCount() != 0)
51 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
53 fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
57 public final int getLineCount() {
61 public final void setLineCount(int n) {
62 if (this.lineCount == n)
65 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
68 public final double getLineLength() {
72 public final void setLineLength(double length) {
73 if (MathUtil.equals(this.lineLength, length))
75 this.lineLength = length;
76 if (getLineCount() != 0)
77 fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE);
79 fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE);
84 public double getComponentCD(double mach) {
85 return DEFAULT_CD; // TODO: HIGH: Better parachute CD estimate?
89 public double getArea() {
90 return Math.PI * MathUtil.pow2(diameter / 2);
93 public void setArea(double area) {
94 if (MathUtil.equals(getArea(), area))
96 diameter = MathUtil.safeSqrt(area / Math.PI) * 2;
97 fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
101 public double getComponentMass() {
102 return super.getComponentMass() +
103 getLineCount() * getLineLength() * getLineMaterial().getDensity();
107 public String getComponentName() {
109 return trans.get("Parachute.Parachute");
113 public boolean allowsChildren() {
118 public boolean isCompatible(Class<? extends RocketComponent> type) {