From 16b11e311c8783a3e8fb794dba76299a8328cbc6 Mon Sep 17 00:00:00 2001 From: andy Date: Mon, 7 Aug 2006 16:49:26 +0000 Subject: [PATCH] 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. --- src/FDM/YASim/Surface.cpp | 4 ++-- src/FDM/YASim/Wing.cpp | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/FDM/YASim/Surface.cpp b/src/FDM/YASim/Surface.cpp index 8e7bafaa6..0f0a40877 100644 --- a/src/FDM/YASim/Surface.cpp +++ b/src/FDM/YASim/Surface.cpp @@ -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) diff --git a/src/FDM/YASim/Wing.cpp b/src/FDM/YASim/Wing.cpp index 5c9fd6a33..12fb438f1 100644 --- a/src/FDM/YASim/Wing.cpp +++ b/src/FDM/YASim/Wing.cpp @@ -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];