As it turns out, they are quite pointy. And creating an authagraphic
tetrahedral projection that has to shove landmasses into the pointy
corners doesn't work very well. Oh, well. I did some fun calculus to
make it work. I don't know how AuthaGraph does it. Probably by not being
authagraphic and lying to its followers. I'll probably make something
interrupted 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 made drawn lines break when they get too long again, and I fixed some
issues with Pierce Quincuncial and Guyou. Speaking of which, I removed
Guyou from my active projection list. It used to be my favourite
projection, but now that I've found Lee, it's just obsolete. Pierce
Quincuncial is a bit obsolete in light of that too, but at least that
one is somewhat known; I don't need it as well as Guyou.
I was also fooling around with Lee and found a way better aspect for
tetrahedral maps. I have no idea how I missed it before.
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 added the forward solution to the Lemons projection, which is
currently a bit wrong, but I'm going to replace it with a Cassini type
thing in a bit, anyway.
I also spiffed up the comments and changed how Antipode works slightly.
I added the perspective projection, a generalized form of the
orthographic and stereographic projections. I also added those contour
lines to shape distortion in a correct way. It looks a little ugly on
simple projections, but really cool on the more abstract ones.
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.
I invented another map projection, this one specifically designed for
small oblong regions. I think it looks pretty cool if I do say so
myself. There are holes at the bounds of my parameter, so I'll have to
take care of that, but honestly, I'm so sick of limits right now.
I got an inverse solution for the two-point equidistant projection. It
currently has a lot of NaNs, divergences, and holes, but I'm going to
fix those once I finish simplifying the solution.
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 changed somewhat how parameters and aspects are treated, particularly
for the retroazimuthal and two-point equidistant projections, which
shouldn't really have aspects. Instead they now have parameters for
those latitudes and longitudes they use, and the aspect selector
disappears when they are selected.
I also moved around a few listeners, cleaned up my code by removing all
explicit EventHandler declarations, and reimplemented the thing where
dragging the sliders in Vector mode instantly changes the map, since
that's apparently not throwing an error anymore.
And in case you were wondering (though I don't know who would read this
besides me), the title references the fact that the "Mecca Projection"
is technically the quasicylindrical retroazimuthal projection, not the
quasiazimuthal one, but my Hammer Retroazimuthal centers on Mecca by
default now, so it's more or less a Mecca projection.
I combined the front and back hemispheres of the Hammer Retroazimuthal
to make one crazy looking map projection. It is still technically
correct, even though I rotated half of it 180 degrees to make it fit. As
classy as it was to have one map projection in two pieces, I think it
just works a lot better this way.
I learned (sort of) how to use Ant and did a bunch of fun build stuff.
Now I have a script to update the .jar files for me and a bunch of real
executables, with installers and icons and everything! I also finally
just got rid of the wormhole thing; it's just completely different from
the rest of this repository and does not belong here. It's fine; I've
got it in the history.
I implemented the final stages of the conformal conic. It is now alway
centered and always fills the image. I also found and fixed a bug where
the user could change the parameters as the map was being calculated. As
predicted, the code for Lambert conic now looks just as ugly as ED Conic
and Albers, but that's okay, because I never have to touch them again.
Woo!
It's a pseudoazimuthal projection based on stereographic. I call it
"pseudostereographic". It's the next logical step after Aitoff and
Hammer. It's not that it's a particularly good map projection -
obviously scaling the longitudes ruins the conformal properties, and it
comes out as a little more progressive than Plate Caree, just barely
more authagraphic than Lee. It's so obvious, though, that surely someone
must have thought of this already.
I implemented some smarter threading so that error messages block the
main window and the map isn't calculated three times when you choose an
aspect. There was apparently also a critical problem that caused the
vector designer to crash one out of every however many thousand times,
which I fixed with a call to Platform.runLater.
Oh, and I did equidistant conic projections! That probably should have
been the title. I've got this super robust method of dealing with all
the different shapes it can have, which looks utterly hideous but works
amazingly.
In addition to that, I composed my "Map wishlist", which does not at all
describe what it is, but I like the word "wishlist" so whatever. I just
added all the maps I want to have eventually with TODO tags on them.
Once I have all of those, I will consider this part of the code done and
move on to refining all of my analysis tools and generating HTML.
Conformal conic is done. I'll admit, there's some room for improvement
in the way inverse handles r0 - you sometimes get awkward blank space on
one side of the map. This is certainly good enough to move forward,
though. I also added Miller, because I remember liking that one at one
point. Not sure why.
I made inverse solutions for all my invented projections, and even threw
in a new one, "Tetrachamfer", which kind of sucks, but I felt like I
should include it for completeness's sake. I found a bug in
MapConfigurationDialog and squashed it, as well. And I added a couple
new maps to the output folder. Oh, I never explained what the problem
with Tobler was! There was an issue with the way Z was being generated,
so last commit, I cleaned that up and may have made it slightly slower,
but I don't really care given how well it works now and how much faster
it still is than Lee (seriously, what is the deal with that?). Did I do
anything else? Not really. Next step: conic projections!
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.
And that's before optimization. I have two variables to play with. And
it's pseudocylindrical. Who would've thought? Tobler, I guess.
This binary search thing worked out super well; I'm really happy with
it. I didn't even have to touch Newton's method, which I think
contributes to this being faster than Winkel Tripel. I must admit, the
code is not pretty by any stretch of the word. But it works. Really
well. I'm so happy right now.
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!
All map-based Applications have been changed to make use of
MapApplication. Yay. I also fixed equal-area cylindrical to be real. Now
if only Tobler and the conic maps were real.
I added more inheritance. When I think of the word "inheritance", the
first thing that comes to mind is the above quote. It's from one of the
broadsheet articles in The Bands of Mourning. Actually, most of what I
did in this commit had to do with parametrization, not inheritance. Oh,
well. It's a good quote.
Maps can have parameters now. Woo. It's an opportunity that Equal-Area
Cylindrical (very simple), my made-up map projections (not that hard a
leap), and Winkel Tripel (surprisingly difficult) currently take
advantage of. I still need to make the conic projections be
parametrized, and Tobler once I can make it be real. I also still need
to make MapAnalyzer take advantage of this newfound inheritance.
That was... a lot. I decided to put some inheritance into the project,
and what a rabbit hole that turned out to be!
Huh. I think that may be the first time I've ever actually used an
"exclamatory statement". What a useless structure that is!
Anyway, both MapDesigners now inherit from the same abstract super
class. Eventually, I'll get MapAnalyzer to link to that, too. I also
changed a whole lot of other things, and started inserting parametric
map capacities. That should be a fun GUI thing to figure out. I also
changed a lot of other things that I can't remember off the top of my
head. I've just been dragging chunks of code around and swimming in
errors for the past week.
I had been under the impression that there wasn't one. If so, I'm
apparently a cartographic genius. More likely I was just mislead by that
2002 Turkish paper.
I made a new program to plot existing map projections with labels (I
have yet to actually add the labels). I also moved some things around,
implemented Aitoff, and found a bug in my Newton-Raphson Approximation
that was making it converge slower (how it still managed to converge to
the right value is totally beyond me).
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.
I refactored everything (assuming I actually understand what the word
'refactoring' means, which I think I do, but I'm not sure. I'm too lazy
to check). There are fewer duplicate names, corresponding information is
closer together in general, the code has less redundancy, it's easier to
add new map projections, and classes are grouped more effectively and
more logically. I've now switched from using Strings to represent map
projections to using an enum (remember when I was using separate
classes? Wow, that was trash!). I was also going to combine the
MapDesigners and MapAnalyzer with some inheritance type stuff, but I
think that's content for another commit.