#include "Math.hpp"
#include "Surface.hpp"
#include "Wing.hpp"
+
namespace yasim {
Wing::Wing()
_stall = 0;
_stallWidth = 0;
_stallPeak = 0;
+ _twist = 0;
_camber = 0;
_incidence = 0;
+ _inducedDrag = 1;
_dragScale = 1;
_liftRatio = 1;
_flap0Start = 0;
_stallPeak = fraction;
}
+void Wing::setTwist(float angle)
+{
+ _twist = angle;
+}
+
void Wing::setCamber(float camber)
{
_camber = camber;
}
}
+void Wing::setFlap0Effectiveness(float lval)
+{
+ lval = Math::clamp(lval, 1, 10);
+ int i;
+ for(i=0; i<_flap0Surfs.size(); i++) {
+ ((Surface*)_flap0Surfs.get(i))->setFlapEffectiveness(lval);
+// if(_mirror) ((Surface*)_flap0Surfs.get(++i))->setFlapEffectiveness(rval);
+ }
+}
+
void Wing::setFlap1(float lval, float rval)
{
lval = Math::clamp(lval, -1, 1);
}
}
+void Wing::setFlap1Effectiveness(float lval)
+{
+ lval = Math::clamp(lval, 1, 10);
+ int i;
+ for(i=0; i<_flap1Surfs.size(); i++) {
+ ((Surface*)_flap1Surfs.get(i))->setFlapEffectiveness(lval);
+// if(_mirror) ((Surface*)_flap1Surfs.get(++i))->setFlap(rval);
+ }
+}
+
void Wing::setSpoiler(float lval, float rval)
{
lval = Math::clamp(lval, 0, 1);
// Have we already been compiled?
if(_surfs.size() != 0) return;
- // Assemble the start/end coordinates into an array, sort them,
+ // Assemble the start/end coordinates of all control surfaces
+ // and the wing itself into an array, sort them,
// and remove duplicates. This gives us the boundaries of our
// segments.
- float bounds[8];
+ float bounds[10];
bounds[0] = _flap0Start; bounds[1] = _flap0End;
bounds[2] = _flap1Start; bounds[3] = _flap1End;
bounds[4] = _spoilerStart; bounds[5] = _spoilerEnd;
bounds[6] = _slatStart; bounds[7] = _slatEnd;
+ //and don't forget the root and the tip of the wing itself
+ bounds[8] = 0; bounds[9] = 1;
// Sort in increasing order
int i;
- for(i=0; i<8; i++) {
+ for(i=0; i<10; i++) {
int minIdx = i;
float minVal = bounds[i];
int j;
- for(j=i+1; j<8; j++) {
+ for(j=i+1; j<10; j++) {
if(bounds[j] < minVal) {
minIdx = j;
minVal = bounds[j];
float tmp = bounds[i];
bounds[i] = minVal; bounds[minIdx] = tmp;
}
-
+
// Uniqify
float last = bounds[0];
int nbounds = 1;
- for(i=1; i<8; i++) {
+ for(i=1; i<10; i++) {
if(bounds[i] != last)
bounds[nbounds++] = bounds[i];
last = bounds[i];
// and flap1 are set. Right now flap1 overrides.
int nSegs = (int)Math::ceil((end-start)/segLen);
+ if (_twist != 0 && nSegs < 8) // more segments if twisted
+ nSegs = 8;
float segWid = _length * (end - start)/nSegs;
int j;
sr->surface = s;
sr->weight = chord * segWid;
s->setTotalDrag(sr->weight);
+ s->setTwist(_twist * frac);
_surfs.add(sr);
if(_mirror) {
sr->surface = s;
sr->weight = chord * segWid;
s->setTotalDrag(sr->weight);
+ s->setTwist(_twist * frac);
_surfs.add(sr);
}
}
}
+
+ // Last of all, re-set the incidence in case setIncidence() was
+ // called before we were compiled.
+ setIncidence(_incidence);
}
float Wing::getDragScale()
int i;
for(i=2; i<4; i++) {
s->setStall(i, 0.2267f);
- s->setStallWidth(i, 1);
+ s->setStallWidth(i, 0.01);
}
if(flap0) s->setFlapParams(_flap0Lift, _flap0Drag);
if(slat) _slatSurfs.add(s);
if(spoiler) _spoilerSurfs.add(s);
+ s->setInducedDrag(_inducedDrag);
+
return s;
}