public boolean isConvexAtVertex(int vertexIndex) { return ConcaveHullTools.isConvexAtVertex(vertexIndex, hullVertices); }
public static boolean isHullConvex(List<? extends Point2DReadOnly> concaveHullVertices) { if (concaveHullVertices.size() <= 3) return true; for (int i = 0; i < concaveHullVertices.size(); i++) { if (!isConvexAtVertex(i, concaveHullVertices)) return false; } return true; }
if (!ConcaveHullTools.isConvexAtVertex(currentIndex, concaveHullVerticesToFilter))
public static int flattenShallowPockets(double depthThreshold, List<Point2D> concaveHullVerticesToFilter) { int numberOfVerticesRemoved = 0; ConcaveHullPocket pocket = new ConcaveHullPocket(); Vector2D shift = new Vector2D(); for (int currentIndex = 0; currentIndex < concaveHullVerticesToFilter.size(); currentIndex++) { if (isConvexAtVertex(currentIndex, concaveHullVerticesToFilter)) continue; boolean success = computeConcaveHullPocket(currentIndex, pocket, concaveHullVerticesToFilter); if (!success) continue; double maxDepth = pocket.getMaxDepth(); if (maxDepth > depthThreshold) continue; Point2D startBridgeVertex = new Point2D(pocket.getStartBridgeVertex()); Point2D endBridgeVertex = new Point2D(pocket.getEndBridgeVertex()); shift.sub(endBridgeVertex, startBridgeVertex); shift.normalize(); // Rotate to the right shift.set(shift.getY(), -shift.getX()); shift.scale(maxDepth); startBridgeVertex.add(shift); endBridgeVertex.add(shift); int startBridgeVertexIndex = pocket.getStartBridgeIndex(); int endBridgeVertexIndex = pocket.getEndBridgeIndex(); numberOfVerticesRemoved += removeAllExclusive(startBridgeVertexIndex, endBridgeVertexIndex, concaveHullVerticesToFilter); } return numberOfVerticesRemoved; }