For what it's worth, I can post the code I ended up with (it's been a while, I can't really tell the whys of everything, now). [Note: judging by all this, in retrospect, you'd probably be better checking for intersect between two geodesics. On Earth at least, the line with constant longitude is a geodesic. Simply initialize it at equator for example, and with your desired longitude, towards azimuth 0.] Anyway. This is the function doing the main computation work: bool Ellipsoid::initPointByLonDiffFromRef(const...
For what it's worth, I can post the code I ended up with (it's been a while, I can't really tell the whys of everything, now). [Note: judging by all this, in retrospect, you'd probably be better checking for intersect between two geodesics. The line with constant longitude is a geodesic. Simply initialize it at equator for example, and with your desired longitude, towards azimuth 0.] Anyway. This is the function doing the main computation work: bool Ellipsoid::initPointByLonDiffFromRef(const LineEqRefParams&...
For what it's worth, I can post the code I ended up with (it's been a while, I can't really tell the whys of everything, now). [Note: judging by all this, in retrospect, you'd probably be better checking for intersect between two geodesics. The line with constant longitude is a geodesic. Simply initialize it at equator for example, and with your desired longitude, towards azimuth 0.] Anyway. This is the function doing the main computation work: bool Ellipsoid::initPointByLonDiffFromRef(const LineEqRefParams&...
In case anyone is interested, my attempt at derivating lambda above was quite wrong. (I miserad a w for omega in Charles Karney's paper). the omega derivative part is much more like : [edit] Omg'(sig) = sin(alp0) / (cos²(sig) + sin²(alp0) * sin²(sig))) Lambda as a function of sigma however is far less well-behaved than was the distance function : in case of geodesics which are quite close to meridians themselves, there are two cases where applying the Newton's method naively would fail : First, when...
In case anyone is interested, my attempt at derivating lambda above was quite wrong. (I miserad a w for omega in Charles Karney's paper). the omega derivative part is much more like : Omg'(sig) = sin(alp0) / (cos²(sig) * (1 + sin²(alp0) * tan²(sig))) That is, in case sig is not too close to +- pi/2 (or wraps of it). I'm still wondering why it works as is without considering a sign switch when sigma gets above pi/2 in absolute value, but... oh well. Lambda as a function of sigma however is far less...
Thanks a lot for pointing me the way. My lack of mathematical background makes those "obvious" methods hard to spot for me. so... omg(sig) = sqrt(1-e²cos²(bet(sig))) = sqrt(1-e²(1 - sin²(bet(sig)))) = sqrt(1-e²(1 - cos²(alp0) * sin²(sig))) omg'(sig) = e² * cos²(alp0) * sin(sig)*cos(sig) / omg(sig) lam(sig) = omg(sig) + f * sin(alp0) * I3(sig) lam'(sig) = omg'(sig) + f * sin(alp0) * I3'(sig) = omg'(sig) + f * sin(alp0) * (2-f) / (1 + (1-f) * sqrt(1 + k² + sin²(sig))) solving for (lam(sig) - lam0)...
Thanks a lot for pointing me the way. My lack of mathematical background makes those "obvious" methods hard to spot for me. so... omg(sig) = sqrt(1-e²cos²(bet(sig))) = sqrt(1-e²(1 - sin²(bet(sig)))) = sqrt(1-e²(1 - cos²(alp0) * sin²(sig))) omg'(sig) = e² * cos²(alp0) * sin(sig)*cos(sig) / omg(sig) lam(sig) = omg(sig) + f * sin(alp0) * I3(sig) lam'(sig) = omg'(sig) + f * sin(alp0) * I3'(sig) = omg'(sig) + f * sin(alp0) * (2-f) / (1 + (1-f) * sqrt(1 + k² + sin²(sig)) solving for (lam(sig) - lam0) ==...
Thanks a lot for pointing me the way. My lack of mathematical background makes those "obvious" methods hard to spot for me. so... omg(sig) = sqrt(1-e²cos²(bet(sig))) = sqrt(1-e²(1 - sin²(bet(sig)))) = sqrt(1-e²(1 - cos²(alp0) * sin²(sig))) omg'(sig) = e² * cos²(alp0) * sin(sig)*cos(sig) / omg(sig) lam(sig) = omg(sig) + f * sin(alp0) * I3(sig) lam'(sig) = omg'(sig) + f * sin(alp0) * I3'(sig) = omg'(sig) + f * sin(alp0) * (2-f) / (1 + (1-f) * sqrt(1 + k² + sin²(sig)) solving for (lam(sig) - lam0) ==...
Thanks a lot for pointing me the way. My lack of mathematical background makes those "obvious" methods hard to spot for me. so... omg(sig) = sqrt(1-e²cos²(bet(sig))) = sqrt(1-e²(1 - sin²(bet(sig)))) = sqrt(1-e²(1 - cos²(alp0) * sin²(sig))) omg'(sig) = e² * cos²(alp0) * sin(sig)*cos(sig) / omg(sig) lam(sig) = omg(sig) + f * sin(alp0) * I3(sig) lam'(sig) = omg'(sig) + f * sin(alp0) * I3'(sig) = omg'(sig) + f * sin(alp0) * (2-f) / (1 + (1-f) * sqrt(1 + k² + sin²(sig)) solving for (lam(sig) - lam0) ==...
Thanks a lot for pointing me the way. My lack of mathematical background makes those "obvious" methods hard to spot for me. so... omg(sig) = sqrt(1-e²cos²(bet(sig))) = sqrt(1-e²(1 - sin²(bet(sig)))) = sqrt(1-e²(1 - cos²(alp0) * sin²(sig))) omg'(sig) = e² * cos²(alp0) * sin(sig)*cos(sig) / omg(sig) lam(sig) = omg(sig) + f * sin(alp0) * I3(sig) lam'(sig) = omg'(sig) + f * sin(alp0) * I3'(sig) = omg'(sig) + f * sin(alp0) * (2-f) / (1 + (1-f) * sqrt(1 + k² + sin²(sig)) solving for (lam(sig) - lam0) ==...
By the way, I improved my current implementation. now trying to solve for it iteratively. Using your naming scheme, I would begin from a first guess sig12 == lam12, recomputing each time an omg12 and a new lam12 from this sigma, comparing the resulting lam12 delta to desired (dErr), and correcting back (in the majority of cases where salp0 isn't too small) omg12 with omg12 -= dErr * (1 - _A3c); and recovering the next iteration sig12 from this updated omg12... (I'm thus simply ignoring the I3 term...
By the way, I improved my current implementation. now trying to solve for it iteratively. Using your naming scheme, I would begin from a first guess sig12 == lam12, recomputing each time an omg12 and a new lam12 from this sigma, comparing the resulting lam12 delta to desired (dErr), and correcting back (in the majority of cases where salp0 isn't too small) omg12 with omg12 -= dErr * (1 - _A3c); and recovering the next iteration sig12 from this updated omg12... This seems already quite precise and...
By the way, I improved my current implementation, now trying iteratively from a first guess sig12 == lam12, recomputing each time an omg12 and a new lam12 from this sigma, comparing the resulting lam12 delta to desired (dErr), and correcting back (in the majority of cases where salp0 isn't too small) omg12 with omg12 -= dErr * (1 - _A3c); and recovering the next iteration sig12 from this updated omg12... This seems already quite precise and way faster than using a geodesic segment in place of the...
C++11 standard enforcing this case to be handled gracefully, even in a multithreaded environment is indeed consistent with what I've read. As to whether it is indeed currently handled well, I would assume that any recent C++ compiler having undergone the C++11 switch has by now those functionnalities covered, but past years waiting for C++11 features to be implemented made me a little paranoid about my own assumptions on those matters. That being said, I do not claim that VS2015 or 17 would fail...
Hi again Charles, While I'm at it... I've seen that some time ago you've changed some of the constant-meant methods in your C++ code to use that local, "static const" technique (eg. for Geodesic::WGS84()). While I was originally quite found of this kind of stuff, and this works perfectly well in a single-threaded environment, there are some issues using this coding hack in a multi-threaded environment. Unfortunately this is a real issue : I've had to revert to another way to initialize those things...
Hi again Charles, While I'm at it... I've seen that some time ago you've changed some of the constant-meant methods in your C++ code to use that local, "static const" technique (eg. for Geodesic::WGS84()). While I was originally quite found of this kind of stuff, and this works perfectly well in a single-threaded environment, there are some issues using this coding hack in a multi-threaded environment. Unfortunately this is a real issue : I've had to revert to another way to initialize those thinkgs...