package uk.co.flyingsquirrels.aero;
import org.jbox2d.common.Vec2;
import uk.co.flyingsquirrels.models.AirDataSource;
import uk.co.flyingsquirrels.models.Control;
import uk.co.flyingsquirrels.models.ControllableComponentTemplate;
import uk.co.flyingsquirrels.utils.MathUtils;
/**
* Calculates lift/drag vectors and moments for an airfoil of a certain size
*/
public class Wing extends ControllableComponentTemplate {
private static final float RHO = 1.2f;
private final Airfoil airfoil;
private final float wingArea;
private final AirDataSource airData;
private float incidence;
private float lift;
private float drag;
private float moment;
public Wing(Airfoil airfoil, float wingArea, float incidence, Vec2 localPosition, AirDataSource airData) {
super(localPosition, null);
this.airfoil = airfoil;
this.wingArea = wingArea;
this.incidence = incidence;
this.airData = airData;
}
public Wing(Airfoil airfoil, float wingArea, float incidence, Vec2 localPosition, AirDataSource airData, Control control) {
super(localPosition, control);
this.airfoil = airfoil;
this.wingArea = wingArea;
this.incidence = incidence;
this.airData = airData;
}
/**
* Returns the lift+drag vector perpendicular to the direction of airflow
*/
public Vec2 getForce() {
return new Vec2(-drag, lift);
}
/**
* Returns the moment about 1/4 chord
*/
public float getMoment() {
return moment;
}
public void updateInternal(float seconds) {
if (getControl() != null) {
incidence = getControl().getValue();
}
Vec2 v = airData.getVelocity();
float qWingArea = 0.5f * getAirDensity() * v.lengthSquared() * wingArea;
float pitch = airData.getPitch();
float airflowDirection = MathUtils.clampAngle(Double.valueOf(Math.atan2(v.y, v.x)).floatValue());
float alpha = MathUtils.clampAngle(pitch + incidence - airflowDirection);
lift = Double.valueOf(airfoil.getCl(alpha) * qWingArea).floatValue();
drag = Double.valueOf(airfoil.getCd(alpha) * qWingArea).floatValue();
moment = Double.valueOf(airfoil.getCm(alpha) * qWingArea).floatValue();
}
private float getAirDensity() {
airData.getAltitude(); // do something with this
return RHO;
}
}