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.
I added a rating system! All maps have a rating 0-4, now. Since this
rating is completely subjective, I doubt I'll put it into the main
program. I haven't actually decided what to do with it yet, but I like
having it. The criteria I used were fairly straightforward:
0 - Terrible. Do not use. There are objectively better alternatives. I
hate it.
1 - Bad. Could be worse, but using this projection reflects a lack of
thought or understanding.
2 - Okay. I can't fault anyone for using it. It's not the best, but it
is fine. Good for at least some situations.
3 - Good. People who use this know what's up.
4 - Fantastic. One of the best. There can only be four.
These ratings reflect how the projection is most often used, not
necessarily how it ought to be used.
I also now measure average distortion in Decibels, because I like the
zeroth order of magnitude better than the negative first order of
magnitude.
I inverted a new projection to fill my "Equahedral" slot. It's what I
had before as "ActuAuthaGraph", but it cuts out the singularities, much
like Tetrachamfer. It works well for Albers, so I figured it would here,
as well. And I was right! With a minimal amount of interruption (it's
not even interruption, in a strictly technical sense), I have created an
authagraphic projection that is far better than any other I've seen. It
even has those nice little holes I like for inserting tiny orthographic
projections.
I also learned that Tetrahedral Projections produce some serious error
in my average distortion metrics. Maybe it's because of the
discontinuity; I'm not sure. I might look into it later, but for now,
I've mostly fixed the problem by lowering the threshold for "outlier" in
my size distortion metric from exp(25) to exp(15). As it turns out,
Tetrahedral projections are now way better than I though they were. This
threshold change somehow threw my Tobler off, so I had to up its
precision by a factor of two. That one's still lightning-fast, though.
It is technically O(1), after all.
Also, given how good EquaHedral is, I've deleted Hyperellipower,
TetraChamfer, and TetraFillet, and removed TetraGraph from most apps.
EquaHedral is just so good! And the AuthaPower generalisation I made for
AuthaGraph just fulfills all of my compromise needs! Tetrahedrons are
the future!
I changed all the descriptions to end with periods. I also fixed a minor bug with conic projections not properly degenerating to cylindricals and made the MapAnalyzer display nicer things (it really isn't that slow. Maybe my computer is just faster now.).
I changed Projection to define "width" and "height" attributes rather than an "aspectRatio" attribute. I'm not sure if it saves any code, and it's definitely less efficient this way, bit it makes the math parts of the code a whole lot more readable and more consise. It also makes my conics work a little bit better.
I'm ready to release. I thought this commit would be some minor spelling fixes, but I ended up having to recompile the jars and exes, fix a (surprisingly minor) bug in Math2.stddev, regenerate the plot, make MapDesignerRaster's maps have more reasonable dimensions, and improve comments slightly.
I also changed the version to 3.1 because I've decided 3.0 was what I had at the beginning of 2017.
I tweaked MapExplainer to be a little bit better, corrected some minor issues with the Projection metadata, added real descriptions to my custom parameterised projections, and fixed a critical bug with WinkelTripel's inverse solution.
I spent a while tweaking my optimization algorithm and trying to figure out why it sucks so much (i.e. why it keeps giving me trash maps), and I think I figured it out. Gradient descent sucks. At least, with this system it does. The functions are too stiff, the numbers too variable in orders of magnitude. Tobler never reaches a good set of parameters because one of its parameters uses degrees instead of radians, so it descends 3,000 times slower. How messed up is that?
I did some research, and I think Broyden-Fletcher-Goldfarb-Shanno is what I want to use. I read up on it and know exactly how I would implement it, if I actually cared that much.
As fun as BFGS would be to implement and use, I go back to school tomorrow and want this done. To that end, I added a slight modification to my gradient descent to deal with the degrees-radians issue and increased the number of iterations drastically. I tried doing a basic Newton's method with the derivative, but I did it one-dimensionally, so it sucked. I just really didn't want to deal with matrices. So here we are. Good enough, I say.
I implemented more advanced SVG parsing and manipulation. It's somewhat
slower now, I think because I changed the way it skips vertices to save
time, but it was necessary to enable slightly more advanced SVG reading
(which I have yet to test). All the projections work, though. I also
changed my coordinate system. I also broke the bit where it does not
draw long lines.
I made a program to automatically generate HTML snippets to fill the
projection page in my GH-Pages branch. It also automatically produces
nice pictures to go with it. I also threw in a nifty new transverse
feature, primarily for azimuthal maps. And I now represent properties
and types as enums. And I fixed a bug in 2 point equidistant. And fixed
some unicode issues.
So, representing projcetions as classes was kind of a horrible idea and
also impossible. That's okay. I still implemented two of the things I
wanted to implement: storing projections as variables such that I can
distribute them among several (like, fifteen), and a formal system
for a long time ive had to poop
i think i should get that looked at
hahahahahahaha just kidding i love being constapated
for processing parameters. Al6so, Wink7el Tripel is tot9ally broe5kn. i
9think it mig3ht be an 7issue with N5ewton Raph9son Appro1ximation. I'll
look i6nto that l8r.
I just added a standard parallel slider to Tobler. I think it's much
better this way. It'll give the optimizer more room to play. I think
this is a good thing.
I got the labels to move around when you resize the graph, and changed
up my distortion metrics slightly. I was, like, yeah. This is good. Now
I can optimize my Tobler projection. And then I found out that the map
optimizer was assigning Tobler size distortions of .4! I'm just so
confused. So that's completely broken. I suppose once I figure this out,
it might help to explain why Tetrapower is so bad.
I spent a buttload of time working on the Tobler projection. It is now
unbearably slow and still has an average distortion of, like .04. It's
okay, though. I've got a plan to fix both of those problems. It involves
ordinary differential equations and inheritance. Nyeh heh heh heh heh!
I implemented the Tobler projection using values from Tobler's paper,
Numerical Approaches to Map Projections and spline interpolation. I used
the apache commons' cubic spline solution, which felt kind of like
cheating, but splines are way more complicated to solve for than I
thought, so I don't feel that bad.
It's also not actually equal-area, so not sure what's up with that. I'll
probably go looking for an iterative solution to try to deal with that.
Either way, this is a great projection.
I also move some methods and classes around.