Created
August 9, 2016 11:10
-
-
Save mourner/19b95f46f36ce8bb78e13820bb7c84df to your computer and use it in GitHub Desktop.
Mercator horner approximation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// not working | |
// based on https://github.com/Project-OSRM/osrm-backend/blob/master/include/util/web_mercator.hpp | |
'use strict'; | |
function latY(lat) { | |
var sin = Math.sin(lat * Math.PI / 180); | |
return 0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI; | |
} | |
var c1 = [0.00000000000000000000000000e+00, 1.00000000000089108431373566e+00, 2.34439410386997223035693483e-06, | |
-3.21291701673364717170998957e-04, -6.62778508496089940141103135e-10, 3.68188055470304769936079078e-08, | |
6.31192702320492485752941578e-14, -1.77274453235716299127325443e-12, -2.24563810831776747318521450e-18, | |
3.13524754818073129982475171e-17, 2.09014225025314211415458228e-23, -9.82938075991732185095509716e-23]; | |
var c2 = [1.00000000000000000000000000e+00, 2.34439410398970701719081061e-06, -3.72061271627251952928813333e-04, | |
-7.81802389685429267252612620e-10, 5.18418724186576447072888605e-08, 9.37468561198098681003717477e-14, | |
-3.30833288607921773936702558e-12, -4.78446279888774903983338274e-18, 9.32999229169156878168234191e-17, | |
9.17695141954265959600965170e-23, -8.72130728982012387640166055e-22, -3.23083224835967391884404730e-28]; | |
function horner(c, x) { | |
var r = 0; | |
for (var i = 0; i < c.length; i++) { | |
r = r * x + c[i]; | |
} | |
return r; | |
} | |
function latY2(lat) { | |
return horner(c1, lat * Math.PI / 180) / horner(c2, lat * Math.PI / 180); | |
} | |
var lats = []; | |
for (var i = 0; i < 10; i++) { | |
lats.push(Math.random() * 180 - 90); | |
} | |
console.time('normal'); | |
for (var i = 0; i < lats.length; i++) latY(lats[i]); | |
console.timeEnd('normal'); | |
console.time('approx'); | |
for (var i = 0; i < lats.length; i++) latY2(lats[i]); | |
console.timeEnd('approx'); | |
for (var i = 0; i < 10; i++) { | |
console.log(latY(lats[i]), latY2(lats[i])); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment