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; } }