in baremaps-dem/src/main/java/org/apache/baremaps/dem/ContourTracer.java [224:450]
private List<LineString> processCell(double level, int x, int y) {
List<LineString> segments = new ArrayList<>();
boolean htb = polygonize && y == height - 2;
boolean hrb = polygonize && x == width - 2;
boolean hbb = polygonize && y == 0;
boolean hlb = polygonize && x == 0;
Coordinate tlc = new Coordinate(x, y + 1.0);
Coordinate tmc = interpolateCoordinate(level, x, y + 1, x + 1, y + 1);
Coordinate trc = new Coordinate(x + 1.0, y + 1.0);
Coordinate mrc = interpolateCoordinate(level, x + 1, y, x + 1, y + 1);
Coordinate brc = new Coordinate(x + 1.0, y);
Coordinate bmc = interpolateCoordinate(level, x, y, x + 1, y);
Coordinate blc = new Coordinate(x, y);
Coordinate mlc = interpolateCoordinate(level, x, y, x, y + 1);
double tlv = grid[y * width + x];
double trv = grid[y * width + (x + 1)];
double brv = grid[(y + 1) * width + (x + 1)];
double blv = grid[(y + 1) * width + x];
int index =
(tlv >= level ? 1 : 0) |
(trv >= level ? 2 : 0) |
(brv >= level ? 4 : 0) |
(blv >= level ? 8 : 0);
switch (index) {
case 1 -> {
segments.add(createSegment(mlc, bmc));
if (hbb) {
segments.add(createSegment(bmc, blc));
}
if (hlb) {
segments.add(createSegment(blc, mlc));
}
}
case 2 -> {
segments.add(createSegment(bmc, mrc));
if (hrb) {
segments.add(createSegment(mrc, brc));
}
if (hbb) {
segments.add(createSegment(brc, bmc));
}
}
case 3 -> {
segments.add(createSegment(mlc, mrc));
if (hrb) {
segments.add(createSegment(mrc, brc));
}
if (hbb) {
segments.add(createSegment(brc, blc));
}
if (hlb) {
segments.add(createSegment(blc, mlc));
}
}
case 4 -> {
segments.add(createSegment(mrc, tmc));
if (htb) {
segments.add(createSegment(tmc, trc));
}
if (hrb) {
segments.add(createSegment(trc, mrc));
}
}
case 5 -> {
segments.add(createSegment(mlc, tmc));
if (htb) {
segments.add(createSegment(tmc, trc));
}
if (hrb) {
segments.add(createSegment(trc, mrc));
}
segments.add(createSegment(mrc, bmc));
if (hbb) {
segments.add(createSegment(bmc, blc));
}
if (hlb) {
segments.add(createSegment(blc, mlc));
}
}
case 6 -> {
segments.add(createSegment(bmc, tmc));
if (htb) {
segments.add(createSegment(tmc, trc));
}
if (hrb) {
segments.add(createSegment(trc, brc));
}
if (hbb) {
segments.add(createSegment(brc, bmc));
}
}
case 7 -> {
segments.add(createSegment(mlc, tmc));
if (htb) {
segments.add(createSegment(tmc, trc));
}
if (hrb) {
segments.add(createSegment(trc, brc));
}
if (hbb) {
segments.add(createSegment(brc, blc));
}
if (hlb) {
segments.add(createSegment(blc, mlc));
}
}
case 8 -> {
segments.add(createSegment(tmc, mlc));
if (hlb) {
segments.add(createSegment(mlc, tlc));
}
if (htb) {
segments.add(createSegment(tlc, tmc));
}
}
case 9 -> {
segments.add(createSegment(tmc, bmc));
if (hbb) {
segments.add(createSegment(bmc, blc));
}
if (hlb) {
segments.add(createSegment(blc, tlc));
}
if (htb) {
segments.add(createSegment(tlc, tmc));
}
}
case 10 -> {
// Detect saddle points ambiguity
segments.add(createSegment(bmc, mlc));
if (hlb) {
segments.add(createSegment(mlc, tlc));
}
if (htb) {
segments.add(createSegment(tlc, tmc));
}
segments.add(createSegment(tmc, mrc));
if (hrb) {
segments.add(createSegment(mrc, brc));
}
if (hbb) {
segments.add(createSegment(brc, bmc));
}
}
case 11 -> {
segments.add(createSegment(tmc, mrc));
if (hrb) {
segments.add(createSegment(mrc, brc));
}
if (hbb) {
segments.add(createSegment(brc, blc));
}
if (hlb) {
segments.add(createSegment(blc, tlc));
}
if (htb) {
segments.add(createSegment(tlc, tmc));
}
}
case 12 -> {
segments.add(createSegment(mrc, mlc));
if (hlb) {
segments.add(createSegment(mlc, tlc));
}
if (htb) {
segments.add(createSegment(tlc, trc));
}
if (hrb) {
segments.add(createSegment(trc, mrc));
}
}
case 13 -> {
segments.add(createSegment(mrc, bmc));
if (hbb) {
segments.add(createSegment(bmc, blc));
}
if (hlb) {
segments.add(createSegment(blc, tlc));
}
if (htb) {
segments.add(createSegment(tlc, trc));
}
if (hrb) {
segments.add(createSegment(trc, mrc));
}
}
case 14 -> {
segments.add(createSegment(bmc, mlc));
if (hlb) {
segments.add(createSegment(mlc, tlc));
}
if (htb) {
segments.add(createSegment(tlc, trc));
}
if (hrb) {
segments.add(createSegment(trc, brc));
}
if (hbb) {
segments.add(createSegment(brc, bmc));
}
}
case 15 -> {
if (htb) {
segments.add(createSegment(tlc, trc));
}
if (hrb) {
segments.add(createSegment(trc, brc));
}
if (hbb) {
segments.add(createSegment(brc, blc));
}
if (hlb) {
segments.add(createSegment(blc, tlc));
}
}
default -> {
// No segments
}
}
return segments;
}