Just looked up the concept of the DSA, and I find it interesting, because for a while I've been using a triangular method[1][2] for various unpublished projects I've played around with. I've made it a
bit more complicated, with the likes of the tri-corner height values (derived from the layer above, or the original seed when
at the top layer) being accompanied by both variance[4] and sub-seeding[5] values, and thus deriving equivalents for each of the mid-points used to create each the subdivision triangle (all three for the central quarter-area triangle, each possible pair and their adjacent corner for the three point-corners). Continuing iteratively for every section for which the increasingly precise LOD is not yet satisfied (i.e. still does not have enough resolution) while still wholly or partly within the desired viewport or needed to work out other localised information.
Obviously, in the triangular version (with only mildly more compex maths than one that works with orthagonals), the central child triangle could not be of the same orientation as the parent one, being either 180 degrees out or plus or minus 60 rotated, so I had long ago decided that the corner-children should also rotated. The original base of the parent triangle is a guide as to which order the sub-triangles get dealt with, on top of which I add a prescribed rotation sequence to them all. This closely mirrors the Diamond-Square's 45 degree rotation schema, although as I'd never considered doing otherwise I'd never actually observed the polygonal (square for DS, presumably triangular but perhaps hexagonal for my scheme) artefacts the DS's rotation is there to avoid.
The usual Wiki mentions that there was an analysis that described DSA as being flawed, but appears to have no details. Anyone know what this entailed? It might apply to my triangular method, although I've noticed no real issues with it.
[1] Useful because I can drill down a sphere-friendly heightmap without obvious polar effects simply by starting with a dodecahedral division of the original, as well as use a single- and double-axis wrap-around Euclidean surface.
[2] A couple of decades ago I was using a far more inefficient and easily irrepeatable method. Randomly (or pseudo-randomly) assigning utterly random values to each pixel (or voxel), then for a given (arbitrary, and thus unjustifiable) number of iterations progressively making a new copy of each pixel(/voxel) a weighted average of it and its neighbours (immediate, or even unto to a given distance) then normalising the values back to maintain the desired max/min. For a colour-map, this gave a Plasma-like output (especially interesting if R, G and B components are dealt with independently, giving an overlay of three 'gels') but is very processor-intensive.
(Just had a browse on one of my old backup disks, that is within reach, and I've actually got some images I recorded from that very experiment!)
A screenshot (converted from bitmap to the now-available PNG format, just for you) that I'd taken of the App itself. (Rough around the edges. Now, where did I put my Delphi installation disks, I could improve on that interface, these days.)
A GIF export I'd made. Notice how the 256 colour limit makes it step in interesting ways that the 24bit version doesn't.
Note that the above result is a result of a 100-iteration 'averaging and normalising' process. The more iterations, the bigger the blobs are (with wrap-around across both axial boundaries, in the above example). Also note the near-complete lack of 'square' artefacts. I'm pretty sure that I made the above using Pythagorean weighting when averaging the eight neighbours. That way it doesn't need anything like the Square-Diamond rotational fudge.
((Bear in mind that the above doesn't exactly relate to landscape generation... but it could do! e.g. heightmap related to one colour component, flora concentration related to another and moisture levels to the third, so that #FFFFFF might be a high, swampy forest, #000000 a barren desert slump, #FF8000 a dry-grass hilltop, #00FF80 a normally damp low-level forest, #8000FF is a mid-level marsh. Look, that's just examples, it's the underlying values that are important.
Anyway, it's far less efficient than the methods being described, just thought it worth bringing up as what
can be done, but why to not do it this way!))
[3] <Original text for this footnote now edited out>
[4] This way, there's a chance of plain-like, mountain-like and even (with a nod to Slartibartfast) Fjord-like areas, with a localised intensity and consistency. Without this, I've found it's either very badly developed (e.g. long, thin plains that don't look right) or globally so self-similar that it doesn't look credible.
[5] Sometimes I've just summed or XOR together all the relevant existing values to create the sub-seed, but if instead of that I make sure that the first values I derive from the master-seed are the four sub-seeds that I will need, I can then mess about with the later PRNG outputs that follow it at that level[6] without disturbing the sub-seed chain that will apply to all lower levels.
[6] e.g. if I derive from the seeded PRNG the four sub-seeds, then use the next four PRNG outputs to dictate the local height variance and thus the mid-point deviations, then I can also at a later time take another four PRNG outputs to dictate the local variances of some sort of resource availability without it affecting the already observed PRNG chain (similarly appended with it's own demand for resource variances) at all levels lower, meaning I can layer additional demands upon the system and yet maintain the same world-state. Not that I'm doing this (yet, at least), but it would mean that I could generate (or allow a client to generate) a given landscape for all end users and then if I later on want to add something esoteric like Spookiness as an overlay to the environment, the upgraded environment would not suddenly have completely different terrain (now possibly inconsistent, in game-space) and yet would now have a new (probably hidden) variable over each square mile/furlong/foot/inch/whatever of the ground with which I could enhance the gameplay. As long as I didn't try to insert new demands (like a new Sleaziness measurement)
within the generating list, only at the end, I also wouldn't end up with the new Spookiness (or whatever) intensities suddenly shifting and producing different environmental effects. IYSWIM.
[edit: some footnote numbers became misaligned by bad editing... hopefully corrected]