The first of the Danseiji

I started putting in finalised Danseiji datasets. I also added a new input, just for ritual purposes, and also ran the Plotter for the heck of it. My new maps fare surprisingly poorly against established names like Robinson, and even Kavrayskiy. I think I need to rework my metrics slightly. Now, I know how that sounds, but to be fair, the current area metric was designed to ensure Gall-Peters did not beat Behrmann. I made sure it did not pay too much heed to the extremely distorted parts, and paid more attention to the vast moderately-distorted regions. I'm starting to think now, though, that those regions are a lot more important than I'd thought. I'll try to make them as intuitive as possible, while still reasonably conforming to what I think makes a good map.
This commit is contained in:
Justin Kunimune 2019-01-19 10:23:47 -10:00
parent 8d4acd1bde
commit 36070bf6a8
14 changed files with 143703 additions and 17290 deletions

BIN
input/Relief.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 37 KiB

View File

@ -115,20 +115,18 @@ public abstract class MapApplication extends Application {
private static final KeyCombination CTRL_ENTER = new KeyCodeCombination(KeyCode.ENTER, KeyCodeCombination.CONTROL_DOWN);
public static final Projection[] FEATURED_PROJECTIONS = { Arbitrary.DANSEIJI_III, Arbitrary.DANSEIJI_IV, Cylindrical.MERCATOR,
public static final Projection[] FEATURED_PROJECTIONS = { Cylindrical.MERCATOR, // the set of featured projections for the ComboBox
Cylindrical.EQUIRECTANGULAR, Cylindrical.EQUAL_AREA, Cylindrical.GALL_STEREOGRAPHIC,
Azimuthal.STEREOGRAPHIC, Azimuthal.POLAR, Azimuthal.EQUAL_AREA, Azimuthal.GNOMONIC,
Azimuthal.PERSPECTIVE, Conic.LAMBERT, Conic.EQUIDISTANT, Conic.ALBERS,
Polyhedral.LEE_TETRAHEDRAL_RECTANGULAR, Polyhedral.ACTUAUTHAGRAPH,
Polyhedral.AUTHAPOWER, Octohedral.KEYES_BASIC_M, Pseudocylindrical.SINUSOIDAL,
Pseudocylindrical.MOLLWEIDE, Tobler.TOBLER, Lenticular.AITOFF,
Lenticular.VAN_DER_GRINTEN, ArbitraryPseudocylindrical.ROBINSON,
WinkelTripel.WINKEL_TRIPEL, Misc.PEIRCE_QUINCUNCIAL, Misc.TWO_POINT_EQUIDISTANT,
Pseudocylindrical.LEMONS }; //the set of featured projections for the ComboBox
Pseudocylindrical.SINUSOIDAL, Pseudocylindrical.MOLLWEIDE, Tobler.TOBLER,
Lenticular.AITOFF, Lenticular.VAN_DER_GRINTEN, ArbitraryPseudocylindrical.ROBINSON,
WinkelTripel.WINKEL_TRIPEL, Arbitrary.DANSEIJI_O, Octohedral.KEYES_BASIC_M,
Polyhedral.LEE_TETRAHEDRAL_RECTANGULAR, Misc.PEIRCE_QUINCUNCIAL, Pseudocylindrical.LEMONS };
public static final String[] PROJECTION_CATEGORIES = { "Cylindrical", "Azimuthal", "Conic",
"Polyhedral", "Pseudocylindrical", "Lenticular", "Other", "Invented by Justin" }; //the overarching categories by which I organise my projections
public static final Projection[][] ALL_PROJECTIONS = {
public static final Projection[][] ALL_PROJECTIONS = { // every projection I have programmed
{ Cylindrical.EQUAL_AREA, Cylindrical.EQUIRECTANGULAR, Cylindrical.GALL_ORTHOGRAPHIC,
Cylindrical.GALL_STEREOGRAPHIC, Cylindrical.HOBO_DYER, Cylindrical.LAMBERT,
Cylindrical.MERCATOR, Cylindrical.MILLER, Cylindrical.PLATE_CARREE },
@ -138,7 +136,7 @@ public abstract class MapApplication extends Application {
{ Polyhedral.AUTHAGRAPH, Octohedral.CAHILL_CONCIALDI, Octohedral.CAHILL_KEYES,
Octohedral.KEYES_BASIC_M, Octohedral.KEYES_BUTTERFLY, Polyhedral.DYMAXION,
Polyhedral.LEE_TETRAHEDRAL_RECTANGULAR, Polyhedral.LEE_TETRAHEDRAL_TRIANGULAR,
Octohedral.WATERMAN },
Polyhedral.VAN_LEEUWEN, Octohedral.WATERMAN },
{ Pseudocylindrical.ECKERT_IV, Pseudocylindrical.KAVRAYSKIY_VII,
Pseudocylindrical.MOLLWEIDE, ArbitraryPseudocylindrical.NATURAL_EARTH,
ArbitraryPseudocylindrical.ROBINSON, Pseudocylindrical.SINUSOIDAL, Tobler.TOBLER },
@ -147,10 +145,11 @@ public abstract class MapApplication extends Application {
{ Snyder.GS50, Misc.GUYOU, Misc.HAMMER_RETROAZIMUTHAL, Pseudocylindrical.LEMONS,
Misc.PEIRCE_QUINCUNCIAL, Misc.TWO_POINT_EQUIDISTANT, Misc.FLAT_EARTH },
{ Arbitrary.DANSEIJI_O, Arbitrary.DANSEIJI_I, Arbitrary.DANSEIJI_II,
Arbitrary.DANSEIJI_III, Arbitrary.DANSEIJI_IV, MyProjections.EXPERIMENT,
Polyhedral.AUTHAPOWER, Polyhedral.ACTUAUTHAGRAPH, MyProjections.MAGNIFIER,
MyProjections.PSEUDOSTEREOGRAPHIC, Polyhedral.TETRAGRAPH,
MyProjections.TWO_POINT_EQUALIZED } }; // every projection I have programmed
Arbitrary.DANSEIJI_III, Arbitrary.DANSEIJI_IV, Arbitrary.DANSEIJI_V,
Arbitrary.DANSEIJI_VI, Arbitrary.DANSEIJI_VII, Arbitrary.DANSEIJI_VIII,
MyProjections.EXPERIMENT, Polyhedral.AUTHAPOWER, Polyhedral.ACTUAUTHAGRAPH,
MyProjections.MAGNIFIER, MyProjections.PSEUDOSTEREOGRAPHIC,
Polyhedral.TETRAGRAPH, MyProjections.TWO_POINT_EQUALIZED } };
private static final String[] ASPECT_NAMES = { "Standard", "Transverse", "Cassini", "Atlantis",
"Jerusalem", "Point Nemo", "Longest Line", "Cylindrical", "Tetrahedral", "Antipode",

View File

@ -32,6 +32,7 @@ import image.SavableImage;
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.stage.Stage;
import maps.Arbitrary;
import maps.ArbitraryPseudocylindrical;
import maps.Azimuthal;
import maps.Conic;
@ -50,7 +51,7 @@ import maps.WinkelTripel;
/**
* A program to generate and output an HTML snippet listing and explaining all of my maps
*
* @author jkunimune
* @author Justin Kunimune
*/
public class MapExplainer extends Application {
@ -63,15 +64,15 @@ public class MapExplainer extends Application {
Cylindrical.GALL_STEREOGRAPHIC, Azimuthal.STEREOGRAPHIC.transverse(),
Azimuthal.POLAR.transverse(), Azimuthal.EQUAL_AREA.transverse(),
Azimuthal.GNOMONIC.transverse(), Azimuthal.ORTHOGRAPHIC.transverse(),
Conic.LAMBERT, Conic.EQUIDISTANT, Conic.ALBERS,
Polyhedral.LEE_TETRAHEDRAL_RECTANGULAR, Polyhedral.AUTHAGRAPH,
Pseudocylindrical.SINUSOIDAL, Pseudocylindrical.MOLLWEIDE, Tobler.TOBLER,
Lenticular.HAMMER, Lenticular.AITOFF, Lenticular.VAN_DER_GRINTEN,
ArbitraryPseudocylindrical.ROBINSON, WinkelTripel.WINKEL_TRIPEL, Octohedral.CAHILL_KEYES,
Conic.LAMBERT, Conic.EQUIDISTANT, Conic.ALBERS, Pseudocylindrical.SINUSOIDAL,
Pseudocylindrical.MOLLWEIDE, Tobler.TOBLER, Lenticular.AITOFF,
Lenticular.VAN_DER_GRINTEN, ArbitraryPseudocylindrical.ROBINSON,
WinkelTripel.WINKEL_TRIPEL, Polyhedral.AUTHAGRAPH,
Polyhedral.LEE_TETRAHEDRAL_RECTANGULAR, Octohedral.CAHILL_KEYES,
Octohedral.CAHILL_CONCIALDI, Misc.PEIRCE_QUINCUNCIAL.transverse(), Snyder.GS50,
Misc.TWO_POINT_EQUIDISTANT, Misc.HAMMER_RETROAZIMUTHAL, Misc.FLAT_EARTH },
{ MyProjections.PSEUDOSTEREOGRAPHIC, Polyhedral.TETRAGRAPH, Polyhedral.AUTHAPOWER,
Polyhedral.ACTUAUTHAGRAPH, MyProjections.TWO_POINT_EQUALIZED.transverse() } };
{ Arbitrary.DANSEIJI_O, Arbitrary.DANSEIJI_IV, Arbitrary.DANSEIJI_V, Polyhedral.TETRAGRAPH,
Polyhedral.AUTHAPOWER, Polyhedral.ACTUAUTHAGRAPH } };
private PixelMap inputSkew, inputPole, inputNone, inputEast, inputWest;

View File

@ -47,6 +47,7 @@ import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import maps.Arbitrary;
import maps.ArbitraryPseudocylindrical;
import maps.Azimuthal;
import maps.Cylindrical;
@ -74,12 +75,14 @@ public class MapPlotter extends Application {
Cylindrical.PLATE_CARREE, Cylindrical.GALL_ORTHOGRAPHIC, Cylindrical.BEHRMANN,
Cylindrical.GALL_STEREOGRAPHIC };
private static final Projection[] AZIMUTHAL = { Azimuthal.POLAR };
private static final Projection[] PSEUDOCYL = { Pseudocylindrical.MOLLWEIDE, ArbitraryPseudocylindrical.ROBINSON,
ArbitraryPseudocylindrical.NATURAL_EARTH, Pseudocylindrical.KAVRAYSKIY_VII, Tobler.TOBLER };
private static final Projection[] PSEUDOCYL = { Pseudocylindrical.MOLLWEIDE,
ArbitraryPseudocylindrical.ROBINSON, ArbitraryPseudocylindrical.NATURAL_EARTH,
Pseudocylindrical.KAVRAYSKIY_VII, Tobler.TOBLER };
private static final Projection[] LENTICULAR = { Lenticular.AITOFF,
Lenticular.VAN_DER_GRINTEN, WinkelTripel.WINKEL_TRIPEL };
Lenticular.VAN_DER_GRINTEN, WinkelTripel.WINKEL_TRIPEL, Arbitrary.DANSEIJI_O,
Arbitrary.DANSEIJI_I, Arbitrary.DANSEIJI_II };
private static final Projection[] TETRAHEDRAL = { Polyhedral.LEE_TETRAHEDRAL_RECTANGULAR,
Polyhedral.AUTHAGRAPH, Polyhedral.ACTUAUTHAGRAPH };
Polyhedral.AUTHAGRAPH, Polyhedral.VAN_LEEUWEN };
private static final Projection[] CHEATY = { Pseudocylindrical.LEMONS,
Octohedral.KEYES_BASIC_M, Polyhedral.DYMAXION, Octohedral.CAHILL_CONCIALDI };
private static final Projection[] OTHER = { Misc.PEIRCE_QUINCUNCIAL };

View File

@ -1,3 +1,24 @@
/**
* MIT License
*
* Copyright (c) 2017 Justin KuPermission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package apps;
import java.io.File;
@ -22,34 +43,10 @@ import maps.Snyder;
import maps.Tobler;
import maps.WinkelTripel;
/**
* MIT License
*
* Copyright (c) 2017 Justin Kunimune
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/**
* A script that automatically manufactures a slew of projections in standard aspect.
*
* @author jkunimune
* @author Justin Kunimune
*/
public class MapProducer extends Application {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -42,52 +42,46 @@ public class Arbitrary {
public static final ArbitraryProjection DANSEIJI_O = new ArbitraryProjection(
"Danseiji O", "The optimal conventional lenticular map.",
true, Type.OTHER, Property.COMPROMISE, "danseijiO.csv");
true, Type.OTHER, Property.COMPROMISE, false, "danseijiO.csv");
public static final ArbitraryProjection DANSEIJI_I = new ArbitraryProjection(
"Danseiji I", "The optimal conventional equal-area map.",
true, Type.OTHER, Property.COMPROMISE, "danseijiI.csv");
true, Type.OTHER, Property.COMPROMISE, false, "danseijiI.csv");
public static final ArbitraryProjection DANSEIJI_II = new ArbitraryProjection(
"Danseiji II", "Like Danseiji O, but with more weight given to shapes.",
true, Type.OTHER, Property.COMPROMISE, "danseijiII.csv");
"Danseiji II", "An optimised map that gives more weight to shapes rather than sizes.",
true, Type.OTHER, Property.COMPROMISE, false, "danseijiII.csv");
public static final ArbitraryProjection DANSEIJI_III = new ArbitraryProjection(
"Danseiji III", "A map optimised to move distortion from the continents into the oceans.",
true, Type.OTHER, Property.COMPROMISE, "danseijiIII.csv");
true, Type.OTHER, Property.COMPROMISE, true, "danseijiIII.csv");
public static final ArbitraryProjection DANSEIJI_IV = new ArbitraryProjection(
"Danseiji IV", "A map optimised to show off the continents by compressing the oceans.",
true, Type.OTHER, Property.COMPROMISE, "danseijiIV.csv");
true, Type.OTHER, Property.COMPROMISE, true, "danseijiIV.csv");
public static final ArbitraryProjection DANSEIJI_V = new ArbitraryProjection(
"Danseiji V", "A map optimised to show off the continents by compressing the oceans.",
true, Type.OTHER, Property.COMPROMISE, "danseijiV.csv");
"Danseiji V", "A map optimised to display landmasses accurately and without interruption.",
true, Type.OTHER, Property.COMPROMISE, true, "danseijiV.csv");
public static final ArbitraryProjection DANSEIJI_VI = new ArbitraryProjection(
"Danseiji VI", "A map where area is approximately proportional to population.",
true, Type.OTHER, Property.COMPROMISE, "danseijiVI.csv");
"Danseiji VI", "A compromise conventional map, where both physical area and population affect size.",
true, Type.OTHER, Property.COMPROMISE, true, "danseijiVI.csv");
public static final ArbitraryProjection DANSEIJI_VII = new ArbitraryProjection(
"Danseiji VII", "A compromise conventional map, where both physical area and population affect size.",
true, Type.OTHER, Property.COMPROMISE, "danseijiVII.csv");
"Danseiji VII", "A compromise unconventional map, where both physical area and population affect size.",
true, Type.OTHER, Property.COMPROMISE, true, "danseijiVII.csv");
public static final ArbitraryProjection DANSEIJI_VIII = new ArbitraryProjection(
"Danseiji VIII", "A compromise unconventional map, where both physical area and population affect size.",
true, Type.OTHER, Property.COMPROMISE, "danseijiVIII.csv");
public static final ArbitraryProjection DANSEIJI_IX = new ArbitraryProjection(
"Danseiji IX", "A map preserving the oceans over landmasses.",
true, Type.OTHER, Property.COMPROMISE, "danseijiIV.csv");
"Danseiji VIII", "A map optimised to show off the oceans at the expense of landmasses.",
true, Type.OTHER, Property.COMPROMISE, true, "danseijiVIII.csv");
@ -99,8 +93,11 @@ public class Arbitrary {
private double[][][] pixels; // the pixel values, for inverse mapping
private double[][] edge; // the indices of the edge vertices
public ArbitraryProjection(String title, String description, boolean interrupted, Type type, Property property, String filename) {
super(title, description, 0, 0, interrupted ? 0b1010 : 0b1011, type, property, 4);
public ArbitraryProjection(
String title, String description, boolean interrupted, Type type, Property property,
boolean basedOnLand, String filename) {
super(title, description, 0, 0, interrupted ? 0b1010 : 0b1011, type, property, 4,
new String[0], new double[0][], !basedOnLand);
this.filename = filename;
}

View File

@ -161,7 +161,7 @@ public class Polyhedral {
public static final PolyhedralProjection ACTUAUTHAGRAPH = new PolyhedralProjection(
"EquaHedral", "A holey authalic tetrahedral projection to put AuthaGraph to shame.",
"EquaHedral", "An interrupted authalic tetrahedral projection.",
0b1010, Configuration.TETRAHEDRON_WIDE_VERTEX, Property.EQUAL_AREA, 3,
new String[] {"Sinus length"}, new double[][] {{0, 60, 20}}) {
@ -225,6 +225,22 @@ public class Polyhedral {
};
public static final Projection VAN_LEEUWEN = new PolyhedralProjection(
"van Leeuwen", "An uninterrupted equal-area tetrahedral projection. It's more accurately known as \"the Vertex-oriented great circle projection applied to a tetrahedron\", but the guy who copublished it with Leeuwen calls it \"the van Leeuwen projection\" on his website, so I think this is fine.",
0b1011, Configuration.TETRAHEDRON_WIDE_VERTEX, Property.EQUAL_AREA, 3) {
public double[] faceProject(double lat, double lon) {
ACTUAUTHAGRAPH.setParameters(0);
return ACTUAUTHAGRAPH.faceProject(lat, lon);
}
public double[] faceInverse(double r, double th) {
ACTUAUTHAGRAPH.setParameters(0);
return ACTUAUTHAGRAPH.faceInverse(r, th);
}
};
public static final Projection DYMAXION = new PolyhedralProjection(
"Dymaxion", "A polyhedral projection that slices up the oceans as much as possible without slicing up any landmasses.",
0b1110, Configuration.DYMAXION, Property.COMPROMISE, 3) {

View File

@ -42,7 +42,7 @@ public class Tobler {
"Tobler Hyperelliptical", "An equal-area projection shaped like a hyperellipse.",
2*Math.PI, 0, 0b1001, Type.PSEUDOCYLINDRICAL, Property.EQUAL_AREA, 4,
new String[]{"Std. Parallel","alpha","K"},
new double[][] {{0,89,30}, {0,1,.46}, {1,5,3.7}}) { //optimal parameters are 30.6,.50,3.63, but these defaults are more recognizably Tobler
new double[][] {{0,89,37.5}, {0,1,0.0}, {1,5,3.0}}) { //optimal parameters are 30.6,.50,3.63, but these defaults are more recognizably Tobler
private static final int N = 20000;
private double alpha, kappa, epsilon; //epsilon is related to gamma, but defined somewhat differently