Fixes from Maik Justus:
+ The wing compilation step was accidentally omitting regions that lie between the tips and the first/last control object. That's a real problem for wings that contain no controls, and a significant issue for those that contain only a few. I'm stunned that this went undetected for so long. + The Surface::flapLift() function was oddly returning 1.0 Newtons as a minimum, instead of zero.
This commit is contained in:
parent
eb38d1f92b
commit
16b11e311c
2 changed files with 11 additions and 8 deletions
|
@ -300,11 +300,11 @@ float Surface::flapLift(float alpha)
|
|||
if(alpha < _stalls[0])
|
||||
return flapLift;
|
||||
else if(alpha > _stalls[0] + _widths[0])
|
||||
return 1;
|
||||
return 0;
|
||||
|
||||
float frac = (alpha - _stalls[0]) / _widths[0];
|
||||
frac = frac*frac*(3-2*frac);
|
||||
return flapLift * (1-frac) + frac;
|
||||
return flapLift * (1-frac);
|
||||
}
|
||||
|
||||
float Surface::controlDrag(float lift, float drag)
|
||||
|
|
|
@ -235,22 +235,25 @@ void Wing::compile()
|
|||
// 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];
|
||||
|
@ -259,11 +262,11 @@ void Wing::compile()
|
|||
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];
|
||||
|
|
Loading…
Reference in a new issue