Merge pull request #289 from Vicilu/DocumentationVicilu
adds documentation to aerodynmics package
This commit is contained in:
commit
ad9d099746
@ -14,7 +14,7 @@ public class AerodynamicForces implements Cloneable, Monitorable {
|
|||||||
*/
|
*/
|
||||||
private RocketComponent component = null;
|
private RocketComponent component = null;
|
||||||
|
|
||||||
|
|
||||||
/** CP and CNa. */
|
/** CP and CNa. */
|
||||||
private Coordinate cp = null;
|
private Coordinate cp = null;
|
||||||
|
|
||||||
@ -25,11 +25,11 @@ public class AerodynamicForces implements Cloneable, Monitorable {
|
|||||||
* compute CNa directly.
|
* compute CNa directly.
|
||||||
*/
|
*/
|
||||||
private double CNa = Double.NaN;
|
private double CNa = Double.NaN;
|
||||||
|
|
||||||
|
|
||||||
/** Normal force coefficient. */
|
/** Normal force coefficient. */
|
||||||
private double CN = Double.NaN;
|
private double CN = Double.NaN;
|
||||||
|
|
||||||
/** Pitching moment coefficient, relative to the coordinate origin. */
|
/** Pitching moment coefficient, relative to the coordinate origin. */
|
||||||
private double Cm = Double.NaN;
|
private double Cm = Double.NaN;
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ public class AerodynamicForces implements Cloneable, Monitorable {
|
|||||||
/** Roll moment forcing coefficient */
|
/** Roll moment forcing coefficient */
|
||||||
private double CrollForce = Double.NaN;
|
private double CrollForce = Double.NaN;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Axial drag coefficient, CA */
|
/** Axial drag coefficient, CA */
|
||||||
private double Caxial = Double.NaN;
|
private double Caxial = Double.NaN;
|
||||||
@ -71,160 +71,184 @@ public class AerodynamicForces implements Cloneable, Monitorable {
|
|||||||
|
|
||||||
private int modID = 0;
|
private int modID = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* creates an empty bean of AerodynamicForces with NaN values
|
||||||
|
*/
|
||||||
|
public AerodynamicForces() {
|
||||||
|
//all done in members declarations
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* initializes an AerodynamicForces already at zero
|
||||||
|
* @param zero flag to iniatilize value to zero or not
|
||||||
|
*/
|
||||||
|
public AerodynamicForces(boolean zero) {
|
||||||
|
if (zero)
|
||||||
|
this.zero();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gives a new component to be linked with
|
||||||
|
* changes it's modification id
|
||||||
|
* @param component The rocket component
|
||||||
|
*/
|
||||||
public void setComponent(RocketComponent component) {
|
public void setComponent(RocketComponent component) {
|
||||||
this.component = component;
|
this.component = component;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return the actual component linked with this
|
||||||
|
*/
|
||||||
public RocketComponent getComponent() {
|
public RocketComponent getComponent() {
|
||||||
return component;
|
return component;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCP(Coordinate cp) {
|
public void setCP(Coordinate cp) {
|
||||||
this.cp = cp;
|
this.cp = cp;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Coordinate getCP() {
|
public Coordinate getCP() {
|
||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCNa(double cNa) {
|
public void setCNa(double cNa) {
|
||||||
CNa = cNa;
|
CNa = cNa;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getCNa() {
|
public double getCNa() {
|
||||||
return CNa;
|
return CNa;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCN(double cN) {
|
public void setCN(double cN) {
|
||||||
CN = cN;
|
CN = cN;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getCN() {
|
public double getCN() {
|
||||||
return CN;
|
return CN;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCm(double cm) {
|
public void setCm(double cm) {
|
||||||
Cm = cm;
|
Cm = cm;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getCm() {
|
public double getCm() {
|
||||||
return Cm;
|
return Cm;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCside(double cside) {
|
public void setCside(double cside) {
|
||||||
Cside = cside;
|
Cside = cside;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getCside() {
|
public double getCside() {
|
||||||
return Cside;
|
return Cside;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCyaw(double cyaw) {
|
public void setCyaw(double cyaw) {
|
||||||
Cyaw = cyaw;
|
Cyaw = cyaw;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getCyaw() {
|
public double getCyaw() {
|
||||||
return Cyaw;
|
return Cyaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCroll(double croll) {
|
public void setCroll(double croll) {
|
||||||
Croll = croll;
|
Croll = croll;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getCroll() {
|
public double getCroll() {
|
||||||
return Croll;
|
return Croll;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCrollDamp(double crollDamp) {
|
public void setCrollDamp(double crollDamp) {
|
||||||
CrollDamp = crollDamp;
|
CrollDamp = crollDamp;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getCrollDamp() {
|
public double getCrollDamp() {
|
||||||
return CrollDamp;
|
return CrollDamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCrollForce(double crollForce) {
|
public void setCrollForce(double crollForce) {
|
||||||
CrollForce = crollForce;
|
CrollForce = crollForce;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getCrollForce() {
|
public double getCrollForce() {
|
||||||
return CrollForce;
|
return CrollForce;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCaxial(double caxial) {
|
public void setCaxial(double caxial) {
|
||||||
Caxial = caxial;
|
Caxial = caxial;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getCaxial() {
|
public double getCaxial() {
|
||||||
return Caxial;
|
return Caxial;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setCD(double cD) {
|
public void setCD(double cD) {
|
||||||
CD = cD;
|
CD = cD;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getCD() {
|
public double getCD() {
|
||||||
return CD;
|
return CD;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPressureCD(double pressureCD) {
|
public void setPressureCD(double pressureCD) {
|
||||||
this.pressureCD = pressureCD;
|
this.pressureCD = pressureCD;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getPressureCD() {
|
public double getPressureCD() {
|
||||||
return pressureCD;
|
return pressureCD;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBaseCD(double baseCD) {
|
public void setBaseCD(double baseCD) {
|
||||||
this.baseCD = baseCD;
|
this.baseCD = baseCD;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getBaseCD() {
|
public double getBaseCD() {
|
||||||
return baseCD;
|
return baseCD;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFrictionCD(double frictionCD) {
|
public void setFrictionCD(double frictionCD) {
|
||||||
this.frictionCD = frictionCD;
|
this.frictionCD = frictionCD;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getFrictionCD() {
|
public double getFrictionCD() {
|
||||||
return frictionCD;
|
return frictionCD;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPitchDampingMoment(double pitchDampingMoment) {
|
public void setPitchDampingMoment(double pitchDampingMoment) {
|
||||||
this.pitchDampingMoment = pitchDampingMoment;
|
this.pitchDampingMoment = pitchDampingMoment;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getPitchDampingMoment() {
|
public double getPitchDampingMoment() {
|
||||||
return pitchDampingMoment;
|
return pitchDampingMoment;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setYawDampingMoment(double yawDampingMoment) {
|
public void setYawDampingMoment(double yawDampingMoment) {
|
||||||
this.yawDampingMoment = yawDampingMoment;
|
this.yawDampingMoment = yawDampingMoment;
|
||||||
modID++;
|
modID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getYawDampingMoment() {
|
public double getYawDampingMoment() {
|
||||||
return yawDampingMoment;
|
return yawDampingMoment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -232,7 +256,7 @@ public class AerodynamicForces implements Cloneable, Monitorable {
|
|||||||
*/
|
*/
|
||||||
public void reset() {
|
public void reset() {
|
||||||
setComponent(null);
|
setComponent(null);
|
||||||
|
|
||||||
setCP(null);
|
setCP(null);
|
||||||
setCNa(Double.NaN);
|
setCNa(Double.NaN);
|
||||||
setCN(Double.NaN);
|
setCN(Double.NaN);
|
||||||
@ -253,7 +277,7 @@ public class AerodynamicForces implements Cloneable, Monitorable {
|
|||||||
*/
|
*/
|
||||||
public void zero() {
|
public void zero() {
|
||||||
// component untouched
|
// component untouched
|
||||||
|
|
||||||
setCP(Coordinate.NUL);
|
setCP(Coordinate.NUL);
|
||||||
setCNa(0);
|
setCNa(0);
|
||||||
setCN(0);
|
setCN(0);
|
||||||
@ -268,12 +292,12 @@ public class AerodynamicForces implements Cloneable, Monitorable {
|
|||||||
setPitchDampingMoment(0);
|
setPitchDampingMoment(0);
|
||||||
setYawDampingMoment(0);
|
setYawDampingMoment(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AerodynamicForces clone() {
|
public AerodynamicForces clone() {
|
||||||
try {
|
try {
|
||||||
return (AerodynamicForces)super.clone();
|
return (AerodynamicForces) super.clone();
|
||||||
} catch (CloneNotSupportedException e) {
|
} catch (CloneNotSupportedException e) {
|
||||||
throw new BugException("CloneNotSupportedException?!?");
|
throw new BugException("CloneNotSupportedException?!?");
|
||||||
}
|
}
|
||||||
@ -308,13 +332,13 @@ public class AerodynamicForces implements Cloneable, Monitorable {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return (int) (1000*(this.getCD()+this.getCaxial()+this.getCNa())) + this.getCP().hashCode();
|
return (int) (1000 * (this.getCD() + this.getCaxial() + this.getCNa())) + this.getCP().hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
String text="AerodynamicForces[";
|
String text = "AerodynamicForces[";
|
||||||
|
|
||||||
if (getComponent() != null)
|
if (getComponent() != null)
|
||||||
text += "component:" + getComponent() + ",";
|
text += "component:" + getComponent() + ",";
|
||||||
@ -340,14 +364,14 @@ public class AerodynamicForces implements Cloneable, Monitorable {
|
|||||||
|
|
||||||
if (!Double.isNaN(getCD()))
|
if (!Double.isNaN(getCD()))
|
||||||
text += "CD:" + getCD() + ",";
|
text += "CD:" + getCD() + ",";
|
||||||
|
|
||||||
if (text.charAt(text.length()-1) == ',')
|
if (text.charAt(text.length() - 1) == ',')
|
||||||
text = text.substring(0, text.length()-1);
|
text = text.substring(0, text.length() - 1);
|
||||||
|
|
||||||
text += "]";
|
text += "]";
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getModID() {
|
public int getModID() {
|
||||||
return modID;
|
return modID;
|
||||||
|
@ -32,14 +32,14 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
private static final String BARROWMAN_PACKAGE = "net.sf.openrocket.aerodynamics.barrowman";
|
private static final String BARROWMAN_PACKAGE = "net.sf.openrocket.aerodynamics.barrowman";
|
||||||
private static final String BARROWMAN_SUFFIX = "Calc";
|
private static final String BARROWMAN_SUFFIX = "Calc";
|
||||||
|
|
||||||
|
|
||||||
private Map<RocketComponent, RocketComponentCalc> calcMap = null;
|
private Map<RocketComponent, RocketComponentCalc> calcMap = null;
|
||||||
|
|
||||||
private double cacheDiameter = -1;
|
private double cacheDiameter = -1;
|
||||||
private double cacheLength = -1;
|
private double cacheLength = -1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public BarrowmanCalculator() {
|
public BarrowmanCalculator() {
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -62,59 +62,76 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
return forces.getCP();
|
return forces.getCP();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<RocketComponent, AerodynamicForces> getForceAnalysis(Configuration configuration,
|
public Map<RocketComponent, AerodynamicForces> getForceAnalysis(Configuration configuration,
|
||||||
FlightConditions conditions, WarningSet warnings) {
|
FlightConditions conditions, WarningSet warnings) {
|
||||||
checkCache(configuration);
|
checkCache(configuration);
|
||||||
|
|
||||||
AerodynamicForces f;
|
Map<RocketComponent, AerodynamicForces> map = getComponentsMap(configuration);
|
||||||
Map<RocketComponent, AerodynamicForces> map =
|
|
||||||
new LinkedHashMap<RocketComponent, AerodynamicForces>();
|
|
||||||
|
|
||||||
// Add all components to the map
|
|
||||||
for (RocketComponent c : configuration) {
|
|
||||||
f = new AerodynamicForces();
|
|
||||||
f.setComponent(c);
|
|
||||||
|
|
||||||
map.put(c, f);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Calculate non-axial force data
|
// Calculate non-axial force data
|
||||||
AerodynamicForces total = calculateNonAxialForces(configuration, conditions, map, warnings);
|
AerodynamicForces total = calculateNonAxialForces(configuration, conditions, map, warnings);
|
||||||
|
|
||||||
|
calculateFrictionData(total, configuration, conditions, warnings);
|
||||||
// Calculate friction data
|
|
||||||
total.setFrictionCD(calculateFrictionDrag(configuration, conditions, map, warnings));
|
|
||||||
total.setPressureCD(calculatePressureDrag(configuration, conditions, map, warnings));
|
|
||||||
total.setBaseCD(calculateBaseDrag(configuration, conditions, map, warnings));
|
|
||||||
|
|
||||||
total.setComponent(configuration.getRocket());
|
total.setComponent(configuration.getRocket());
|
||||||
|
|
||||||
map.put(total.getComponent(), total);
|
map.put(total.getComponent(), total);
|
||||||
|
checkCDAndApplyFriction(map, conditions);
|
||||||
|
|
||||||
for (RocketComponent c : map.keySet()) {
|
|
||||||
f = map.get(c);
|
|
||||||
if (Double.isNaN(f.getBaseCD()) && Double.isNaN(f.getPressureCD()) &&
|
|
||||||
Double.isNaN(f.getFrictionCD()))
|
|
||||||
continue;
|
|
||||||
if (Double.isNaN(f.getBaseCD()))
|
|
||||||
f.setBaseCD(0);
|
|
||||||
if (Double.isNaN(f.getPressureCD()))
|
|
||||||
f.setPressureCD(0);
|
|
||||||
if (Double.isNaN(f.getFrictionCD()))
|
|
||||||
f.setFrictionCD(0);
|
|
||||||
f.setCD(f.getBaseCD() + f.getPressureCD() + f.getFrictionCD());
|
|
||||||
f.setCaxial(calculateAxialDrag(conditions, f.getCD()));
|
|
||||||
}
|
|
||||||
|
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get a map of rocket components with their own Aerodynamic forces bean
|
||||||
|
* TODO: LOW: maybe transfer the function to Configuration class?
|
||||||
|
* @param configuration The rocket configuration
|
||||||
|
* @return the map of rocket configuration with it's
|
||||||
|
* correspondent aerodynamic forces bean
|
||||||
|
*/
|
||||||
|
private Map<RocketComponent, AerodynamicForces> getComponentsMap(Configuration configuration) {
|
||||||
|
Map<RocketComponent, AerodynamicForces> map = new LinkedHashMap<RocketComponent, AerodynamicForces>();
|
||||||
|
// Add all components to the map
|
||||||
|
for (RocketComponent c : configuration) {
|
||||||
|
AerodynamicForces f = new AerodynamicForces();
|
||||||
|
f.setComponent(c);
|
||||||
|
map.put(c, f);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check an analysis to fix possible invalid CDs and apply the actual friction
|
||||||
|
*
|
||||||
|
* @param forceAnalysis
|
||||||
|
* @param conditions
|
||||||
|
*/
|
||||||
|
private void checkCDAndApplyFriction(Map<RocketComponent, AerodynamicForces> forceAnalysis, FlightConditions conditions) {
|
||||||
|
for (RocketComponent c : forceAnalysis.keySet()) {
|
||||||
|
checkCDConsistency(forceAnalysis.get(c));
|
||||||
|
applyFriction(forceAnalysis.get(c), conditions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fixes possibles NaN in previous calculation of CDs
|
||||||
|
*
|
||||||
|
* @param f
|
||||||
|
* @param conditions
|
||||||
|
*/
|
||||||
|
private void checkCDConsistency(AerodynamicForces f) {
|
||||||
|
if (Double.isNaN(f.getBaseCD()) && Double.isNaN(f.getPressureCD()) &&
|
||||||
|
Double.isNaN(f.getFrictionCD()))
|
||||||
|
return;
|
||||||
|
if (Double.isNaN(f.getBaseCD()))
|
||||||
|
f.setBaseCD(0);
|
||||||
|
if (Double.isNaN(f.getPressureCD()))
|
||||||
|
f.setPressureCD(0);
|
||||||
|
if (Double.isNaN(f.getFrictionCD()))
|
||||||
|
f.setFrictionCD(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AerodynamicForces getAerodynamicForces(Configuration configuration,
|
public AerodynamicForces getAerodynamicForces(Configuration configuration,
|
||||||
FlightConditions conditions, WarningSet warnings) {
|
FlightConditions conditions, WarningSet warnings) {
|
||||||
@ -127,27 +144,53 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
AerodynamicForces total = calculateNonAxialForces(configuration, conditions, null, warnings);
|
AerodynamicForces total = calculateNonAxialForces(configuration, conditions, null, warnings);
|
||||||
|
|
||||||
// Calculate friction data
|
// Calculate friction data
|
||||||
total.setFrictionCD(calculateFrictionDrag(configuration, conditions, null, warnings));
|
calculateFrictionData(total, configuration, conditions, warnings);
|
||||||
total.setPressureCD(calculatePressureDrag(configuration, conditions, null, warnings));
|
applyFriction(total, conditions);
|
||||||
total.setBaseCD(calculateBaseDrag(configuration, conditions, null, warnings));
|
|
||||||
|
|
||||||
total.setCD(total.getFrictionCD() + total.getPressureCD() + total.getBaseCD());
|
|
||||||
|
|
||||||
total.setCaxial(calculateAxialDrag(conditions, total.getCD()));
|
|
||||||
|
|
||||||
// Calculate pitch and yaw damping moments
|
// Calculate pitch and yaw damping moments
|
||||||
calculateDampingMoments(configuration, conditions, total);
|
calculateDampingMoments(configuration, conditions, total);
|
||||||
total.setCm(total.getCm() - total.getPitchDampingMoment());
|
applyDampingMoments(total);
|
||||||
total.setCyaw(total.getCyaw() - total.getYawDampingMoment());
|
|
||||||
|
|
||||||
|
|
||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies the actual influence of friction in an AerodynamicForces set
|
||||||
|
*
|
||||||
|
* @param force the Aerodynamic forces to be applied with friction
|
||||||
|
* @param conditions the flight conditions in consideration
|
||||||
|
*/
|
||||||
|
private void applyFriction(AerodynamicForces force, FlightConditions conditions) {
|
||||||
|
force.setCD(force.getFrictionCD() + force.getPressureCD() + force.getBaseCD());
|
||||||
|
force.setCaxial(calculateAxialDrag(conditions, force.getCD()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* does the actual action of damping into an AerodynamicForces set
|
||||||
/*
|
*
|
||||||
|
* @param total the AerodynamicForces object to be applied with the damping
|
||||||
|
*/
|
||||||
|
private void applyDampingMoments(AerodynamicForces total) {
|
||||||
|
total.setCm(total.getCm() - total.getPitchDampingMoment());
|
||||||
|
total.setCyaw(total.getCyaw() - total.getYawDampingMoment());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will calculate all basic CD from an AerodynamicForces set
|
||||||
|
* @param total The AerodynamicForces that will be calculated
|
||||||
|
* @param configuration the Rocket configutarion
|
||||||
|
* @param conditions Flight conditions in the simulation
|
||||||
|
* @param warnings Warning set to handle special events
|
||||||
|
*/
|
||||||
|
private void calculateFrictionData(AerodynamicForces total, Configuration configuration, FlightConditions conditions, WarningSet warnings) {
|
||||||
|
total.setFrictionCD(calculateFrictionDrag(configuration, conditions, null, warnings));
|
||||||
|
total.setPressureCD(calculatePressureDrag(configuration, conditions, null, warnings));
|
||||||
|
total.setBaseCD(calculateBaseDrag(configuration, conditions, null, warnings));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
* Perform the actual CP calculation.
|
* Perform the actual CP calculation.
|
||||||
*/
|
*/
|
||||||
private AerodynamicForces calculateNonAxialForces(Configuration configuration, FlightConditions conditions,
|
private AerodynamicForces calculateNonAxialForces(Configuration configuration, FlightConditions conditions,
|
||||||
@ -155,8 +198,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
|
|
||||||
checkCache(configuration);
|
checkCache(configuration);
|
||||||
|
|
||||||
AerodynamicForces total = new AerodynamicForces();
|
AerodynamicForces total = new AerodynamicForces(true);
|
||||||
total.zero();
|
|
||||||
|
|
||||||
double radius = 0; // aft radius of previous component
|
double radius = 0; // aft radius of previous component
|
||||||
double componentX = 0; // aft coordinate of previous component
|
double componentX = 0; // aft coordinate of previous component
|
||||||
@ -168,9 +210,8 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
if (conditions.getAOA() > 17.5 * Math.PI / 180)
|
if (conditions.getAOA() > 17.5 * Math.PI / 180)
|
||||||
warnings.add(new Warning.LargeAOA(conditions.getAOA()));
|
warnings.add(new Warning.LargeAOA(conditions.getAOA()));
|
||||||
|
|
||||||
|
|
||||||
if (calcMap == null)
|
checkCalcMap(configuration);
|
||||||
buildCalcMap(configuration);
|
|
||||||
|
|
||||||
for (RocketComponent component : configuration) {
|
for (RocketComponent component : configuration) {
|
||||||
|
|
||||||
@ -207,6 +248,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
forces.setCP(component.toAbsolute(forces.getCP())[0]);
|
forces.setCP(component.toAbsolute(forces.getCP())[0]);
|
||||||
forces.setCm(forces.getCN() * forces.getCP().x / conditions.getRefLength());
|
forces.setCm(forces.getCN() * forces.getCP().x / conditions.getRefLength());
|
||||||
|
|
||||||
|
//TODO: LOW: Why is it here? was this the todo from above? Vicilu
|
||||||
if (map != null) {
|
if (map != null) {
|
||||||
AerodynamicForces f = map.get(component);
|
AerodynamicForces f = map.get(component);
|
||||||
|
|
||||||
@ -219,6 +261,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
f.setCroll(forces.getCroll());
|
f.setCroll(forces.getCroll());
|
||||||
f.setCrollDamp(forces.getCrollDamp());
|
f.setCrollDamp(forces.getCrollDamp());
|
||||||
f.setCrollForce(forces.getCrollForce());
|
f.setCrollForce(forces.getCrollForce());
|
||||||
|
map.put(component, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
total.setCP(total.getCP().average(forces.getCP()));
|
total.setCP(total.getCP().average(forces.getCP()));
|
||||||
@ -236,11 +279,19 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//////////////// DRAG CALCULATIONS ////////////////
|
|
||||||
|
|
||||||
|
|
||||||
|
//////////////// DRAG CALCULATIONS ////////////////
|
||||||
|
//TODO: LOW: clarify what map is doing here, or use it
|
||||||
|
/**
|
||||||
|
* Calculation of drag coefficient due to air friction
|
||||||
|
*
|
||||||
|
* @param configuration Rocket configuration
|
||||||
|
* @param conditions Flight conditions taken into account
|
||||||
|
* @param map ?
|
||||||
|
* @param set Set to handle
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
private double calculateFrictionDrag(Configuration configuration, FlightConditions conditions,
|
private double calculateFrictionDrag(Configuration configuration, FlightConditions conditions,
|
||||||
Map<RocketComponent, AerodynamicForces> map, WarningSet set) {
|
Map<RocketComponent, AerodynamicForces> map, WarningSet set) {
|
||||||
double c1 = 1.0, c2 = 1.0;
|
double c1 = 1.0, c2 = 1.0;
|
||||||
@ -249,8 +300,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
double Re;
|
double Re;
|
||||||
double Cf;
|
double Cf;
|
||||||
|
|
||||||
if (calcMap == null)
|
checkCalcMap(configuration);
|
||||||
buildCalcMap(configuration);
|
|
||||||
|
|
||||||
Re = conditions.getVelocity() * configuration.getLength() /
|
Re = conditions.getVelocity() * configuration.getLength() /
|
||||||
conditions.getAtmosphericConditions().getKinematicViscosity();
|
conditions.getAtmosphericConditions().getKinematicViscosity();
|
||||||
@ -301,7 +351,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
Cf *= c2;
|
Cf *= c2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Assume fully turbulent. Roughness-limitation is checked later.
|
// Assume fully turbulent. Roughness-limitation is checked later.
|
||||||
@ -344,8 +394,8 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
roughnessCorrection = c2 * (mach - 0.9) / 0.2 + c1 * (1.1 - mach) / 0.2;
|
roughnessCorrection = c2 * (mach - 0.9) / 0.2 + c1 * (1.1 - mach) / 0.2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculate the friction drag coefficient.
|
* Calculate the friction drag coefficient.
|
||||||
*
|
*
|
||||||
@ -353,7 +403,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
* fineness ratio (calculated in the same iteration). The fins are corrected
|
* fineness ratio (calculated in the same iteration). The fins are corrected
|
||||||
* for thickness as we go on.
|
* for thickness as we go on.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
double finFriction = 0;
|
double finFriction = 0;
|
||||||
double bodyFriction = 0;
|
double bodyFriction = 0;
|
||||||
double maxR = 0, len = 0;
|
double maxR = 0, len = 0;
|
||||||
@ -371,9 +421,8 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
// Calculate the roughness-limited friction coefficient
|
// Calculate the roughness-limited friction coefficient
|
||||||
Finish finish = ((ExternalComponent) c).getFinish();
|
Finish finish = ((ExternalComponent) c).getFinish();
|
||||||
if (Double.isNaN(roughnessLimited[finish.ordinal()])) {
|
if (Double.isNaN(roughnessLimited[finish.ordinal()])) {
|
||||||
roughnessLimited[finish.ordinal()] =
|
roughnessLimited[finish.ordinal()] = 0.032 * Math.pow(finish.getRoughnessSize() / configuration.getLength(), 0.2) *
|
||||||
0.032 * Math.pow(finish.getRoughnessSize() / configuration.getLength(), 0.2) *
|
roughnessCorrection;
|
||||||
roughnessCorrection;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -397,8 +446,8 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Calculate the friction drag:
|
// Calculate the friction drag:
|
||||||
if (c instanceof SymmetricComponent) {
|
if (c instanceof SymmetricComponent) {
|
||||||
|
|
||||||
@ -448,16 +497,32 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
return (finFriction + correction * bodyFriction) / conditions.getRefArea();
|
return (finFriction + correction * bodyFriction) / conditions.getRefArea();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* method to avoid repetition, create the calcMap if null
|
||||||
|
* @param configuration the rocket configuration
|
||||||
|
*/
|
||||||
|
private void checkCalcMap(Configuration configuration) {
|
||||||
|
if (calcMap == null)
|
||||||
|
buildCalcMap(configuration);
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: LOW: clarify what map is doing here, or use it
|
||||||
|
/**
|
||||||
|
* Calculation of drag coefficient due to pressure
|
||||||
|
*
|
||||||
|
* @param configuration Rocket configuration
|
||||||
|
* @param conditions Flight conditions taken into account
|
||||||
|
* @param map ?
|
||||||
|
* @param set Set to handle
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
private double calculatePressureDrag(Configuration configuration, FlightConditions conditions,
|
private double calculatePressureDrag(Configuration configuration, FlightConditions conditions,
|
||||||
Map<RocketComponent, AerodynamicForces> map, WarningSet warnings) {
|
Map<RocketComponent, AerodynamicForces> map, WarningSet warnings) {
|
||||||
|
|
||||||
double stagnation, base, total;
|
double stagnation, base, total;
|
||||||
double radius = 0;
|
double radius = 0;
|
||||||
|
|
||||||
if (calcMap == null)
|
checkCalcMap(configuration);
|
||||||
buildCalcMap(configuration);
|
|
||||||
|
|
||||||
stagnation = calculateStagnationCD(conditions.getMach());
|
stagnation = calculateStagnationCD(conditions.getMach());
|
||||||
base = calculateBaseCD(conditions.getMach());
|
base = calculateBaseCD(conditions.getMach());
|
||||||
@ -476,7 +541,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
map.get(c).setPressureCD(cd);
|
map.get(c).setPressureCD(cd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Stagnation drag
|
// Stagnation drag
|
||||||
if (c instanceof SymmetricComponent) {
|
if (c instanceof SymmetricComponent) {
|
||||||
SymmetricComponent s = (SymmetricComponent) c;
|
SymmetricComponent s = (SymmetricComponent) c;
|
||||||
@ -497,7 +562,16 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: LOW: clarify what map is doing here, or use it
|
||||||
|
/**
|
||||||
|
* Calculation of drag coefficient due to base
|
||||||
|
*
|
||||||
|
* @param configuration Rocket configuration
|
||||||
|
* @param conditions Flight conditions taken into account
|
||||||
|
* @param map ?
|
||||||
|
* @param set Set to handle
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
private double calculateBaseDrag(Configuration configuration, FlightConditions conditions,
|
private double calculateBaseDrag(Configuration configuration, FlightConditions conditions,
|
||||||
Map<RocketComponent, AerodynamicForces> map, WarningSet warnings) {
|
Map<RocketComponent, AerodynamicForces> map, WarningSet warnings) {
|
||||||
|
|
||||||
@ -505,8 +579,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
double radius = 0;
|
double radius = 0;
|
||||||
RocketComponent prevComponent = null;
|
RocketComponent prevComponent = null;
|
||||||
|
|
||||||
if (calcMap == null)
|
checkCalcMap(configuration);
|
||||||
buildCalcMap(configuration);
|
|
||||||
|
|
||||||
base = calculateBaseCD(conditions.getMach());
|
base = calculateBaseCD(conditions.getMach());
|
||||||
total = 0;
|
total = 0;
|
||||||
@ -543,7 +616,11 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets CD by the speed
|
||||||
|
* @param m Mach number for calculation
|
||||||
|
* @return Stagnation CD
|
||||||
|
*/
|
||||||
public static double calculateStagnationCD(double m) {
|
public static double calculateStagnationCD(double m) {
|
||||||
double pressure;
|
double pressure;
|
||||||
if (m <= 1) {
|
if (m <= 1) {
|
||||||
@ -554,7 +631,11 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
return 0.85 * pressure;
|
return 0.85 * pressure;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Calculates base CD
|
||||||
|
* @param m Mach number for calculation
|
||||||
|
* @return Base CD
|
||||||
|
*/
|
||||||
public static double calculateBaseCD(double m) {
|
public static double calculateBaseCD(double m) {
|
||||||
if (m <= 1) {
|
if (m <= 1) {
|
||||||
return 0.12 + 0.13 * m * m;
|
return 0.12 + 0.13 * m * m;
|
||||||
@ -564,21 +645,19 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private static final double[] axialDragPoly1, axialDragPoly2;
|
private static final double[] axialDragPoly1, axialDragPoly2;
|
||||||
static {
|
static {
|
||||||
PolyInterpolator interpolator;
|
PolyInterpolator interpolator;
|
||||||
interpolator = new PolyInterpolator(
|
interpolator = new PolyInterpolator(
|
||||||
new double[] { 0, 17 * Math.PI / 180 },
|
new double[] { 0, 17 * Math.PI / 180 },
|
||||||
new double[] { 0, 17 * Math.PI / 180 }
|
new double[] { 0, 17 * Math.PI / 180 });
|
||||||
);
|
|
||||||
axialDragPoly1 = interpolator.interpolator(1, 1.3, 0, 0);
|
axialDragPoly1 = interpolator.interpolator(1, 1.3, 0, 0);
|
||||||
|
|
||||||
interpolator = new PolyInterpolator(
|
interpolator = new PolyInterpolator(
|
||||||
new double[] { 17 * Math.PI / 180, Math.PI / 2 },
|
new double[] { 17 * Math.PI / 180, Math.PI / 2 },
|
||||||
new double[] { 17 * Math.PI / 180, Math.PI / 2 },
|
new double[] { 17 * Math.PI / 180, Math.PI / 2 },
|
||||||
new double[] { Math.PI / 2 }
|
new double[] { Math.PI / 2 });
|
||||||
);
|
|
||||||
axialDragPoly2 = interpolator.interpolator(1.3, 0, 0, 0, 0);
|
axialDragPoly2 = interpolator.interpolator(1.3, 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -597,7 +676,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
// double sinaoa = conditions.getSinAOA();
|
// double sinaoa = conditions.getSinAOA();
|
||||||
// return cd * (1 + Math.min(sinaoa, 0.25));
|
// return cd * (1 + Math.min(sinaoa, 0.25));
|
||||||
|
|
||||||
|
|
||||||
if (aoa > Math.PI / 2)
|
if (aoa > Math.PI / 2)
|
||||||
aoa = Math.PI - aoa;
|
aoa = Math.PI - aoa;
|
||||||
if (aoa < 17 * Math.PI / 180)
|
if (aoa < 17 * Math.PI / 180)
|
||||||
@ -611,7 +690,12 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
return -mul * cd;
|
return -mul * cd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get damping moments from a rocket in a flight
|
||||||
|
* @param configuration Rocket configuration
|
||||||
|
* @param conditions flight conditions in consideration
|
||||||
|
* @param total acting aerodynamic forces
|
||||||
|
*/
|
||||||
private void calculateDampingMoments(Configuration configuration, FlightConditions conditions,
|
private void calculateDampingMoments(Configuration configuration, FlightConditions conditions,
|
||||||
AerodynamicForces total) {
|
AerodynamicForces total) {
|
||||||
|
|
||||||
@ -632,7 +716,7 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
|
|
||||||
// TODO: MEDIUM: Are the rotation etc. being added correctly? sin/cos theta?
|
// TODO: MEDIUM: Are the rotation etc. being added correctly? sin/cos theta?
|
||||||
|
|
||||||
|
|
||||||
private double getDampingMultiplier(Configuration configuration, FlightConditions conditions,
|
private double getDampingMultiplier(Configuration configuration, FlightConditions conditions,
|
||||||
double cgx) {
|
double cgx) {
|
||||||
if (cacheDiameter < 0) {
|
if (cacheDiameter < 0) {
|
||||||
@ -664,9 +748,10 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
FinSet f = (FinSet) c;
|
FinSet f = (FinSet) c;
|
||||||
mul += 0.6 * Math.min(f.getFinCount(), 4) * f.getFinArea() *
|
mul += 0.6 * Math.min(f.getFinCount(), 4) * f.getFinArea() *
|
||||||
MathUtil.pow3(Math.abs(f.toAbsolute(new Coordinate(
|
MathUtil.pow3(Math.abs(f.toAbsolute(new Coordinate(
|
||||||
((FinSetCalc) calcMap.get(f)).getMidchordPos()))[0].x
|
((FinSetCalc) calcMap.get(f)).getMidchordPos()))[0].x
|
||||||
- cgx)) /
|
- cgx))
|
||||||
(conditions.getRefArea() * conditions.getRefLength());
|
/
|
||||||
|
(conditions.getRefArea() * conditions.getRefLength());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -674,9 +759,8 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//////// The calculator map
|
|
||||||
|
|
||||||
|
//////// The calculator map
|
||||||
@Override
|
@Override
|
||||||
protected void voidAerodynamicCache() {
|
protected void voidAerodynamicCache() {
|
||||||
super.voidAerodynamicCache();
|
super.voidAerodynamicCache();
|
||||||
@ -686,7 +770,10 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
cacheLength = -1;
|
cacheLength = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* caches the map for aerodynamics calculations
|
||||||
|
* @param configuration the rocket configuration
|
||||||
|
*/
|
||||||
private void buildCalcMap(Configuration configuration) {
|
private void buildCalcMap(Configuration configuration) {
|
||||||
Iterator<RocketComponent> iterator;
|
Iterator<RocketComponent> iterator;
|
||||||
|
|
||||||
@ -711,5 +798,5 @@ public class BarrowmanCalculator extends AbstractAerodynamicCalculator {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -63,9 +63,12 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
/** Current roll rate. */
|
/** Current roll rate. */
|
||||||
private double rollRate = 0;
|
private double rollRate = 0;
|
||||||
|
|
||||||
|
/** Current pitch rate. */
|
||||||
private double pitchRate = 0;
|
private double pitchRate = 0;
|
||||||
|
/** Current yaw rate. */
|
||||||
private double yawRate = 0;
|
private double yawRate = 0;
|
||||||
|
|
||||||
|
|
||||||
private Coordinate pitchCenter = Coordinate.NUL;
|
private Coordinate pitchCenter = Coordinate.NUL;
|
||||||
|
|
||||||
|
|
||||||
@ -102,6 +105,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the reference length and area.
|
* Set the reference length and area.
|
||||||
|
* fires change event
|
||||||
*/
|
*/
|
||||||
public void setRefLength(double length) {
|
public void setRefLength(double length) {
|
||||||
refLength = length;
|
refLength = length;
|
||||||
@ -111,7 +115,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the reference length.
|
* @return the reference length.
|
||||||
*/
|
*/
|
||||||
public double getRefLength() {
|
public double getRefLength() {
|
||||||
return refLength;
|
return refLength;
|
||||||
@ -119,6 +123,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the reference area and length.
|
* Set the reference area and length.
|
||||||
|
* fires change event
|
||||||
*/
|
*/
|
||||||
public void setRefArea(double area) {
|
public void setRefArea(double area) {
|
||||||
refArea = area;
|
refArea = area;
|
||||||
@ -127,7 +132,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the reference area.
|
* @return the reference area.
|
||||||
*/
|
*/
|
||||||
public double getRefArea() {
|
public double getRefArea() {
|
||||||
return refArea;
|
return refArea;
|
||||||
@ -137,7 +142,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
/**
|
/**
|
||||||
* Sets the angle of attack. It calculates values also for the methods
|
* Sets the angle of attack. It calculates values also for the methods
|
||||||
* {@link #getSinAOA()} and {@link #getSincAOA()}.
|
* {@link #getSinAOA()} and {@link #getSincAOA()}.
|
||||||
*
|
* fires change event if it's different from previous value
|
||||||
* @param aoa the angle of attack.
|
* @param aoa the angle of attack.
|
||||||
*/
|
*/
|
||||||
public void setAOA(double aoa) {
|
public void setAOA(double aoa) {
|
||||||
@ -162,6 +167,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
* to be the sine of <code>aoa</code> for cases in which this value is known.
|
* to be the sine of <code>aoa</code> for cases in which this value is known.
|
||||||
* The AOA must still be specified, as the sine is not unique in the range
|
* The AOA must still be specified, as the sine is not unique in the range
|
||||||
* of 0..180 degrees.
|
* of 0..180 degrees.
|
||||||
|
* fires change event if it's different from previous value
|
||||||
*
|
*
|
||||||
* @param aoa the angle of attack in radians.
|
* @param aoa the angle of attack in radians.
|
||||||
* @param sinAOA the sine of the angle of attack.
|
* @param sinAOA the sine of the angle of attack.
|
||||||
@ -186,21 +192,21 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the angle of attack.
|
* @return the angle of attack.
|
||||||
*/
|
*/
|
||||||
public double getAOA() {
|
public double getAOA() {
|
||||||
return aoa;
|
return aoa;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the sine of the angle of attack.
|
* @return the sine of the angle of attack.
|
||||||
*/
|
*/
|
||||||
public double getSinAOA() {
|
public double getSinAOA() {
|
||||||
return sinAOA;
|
return sinAOA;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the sinc of the angle of attack (sin(AOA) / AOA). This method returns
|
* @return the sinc of the angle of attack (sin(AOA) / AOA). This method returns
|
||||||
* one if the angle of attack is zero.
|
* one if the angle of attack is zero.
|
||||||
*/
|
*/
|
||||||
public double getSincAOA() {
|
public double getSincAOA() {
|
||||||
@ -210,6 +216,8 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the direction of the lateral airflow.
|
* Set the direction of the lateral airflow.
|
||||||
|
* fires change event if it's different from previous value
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
public void setTheta(double theta) {
|
public void setTheta(double theta) {
|
||||||
if (MathUtil.equals(this.theta, theta))
|
if (MathUtil.equals(this.theta, theta))
|
||||||
@ -219,7 +227,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the direction of the lateral airflow.
|
* @return the direction of the lateral airflow.
|
||||||
*/
|
*/
|
||||||
public double getTheta() {
|
public double getTheta() {
|
||||||
return theta;
|
return theta;
|
||||||
@ -229,6 +237,8 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
/**
|
/**
|
||||||
* Set the current Mach speed. This should be (but is not required to be) in
|
* Set the current Mach speed. This should be (but is not required to be) in
|
||||||
* reference to the speed of sound of the atmospheric conditions.
|
* reference to the speed of sound of the atmospheric conditions.
|
||||||
|
*
|
||||||
|
* fires change event if it's different from previous value
|
||||||
*/
|
*/
|
||||||
public void setMach(double mach) {
|
public void setMach(double mach) {
|
||||||
mach = Math.max(mach, 0);
|
mach = Math.max(mach, 0);
|
||||||
@ -244,7 +254,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the current Mach speed.
|
* @return the current Mach speed.
|
||||||
*/
|
*/
|
||||||
public double getMach() {
|
public double getMach() {
|
||||||
return mach;
|
return mach;
|
||||||
@ -272,7 +282,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return sqrt(abs(1 - Mach^2)). This is calculated in the setting call and is
|
* @return sqrt(abs(1 - Mach^2)). This is calculated in the setting call and is
|
||||||
* therefore fast.
|
* therefore fast.
|
||||||
*/
|
*/
|
||||||
public double getBeta() {
|
public double getBeta() {
|
||||||
@ -281,7 +291,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the current roll rate.
|
* @return the current roll rate.
|
||||||
*/
|
*/
|
||||||
public double getRollRate() {
|
public double getRollRate() {
|
||||||
return rollRate;
|
return rollRate;
|
||||||
@ -290,6 +300,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the current roll rate.
|
* Set the current roll rate.
|
||||||
|
* fires change event if it's different from previous
|
||||||
*/
|
*/
|
||||||
public void setRollRate(double rate) {
|
public void setRollRate(double rate) {
|
||||||
if (MathUtil.equals(this.rollRate, rate))
|
if (MathUtil.equals(this.rollRate, rate))
|
||||||
@ -300,11 +311,19 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return current pitch rate
|
||||||
|
*/
|
||||||
public double getPitchRate() {
|
public double getPitchRate() {
|
||||||
return pitchRate;
|
return pitchRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets the pitch rate
|
||||||
|
* fires change event if it's different from previous
|
||||||
|
* @param pitchRate
|
||||||
|
*/
|
||||||
public void setPitchRate(double pitchRate) {
|
public void setPitchRate(double pitchRate) {
|
||||||
if (MathUtil.equals(this.pitchRate, pitchRate))
|
if (MathUtil.equals(this.pitchRate, pitchRate))
|
||||||
return;
|
return;
|
||||||
@ -312,7 +331,10 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
fireChangeEvent();
|
fireChangeEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return current yaw rate
|
||||||
|
*/
|
||||||
public double getYawRate() {
|
public double getYawRate() {
|
||||||
return yawRate;
|
return yawRate;
|
||||||
}
|
}
|
||||||
@ -402,7 +424,7 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a copy of the flight conditions. The copy has no listeners. The
|
* @return a copy of the flight conditions. The copy has no listeners. The
|
||||||
* atmospheric conditions is also cloned.
|
* atmospheric conditions is also cloned.
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
@ -454,6 +476,9 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
|
|||||||
listenerList.remove(listener);
|
listenerList.remove(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wake up call to listeners
|
||||||
|
*/
|
||||||
protected void fireChangeEvent() {
|
protected void fireChangeEvent() {
|
||||||
modID = UniqueID.next();
|
modID = UniqueID.next();
|
||||||
// Copy the list before iterating to prevent concurrent modification exceptions.
|
// Copy the list before iterating to prevent concurrent modification exceptions.
|
||||||
|
@ -7,10 +7,11 @@ import net.sf.openrocket.unit.UnitGroup;
|
|||||||
|
|
||||||
public abstract class Warning {
|
public abstract class Warning {
|
||||||
|
|
||||||
|
/** support to multiple languages warning */
|
||||||
private static final Translator trans = Application.getTranslator();
|
private static final Translator trans = Application.getTranslator();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a Warning with the specific text.
|
* @return a Warning with the specific text.
|
||||||
*/
|
*/
|
||||||
public static Warning fromString(String text) {
|
public static Warning fromString(String text) {
|
||||||
return new Warning.Other(text);
|
return new Warning.Other(text);
|
||||||
@ -321,43 +322,33 @@ public abstract class Warning {
|
|||||||
|
|
||||||
/** A <code>Warning</code> that the body diameter is discontinuous. */
|
/** A <code>Warning</code> that the body diameter is discontinuous. */
|
||||||
////Discontinuity in rocket body diameter.
|
////Discontinuity in rocket body diameter.
|
||||||
public static final Warning DISCONTINUITY =
|
public static final Warning DISCONTINUITY = new Other(trans.get("Warning.DISCONTINUITY"));
|
||||||
new Other(trans.get("Warning.DISCONTINUITY"));
|
|
||||||
|
|
||||||
/** A <code>Warning</code> that the fins are thick compared to the rocket body. */
|
/** A <code>Warning</code> that the fins are thick compared to the rocket body. */
|
||||||
////Thick fins may not be modeled accurately.
|
////Thick fins may not be modeled accurately.
|
||||||
public static final Warning THICK_FIN =
|
public static final Warning THICK_FIN = new Other(trans.get("Warning.THICK_FIN"));
|
||||||
new Other(trans.get("Warning.THICK_FIN"));
|
|
||||||
|
|
||||||
/** A <code>Warning</code> that the fins have jagged edges. */
|
/** A <code>Warning</code> that the fins have jagged edges. */
|
||||||
////Jagged-edged fin predictions may be inaccurate.
|
////Jagged-edged fin predictions may be inaccurate.
|
||||||
public static final Warning JAGGED_EDGED_FIN =
|
public static final Warning JAGGED_EDGED_FIN = new Other(trans.get("Warning.JAGGED_EDGED_FIN"));
|
||||||
new Other(trans.get("Warning.JAGGED_EDGED_FIN"));
|
|
||||||
|
|
||||||
/** A <code>Warning</code> that simulation listeners have affected the simulation */
|
/** A <code>Warning</code> that simulation listeners have affected the simulation */
|
||||||
////Listeners modified the flight simulation
|
////Listeners modified the flight simulation
|
||||||
public static final Warning LISTENERS_AFFECTED =
|
public static final Warning LISTENERS_AFFECTED = new Other(trans.get("Warning.LISTENERS_AFFECTED"));
|
||||||
new Other(trans.get("Warning.LISTENERS_AFFECTED"));
|
|
||||||
|
|
||||||
////Recovery device opened while motor still burning.
|
////Recovery device opened while motor still burning.
|
||||||
public static final Warning RECOVERY_DEPLOYMENT_WHILE_BURNING =
|
public static final Warning RECOVERY_DEPLOYMENT_WHILE_BURNING = new Other(trans.get("Warning.RECOVERY_DEPLOYMENT_WHILE_BURNING"));
|
||||||
new Other(trans.get("Warning.RECOVERY_DEPLOYMENT_WHILE_BURNING"));
|
|
||||||
|
|
||||||
|
|
||||||
//// Invalid parameter encountered, ignoring.
|
//// Invalid parameter encountered, ignoring.
|
||||||
public static final Warning FILE_INVALID_PARAMETER =
|
public static final Warning FILE_INVALID_PARAMETER = new Other(trans.get("Warning.FILE_INVALID_PARAMETER"));
|
||||||
new Other(trans.get("Warning.FILE_INVALID_PARAMETER"));
|
|
||||||
|
|
||||||
public static final Warning PARALLEL_FINS =
|
public static final Warning PARALLEL_FINS = new Other(trans.get("Warning.PARALLEL_FINS"));
|
||||||
new Other(trans.get("Warning.PARALLEL_FINS"));
|
|
||||||
|
|
||||||
public static final Warning SUPERSONIC =
|
public static final Warning SUPERSONIC = new Other(trans.get("Warning.SUPERSONIC"));
|
||||||
new Other(trans.get("Warning.SUPERSONIC"));
|
|
||||||
|
|
||||||
public static final Warning RECOVERY_LAUNCH_ROD =
|
public static final Warning RECOVERY_LAUNCH_ROD = new Other(trans.get("Warning.RECOVERY_LAUNCH_ROD"));
|
||||||
new Other(trans.get("Warning.RECOVERY_LAUNCH_ROD"));
|
|
||||||
|
|
||||||
public static final Warning TUMBLE_UNDER_THRUST =
|
public static final Warning TUMBLE_UNDER_THRUST = new Other(trans.get("Warning.TUMBLE_UNDER_THRUST"));
|
||||||
new Other(trans.get("Warning.TUMBLE_UNDER_THRUST"));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@ import net.sf.openrocket.util.Mutable;
|
|||||||
*/
|
*/
|
||||||
public class WarningSet extends AbstractSet<Warning> implements Cloneable, Monitorable {
|
public class WarningSet extends AbstractSet<Warning> implements Cloneable, Monitorable {
|
||||||
|
|
||||||
|
/** the actual array of warnings*/
|
||||||
private ArrayList<Warning> warnings = new ArrayList<Warning>();
|
private ArrayList<Warning> warnings = new ArrayList<Warning>();
|
||||||
|
|
||||||
private Mutable mutable = new Mutable();
|
private Mutable mutable = new Mutable();
|
||||||
|
@ -5,6 +5,9 @@ import static net.sf.openrocket.util.MathUtil.pow2;
|
|||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import net.sf.openrocket.aerodynamics.AerodynamicForces;
|
import net.sf.openrocket.aerodynamics.AerodynamicForces;
|
||||||
import net.sf.openrocket.aerodynamics.FlightConditions;
|
import net.sf.openrocket.aerodynamics.FlightConditions;
|
||||||
import net.sf.openrocket.aerodynamics.Warning;
|
import net.sf.openrocket.aerodynamics.Warning;
|
||||||
@ -17,14 +20,13 @@ import net.sf.openrocket.util.LinearInterpolator;
|
|||||||
import net.sf.openrocket.util.MathUtil;
|
import net.sf.openrocket.util.MathUtil;
|
||||||
import net.sf.openrocket.util.PolyInterpolator;
|
import net.sf.openrocket.util.PolyInterpolator;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.slf4j.LoggerFactory;
|
|
||||||
|
|
||||||
|
|
||||||
public class FinSetCalc extends RocketComponentCalc {
|
public class FinSetCalc extends RocketComponentCalc {
|
||||||
|
|
||||||
|
/** logger for debugging*/
|
||||||
private final static Logger logger = LoggerFactory.getLogger(FinSetCalc.class);
|
private final static Logger logger = LoggerFactory.getLogger(FinSetCalc.class);
|
||||||
|
|
||||||
|
/** considers the stall angle as 20 degrees*/
|
||||||
private static final double STALL_ANGLE = (20 * Math.PI / 180);
|
private static final double STALL_ANGLE = (20 * Math.PI / 180);
|
||||||
|
|
||||||
/** Number of divisions in the fin chords. */
|
/** Number of divisions in the fin chords. */
|
||||||
@ -57,25 +59,27 @@ public class FinSetCalc extends RocketComponentCalc {
|
|||||||
private final double cantAngle;
|
private final double cantAngle;
|
||||||
private final FinSet.CrossSection crossSection;
|
private final FinSet.CrossSection crossSection;
|
||||||
|
|
||||||
public FinSetCalc(RocketComponent component) {
|
/**
|
||||||
|
* builds a calculator of aerodynamic forces a specified fin
|
||||||
|
* @param component The fin in consideration
|
||||||
|
*/
|
||||||
|
///why is this accepting RocketComponent when it rejects?
|
||||||
|
///why not put FinSet in the parameter instead?
|
||||||
|
public FinSetCalc(FinSet component) {
|
||||||
super(component);
|
super(component);
|
||||||
if (!(component instanceof FinSet)) {
|
|
||||||
throw new IllegalArgumentException("Illegal component type " + component);
|
|
||||||
}
|
|
||||||
|
|
||||||
FinSet fin = (FinSet) component;
|
thickness = component.getThickness();
|
||||||
thickness = fin.getThickness();
|
bodyRadius = component.getBodyRadius();
|
||||||
bodyRadius = fin.getBodyRadius();
|
finCount = component.getFinCount();
|
||||||
finCount = fin.getFinCount();
|
baseRotation = component.getBaseRotation();
|
||||||
baseRotation = fin.getBaseRotation();
|
cantAngle = component.getCantAngle();
|
||||||
cantAngle = fin.getCantAngle();
|
span = component.getSpan();
|
||||||
span = fin.getSpan();
|
finArea = component.getFinArea();
|
||||||
finArea = fin.getFinArea();
|
crossSection = component.getCrossSection();
|
||||||
crossSection = fin.getCrossSection();
|
|
||||||
|
|
||||||
calculateFinGeometry(fin);
|
calculateFinGeometry(component);
|
||||||
calculatePoly();
|
calculatePoly();
|
||||||
calculateInterferenceFinCount(fin);
|
calculateInterferenceFinCount(component);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -439,8 +443,7 @@ public class FinSetCalc extends RocketComponentCalc {
|
|||||||
private static final PolyInterpolator cnaInterpolator = new PolyInterpolator(
|
private static final PolyInterpolator cnaInterpolator = new PolyInterpolator(
|
||||||
new double[] { CNA_SUBSONIC, CNA_SUPERSONIC },
|
new double[] { CNA_SUBSONIC, CNA_SUPERSONIC },
|
||||||
new double[] { CNA_SUBSONIC, CNA_SUPERSONIC },
|
new double[] { CNA_SUBSONIC, CNA_SUPERSONIC },
|
||||||
new double[] { CNA_SUBSONIC }
|
new double[] { CNA_SUBSONIC });
|
||||||
);
|
|
||||||
/* Pre-calculate the values for K1, K2 and K3 */
|
/* Pre-calculate the values for K1, K2 and K3 */
|
||||||
static {
|
static {
|
||||||
// Up to Mach 5
|
// Up to Mach 5
|
||||||
|
@ -16,26 +16,48 @@ public class Appearance {
|
|||||||
private final double shine;
|
private final double shine;
|
||||||
private final Decal texture;
|
private final Decal texture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main constructor
|
||||||
|
*
|
||||||
|
* @param paint the color to be used
|
||||||
|
* @param shine shine of the appearance, will be clamped between 0 and 1
|
||||||
|
* @param texture The appearance texture
|
||||||
|
*/
|
||||||
public Appearance(final Color paint, final double shine, final Decal texture) {
|
public Appearance(final Color paint, final double shine, final Decal texture) {
|
||||||
this.paint = paint;
|
this.paint = paint;
|
||||||
this.shine = MathUtil.clamp(shine, 0, 1);
|
this.shine = MathUtil.clamp(shine, 0, 1);
|
||||||
this.texture = texture;
|
this.texture = texture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main constructor
|
||||||
|
*
|
||||||
|
* @param paint the color to be used
|
||||||
|
* @param shine shine of the appearance, will be clamped between 0 and 1
|
||||||
|
*/
|
||||||
public Appearance(final Color paint, final double shine) {
|
public Appearance(final Color paint, final double shine) {
|
||||||
this.paint = paint;
|
this.paint = paint;
|
||||||
this.shine = MathUtil.clamp(shine, 0, 1);
|
this.shine = MathUtil.clamp(shine, 0, 1);
|
||||||
this.texture = null;
|
this.texture = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return colr of the appearance
|
||||||
|
*/
|
||||||
public Color getPaint() {
|
public Color getPaint() {
|
||||||
return paint;
|
return paint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Shine of appearance
|
||||||
|
*/
|
||||||
public double getShine() {
|
public double getShine() {
|
||||||
return shine;
|
return shine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Texture used in appearance
|
||||||
|
*/
|
||||||
public Decal getTexture() {
|
public Decal getTexture() {
|
||||||
return texture;
|
return texture;
|
||||||
}
|
}
|
||||||
|
@ -18,25 +18,38 @@ import net.sf.openrocket.util.Coordinate;
|
|||||||
*/
|
*/
|
||||||
public class AppearanceBuilder extends AbstractChangeSource {
|
public class AppearanceBuilder extends AbstractChangeSource {
|
||||||
|
|
||||||
private Color paint;
|
private Color paint; //current cached color
|
||||||
private double shine;
|
private double shine; //current cached shine
|
||||||
private double offsetU, offsetV;
|
private double offsetU, offsetV;//current offset to be used
|
||||||
private double centerU, centerV;
|
private double centerU, centerV;//current values for the center of the appearance
|
||||||
private double scaleU, scaleV;
|
private double scaleU, scaleV; //current values for scaling
|
||||||
private double rotation;
|
private double rotation; //
|
||||||
private DecalImage image;
|
private DecalImage image;
|
||||||
private Decal.EdgeMode edgeMode;
|
private Decal.EdgeMode edgeMode;
|
||||||
|
|
||||||
private boolean batch;
|
private boolean batch;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default constructor
|
||||||
|
* Set the builder to make appearance of null values
|
||||||
|
*
|
||||||
|
*/
|
||||||
public AppearanceBuilder() {
|
public AppearanceBuilder() {
|
||||||
resetToDefaults();
|
resetToDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor that initializes already with a
|
||||||
|
*
|
||||||
|
* @param a the appearance to be copied
|
||||||
|
*/
|
||||||
public AppearanceBuilder(Appearance a) {
|
public AppearanceBuilder(Appearance a) {
|
||||||
setAppearance(a);
|
setAppearance(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the builder cache and set to build blank appearances
|
||||||
|
*/
|
||||||
private void resetToDefaults() {
|
private void resetToDefaults() {
|
||||||
paint = new Color(0, 0, 0);
|
paint = new Color(0, 0, 0);
|
||||||
shine = 0;
|
shine = 0;
|
||||||
@ -46,8 +59,15 @@ public class AppearanceBuilder extends AbstractChangeSource {
|
|||||||
rotation = 0;
|
rotation = 0;
|
||||||
image = null;
|
image = null;
|
||||||
edgeMode = EdgeMode.REPEAT;
|
edgeMode = EdgeMode.REPEAT;
|
||||||
|
fireChangeEvent();//shouldn't this fire change event?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the builder to create appearance equals to an existing appearance
|
||||||
|
* Fires change only once, hence the call to batch
|
||||||
|
*
|
||||||
|
* @param a the appearance to be used as the new template
|
||||||
|
*/
|
||||||
public void setAppearance(final Appearance a) {
|
public void setAppearance(final Appearance a) {
|
||||||
batch(new Runnable() {
|
batch(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
@ -56,20 +76,33 @@ public class AppearanceBuilder extends AbstractChangeSource {
|
|||||||
if (a != null) {
|
if (a != null) {
|
||||||
setPaint(a.getPaint());
|
setPaint(a.getPaint());
|
||||||
setShine(a.getShine());
|
setShine(a.getShine());
|
||||||
Decal d = a.getTexture();
|
setDecal(a.getTexture());
|
||||||
if (d != null) {
|
|
||||||
setOffset(d.getOffset().x, d.getOffset().y);
|
|
||||||
setCenter(d.getCenter().x, d.getCenter().y);
|
|
||||||
setScaleUV(d.getScale().x, d.getScale().y);
|
|
||||||
setRotation(d.getRotation());
|
|
||||||
setEdgeMode(d.getEdgeMode());
|
|
||||||
setImage(d.getImage());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* makes a full copy of a decal, including information of offsets, center and scale
|
||||||
|
*
|
||||||
|
* @param d The decal
|
||||||
|
*/
|
||||||
|
public void setDecal(Decal d){
|
||||||
|
if (d != null) {
|
||||||
|
setOffset(d.getOffset().x, d.getOffset().y);
|
||||||
|
setCenter(d.getCenter().x, d.getCenter().y);
|
||||||
|
setScaleUV(d.getScale().x, d.getScale().y);
|
||||||
|
setRotation(d.getRotation());
|
||||||
|
setEdgeMode(d.getEdgeMode());
|
||||||
|
setImage(d.getImage());
|
||||||
|
}
|
||||||
|
fireChangeEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Method creates another object of Appearance
|
||||||
|
* @return the created appearance
|
||||||
|
*/
|
||||||
public Appearance getAppearance() {
|
public Appearance getAppearance() {
|
||||||
|
|
||||||
Decal t = null;
|
Decal t = null;
|
||||||
@ -88,143 +121,316 @@ public class AppearanceBuilder extends AbstractChangeSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get current paint in template
|
||||||
|
*
|
||||||
|
* return the color used in the current paint
|
||||||
|
*/
|
||||||
public Color getPaint() {
|
public Color getPaint() {
|
||||||
return paint;
|
return paint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets a new paint color to be used
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param paint the new color
|
||||||
|
*/
|
||||||
public void setPaint(Color paint) {
|
public void setPaint(Color paint) {
|
||||||
this.paint = paint;
|
this.paint = paint;
|
||||||
fireChangeEvent();
|
fireChangeEvent();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current shine
|
||||||
|
*
|
||||||
|
* @return current shine in template
|
||||||
|
*/
|
||||||
public double getShine() {
|
public double getShine() {
|
||||||
return shine;
|
return shine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a new shine for template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param shine the new shine for template
|
||||||
|
*/
|
||||||
public void setShine(double shine) {
|
public void setShine(double shine) {
|
||||||
this.shine = shine;
|
this.shine = shine;
|
||||||
fireChangeEvent();
|
fireChangeEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current offset axis U used
|
||||||
|
*
|
||||||
|
* @return offset in axis U
|
||||||
|
*/
|
||||||
public double getOffsetU() {
|
public double getOffsetU() {
|
||||||
return offsetU;
|
return offsetU;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets a new offset in axis U for template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param offsetU the new offset to be used
|
||||||
|
*/
|
||||||
public void setOffsetU(double offsetU) {
|
public void setOffsetU(double offsetU) {
|
||||||
this.offsetU = offsetU;
|
this.offsetU = offsetU;
|
||||||
fireChangeEvent();
|
fireChangeEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current offset axis V used
|
||||||
|
*
|
||||||
|
* @return offset in axis V
|
||||||
|
*/
|
||||||
public double getOffsetV() {
|
public double getOffsetV() {
|
||||||
return offsetV;
|
return offsetV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets a new offset in axis V for template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param offsetV the new offset to be used
|
||||||
|
*/
|
||||||
public void setOffsetV(double offsetV) {
|
public void setOffsetV(double offsetV) {
|
||||||
this.offsetV = offsetV;
|
this.offsetV = offsetV;
|
||||||
fireChangeEvent();
|
fireChangeEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets a new offset to be used for template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param u offset in axis u
|
||||||
|
* @param v offset in axis v
|
||||||
|
*/
|
||||||
public void setOffset(double u, double v) {
|
public void setOffset(double u, double v) {
|
||||||
setOffsetU(u);
|
setOffsetU(u);
|
||||||
setOffsetV(v);
|
setOffsetV(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current center in axis U used in template
|
||||||
|
*
|
||||||
|
* @return the current value of U of cente in template
|
||||||
|
*/
|
||||||
public double getCenterU() {
|
public double getCenterU() {
|
||||||
return centerU;
|
return centerU;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set a new value for axis U for center in template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param centerU value of axis U for center
|
||||||
|
*/
|
||||||
public void setCenterU(double centerU) {
|
public void setCenterU(double centerU) {
|
||||||
this.centerU = centerU;
|
this.centerU = centerU;
|
||||||
fireChangeEvent();
|
fireChangeEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current center in axis V used in template
|
||||||
|
*
|
||||||
|
* @return the current value of V of cente in template
|
||||||
|
*/
|
||||||
public double getCenterV() {
|
public double getCenterV() {
|
||||||
return centerV;
|
return centerV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set a new value for axis V for center in template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param centerU value of axis V for center
|
||||||
|
*/
|
||||||
public void setCenterV(double centerV) {
|
public void setCenterV(double centerV) {
|
||||||
this.centerV = centerV;
|
this.centerV = centerV;
|
||||||
fireChangeEvent();
|
fireChangeEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets a new center for template
|
||||||
|
* fires chenge event
|
||||||
|
*
|
||||||
|
* @param u new value for axis u of the center
|
||||||
|
* @param v new value for axis v of the center
|
||||||
|
*/
|
||||||
public void setCenter(double u, double v) {
|
public void setCenter(double u, double v) {
|
||||||
setCenterU(u);
|
setCenterU(u);
|
||||||
setCenterV(v);
|
setCenterV(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current scale value of axis u in template
|
||||||
|
*
|
||||||
|
* @return current value for axis u of scale
|
||||||
|
*/
|
||||||
public double getScaleU() {
|
public double getScaleU() {
|
||||||
return scaleU;
|
return scaleU;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets a new value of axis U for scaling in the template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param scaleU new value of scalling in axis U
|
||||||
|
*/
|
||||||
public void setScaleU(double scaleU) {
|
public void setScaleU(double scaleU) {
|
||||||
this.scaleU = scaleU;
|
this.scaleU = scaleU;
|
||||||
fireChangeEvent();
|
fireChangeEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current scale value of axis V in template
|
||||||
|
*
|
||||||
|
* @return current value for axis V of scale
|
||||||
|
*/
|
||||||
public double getScaleV() {
|
public double getScaleV() {
|
||||||
return scaleV;
|
return scaleV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets a new value of axis V for scaling in the template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param scaleV new value of scalling in axis V
|
||||||
|
*/
|
||||||
public void setScaleV(double scaleV) {
|
public void setScaleV(double scaleV) {
|
||||||
this.scaleV = scaleV;
|
this.scaleV = scaleV;
|
||||||
fireChangeEvent();
|
fireChangeEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets a new value of both axis for scaling in the template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param u new value of scalling in axis U
|
||||||
|
* @param v new value of scalling in axis v
|
||||||
|
*/
|
||||||
public void setScaleUV(double u, double v) {
|
public void setScaleUV(double u, double v) {
|
||||||
setScaleU(u);
|
setScaleU(u);
|
||||||
setScaleV(v);
|
setScaleV(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current value of X axis for scalling in the template
|
||||||
|
*
|
||||||
|
* @return value of scalling in axis x
|
||||||
|
*/
|
||||||
public double getScaleX() {
|
public double getScaleX() {
|
||||||
return 1.0 / getScaleU();
|
return 1.0 / getScaleU();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setScaleX(double scaleU) {
|
/**
|
||||||
setScaleU(1.0 / scaleU);
|
* sets a new value of axis X for scalling in template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param scaleX the new value for axis X
|
||||||
|
*/
|
||||||
|
public void setScaleX(double scaleX) {
|
||||||
|
setScaleU(1.0 / scaleX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current value of Y axis for scalling in the template
|
||||||
|
*
|
||||||
|
* @return value of scalling in axis Y
|
||||||
|
*/
|
||||||
public double getScaleY() {
|
public double getScaleY() {
|
||||||
return 1.0 / getScaleV();
|
return 1.0 / getScaleV();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setScaleY(double scaleV) {
|
/**
|
||||||
setScaleV(1.0 / scaleV);
|
* sets a new value of axis Y for scalling in template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param scaleX the new value for axis Y
|
||||||
|
*/
|
||||||
|
public void setScaleY(double scaleY) {
|
||||||
|
setScaleV(1.0 / scaleY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current value of rotation in template
|
||||||
|
*
|
||||||
|
* @return the current rotation in template
|
||||||
|
*/
|
||||||
public double getRotation() {
|
public double getRotation() {
|
||||||
return rotation;
|
return rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets a new value of rotation in template
|
||||||
|
* fires chenge event
|
||||||
|
*
|
||||||
|
* @param rotation the new value for rotation in template
|
||||||
|
*/
|
||||||
public void setRotation(double rotation) {
|
public void setRotation(double rotation) {
|
||||||
this.rotation = rotation;
|
this.rotation = rotation;
|
||||||
fireChangeEvent();
|
fireChangeEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current image in template
|
||||||
|
*
|
||||||
|
* @param the current image in template
|
||||||
|
*/
|
||||||
public DecalImage getImage() {
|
public DecalImage getImage() {
|
||||||
return image;
|
return image;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets a new image in template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param image the new image to be used as template
|
||||||
|
*/
|
||||||
public void setImage(DecalImage image) {
|
public void setImage(DecalImage image) {
|
||||||
this.image = image;
|
this.image = image;
|
||||||
fireChangeEvent();
|
fireChangeEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gets the current Edge mode in use
|
||||||
|
*
|
||||||
|
* @return the current edge mode in template
|
||||||
|
*/
|
||||||
public Decal.EdgeMode getEdgeMode() {
|
public Decal.EdgeMode getEdgeMode() {
|
||||||
return edgeMode;
|
return edgeMode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sets a new edge mode to be used in template
|
||||||
|
* fires change event
|
||||||
|
*
|
||||||
|
* @param edgeMode the new edgeMode to be used
|
||||||
|
*/
|
||||||
public void setEdgeMode(Decal.EdgeMode edgeMode) {
|
public void setEdgeMode(Decal.EdgeMode edgeMode) {
|
||||||
this.edgeMode = edgeMode;
|
this.edgeMode = edgeMode;
|
||||||
fireChangeEvent();
|
fireChangeEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* only applies change if there is no more changes comming
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void fireChangeEvent() {
|
protected void fireChangeEvent() {
|
||||||
if (!batch)
|
if (!batch)
|
||||||
super.fireChangeEvent();
|
super.fireChangeEvent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* function that garantees that chenges event only occurs after all changes are made
|
||||||
|
*
|
||||||
|
* param r the functor to be executed
|
||||||
|
*/
|
||||||
public void batch(Runnable r) {
|
public void batch(Runnable r) {
|
||||||
batch = true;
|
batch = true;
|
||||||
r.run();
|
r.run();
|
||||||
|
@ -31,6 +31,9 @@ public class AbstractChangeSource implements ChangeSource {
|
|||||||
log.trace("Removing change listeners, listener count is now " + listeners.size());
|
log.trace("Removing change listeners, listener count is now " + listeners.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* execute a change event from any listeners that are triggered by it
|
||||||
|
*/
|
||||||
public void fireChangeEvent(Object source) {
|
public void fireChangeEvent(Object source) {
|
||||||
EventObject event = new EventObject(source);
|
EventObject event = new EventObject(source);
|
||||||
// Copy the list before iterating to prevent concurrent modification exceptions.
|
// Copy the list before iterating to prevent concurrent modification exceptions.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user