
// LineAdjust.java
// Murat Öksüzer, April 2021
// https://www.smartycoder.com/2021/04/geometry-model-jts-tutorial-1.html
// Modified by Andrew Davison, ad@coe.psu.ac.th, March 2023

/* Use DouglasPeuckerSimplifier to simplify lines, and 
   Densifier to add more points to lines.

   Usage:
    > compile LineAdjust.java
    > run LineAdjust

  When prompted, press <enter> on the command line to move 
  to the next example.
*/

import org.locationtech.jts.geom.*;
import org.locationtech.jts.simplify.DouglasPeuckerSimplifier;
import org.locationtech.jts.densify.Densifier;


public class LineAdjust
{

  public static void main(String[] args)
  {
    GeomsViewer gv =  Utils.view("LineAdjust");
    GeometryFactory gf = new GeometryFactory();

    double[] coords = {
            50,20, 70,70, 90, 50, 110, 80, 120, 60,
            150,60, 175,120, 200,150, 220,100, 230, 130,
            260,80, 310,110 };
    Geometry line = Utils.makeGeometry(coords, Utils.LINE); 
    System.out.println("Line: " + line);
    System.out.println("No. points: " + line.getNumPoints());
    gv.add("Original", line);

    gv.setTitle("Simplify");
    DouglasPeuckerSimplifier dps = new DouglasPeuckerSimplifier(line);
    dps.setDistanceTolerance(30);

    Geometry simplerLine = dps.getResultGeometry();
    System.out.println("\nSimplier line: " + Utils.simplify(simplerLine));
    System.out.println("No. points: " + simplerLine.getNumPoints());
    gv.add("Simpler", simplerLine);

    Geometry mpts = gf.createMultiPointFromCoords(simplerLine.getCoordinates());
    gv.add(mpts);

    Utils.waitEnter();

    gv.remove(simplerLine);
    gv.remove(mpts);
    gv.setTitle("Densify");
    Densifier densifier = new Densifier(line);
    densifier.setDistanceTolerance(15);

    Geometry denserLine = densifier.getResultGeometry();
    System.out.println("\nDenser line: " + Utils.simplify(denserLine));
    System.out.println("No. points: " + denserLine.getNumPoints());
    gv.add("Denser", denserLine);

    mpts = gf.createMultiPointFromCoords(denserLine.getCoordinates());
    gv.add(mpts);
    Utils.waitEnter();

    gv.close();
  } /* main */


}  // end of LineAdjust class
