/** * @return a full depth copy of this list of planar regions. The copy can be entirely modified * without interfering with this. */ public PlanarRegionsList copy() { List<PlanarRegion> planarRegionsCopy = new ArrayList<>(); for (int i = 0; i < getNumberOfPlanarRegions(); i++) planarRegionsCopy.add(regions.get(i).copy()); return new PlanarRegionsList(planarRegionsCopy); }
/** * @return a full depth copy of this list of planar regions. The copy can be entirely modified without interfering with this. */ public PlanarRegionsList copy() { List<PlanarRegion> planarRegionsCopy = new ArrayList<>(); for (int i = 0; i < getNumberOfPlanarRegions(); i++) planarRegionsCopy.add(regions.get(i).copy()); return new PlanarRegionsList(planarRegionsCopy); } }
public static PlanarRegionsListMessage convertToPlanarRegionsListMessage(PlanarRegionsList planarRegionsList) { List<PlanarRegionMessage> planarRegionMessages = new ArrayList<>(); for (int regionIndex = 0; regionIndex < planarRegionsList.getNumberOfPlanarRegions(); regionIndex++) planarRegionMessages.add(convertToPlanarRegionMessage(planarRegionsList.getPlanarRegion(regionIndex))); return new PlanarRegionsListMessage(planarRegionMessages); }
/** * Retrieves the last planar region of this list. Special case: returns null when the list is * empty. */ public PlanarRegion getLastPlanarRegion() { if (isEmpty()) return null; else return getPlanarRegion(getNumberOfPlanarRegions() - 1); }
/** Adds the PlanarRegionsList transforming from the current coordinate system. * Uses the given appearances in order, one for each PlanarRegion. Then loops on the appearances. * * @param planarRegions */ public void addPlanarRegionsList(PlanarRegionsList planarRegions, AppearanceDefinition... appearances) { int numberOfPlanarRegions = planarRegions.getNumberOfPlanarRegions(); for (int i = 0; i < numberOfPlanarRegions; i++) { addPlanarRegion(planarRegions.getPlanarRegion(i), appearances[i % appearances.length]); } }
/** * Retrieves the last planar region of this list. * Special case: returns null when the list is empty. */ public PlanarRegion getLastPlanarRegion() { if (isEmpty()) return null; else return getPlanarRegion(getNumberOfPlanarRegions() - 1); }
/** * Retrieves the last planar region of this list and removes it from this list. * Special case: returns null when the list is empty. */ public PlanarRegion pollLastPlanarRegion() { if (isEmpty()) return null; else return pollPlanarRegion(getNumberOfPlanarRegions() - 1); }
/** * Retrieves the last planar region of this list and removes it from this list. Special case: * returns null when the list is empty. */ public PlanarRegion pollLastPlanarRegion() { if (isEmpty()) return null; else return pollPlanarRegion(getNumberOfPlanarRegions() - 1); }
/** Adds the PlanarRegionsList transforming from the current coordinate system. * Uses the given appearances in order, one for each PlanarRegion. Then loops on the appearances. * * @param planarRegions */ public static void addPlanarRegionsList(Graphics3DObject graphics3DObject, PlanarRegionsList planarRegions, AppearanceDefinition... appearances) { int numberOfPlanarRegions = planarRegions.getNumberOfPlanarRegions(); for (int i = 0; i < numberOfPlanarRegions; i++) { addPlanarRegion(graphics3DObject, planarRegions.getPlanarRegion(i), appearances[i % appearances.length]); } }
private static void checkPlanarRegionListsAreEqual(PlanarRegionsList listA, PlanarRegionsList listB) { assertEquals("Planar region lists are different sizes.", listA.getNumberOfPlanarRegions(), listB.getNumberOfPlanarRegions()); for (int i = 0; i < listA.getNumberOfPlanarRegions(); i++) { PlanarRegion planarRegionA = listA.getPlanarRegion(i); PlanarRegion planarRegionB = null; for (int j = 0; j < listB.getNumberOfPlanarRegions(); j++) { if (planarRegionA.getRegionId() == listB.getPlanarRegion(j).getRegionId()) { planarRegionB = listB.getPlanarRegion(j); break; } } assertFalse("Unable to find equivalent planar region", planarRegionB == null); checkPlanarRegionsEqual(i, planarRegionA, planarRegionB); } }
public static PlanarRegionsList generatePlanarRegionsListFromRandomPolygonsWithRandomTransform(Random random, int numberOfRandomlyGeneratedPolygons, double maxAbsoluteXYForPolygons, int numberOfPossiblePointsForPolygons, int numberOfPossiblePlanarRegions) { PlanarRegionsList planarRegionsList = new PlanarRegionsList(); int numberOfPlanarRegions = random.nextInt(numberOfPossiblePlanarRegions) + 1; while (planarRegionsList.getNumberOfPlanarRegions() < numberOfPlanarRegions) { planarRegionsList.addPlanarRegion(PlanarRegion.generatePlanarRegionFromRandomPolygonsWithRandomTransform(random, numberOfRandomlyGeneratedPolygons, maxAbsoluteXYForPolygons, numberOfPossiblePointsForPolygons)); } return planarRegionsList; } }
/** * Submit a new list of planar regions to eventually render. * This method does NOT update any YoVariables and does not update any graphics. * Once a list of planar regions is submitted, the method {@link #processPlanarRegionsListQueue()} has to be called every update tick in the caller. * @param planarRegionsList the list of planar regions to be eventually rendered. * @param requestedAppearance appearance to render the planar regions */ public void submitPlanarRegionsListToRender(PlanarRegionsList planarRegionsList, Color requestedColor) { for(int i = 0; i < planarRegionsList.getNumberOfPlanarRegions(); i++) { int index = i + currentMeshIndex.getIntegerValue(); if(index < 0 || index >= planarRegionsColorBuffer.length) break; planarRegionsColorBuffer[index].set(requestedColor.getRGB()); } submitPlanarRegionsListToRender(planarRegionsList); }
private void buildMeshAndMaterial(PlanarRegionsList planarRegionsList) { if (VERBOSE) PrintTools.info(this, "Creating mesh and material for new planar regions."); RigidBodyTransform transformToWorld = new RigidBodyTransform(); List<MeshView> regionMeshViews = new ArrayList<>(); for (int regionIndex = 0; regionIndex < planarRegionsList.getNumberOfPlanarRegions(); regionIndex++) { JavaFXMeshBuilder meshBuilder = new JavaFXMeshBuilder(); PlanarRegion planarRegion = planarRegionsList.getPlanarRegion(regionIndex); int regionId = planarRegion.getRegionId(); planarRegion.getTransformToWorld(transformToWorld); meshBuilder.addMultiLine(transformToWorld, Arrays.asList(planarRegion.getConcaveHull()), VisualizationParameters.CONCAVEHULL_LINE_THICKNESS, true); for (int polygonIndex = 0; polygonIndex < planarRegion.getNumberOfConvexPolygons(); polygonIndex++) { ConvexPolygon2D convexPolygon2d = planarRegion.getConvexPolygon(polygonIndex); meshBuilder.addPolygon(transformToWorld, convexPolygon2d); } MeshView regionMeshView = new MeshView(meshBuilder.generateMesh()); regionMeshView.setMaterial(new PhongMaterial(getRegionColor(regionId))); regionMeshViews.add(regionMeshView); } graphicsToRender.set(regionMeshViews); }
private CombinedTerrainObject3D createCombinedTerrainObjectFromPlanarRegionsList(String environmentName, double allowablePenetrationThickness) { CombinedTerrainObject3D combinedTerrainObject3D = new CombinedTerrainObject3D(environmentName); for (int i = 0; i < planarRegionsLists.length; i++) { PlanarRegionsList planarRegionsList = planarRegionsLists[i]; for (int j = 0; j < planarRegionsList.getNumberOfPlanarRegions(); j++) { PlanarRegion planarRegion = planarRegionsList.getPlanarRegion(j); if(appearances == null) { combinedTerrainObject3D.addTerrainObject(new PlanarRegionTerrainObject(planarRegion, allowablePenetrationThickness)); } else { combinedTerrainObject3D.addTerrainObject(new PlanarRegionTerrainObject(planarRegion, allowablePenetrationThickness, appearances[i])); } } } return combinedTerrainObject3D; }
boolean[] added = new boolean[regionsB.getNumberOfPlanarRegions()]; for (int regionBIdx = 0; regionBIdx < regionsB.getNumberOfPlanarRegions(); regionBIdx++) boolean foundMatchingRegion = false; for (int regionBIdx = 0; regionBIdx < regionsB.getNumberOfPlanarRegions(); regionBIdx++) for (int regionBIdx = 0; regionBIdx < regionsB.getNumberOfPlanarRegions(); regionBIdx++)
boolean[] added = new boolean[regionsB.getNumberOfPlanarRegions()]; for (int regionBIdx = 0; regionBIdx < regionsB.getNumberOfPlanarRegions(); regionBIdx++) boolean foundMatchingRegion = false; for (int regionBIdx = 0; regionBIdx < regionsB.getNumberOfPlanarRegions(); regionBIdx++) for (int regionBIdx = 0; regionBIdx < regionsB.getNumberOfPlanarRegions(); regionBIdx++)
/** * Filter all the polygons and regions such that only polygon and regions with data remain. * Simplifies the algorithm for updating the YoVariables in {@link #processPlanarRegionsListQueue()}. * @param planarRegionsList the list of planar regions with non-empty regions and non-empty polygons. * @return */ private PlanarRegionsList filterEmptyRegionsAndEmptyPolygons(PlanarRegionsList planarRegionsList) { for (int regionIndex = planarRegionsList.getNumberOfPlanarRegions() - 1; regionIndex >= 0; regionIndex--) { PlanarRegion planarRegion = planarRegionsList.getPlanarRegion(regionIndex); for (int polygonIndex = planarRegion.getNumberOfConvexPolygons() - 1; polygonIndex >= 0; polygonIndex--) { if (planarRegion.getConvexPolygon(polygonIndex).isEmpty()) planarRegion.pollConvexPolygon(polygonIndex); } if (planarRegion.isEmpty()) planarRegionsList.pollPlanarRegion(regionIndex); } if (planarRegionsList.isEmpty()) return null; return planarRegionsList; }
/** * Filter all the polygons and regions such that only polygon and regions with data remain. * Simplifies the algorithm for updating the YoVariables in {@link #processPlanarRegionsListQueue()}. * @param planarRegionsList the list of planar regions with non-empty regions and non-empty polygons. * @return */ private PlanarRegionsList filterEmptyRegionsAndEmptyPolygons(PlanarRegionsList planarRegionsList) { for (int regionIndex = planarRegionsList.getNumberOfPlanarRegions() - 1; regionIndex >= 0; regionIndex--) { PlanarRegion planarRegion = planarRegionsList.getPlanarRegion(regionIndex); for (int polygonIndex = planarRegion.getNumberOfConvexPolygons() - 1; polygonIndex >= 0; polygonIndex--) { if (planarRegion.getConvexPolygon(polygonIndex).isEmpty()) planarRegion.pollConvexPolygon(polygonIndex); } if (planarRegion.isEmpty()) planarRegionsList.pollPlanarRegion(regionIndex); } if (planarRegionsList.isEmpty()) return null; return planarRegionsList; }
private Pair<Mesh, Material> generateMeshAndMaterial(PlanarRegionsListMessage newMessage) { meshBuilder.clear(); double lineWidth = 0.01; RigidBodyTransform transformToWorld = new RigidBodyTransform(); PlanarRegionsList planarRegionsList = PlanarRegionMessageConverter.convertToPlanarRegionsList(newMessage); for (int regionIndex = 0; regionIndex < planarRegionsList.getNumberOfPlanarRegions(); regionIndex++) { PlanarRegion planarRegion = planarRegionsList.getPlanarRegion(regionIndex); int regionId = planarRegion.getRegionId(); Color regionColor = getRegionColor(regionId); planarRegion.getTransformToWorld(transformToWorld); meshBuilder.addMultiLine(transformToWorld, planarRegion.getConcaveHull(), lineWidth, regionColor, true); for (int polygonIndex = 0; polygonIndex < planarRegion.getNumberOfConvexPolygons(); polygonIndex++) { ConvexPolygon2D convexPolygon2d = planarRegion.getConvexPolygon(polygonIndex); regionColor = Color.hsb(regionColor.getHue(), 0.9, 0.5 + 0.5 * ((double) polygonIndex / (double) planarRegion.getNumberOfConvexPolygons())); meshBuilder.addPolygon(transformToWorld, convexPolygon2d, regionColor); } } Material material = meshBuilder.generateMaterial(); Mesh mesh = meshBuilder.generateMesh(); return new Pair<>(mesh, material); }
private Pair<Mesh, Material> generateMeshAndMaterial(PlanarRegionsListMessage newMessage) { meshBuilder.clear(); double lineWidth = 0.01; RigidBodyTransform transformToWorld = new RigidBodyTransform(); PlanarRegionsList planarRegionsList = PlanarRegionMessageConverter.convertToPlanarRegionsList(newMessage); for (int regionIndex = 0; regionIndex < planarRegionsList.getNumberOfPlanarRegions(); regionIndex++) { PlanarRegion planarRegion = planarRegionsList.getPlanarRegion(regionIndex); int regionId = planarRegion.getRegionId(); Color regionColor = getRegionColor(regionId); planarRegion.getTransformToWorld(transformToWorld); meshBuilder.addMultiLine(transformToWorld, planarRegion.getConcaveHull(), lineWidth, regionColor, true); for (int polygonIndex = 0; polygonIndex < planarRegion.getNumberOfConvexPolygons(); polygonIndex++) { ConvexPolygon2D convexPolygon2d = planarRegion.getConvexPolygon(polygonIndex); regionColor = Color.hsb(regionColor.getHue(), 0.9, 0.5 + 0.5 * ((double) polygonIndex / (double) planarRegion.getNumberOfConvexPolygons())); meshBuilder.addPolygon(transformToWorld, convexPolygon2d, regionColor); } } Material material = meshBuilder.generateMaterial(); Mesh mesh = meshBuilder.generateMesh(); return new Pair<>(mesh, material); }