import java.util.*; public class ConvexCut { public static class Point { public double x, y; public Point(double x, double y) { this.x = x; this.y = y; } } // cuts right part of poly (returns left part) public static Point[] convexCut(Point[] poly, Point p1, Point p2) { int n = poly.length; List res = new ArrayList<>(); for (int i = 0, j = n - 1; i < n; j = i++) { int d1 = orientation(p1.x, p1.y, p2.x, p2.y, poly[j].x, poly[j].y); int d2 = orientation(p1.x, p1.y, p2.x, p2.y, poly[i].x, poly[i].y); if (d1 >= 0) res.add(poly[j]); if (d1 * d2 < 0) res.add(getLinesIntersection(p1.x, p1.y, p2.x, p2.y, poly[j].x, poly[j].y, poly[i].x, poly[i].y)); } return res.toArray(new Point[res.size()]); } static int orientation(double ax, double ay, double bx, double by, double cx, double cy) { bx -= ax; by -= ay; cx -= ax; cy -= ay; double cross = bx * cy - by * cx; double EPS = 1e-9; return cross < -EPS ? -1 : cross > EPS ? 1 : 0; } static Point getLinesIntersection(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { double a1 = y2 - y1; double b1 = x1 - x2; double c1 = -(x1 * y2 - x2 * y1); double a2 = y4 - y3; double b2 = x3 - x4; double c2 = -(x3 * y4 - x4 * y3); double det = a1 * b2 - a2 * b1; double x = -(c1 * b2 - c2 * b1) / det; double y = -(a1 * c2 - a2 * c1) / det; return new Point(x, y); } public static void main(String[] args) { } }