I inverted it. It looks great. It even knows where to place a sharp border where the map ends. Everything I still need to do is on the Rubber-Earth side.
I changed the Arbitrary maps to account for a change in file format in my Rubber-Earth repo, specifically with respect to the addition of a raster map (which I have yet to implement) and non-rectangular cells. I've got it all nice and smooth, and now it's on to raster maps!
I threw in Danseiji O, I, II, III, and IV. I'll do the others later once I'm happier with the tearing algorithm, but for now, I think this is pretty darn rad, dude. Check out the MapAnalyzer images!
Fixed a bug from a while ago where it doesn't properly escape weird
characters in HTML. Also corrected the Kavrayskiy description and
tweaked text sizes on the supermap.
I returned to Java 8. The Java 9 javapackager just wasn't working. I
feel that I could probably get it to package properly if I kept at it,
but I don't think it's worth it; I don't even know if anyone has Java 9
on their computer, given how the java website still has Java 8 all over
the front page for some reason. The bigger display did start to grow on
me, though I have a feeling that was Java 9 correctly recognising and
responding to my 125% text size in Accessibility Settings. I went ahead
and sized everything up just a bit. I think it looks nicer.
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 made a bunch of changes. All small ones. Together, they make my automatically-generated map a lot better. I'm finally ready to start post-processing and put these on Wikipedia!
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 got the coastlines to correctly rebind to themselves when crossing a neatline. My projection code finally produces decent maps without post-processing! Now to fulfill my dream of replacing all the Tissot's Indicatrices images on Wikipedia!
My utils package was getting pretty big, and some of them were pretty
specific, so I moved some of them to a helper package specifically for
working with imagery.
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 found the JavaFX concurrent package and have been using it to make my
code more thread-safe. In its current state, it doesn't actually display
the progress bar correctly or disable the buttons, and the threads still
read from input while it's changing, but I wanted to save my progress,
because this has been quite the struggle thus far.
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 detached Antarctica from the Cahill Keyes projection, making it much
more true to Keyes's (did you know it's pronounced /kais/?) intention. I
still use the simpler one by default, because this is a program for
creating oblique projections, and that one works much better for
obliquity.
I did the inverse of the Bat projection. It took some finagling to get
the parallel cutoffs like I wanted them, but all in all, I think it
looks great. Onto Cahill-Keyes!
I was able to get the Bat projection working without too much trouble.
It turned out that while I got my MacLaurin series right for the
conformal mapping from the disc to a hexagon, my integral was wrong. I
fixed that, but I still needed to do tho oblique trick to make it look
good enough. All in all, it works great. Now I just need an inverse.
Newton-Raphson, anyone?
I started working on that bat projection, but as it turns out, the 12th
order MacLaurin series isn't nearly precise enough. I'll have to break
it up farther. For now, though, here you go.
I've used that reference before, haven't I?
In any case, I have successfully transfered Waterman to a new Octohedral
class that is far more generalisable than the last one. I now intend to
start moving Cahill-Keyes, and coding in Cahill-Rus, Cahill-Concialdi,
and the detachment of Antarctica. The end goal: more and better
octohedral maps in my collection.
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 have spent teh last week attempting to implement proper BFGS optimisation to replace my gradient descent. I have been encountering mysterious problem after mysterious problem, from random noise in my deterministic data to fake derivatives being better than real derivatives. But now it works. And I need to push this _right now_ before it breaks.
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.
I finished the inverse of my new Equahedral map projection. Numerically,
it looks great, but to be completely honest, I'm dubious. I'm strongly
considering changing my average shape distortion function, because it's
giving a quite good score to Equahedral, even though Equahedral distorts
pretty much everything about the same amount, which I honestly think
should score it lower. It looks like it does shape better than Winkel
Tripel, which I just don't believe. So we'll see.
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've invented another map projection. Well, two, technically. They are
both equal-area tetrahedrals of the same form. I scrapped the old
Equahedral and replaced it with projections having interruptions more
like Cahill's sinuses than the arbitrary holes I put in the other one.
This drastically reduces the maximum distortion and conforms better to
the sphere, without taking up too much more area. I couldn't decide
exactly how to format the meridians (they needed a joint somewhere, but
where?), so I did it two ways so I could compare them. I'll get rid of
the one that I don't like as much, which seems to be "fold". That one is
a little bit more mathematically elegant, but just distorts the vertexal
regions more.
I implemented the one, true map projection, reverse-engineered from
spherical data. We can never be sure if this is the exact algorithm
required to convert the continents back to their natural, planar form,
but it looks pretty good to me. Perhaps with this correct map projection
in hand, we can banish the lies the government has been feeding us all
our lives. Stay flat, comrades.
Oh, I also fixed a bug in Mollweide.
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 improved my button handling so that the proper buttons grey out
whenever things are happening. I ended up taking a page from JavaFX's
book and having a map from an enum to stored buttons. I also made the
plot saving thing work, since that seems to have broken at some point,
and improved some documentation.
I fixed a bug relating to the display of obscure map projection titles
that seems to have cropped up with Java 9 and finally made conformal
conic behave a little bit better when it degenerates to Mercator.
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.