From f44ad19aa8c5224886aee6cd8766d1eac682f1e3 Mon Sep 17 00:00:00 2001 From: WHR Date: Tue, 10 Oct 2017 20:32:54 +0800 Subject: [PATCH 1/2] Update continents data --- src/Boardroom.js | 90 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 64 insertions(+), 26 deletions(-) diff --git a/src/Boardroom.js b/src/Boardroom.js index ecd64d4..8a54c9d 100644 --- a/src/Boardroom.js +++ b/src/Boardroom.js @@ -489,32 +489,70 @@ function updateSliders(animateTime){ } function findArea(lat, lng){ - if(lat <= -40){ - return "antarctica"; - } - if(lat > 12 && lng > -180 && lng < -45){ - return "northamerica"; - } - if(lat <= 12 && lat > -40 && lng > -90 && lng < -30){ - return "southamerica"; - } - if(lat < -10 && lng >= 105 && lng <=155){ - return "australia"; - } - if(lat > 20 && lng >= 60 && lng <=160){ - return "asia"; - } - if(lat > 10 && lat < 40 && lng >= 35 && lng <=60){ - return "asia"; - } - if(lat > -40 && lat < 35 && lng >= -20 && lng <=50){ - return "africa"; - } - if(lat >= 35 && lng >= -10 && lng <=40){ - return "europe"; - } - - return "other"; + // Data are from Daniel Pereira + + const LatNAm = [90, 90, 78.13, 57.5, 15, 15, 1.25, 1.25, 51, 60, 60]; + const LonNAm = [-168.75, -10, -10, -37.5, -30, -75, -82.5, -105, -180, -180, -168.75]; + const LatNA2 = [51, 51, 60]; + const LonNA2 = [166.6, 180, 180]; + + const LatSAm = [1.25, 1.25, 15, 15, -60, -60]; + const LonSAm = [-105, -82.5, -75, -30, -30, -105]; + + const LatEur = [90, 90, 42.5, 42.5, 40.79, 41, 40.55, 40.40, 40.05, 39.17, 35.46, 33, 38, 35.42, 28.25, 15, 57.5,78.13]; + const LonEur = [-10, 77.5, 48.8, 30, 28.81, 29, 27.31, 26.75, 26.36, 25.19, 27.91, 27.5, 10, -10, -13, -30, -37.5, -10] + + const LatAfr = [15, 28.25, 35.42, 38, 33, 31.74, 29.54, 27.78, 11.3, 12.5, -60, -60]; + const LonAfr = [-30, -13, -10, 10, 27.5, 34.58, 34.92, 34.46, 44.3, 52, 75, -30]; + + const LatAus = [-11.88, -10.27, -10, -30, -52.5, -31.88]; + const LonAus = [110, 140, 145, 161.25, 142.5, 110]; + + const LatAsi = [90, 42.5, 42.5, 40.79, 41, 40.55, 40.4, 40.05, 39.17, 35.46, 33, 31.74, 29.54, 27.78, 11.3, 12.5, -60, -60, -31.88, -11.88, -10.27, 33.13, 51, 60, 90]; + const LonAsi = [77.5, 48.8, 30, 28.81, 29, 27.31, 26.75, 26.36, 25.19, 27.91, 27.5, 34.58, 34.92, 34.46, 44.3, 52, 75, 110, 110, 110, 140, 140, 166.6, 180, 180]; + const LatAs2 = [90, 90, 60, 60]; + const LonAs2 = [-180, -168.75, -168.75, -180]; + + const LatAnt = [-60, -60, -90, -90]; + const LonAnt = [-180, 180, 180, -180]; + + var is_in_polygon = function(lat, lng, plats, plngs) { + var i, j; + var r = false; + // assert(plats.length == plngs.length) + for(i = 0, j = plats.length - 1; i < plats.length; j = i++) { + if(((plats[i] > lat) != (plats[j] > lat)) && + (lng < (plngs[j] - plngs[i]) * (lat - plats[i]) / (plats[j] - plats[i]) + plngs[i])) { + //process.stderr.write("r = " + r + "\n"); + r = !r; + } + } + return r; + }; + + if(is_in_polygon(lat, lng, LatSAm, LonSAm)) { + return "southamerica"; + } + if(is_in_polygon(lat, lng, LatNAm, LonNAm)) { + return "northamerica"; + } + if(is_in_polygon(lat, lng, LatEur, LonEur)) { + return "europe"; + } + if(is_in_polygon(lat, lng, LatAsi, LonAsi) || is_in_polygon(lat, lng, LatAs2, LonAs2)) { + return "asia"; + } + if(is_in_polygon(lat, lng, LatAus, LonAus)) { + return "australia"; + } + if(is_in_polygon(lat, lng, LatAfr, LonAfr)) { + return "africa"; + } + if(is_in_polygon(lat, lng, LatAnt, LonAnt)) { + return "antarctica"; + } + + return "other"; } From 46faced9421470f42455263e9a9bf86100f10e5a Mon Sep 17 00:00:00 2001 From: WHR Date: Tue, 10 Oct 2017 20:39:33 +0800 Subject: [PATCH 2/2] Adjust comments --- src/Boardroom.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Boardroom.js b/src/Boardroom.js index 8a54c9d..65e3aa4 100644 --- a/src/Boardroom.js +++ b/src/Boardroom.js @@ -490,6 +490,7 @@ function updateSliders(animateTime){ function findArea(lat, lng){ // Data are from Daniel Pereira + // Polygon code from https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html const LatNAm = [90, 90, 78.13, 57.5, 15, 15, 1.25, 1.25, 51, 60, 60]; const LonNAm = [-168.75, -10, -10, -37.5, -30, -75, -82.5, -105, -180, -180, -168.75]; @@ -523,7 +524,6 @@ function findArea(lat, lng){ for(i = 0, j = plats.length - 1; i < plats.length; j = i++) { if(((plats[i] > lat) != (plats[j] > lat)) && (lng < (plngs[j] - plngs[i]) * (lat - plats[i]) / (plats[j] - plats[i]) + plngs[i])) { - //process.stderr.write("r = " + r + "\n"); r = !r; } }