From b095d00ee67affff4acecd15e505f5d79bdf200a Mon Sep 17 00:00:00 2001 From: jkunimune Date: Mon, 21 Nov 2016 15:39:18 -0500 Subject: [PATCH] Reinforced the North-Up Convention So, it turns out that one of the reasons I was having such trouble with AuthaGraph was that I had a sign convention where south was positive and the international date line was zero. So, I fixed that, because that was awful. It should be easier for me to figure out polyhedric projections now. Mind you, AuthaGraph doesn't work at all right now. It's just not even close right now. Don't worry - I'll work on that. --- bin/MapProjections.class | Bin 21502 -> 21710 bytes src/MapProjections.java | 138 ++++++++++++++++++++++----------------- 2 files changed, 78 insertions(+), 60 deletions(-) diff --git a/bin/MapProjections.class b/bin/MapProjections.class index ae52a132346f8a0bc788e2398c2955b78fb627b3..5dab5e0fa8ef37b396b5821ab3985bb078d063c5 100644 GIT binary patch literal 21710 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 B=kovn diff --git a/src/MapProjections.java b/src/MapProjections.java index baf8d24..2ab24d6 100644 --- a/src/MapProjections.java +++ b/src/MapProjections.java @@ -18,6 +18,7 @@ import javafx.scene.control.Label; import javafx.scene.control.MenuButton; import javafx.scene.control.MenuItem; import javafx.scene.control.Slider; +import javafx.scene.control.Spinner; import javafx.scene.control.Tooltip; import javafx.scene.image.Image; import javafx.scene.image.ImageView; @@ -57,7 +58,7 @@ public class MapProjections extends Application { "Represents earth viewed from an infinite distance", "Every straight line on the map is a straight line on the sphere", "A conformal conical map", "The compromise map used by National Geographic (caution: very slow)", "A circular compromise map", - "An equal-area map shaped like an elipse", "An equal-area map shaped like an elipse", + "An equal-area map shaped like an ellipse", "An equal-area map shaped like an elipse", "An equal-area map shaped like a sinusoid", "BURN LIFE'S HOUSE DOWN!", "A conformal square map that uses complex math", "A reorganized version of Pierce Quincuncial and actually the best map ever", @@ -66,10 +67,10 @@ public class MapProjections extends Application { "What happens when you apply a complex differentiable function to a stereographic projection?" }; private static final String[] AXES = { "Standard", "Transverse", "Center of Mass", "Jerusalem", "Point Nemo", - "Longest Line", "Longest Line Transverse", "Cylindrical", "Conical", "Quincuncial", "Random" }; - private static final double[] DEF_LATS = { 90, 0, 29.9792, 31.7833, 48.8767, -28.5217, -46.4883, -35, -10, 60, Double.NaN }; - private static final double[] DEF_LONS = { 0, 0, 31.1344, 35.216, 56.6067, 141.451, 16.5305, -13.6064, 65, -6, Double.NaN }; - private static final double[] DEF_THTS = { 0, 0, -32, -35, -45, 71.5, 137, 145, -150, -10, Double.NaN }; + "Longest Line", "Longest Line Transverse", "Cylindrical", "Conical", "Quincuncial", "Antipode", "Random" }; + private static final double[] DEF_LATS = { 90, 0, 29.9792, 31.7833, 48.8767, -28.5217, -46.4883, -35, -10, 60 }; + private static final double[] DEF_LONS = { 0, 0, 31.1344, 35.216, 56.6067, 141.451, 16.5305, -13.6064, 65, -6 }; + private static final double[] DEF_THTS = { 0, 0, -32, -35, -45, 161.5, 137, 145, -150, -10 }; private FileChooser inputChooser, saver; @@ -138,14 +139,14 @@ public class MapProjections extends Application { } }); projectionChooser.setPrefWidth(200); - projectionChooser.setValue("Mercator"); + projectionChooser.setValue(PROJ_ARR[1]); layout.getChildren().add(new HBox(3, lbl, projectionChooser)); - projectionDesc = new Text("Please choose a projection."); + projectionDesc = new Text(DESC[1]); projectionDesc.setWrappingWidth(CONT_WIDTH); layout.getChildren().add(projectionDesc); - final MenuButton defAxes = new MenuButton("Axis Presets"); + final MenuButton defAxes = new MenuButton("Aspect Presets"); for (String preset: AXES) { MenuItem m = new MenuItem(preset); m.setOnAction(new EventHandler() { @@ -156,12 +157,16 @@ public class MapProjections extends Application { defAxes.getItems().add(m); } defAxes.setTooltip(new Tooltip( - "Set the axis sliders based on a preset")); + "Set the aspect sliders based on a preset")); layout.getChildren().add(defAxes); latSlider = new Slider(-90, 90, 90); lonSlider = new Slider(-180,180,0); thtSlider = new Slider(-180,180,0); + Tooltip aspTlTp = new Tooltip("Change the aspect of the map"); + latSlider.setTooltip(aspTlTp); + lonSlider.setTooltip(aspTlTp); + thtSlider.setTooltip(aspTlTp); GridPane grid = new GridPane(); grid.addRow(0, new Text("Latitude:"), latSlider); @@ -227,6 +232,12 @@ public class MapProjections extends Application { private void setAxisByPreset(String preset) { + if (preset.equals("Antipode")) { + latSlider.setValue(-latSlider.getValue()); + lonSlider.setValue((lonSlider.getValue()+360)%360-180); + thtSlider.setValue(-thtSlider.getValue()); + return; + } if (preset.equals("Random")) { latSlider.setValue(Math.toDegrees(Math.asin(Math.random()*2-1))); lonSlider.setValue(Math.random()*360-180); @@ -273,7 +284,7 @@ public class MapProjections extends Application { final int[] refDims = {(int)width, (int)height}; final String p = projectionChooser.getValue(); final double X = 2.0*x/outputWidth-1; - final double Y = 2.0*y/outputHeight-1; + final double Y = 1-2.0*y/outputHeight; if (p.equals("Pierce Quincuncial")) return quincuncial(pole, X, Y, refDims, input); else if (p.equals("Equirectangular")) @@ -327,8 +338,8 @@ public class MapProjections extends Application { Complex k = new Complex(Math.sqrt(0.5)); // the rest comes from some fancy complex calculus Complex ans = Jacobi.cn(u, k); double p = 2 * Math.atan(ans.abs()); - double theta = Math.atan2(ans.getRe(), ans.getIm()) + Math.PI; - double lambda = p - Math.PI / 2; + double theta = Math.atan2(ans.getIm(), ans.getRe()) - Math.PI/2; + double lambda = Math.PI/2 - p; return getColor(pole, lambda, theta, refDims, ref); } @@ -336,15 +347,15 @@ public class MapProjections extends Application { private static int experiment(final double[] pole, double x, double y, int[] refDims, Image ref) { // just some random complex plane stuff Complex z = new Complex(x*3, y*3); - Complex ans = z.neg().exp().minus(1).neg().invert(); + Complex ans = z; double p = 2 * Math.atan(ans.abs()); - double theta = Math.atan2(ans.getRe(), ans.getIm()) + Math.PI; - double lambda = p - Math.PI / 2; + double theta = Math.atan2(ans.getIm(), ans.getRe()) + Math.PI/2; + double lambda = Math.PI/2 - p; return getColor(pole, lambda, theta, refDims, ref); } private static int equirectangular(final double[] pole, double x, double y, - int[] refDims, Image ref) { // a basic scale + int[] refDims, Image ref) { // a linear scale return getColor(pole, y*Math.PI/2, x*Math.PI, refDims, ref); } @@ -356,9 +367,10 @@ public class MapProjections extends Application { private static int polar(final double[] pole, double x, double y, int[] refDims, Image ref) { // the projection used on the UN flag - double phi = Math.PI * Math.hypot(x, y) - Math.PI/2; + double phi = Math.PI/2 - Math.PI * Math.hypot(x, y); if (Math.abs(phi) < Math.PI/2) - return getColor(pole, phi, Math.atan2(x, y), refDims, ref); + return getColor(pole, phi, Math.atan2(y, x) + Math.PI/2, + refDims, ref); else return 0; } @@ -376,21 +388,21 @@ public class MapProjections extends Application { private static int stereographic(final double[] pole, double x, double y, int[] refDims, Image ref) { // a shape-preserving infinite map - return getColor(pole, 2*Math.atan(2*Math.hypot(x, y)) - Math.PI/2, - Math.atan2(x, y), refDims, ref); + return getColor(pole, Math.PI/2 - 2*Math.atan(2*Math.hypot(x, y)), + Math.atan2(y, x) + Math.PI/2, refDims, ref); } private static int gnomonic(final double[] pole, double x, double y, int[] refDims, Image ref) { // map where straight lines are straight - return getColor(pole, Math.atan(2*Math.hypot(x, y)) - Math.PI/2, - Math.atan2(x, y), refDims, ref); + return getColor(pole, Math.PI/2 - Math.atan(2*Math.hypot(x, y)), + Math.atan2(y, x) + Math.PI/2, refDims, ref); } private static int orthographic(final double[] pole, double x, double y, int[] refDims, Image ref) { // a map that mimics the view from space double R = Math.hypot(x, y); if (R <= 1) - return getColor(pole, -Math.acos(R), Math.atan2(x, y), + return getColor(pole, Math.acos(R), Math.atan2(y, x) + Math.PI/2, refDims, ref); else return 0; @@ -403,10 +415,10 @@ public class MapProjections extends Application { private static int lambert(final double[] pole, double x, double y, int[] refDims, Image ref) { // a conical projection - y = (y+1)/2; + y = (y-1)/2; return getColor(pole, - 2*Math.atan(Math.pow(1.5*Math.hypot(x, y), 2)) - Math.PI/2, - 2*Math.atan2(x, y), refDims, ref); + Math.PI/2 - 2*Math.atan(Math.pow(1.5*Math.hypot(x, y), 2)), + 2*(Math.atan2(y, x) + Math.PI/2), refDims, ref); } private static int lemons(final double[] pole, double x, double y, @@ -427,8 +439,8 @@ public class MapProjections extends Application { final int[] refDims, Image ref) { // the lambert azimuthal equal area projection double R = Math.hypot(x, y); if (R <= 1) - return getColor(pole, Math.asin(2*R*R - 1), Math.atan2(x, y), - refDims, ref); + return getColor(pole, Math.asin(1 - 2*R*R), + Math.atan2(y, x) + Math.PI/2, refDims, ref); else return 0; } @@ -439,8 +451,8 @@ public class MapProjections extends Application { Complex k = new Complex(Math.sqrt(0.5)); // the rest comes from some fancy complex calculus Complex ans = Jacobi.cn(u, k); double p = 2 * Math.atan(ans.abs()); - double theta = Math.atan2(ans.getRe(), ans.getIm()); - double lambda = p - Math.PI / 2; + double theta = Math.atan2(ans.getIm(), ans.getRe()); + double lambda = Math.PI/2 - p; return getColor(pole, lambda, theta, refDims, ref); } @@ -508,8 +520,8 @@ public class MapProjections extends Application { int[] refDims, Image ref) { // a novelty map that magnifies the center profusely double R = Math.hypot(x, y); if (R <= 1) - return getColor(pole, Math.PI/2 * (R*R*R*1.8 + R*.2 - 1), - Math.atan2(x, y), refDims, ref); + return getColor(pole, Math.PI/2 * (1 - R*.2 - R*R*R*1.8), + Math.atan2(y, x) + Math.PI/2, refDims, ref); else return 0; } @@ -529,43 +541,46 @@ public class MapProjections extends Application { final double[] faceCenter = new double[3]; final double localX, localY; if (y+1 > 4*x && y+1 > -4*x) { - faceCenter[0] = Math.PI/2-Math.asin(Math.sqrt(8)/3); - faceCenter[1] = Math.PI; + //faceCenter[0] = Math.asin(Math.sqrt(8)/3)-Math.PI/2; + faceCenter[0] = -1; + faceCenter[1] = 0; faceCenter[2] = 0; localX = 2*x; localY = y-1/3.0; } else if (y+1 > 4*(x+1)) { - faceCenter[0] = -Math.PI/2; + faceCenter[0] = Math.PI/2; faceCenter[1] = 0; faceCenter[2] = 0; localX = 2*(x+1); localY = y-1/3.0; } else if (y+1 > -4*(x-1)) { - faceCenter[0] = -Math.PI/2; + faceCenter[0] = Math.PI/2; faceCenter[1] = 0; faceCenter[2] = 0; localX = 2*(x-1); localY = y-1/3.0; } else if (x < 0) { - faceCenter[0] = Math.PI/2-Math.asin(Math.sqrt(8)/3); - faceCenter[1] = Math.PI/3; + faceCenter[0] = Math.asin(Math.sqrt(8)/3)-Math.PI/2; + faceCenter[1] = 4*Math.PI/3; faceCenter[2] = Math.PI/3; localX = 2*(x+0.5); localY = y+1/3.0; } else { - faceCenter[0] = Math.PI/2-Math.asin(Math.sqrt(8)/3); - faceCenter[1] =5*Math.PI/3; + faceCenter[0] = Math.asin(Math.sqrt(8)/3)-Math.PI/2; + faceCenter[1] =2*Math.PI/3; faceCenter[2] = -Math.PI/3; localX = 2*(x-0.5); localY = y+1/3.0; } double[] newPole = obliquify(pole, faceCenter); - return gnomonic(newPole, localX, localY, refDims, ref); + return getColor(newPole, + Math.PI/2 - Math.atan(2.35*Math.hypot(localX, localY)), + Math.atan2(localY, localX) + Math.PI/2, refDims, ref); } @@ -573,8 +588,8 @@ public class MapProjections extends Application { int[] refDims, Image input) { // returns the color of any coordinate on earth final double[] coords = {lat, lon}; final double[] convCoords = obliquify(pole, coords); - double x = convCoords[1] / (2*Math.PI); - double y = convCoords[0] * refDims[1] / Math.PI + refDims[1]/2.0; + double x = convCoords[1]/(2*Math.PI) + refDims[0]/2.0; + double y = refDims[1]/2.0 - convCoords[0]*refDims[1]/Math.PI; x = (x - Math.floor(x)) * refDims[0]; if (y < 0) @@ -593,29 +608,32 @@ public class MapProjections extends Application { double lat1 = coords[0]; double lon1 = coords[1]; lon1 += tht0; - double latitude = Math.asin(Math.sin(lat0) * Math.sin(lat1) + Math.cos(lat0) * Math.cos(lon1) * Math.cos(lat1)); - double longitude; - double innerFunc = Math.sin(lat1) / Math.cos(lat0) / Math.cos(latitude) - Math.tan(lat0) * Math.tan(latitude); + double latf = Math.asin(Math.sin(lat0)*Math.sin(lat1) - Math.cos(lat0)*Math.cos(lon1)*Math.cos(lat1)); + double lonf; + double innerFunc = Math.sin(lat1)/Math.cos(lat0)/Math.cos(latf) - Math.tan(lat0)*Math.tan(latf); if (lat0 == Math.PI / 2) // accounts for special case when lat0 = pi/2 - longitude = lon1+lon0 + Math.PI; + lonf = lon1+lon0+Math.PI; else if (lat0 == -Math.PI / 2) // accounts for special case when lat0 = -pi/2 - longitude = -lon1+lon0; - else if (Math.abs(innerFunc) > 1) { // accounts for special case when - // cos(lat) = --> 0 - if ((lon1 == Math.PI && lat1 < -lat0) || (lon1 != Math.PI && lat1 < lat0)) - longitude = Math.PI + lon0; + lonf = -lon1+lon0; + else if (Math.abs(innerFunc) > 1) { // accounts for special case when cos(lat1) = --> 0 + if ((lon1 == 0 && lat1 < -lat0) || (lon1 != 0 && lat1 < lat0)) + lonf = lon0; else - longitude = lon0; - } else if (Math.sin(lon1) < 0) - longitude = lon0 + Math - .acos(Math.sin(lat1) / Math.cos(lat0) / Math.cos(latitude) - Math.tan(lat0) * Math.tan(latitude)); + lonf = lon0 + Math.PI; + } else if (Math.sin(lon1) > 0) + lonf = Math.PI + lon0 + + Math.acos(Math.sin(lat1) / Math.cos(lat0)/Math.cos(latf) - Math.tan(lat0)*Math.tan(latf)); else - longitude = lon0 - Math.acos(Math.sin(lat1) / Math.cos(lat0) / Math.cos(latitude) - Math.tan(lat0) * Math.tan(latitude)); - double orientation = (Math.cos(lat0)*Math.sin(lat0)-Math.tan(latitude)*Math.sin(lat1)+Math.tan(latitude)*Math.sin(latitude)*Math.sin(lat0))/Math.cos(lat1); + lonf = Math.PI + lon0 - + Math.acos(Math.sin(lat1)/Math.cos(lat0)/Math.cos(latf) - Math.tan(lat0)*Math.tan(latf)); - double[] output = {latitude, longitude, orientation}; + double P = Math.sin(lat0)*Math.cos(latf)-Math.cos(lat0)*Math.sin(latf)*Math.cos(lonf-lon0); + double thtf = Math.acos(P/Math.cos(lat1)); + thtf = 0; if (coords.length >= 3) - output[2] += coords[2]; // carry forward some information if necessary + thtf += coords[2]; + + double[] output = {latf, lonf, thtf}; return output; } } \ No newline at end of file