public static ConcaveHullFactoryParameters parse(String parametersAsString) { parametersAsString = parametersAsString.replace(",", ""); Scanner scanner = new Scanner(parametersAsString); ConcaveHullFactoryParameters parameters = new ConcaveHullFactoryParameters(); parameters.setEdgeLengthThreshold(ScannerTools.readNextDouble(scanner, parameters.getEdgeLengthThreshold())); parameters.setRemoveAllTrianglesWithTwoBorderEdges(ScannerTools.readNextBoolean(scanner, parameters.doRemoveAllTrianglesWithTwoBorderEdges())); parameters.setAllowSplittingConcaveHull(ScannerTools.readNextBoolean(scanner, parameters.isSplittingConcaveHullAllowed())); parameters.setMaxNumberOfIterations(ScannerTools.readNextInt(scanner, parameters.getMaxNumberOfIterations())); scanner.close(); return parameters; } }
public ConcaveHullFactoryParameters(ConcaveHullFactoryParameters other) { set(other); }
public ConcaveHullFactoryParameters() { setDefaultParameters(); }
QuadEdgeTriangle candidateTriangle = candidatePair.getRight(); double edgeLength = quadEdgeComparator.getEdgeLength(candidateEdge); boolean isEdgeTooLong = edgeLength >= parameters.getEdgeLengthThreshold(); int numberOfBorderVertices = numberOfBorderVertices(candidateTriangle, borderVertices); int numberOfBorderEdges = numberOfBorderEdges(candidateTriangle, borderEdges); throw new RuntimeException("Triangle should have three border vertices, but has: " + numberOfBorderVertices); if (parameters.doRemoveAllTrianglesWithTwoBorderEdges() || isEdgeTooLong) .findAny().isPresent(); if (isIntersectionTriangle) return parameters.isSplittingConcaveHullAllowed() ? Case.INTERSECTION_TRIANGLE : Case.KEEP_TRIANGLE; else return Case.TWO_BORDER_EDGES_THREE_BORDER_VERTICES; if (!parameters.isSplittingConcaveHullAllowed()) return Case.KEEP_TRIANGLE;
@Override protected ConcaveHullFactoryParameters getValueCopy(ConcaveHullFactoryParameters valueToCopy) { return new ConcaveHullFactoryParameters(valueToCopy); } }
private Node createPriorityQueueGraphics(PlanarRegionSegmentationRawData rawData, ConcaveHullFactoryResult concaveHullFactoryResult) { JavaFXMultiColorMeshBuilder meshBuilder = new JavaFXMultiColorMeshBuilder(new TextureColorAdaptivePalette(512)); Point3D planeOrigin = rawData.getOrigin(); Quaternion planeOrientation = rawData.getOrientation(); Color regionColor = OcTreeMeshBuilder.getRegionColor(rawData.getRegionId()); for (ConcaveHullVariables intermediateVariables : concaveHullFactoryResult.getIntermediateVariables()) { PriorityQueue<Pair<QuadEdge, QuadEdgeTriangle>> queue = intermediateVariables.getSortedByLengthQueue(); for (Pair<QuadEdge, QuadEdgeTriangle> edgeAndTriangle : queue) { QuadEdge edge = edgeAndTriangle.getLeft(); Point3D dest = PolygonizerTools.toPointInWorld(edge.dest().getX(), edge.dest().getY(), planeOrigin, planeOrientation); Point3D orig = PolygonizerTools.toPointInWorld(edge.orig().getX(), edge.orig().getY(), planeOrigin, planeOrientation); boolean isEdgeTooLong = dest.distance(orig) > parameters.getEdgeLengthThreshold(); Color lineColor = Color.hsb(regionColor.getHue(), regionColor.getSaturation(), isEdgeTooLong ? 0.25 : regionColor.getBrightness()); meshBuilder.addLine(dest, orig, 0.0015, lineColor); QuadEdgeTriangle triangle = edgeAndTriangle.getRight(); List<Point2D> triangleVerticesLocal = Arrays.stream(triangle.getVertices()).map(v -> new Point2D(v.getX(), v.getY())).collect(Collectors.toList()); List<Point3D> triangleVerticesWorld = PolygonizerTools.toPointsInWorld(triangleVerticesLocal, planeOrigin, planeOrientation); double hue = 360.0 * random.nextDouble(); double saturation = 0.8 * random.nextDouble() + 0.1; double brightness = 0.9; meshBuilder.addPolyon(triangleVerticesWorld, Color.hsb(hue, saturation, brightness)); } } MeshView trianglesMeshView = new MeshView(meshBuilder.generateMesh()); trianglesMeshView.setMaterial(meshBuilder.generateMaterial()); return trianglesMeshView; }
public PolygonizerVisualizer() throws IOException { parameters.setEdgeLengthThreshold(0.05); // parameters.setAllowSplittingConcaveHull(false); // parameters.setRemoveAllTrianglesWithTwoBorderEdges(false); // parameters.setMaxNumberOfIterations(0); }
public void loadConfiguration(FilePropertyHelper filePropertyHelper) { Boolean enableFile = filePropertyHelper.loadBooleanProperty(REAModuleAPI.OcTreeEnable.getName()); if (enableFile != null) isOcTreeEnabled.set(enableFile); Boolean enableSegmentationFile = filePropertyHelper.loadBooleanProperty(REAModuleAPI.PlanarRegionsSegmentationEnable.getName()); if (enableSegmentationFile != null) enableSegmentation.set(enableSegmentationFile); Boolean enablePolygonizerFile = filePropertyHelper.loadBooleanProperty(REAModuleAPI.PlanarRegionsPolygonizerEnable.getName()); if (enablePolygonizerFile != null) enablePolygonizer.set(enablePolygonizerFile); Boolean enableIntersectionCalulatorFile = filePropertyHelper.loadBooleanProperty(REAModuleAPI.PlanarRegionsIntersectionEnable.getName()); if (enableIntersectionCalulatorFile != null) enableIntersectionCalulator.set(enableIntersectionCalulatorFile); String planarRegionSegmentationParametersFile = filePropertyHelper.loadProperty(REAModuleAPI.PlanarRegionsSegmentationParameters.getName()); if (planarRegionSegmentationParametersFile != null) planarRegionSegmentationParameters.set(PlanarRegionSegmentationParameters.parse(planarRegionSegmentationParametersFile)); String planarRegionConcaveHullFactoryParametersFile = filePropertyHelper.loadProperty(REAModuleAPI.PlanarRegionsConcaveHullParameters.getName()); if (planarRegionConcaveHullFactoryParametersFile != null) concaveHullFactoryParameters.set(ConcaveHullFactoryParameters.parse(planarRegionConcaveHullFactoryParametersFile)); String polygonizerParametersFile = filePropertyHelper.loadProperty(REAModuleAPI.PlanarRegionsPolygonizerParameters.getName()); if (polygonizerParametersFile != null) polygonizerParameters.set(PolygonizerParameters.parse(polygonizerParametersFile)); String intersectionEstimationParametersFile = filePropertyHelper.loadProperty(REAModuleAPI.PlanarRegionsIntersectionParameters.getName()); if (intersectionEstimationParametersFile != null) intersectionEstimationParameters.set(IntersectionEstimationParameters.parse(intersectionEstimationParametersFile)); }
private static List<ConcaveHullVariables> computeConcaveHullBorderEdgesRecursive(ConcaveHullFactoryParameters parameters, ConcaveHullVariables variables, MutableInt currentIteration) if (currentIteration.intValue() >= parameters.getMaxNumberOfIterations())
public ConcaveHullFactoryParametersProperty(Object bean, String name) { super(bean, name, new ConcaveHullFactoryParameters()); }
boolean isEdgeTooLong = vertex.distance(nextVertex) > parameters.getEdgeLengthThreshold(); Color lineColor = Color.hsb(regionColor.getHue(), regionColor.getSaturation(), isEdgeTooLong ? 0.25 : regionColor.getBrightness()); meshBuilder.addLine(vertex, nextVertex, 0.0015, lineColor);
public static void main(String[] args) throws IOException { PlanarRegionSegmentationRawDataImporter dataImporter = new PlanarRegionSegmentationRawDataImporter(new File("../../Data/20161210_185643_PlanarRegionSegmentation_Atlas_CB")); dataImporter.loadPlanarRegionSegmentationData(); List<PlanarRegionSegmentationRawData> regionsRawData = dataImporter.getPlanarRegionSegmentationRawData(); ConcaveHullFactoryParameters parameters = new ConcaveHullFactoryParameters(); while (true) { for (PlanarRegionSegmentationRawData rawData : regionsRawData) { List<Point2D> pointsInPlane = rawData.getPointCloudInPlane(); SimpleConcaveHullFactory.createConcaveHull(pointsInPlane, parameters); } } } }
private Node createBorderEdgesGraphics(PlanarRegionSegmentationRawData rawData, ConcaveHullFactoryResult concaveHullFactoryResult) { int regionId = rawData.getRegionId(); JavaFXMultiColorMeshBuilder meshBuilder = new JavaFXMultiColorMeshBuilder(new TextureColorAdaptivePalette(16)); Point3D planeOrigin = rawData.getOrigin(); Quaternion planeOrientation = rawData.getOrientation(); Color regionColor = OcTreeMeshBuilder.getRegionColor(regionId); for (ConcaveHullVariables intermediateVariables : concaveHullFactoryResult.getIntermediateVariables()) { Set<QuadEdge> borderEdges = intermediateVariables.getBorderEdges(); for (QuadEdge edge : borderEdges) { Point3D dest = PolygonizerTools.toPointInWorld(edge.dest().getX(), edge.dest().getY(), planeOrigin, planeOrientation); Point3D orig = PolygonizerTools.toPointInWorld(edge.orig().getX(), edge.orig().getY(), planeOrigin, planeOrientation); boolean isEdgeTooLong = dest.distance(orig) > parameters.getEdgeLengthThreshold(); Color lineColor = Color.hsb(regionColor.getHue(), regionColor.getSaturation(), isEdgeTooLong ? 0.25 : regionColor.getBrightness()); meshBuilder.addLine(dest, orig, 0.0015, lineColor); } } MeshView meshView = new MeshView(meshBuilder.generateMesh()); meshView.setMaterial(meshBuilder.generateMaterial()); meshView.setMouseTransparent(true); return meshView; }
public REAPlanarRegionFeatureUpdater(NormalOcTree octree, Messager reaMessager) { this.octree = octree; this.reaMessager = reaMessager; isOcTreeEnabled = reaMessager.createInput(REAModuleAPI.OcTreeEnable, true); enableSegmentation = reaMessager.createInput(REAModuleAPI.PlanarRegionsSegmentationEnable, true); clearSegmentation = reaMessager.createInput(REAModuleAPI.PlanarRegionsSegmentationClear, false); enablePolygonizer = reaMessager.createInput(REAModuleAPI.PlanarRegionsPolygonizerEnable, true); clearPolygonizer = reaMessager.createInput(REAModuleAPI.PlanarRegionsPolygonizerClear, false); enableIntersectionCalulator = reaMessager.createInput(REAModuleAPI.PlanarRegionsIntersectionEnable, false); planarRegionSegmentationParameters = reaMessager.createInput(REAModuleAPI.PlanarRegionsSegmentationParameters, new PlanarRegionSegmentationParameters()); concaveHullFactoryParameters = reaMessager.createInput(REAModuleAPI.PlanarRegionsConcaveHullParameters, new ConcaveHullFactoryParameters()); polygonizerParameters = reaMessager.createInput(REAModuleAPI.PlanarRegionsPolygonizerParameters, new PolygonizerParameters()); intersectionEstimationParameters = reaMessager.createInput(REAModuleAPI.PlanarRegionsIntersectionParameters, new IntersectionEstimationParameters()); reaMessager.registerTopicListener(REAModuleAPI.RequestEntireModuleState, (messageContent) -> sendCurrentState()); }