private List processCell()

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;
  }