I fixed up and ran the MapExplainer, to update the website. I added more maps to it and made it handle threads properly. I also updated the MapPlotter to have that neat Bat Map, and fixed minor issues with Polyhedral and Octohedral.
I added labels to the political map and made it properly handle labels. That was the last major thing I wanted to do. Yay! I created a bunch of new vector maps and took the opportunity to freshen up my super-map. I also found and fixed a fatal bug in the raster map designer in that it was not loading parameters.
I renamed AuthaPower to TetraPower, as it is a somewhat more descriptive name, and removed the old TetraPower, as it didn't add much to TetraGraph. I also made my SVGs more compatible, enhanced my graticules, and fixed a bug with Behrmann.
I wrote a script that automatically generates standard axis maps, which I will now put on Wikipedia. There are some issues on which I am currently working, but this is great for the most part. I also revamped my organisation and documentation slightly.
I finished my thread-safing. Wow, threads are hard. I'm much more
confident in my code's ability to run without mysterious unreproducable
errors, now, though.
I (finally) made it automatically snip paths that are obviously crossing
interruptions. This should make vector maps look world better straight
out of the program, and will be crucial to mass-producing vector maps.
There's some room for improvement regarding the handling of closepaths,
but all in all, this is a big step up.
I also got a new input, fixed some minor issues with the new
Cahill-Keyes (did you know it's pronounced /kais/?), and might have
fixed the sporadic BufferOverflowExceptions, but I'm not sure about the
last one, as that problem is extremely difficult to reproduce, but I
have a strong suspicion it has something to do with threads, and I added
a bunch of Platform.runLater()s, so we'll see.
I decided to spruce up my input SVG generation code, and got very carried away. I moved some of the bigger or more specific files into an Advanced folder in input, and then I got the horrible idea to make a super detailed computer-generated map from Natural Earth data with labels for everything and fancy borders, and then I had to do it. It took a very long time. But it is complete. Check out Advanced\Supermap if you have a powerful enough computer.
I also reorganised my code a bit and took better advantage of shapefiles.
I switched around Basic.svg and Landmasses.svg, because Basic.svg
honestly just looks bad. The graticule is fine when the landmasses are
filled, but in the map designer, the graticule totally distracts from
the actual coastlines, and it was driving me cra cray.
I made it so that saved SVG files have their dimensions changed to fit
the new map projection shape. I know I said that I already did that, but
this time it actually works. I also instilled a couple of checks to
prevent my projections from going to infinity or NaN.
I created a new Waterman projection for Wikipedia and in the process changed a few things to make the resulting image better. Aren't real applications to reveal shortcomings in one's product the best?
I finished my input images. Everything is complete and ready to be used in my program. Tissot-alt1.svg looks more like the one on Wikipedia I'm trying to replace, Tissot.svg looks more like that, Landmasses.svg has an updated, better-looking black-on-white color scheme, Political.svg has cleaner and more editable css, Political.png has been changed to a nicer size, Tissot.png is now consistent with Tissot.svg, Graticule.svg is finer and has tropics and arctic circles labeled, and Orthodromes looks a lot nicer depite being functionally the same.
I found out that some of my svg landmass strings got corrupted to oddly-shaped landmasses at some unknown point in time. I also found out that the sources that I cited for said images were completely wrong. So I decided to cut ties and just make all of my own svg inputs from scratch. I used the data from Natural Earth, which I can now access with my improved coding skill (the last time I tried to use Natural Earth, I couldn't figure out how to open their shapefiles, which is why I turned to SVG in the first place). I expanded my zupplementary Python scripts in preparation to redo all of them from my new source. Except Political.svg. That's made by the same person who does Natural Earth using the same data, and is already a great image.
So I cleared out my old SVGs, updated the README to use real sources, and added some notes to myself in the Java files.
Last week, I thought Cahill-Keyes would be my final map projection. Now
I have that, two new pseudocylindricals, and the beginnings of a
Dymaxion derivation in my notebook. I just can't stop! Anyway, I threw
in Natural Earth, because I like Tom Patterson's work (as you may know,
two of my input rasters were made by him), and Karvayaganirsksyviyh the
twelfth, because of that one reference in XKCD and its slightly
persuasive Wikipedia page. Neither was too hard to implement, though I
did make Robinson share a class with the very similar Natural Earth.
I also redid Tissot like I said I would. I relegated the other one to
the side to be used by scripts only. I just like a lot more indicatrices
on my map than Eric Gaba. I need to update Tissot.png to have colors
consistent with Tissot.svg, but I'll do that later. I was going to do
that today before I got distracted finding out all of my Antarcticas
were wrong.
I added a few more vector inputs that I've been wanting for some time. My Tissot one I actually don't love, but it is based heavily on Eric Gaba's Tissot maps that are all over Wikipedia that I want to replace because they lack indicatrices in the most important locations: the poles and the prime meridian. After I fix Wikipedia, I might make a new one without a graticule and with more indicatrices.
I also made my program slightly better at loading new SVG maps and fixed Landmasses to not have a weird broken Antarctica.
I changed up a few map projections to look more like they did when they were first published. I added a triangular version of Lee, I changed AuthaGraph to have the aspect built in, and I fixed all of the ones without aspects to actually not have aspects (there was a bug there that I fixed).
I also cleaned up SVGMap a bit to try to make it work better with this great Tissot's indicatrices image I found, but the image was too messy, and I couldn't make it work.
I changed up the inputs a bit. Many of the raster inputs are now PNGs; I decided that even though they take up more space, JPEG artifacts aren't worth the few extra megabytes, especially since JPEG artifacts that get magnified by projection are really annoying.
I touched up the graticule SVGs by removing some annoying "z"s and thinning the lines.
I realised that Political.png was really bad, so I color-coded Political.svg and converted that to a PNG. I don't know why it's taken me so long to find a decent way of doing that. Oh, yeah, and Political.svg exists now. The default "Basic.svg" is what was "Compound.svg". It makes the two map designers more consistent.
I also updated the README accordingly.
I added an option to remove the unnecessary stuff on the side of the map. It makes some pretty cool looking stuff. Not as good stuff, in my opinion, since it implies that the world has hard edges, but it works real well for the map analyser, where it prevents the distorted margins from distracting from the less distorted part that actually matters.
I've finished Cahill-Keyes! It took a lot of reading, a lot of geometry,
and a lot of if statements. But now it's perfect. Now all I need is an
inverse projection.
I went through my images, recorded their sources if I could find them,
and replaced them with certifieably open-source alternatives if not.
I also fixed a minor issue with saving.
I refined my SVG parser to be open to more commands and such. It still
does not take kindly to arcs, but it's pretty darn good. I tried it out
with some new maps, and it looks great.
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.
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 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.
I added gradient descent to the optimizing program in the hopes of
making it faster, which kind of worked, I suppose. I also made some of
the tolerances smarter on some of the iterative algorithms, and took a
few terms off of the Dixon McLaurin Series. I also have Lee centering
its Taylor Series on points closer to the points, so that's more
accurate at the poles now. And I made Tetragraph have actual numbers
attached to it rather than that 1.1 I had from guess-and check. Oh, and
I got rid of Eliptabola because it was apparently discontinuous or crazy
stiff or something, because gradient descent on it would always diverge
to NaN, and it wasn't that great of a projection, anyhow.
I implemented the Lee Conformal Projection, and let me tell you, it took
a lot of work. Oh, also, I tried another family of pseudo-azimuthal-ish
projections that just kind of sucked. I think I'm going to try
optimizing some tetrahedral projections next. Hence the Lee projection.
I used a 28th-order McLaurin series for the Lee projection, so it
doesn't actually tesselate perfectly. I think I might have entered a
number wrong, because seriously?! The 28th order with six decimal places
of precision wasn't good enough? Anyway, the series was a suggestion
from Lee himself in the paper that I read on JStor, that I had to make a
JStor account for, because I couldn't get the equations literally
anywhere else on the internet. NGAHHH!
I set it to use HSB instead of RGB. Now, darker areas have more angular
distortion, red areas are compressed, and blue areas are dilated. I also
made some neat graphics.
The JavaFX thing wouldn't really have worked for me given that I needed
to transform the image, not just display it. I'm still salty I didn't
find out about that sooner. Anyway, I got it all to work besides the
complex number ones. I'll figure those out in a bit. I also haven't
tested saving yet, but I'm sure it will work perfectly on the first try.
I've decided to give up on replicating the AuthaGraph projection. I'm
pretty close to the actual projection, and while mine is not
authagraphic, I think it's more authagraphic than the actual AuthaGraph
projection. Of course, I can't really tell, because I can't find an
AuthaGraph map with Tissot's indicatrices on it.
In attempting to solve for the AuthaGraph projection, I made something
that is, in my personal opinion, better: a compromise tetrahedral
projection! It's not authagraphic (though, technically, neither is
AuthaGraph), but it distorts shape far less than AuthaGraph does. I'll
still try to solve AuthaGraph, maybe even modify it to make it, you
know, authagraphic, but I really like this map projection I came up
with.
Turns out some of those garbage IDL-zero conventions were lurking in my
code. Typical. Cut off one head of the evil conventions hiding in my
code, and two more grow in it's place. Well, I'm almost certain my
conventions are correct now, and am ready to tackle AuthaGraph again.
I tried to make MapProjections faster, but it didn't work. The GUI looks
nicer now, but a bunch of functionality is gone.
I also did something with wormhole, apparently.
I added a new program that simply takes a couple of input panoramas and
animates what it would look like to go through a wormhole (abstracted to
a four-dimensional cylinder).
I implemented a new axis, Hammer, an equal-area projection similar to
hammer. I also threw in a random axis option, which randomly selects a
point on the Earth's surface to be the axis of the projection.
I invented a new map projection! I have given it the working title
"Rectus Aequilibrium," because it is square, it is a compromise
projection, Latin is cool, and I promised myself a long time ago that if
I ever made a map projection, I would not name it after myself. Feel
free to try it, but I think I will be trying a different algorithm,
since I think this one distorts shape too much to justify the small
amount of size distortion it reduces.
In other news, I implemented a Van der Grinten projection and spruced up
my naming conventions a bit.
I created a bunch of new maps! I added the Mollweide projection to the
program, and a Winkel Tripel button that does not yet work. I have
Winkel working in the vectorized version, but I am still working on the
math in the main program. Also, check out the "Shifted" axis preset (now
my favorite projection when combined with "Shifted Quincuncial), as well
as the "Circles", "Stars", and "Political" themes.