On Wed, May 16, 2018 at 04:45:54PM +0200, Evaristo Quiroga via Therion wrote:
I think the problem is the average calculation formula in "thdb1d.cxx"
// check backwards compass reading if ((lei->data_type == TT_DATATYPE_NORMAL) || (lei->data_type == TT_DATATYPE_DIVING) || (lei->data_type == TT_DATATYPE_CYLPOLAR)) { if (!thisnan(lei->backbearing)) { if (thisnan(lei->bearing)) { lei->backbearing -= 180.0; if (lei->backbearing < 0) lei->backbearing += 360.0; lei->bearing = lei->backbearing; } else { lei->backbearing -= 180.0; if (lei->backbearing < 0) lei->backbearing += 360.0; // calculate average of two angles //lei->bearing += lei->backbearing; //lei->bearing = lei->bearing / 2.0; double sumx, sumy; sumx = cos((90.0 - lei->bearing)/180.0*THPI) + cos((90.0 - lei->backbearing)/180.0*THPI); sumy = sin((90.0 - lei->bearing)/180.0*THPI) + sin((90.0 - lei->backbearing)/180.0*THPI); lei->bearing = 90.0 - (atan2(sumy, sumx) / THPI * 180.0); if (lei->bearing < 0.0) lei->bearing += 360.0; } } }
I think the formula is too complicated. I purpose a simpler formula, like: If bearing <=180 AverageBearing = (bearing + (backbearing -180))/2 else AverageBearing = (bearing + (backbearing +180))/2
Your proposed formula gives wrong answers in some cases - consider: bearing = 80, backbearing = 0 These give AverageBearing = (80 + 0 - 180) / 2 = -50 (equivalent to 310), but this should be 130 (average of 80 and 180). The therion formula is attempting to average the angles by trigonometry, which seems a reasonable approach (though probably slower than trying to average more directly like you're suggesting). It looks essentially correct to me, though it's a bit oddly written since cos(90 - x) is sin(x), sin(90 - x) is -cos(x), 90 - atan2(y,x) is atan2(x,y) (possibly +/- a multiple of 360). But if I work it out with a calculator for 236.8 and 56.8 then I do get 236.8. If it's still not working with the declination set to zero, perhaps you should show us a complete small example we can process to see what is going on? Cheers, Olly