// Path: kendzi-math-geometry/src/main/java/kendzi/math/geometry/polygon/PolygonList2d.java
// public class PolygonList2d {
// 
//     /**
//      * Points of polygon.
//      */
//     private List<Point2d> points;
// 
//     /**
//      * Create polygon from list of points.
//      *
//      * @param pPoints list of points
//      */
//     public PolygonList2d(List<Point2d> pPoints) {
//         this.points = pPoints;
//     }
// 
//     /**
//      * Create polygon from  points.
//      *
//      * @param pPoints points
//      */
//     public PolygonList2d(Point2d ... pPoints) {
//         List<Point2d> ret = new ArrayList<Point2d>(pPoints.length);
//         for(Point2d p : pPoints) {
//             ret.add(p);
//         }
// 
//         this.points = ret;
//     }
// 
//     /**
//      * Create empty polygon.
//      */
//     public PolygonList2d() {
//         this(new ArrayList<Point2d>());
//     }
// 
//     /**
//      * @return the points
//      */
//     public List<Point2d> getPoints() {
//         return this.points;
//     }
// 
//     /**
//      * @param pPoints the points to set
//      */
//     public void setPoints(List<Point2d> pPoints) {
//         this.points = pPoints;
//     }
// 
// 
// 
// 
//     public void union(PolygonList2d pPolygon) {
//         // TODO !!!
//         //        suma
//         throw new RuntimeException("TODO");
//     }
//     public void difference(PolygonList2d pPolygon) {
//         // TODO !!!
//         //        roznica
//         throw new RuntimeException("TODO");
//     }
// 
//     public boolean inside(Point2d pPoint) {
//         // TODO !!!
//         throw new RuntimeException("TODO");
// 
//     }
// 
//     public boolean inside(Point2d pPoint, double epsilon) {
//         // TODO !!!
//         throw new RuntimeException("TODO");
//     }
// 
//     /**
//      * Reverse point order in list
//      * 
//      * @param polygon
//      * @return
//      */
//     public static List<Point2d> reverse(List<Point2d> polygon) {
//         return PolygonUtil.reverse(polygon);
//     }
// }


import java.applet.Applet;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Graphics;
import java.awt.Polygon;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import javax.vecmath.Point2d;
import kendzi.math.geometry.polygon.PolygonList2d;
        if (this.points.contains(point)) {
            return;
        }

        this.points.add(point);

        if (this.points.size() >= 3) {
            SkeletonScanApp();
        }
    }

    void clearAll() {
        this.points = new ArrayList<Point2d>();

        this.drawableObjects.clear();

    }

    boolean SkeletonScanApp() {
        SkeletonOutput ret = Skeleton.skeleton(this.points);

        setupResults(ret);

        return true;
    }

    public void setupResults(SkeletonOutput sk) {
        this.drawableObjects.clear();

        for (EdgeOutput edgeOutput : sk.getEdgeOutputs()) {
// Path: kendzi-math-geometry/src/main/java/kendzi/math/geometry/polygon/PolygonList2d.java
// public class PolygonList2d {
// 
//     /**
//      * Points of polygon.
//      */
//     private List<Point2d> points;
// 
//     /**
//      * Create polygon from list of points.
//      *
//      * @param pPoints list of points
//      */
//     public PolygonList2d(List<Point2d> pPoints) {
//         this.points = pPoints;
//     }
// 
//     /**
//      * Create polygon from  points.
//      *
//      * @param pPoints points
//      */
//     public PolygonList2d(Point2d ... pPoints) {
//         List<Point2d> ret = new ArrayList<Point2d>(pPoints.length);
//         for(Point2d p : pPoints) {
//             ret.add(p);
//         }
// 
//         this.points = ret;
//     }
// 
//     /**
//      * Create empty polygon.
//      */
//     public PolygonList2d() {
//         this(new ArrayList<Point2d>());
//     }
// 
//     /**
//      * @return the points
//      */
//     public List<Point2d> getPoints() {
//         return this.points;
//     }
// 
//     /**
//      * @param pPoints the points to set
//      */
//     public void setPoints(List<Point2d> pPoints) {
//         this.points = pPoints;
//     }
// 
// 
// 
// 
//     public void union(PolygonList2d pPolygon) {
//         // TODO !!!
//         //        suma
//         throw new RuntimeException("TODO");
//     }
//     public void difference(PolygonList2d pPolygon) {
//         // TODO !!!
//         //        roznica
//         throw new RuntimeException("TODO");
//     }
// 
//     public boolean inside(Point2d pPoint) {
//         // TODO !!!
//         throw new RuntimeException("TODO");
// 
//     }
// 
//     public boolean inside(Point2d pPoint, double epsilon) {
//         // TODO !!!
//         throw new RuntimeException("TODO");
//     }
// 
//     /**
//      * Reverse point order in list
//      * 
//      * @param polygon
//      * @return
//      */
//     public static List<Point2d> reverse(List<Point2d> polygon) {
//         return PolygonUtil.reverse(polygon);
//     }
// }


// Path: kendzi-straight-skeleton/src/test/java/kendzi/math/geometry/skeleton/SkeletonApplet.java
import java.applet.Applet;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Graphics;
import java.awt.Polygon;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import javax.vecmath.Point2d;
import kendzi.math.geometry.polygon.PolygonList2d;

        if (this.points.contains(point)) {
            return;
        }

        this.points.add(point);

        if (this.points.size() >= 3) {
            SkeletonScanApp();
        }
    }

    void clearAll() {
        this.points = new ArrayList<Point2d>();

        this.drawableObjects.clear();

    }

    boolean SkeletonScanApp() {
        SkeletonOutput ret = Skeleton.skeleton(this.points);

        setupResults(ret);

        return true;
    }

    public void setupResults(SkeletonOutput sk) {
        this.drawableObjects.clear();

        for (EdgeOutput edgeOutput : sk.getEdgeOutputs()) {
            PolygonList2d polygonList2d = edgeOutput.getPolygon();