From ed297dbd079f3cc1ce93cd3aeb2cd98a60be7351 Mon Sep 17 00:00:00 2001 From: Justin Kunimune Date: Wed, 24 Jan 2018 18:48:18 -1000 Subject: [PATCH] Angles vs factors I changed my shape distortion metric to be max angle displacement instead of stretch factor in decibels, hoping it would weigh moderate distortion higher and severe distortion lower. It didn't really do anything. I think I'll just set it back to how it was, because I liked it that way. --- output/graph - plotter.png | Bin 47455 -> 48693 bytes src/apps/MapAnalyzer.java | 44 +++++++++++++++++------------------ src/apps/MapApplication.java | 6 ++--- src/apps/MapPlotter.java | 13 ++++------- src/maps/Azimuthal.java | 2 +- src/maps/Projection.java | 5 ++-- src/utils/Math2.java | 5 ++++ 7 files changed, 38 insertions(+), 37 deletions(-) diff --git a/output/graph - plotter.png b/output/graph - plotter.png index 3d569c7be323acbc6b856db8bb243198b2f148ad..28e616706d48fe89c5509f316144a72f7edc116b 100644 GIT binary patch literal 48693 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 diff --git a/src/apps/MapAnalyzer.java b/src/apps/MapAnalyzer.java index 2b42cdf..47056ec 100644 --- a/src/apps/MapAnalyzer.java +++ b/src/apps/MapAnalyzer.java @@ -24,8 +24,7 @@ package apps; import java.io.File; import java.io.IOException; -import java.util.function.DoubleUnaryOperator; - +import java.util.function.DoubleFunction; import javax.imageio.ImageIO; import dialogs.ProgressBarDialog; @@ -146,14 +145,14 @@ public class MapAnalyzer extends MapApplication { private Region buildTextDisplay() { - this.avgSizeDistort = new Text("..."); - this.avgShapeDistort = new Text("..."); + this.avgSizeDistort = new Text(". . ."); + this.avgShapeDistort = new Text(". . ."); final Text txt = new Text("Blue areas are dilated, red areas are compressed, and black areas are stretched."); txt.setWrappingWidth(GUI_WIDTH); VBox box = new VBox(3, - new HBox(new Label("Average size distortion: "),avgSizeDistort), - new HBox(new Label("Average shape distortion: "),avgShapeDistort), + new HBox(new Label("Average area distortion: "), avgSizeDistort), + new HBox(new Label("Average angle distortion: "), avgShapeDistort), txt); box.setAlignment(Pos.CENTER_LEFT); return box; @@ -173,7 +172,7 @@ public class MapAnalyzer extends MapApplication { this.shapeChart = new BarChart(new CategoryAxis(), new NumberAxis()); this.shapeChart.setPrefWidth(CHART_WIDTH); this.shapeChart.setPrefHeight(IMG_WIDTH/2); - this.shapeChart.getXAxis().setLabel("Stretch factor"); + this.shapeChart.getXAxis().setLabel("Angle displacement"); this.shapeChart.setBarGap(0); this.shapeChart.setCategoryGap(0); this.shapeChart.setAnimated(false); @@ -190,8 +189,8 @@ public class MapAnalyzer extends MapApplication { sizeChart.getData().clear(); shapeChart.getData().clear(); - avgSizeDistort.setText("..."); - avgShapeDistort.setText("..."); + avgSizeDistort.setText("\u2026"); + avgShapeDistort.setText("\u2026"); }); loadParameters(); @@ -205,13 +204,13 @@ public class MapAnalyzer extends MapApplication { final double[][][] distortionG = proj.calculateDistortion(Projection.globe(GLOBE_RES)); Platform.runLater(() -> { - sizeChart.getData().add(histogram(distortionG[0], - -LN_10, LN_10, 20, Math::exp)); - shapeChart.getData().add(histogram(distortionG[1], - 0.0, LN_10, 20, Math::exp)); + sizeChart.getData().add(histogram(distortionG[0], -LN_10, LN_10, 20, + (x) -> Double.toString(Math.round(100*Math.exp(x))/100.))); + shapeChart.getData().add(histogram(distortionG[1], 0.0, Math.PI/2, 18, + (x) -> Integer.toString((int) Math.toDegrees(x))+"\u00B0")); - avgSizeDistort.setText(format(Math2.stdDev(distortionG[0])/LN_10*10)); - avgShapeDistort.setText(format(Math2.mean(distortionG[1])/LN_10*10)); + avgSizeDistort.setText(format(Math2.toDecibels(Math2.stdDev(distortionG[0])))+"dB"); + avgShapeDistort.setText(format(Math.toDegrees(Math2.mean(distortionG[1])))+"\u00B0"); enable(ButtonType.UPDATE_MAP, ButtonType.SAVE_GRAPH); }); @@ -271,7 +270,7 @@ public class MapAnalyzer extends MapApplication { for (int x = 0; x < distortion[0][y].length; x ++) { final double sizeDistort = distortion[0][y][x], shapeDistort = distortion[1][y][x]; final double sizeContour = Math.round(sizeDistort/(LN_10/10))*LN_10/10; //contour the size by decibels - final double shapeContour = Math.round(shapeDistort/(LN_10/20))*LN_10/20; //contour the size by semidecibels + final double shapeContour = Math.round(shapeDistort/(Math.PI/36))*Math.PI/36; //contour the size by semidecibels if (Double.isNaN(sizeDistort) || Double.isNaN(shapeDistort)) { writer.setArgb(x, y, 0); continue; @@ -279,14 +278,14 @@ public class MapAnalyzer extends MapApplication { final int r, g, b; if (sizeDistort < 0) { //if compressing - r = (int)(255.9*Math.exp(-shapeContour*.6)); - g = (int)(255.9*Math.exp(-shapeContour*.6)*Math.exp(sizeContour*.6)); + r = (int)(255.9*(1-shapeContour/(Math.PI/2))); + g = (int)(255.9*(1-shapeContour/(Math.PI/2))*Math.exp(sizeContour*.6)); b = g; } else { //if dilating - r = (int)(255.9*Math.exp(-shapeContour*.6)*Math.exp(-sizeContour*.6)); + r = (int)(255.9*(1-shapeContour/(Math.PI/2))*Math.exp(-sizeContour*.6)); g = r; //I find .6 to be a rather visually pleasing sensitivity - b = (int)(255.9*Math.exp(-shapeContour*.6)); + b = (int)(255.9*(1-shapeContour/(Math.PI/2))); } final int argb = ((((((0xFF)<<8)+r)<<8)+g)<<8)+b; @@ -298,7 +297,7 @@ public class MapAnalyzer extends MapApplication { private static final Series histogram(double[][] values, - double min, double max, int num, DoubleUnaryOperator converter) { + double min, double max, int num, DoubleFunction converter) { int[] hist = new int[num+1]; //this array is the histogram values for min, min+dx, ..., max-dx, max int tot = 0; for (double[] row: values) { @@ -313,9 +312,8 @@ public class MapAnalyzer extends MapApplication { } Series output = new Series(); for (int i = 0; i <= num; i ++) { - double x = converter.applyAsDouble(i*(max-min)/num+min); output.getData().add(new Data( - Double.toString(Math.round(100*x)/100.), + converter.apply(i*(max-min)/num+min), (double)hist[i]/tot*100)); } return output; diff --git a/src/apps/MapApplication.java b/src/apps/MapApplication.java index f12c7ce..3b105e0 100644 --- a/src/apps/MapApplication.java +++ b/src/apps/MapApplication.java @@ -42,7 +42,6 @@ import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.geometry.Pos; -import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Button; @@ -69,6 +68,7 @@ import javafx.scene.layout.Priority; import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; import javafx.scene.text.Text; import javafx.stage.FileChooser; import javafx.stage.Stage; @@ -183,7 +183,7 @@ public abstract class MapApplication extends Application { public void start(Stage root) { this.root = root; this.root.setTitle(this.name); - this.root.setScene(new Scene(new StackPane(makeWidgets()))); + this.root.setScene(new Scene(new StackPane(makeWidgets()), Color.ANTIQUEWHITE)); //Why can't I set this color? this.root.show(); this.suppressListeners.set(); @@ -192,7 +192,7 @@ public abstract class MapApplication extends Application { } - protected abstract Node makeWidgets(); + protected abstract Region makeWidgets(); /** diff --git a/src/apps/MapPlotter.java b/src/apps/MapPlotter.java index 55a4bfb..91edc8c 100644 --- a/src/apps/MapPlotter.java +++ b/src/apps/MapPlotter.java @@ -47,19 +47,18 @@ import javafx.scene.control.Label; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.StackPane; import javafx.stage.Stage; +import maps.Arbitrary; import maps.Azimuthal; import maps.CahillKeyes; import maps.Cylindrical; import maps.Lenticular; import maps.Misc; -import maps.MyProjections; +import maps.Polyhedral; import maps.Projection; import maps.Pseudocylindrical; -import maps.Arbitrary; -import maps.Polyhedral; import maps.Tobler; -import maps.Waterman; import maps.WinkelTripel; +import utils.Math2; /** * A simple script that creates an annotated ScatterPlot of map projections @@ -67,8 +66,6 @@ import maps.WinkelTripel; * @author jkunimune */ public class MapPlotter extends Application { - - private static final double DECIBEL = Math.log(10)/10; private static final double GLOBE_RES = .005; @@ -101,7 +98,7 @@ public class MapPlotter extends Application { final ScatterChart plot = new ScatterChart( new NumberAxis("Size distortion", 0, 4, .5), - new NumberAxis("Shape distortion", 0, 3, .5)); + new NumberAxis("Shape distortion", 0, 20, 5)); plot.setLegendSide(Side.RIGHT); final AnchorPane overlay = new AnchorPane(); stack = new StackPane(plot, overlay); @@ -152,7 +149,7 @@ public class MapPlotter extends Application { final double[] params = projection.getDefaultParameters(); final double distortion[] = projection.avgDistortion(points, params); final Data datum = new Data( - distortion[0]/DECIBEL, distortion[1]/DECIBEL); + Math2.toDecibels(distortion[0]), Math.toDegrees(distortion[1])); series.getData().add(datum); final Label lbl = new Label(projection.getName()); overlay.getChildren().add(lbl); diff --git a/src/maps/Azimuthal.java b/src/maps/Azimuthal.java index 5142a82..c558097 100644 --- a/src/maps/Azimuthal.java +++ b/src/maps/Azimuthal.java @@ -90,7 +90,7 @@ public class Azimuthal { 4, 4, 0b0111, Type.AZIMUTHAL, Property.GNOMONIC, 2) { public double[] project(double lat, double lon) { - if (lat < 0.2) lat = 0.2; + if (lat < 0.01) lat = 0.01; final double r = Math.tan(Math.PI/2 - lat); return new double[] { r*Math.sin(lon), -r*Math.cos(lon)}; } diff --git a/src/maps/Projection.java b/src/maps/Projection.java index b3b17ee..63aca46 100644 --- a/src/maps/Projection.java +++ b/src/maps/Projection.java @@ -367,8 +367,9 @@ public abstract class Projection { final double s1ps2 = Math.hypot((pE[0]-pC[0])+(pN[1]-pC[1]), (pE[1]-pC[1])-(pN[0]-pC[0])); final double s1ms2 = Math.hypot((pE[0]-pC[0])-(pN[1]-pC[1]), (pE[1]-pC[1])+(pN[0]-pC[0])); - output[1] = Math.abs(Math.log(Math.abs((s1ps2-s1ms2)/(s1ps2+s1ms2)))); //the first output is the shape (angle) distortion - if (Math.abs(output[1]) > 25) + final double sig = Math.abs((s1ps2+s1ms2)/(s1ps2-s1ms2)); + output[1] = Math.atan((sig - 1)/Math.sqrt(sig)/2); //the first output is the shape (angle) distortion + if (sig > 1e10) output[1] = Double.NaN; //discard outliers return output; diff --git a/src/utils/Math2.java b/src/utils/Math2.java index 36a51f9..d2d6757 100644 --- a/src/utils/Math2.java +++ b/src/utils/Math2.java @@ -171,6 +171,11 @@ public class Math2 { } + public static double toDecibels(double ratio) { + return ratio/Math.log(10)*10; + } + + public static double sind(double angdeg) { return Math.sin(Math.toRadians(angdeg)); }