List<QuadEdgeTriangle> qeTriangles = QuadEdgeTriangle.createOn(qes); Collection<com.vividsolutions.jts.triangulate.quadedge.Vertex> qeVertices = qes.getVertices(false); LineSegment sA = qet.getEdge(0).toLineSegment(); LineSegment sB = qet.getEdge(1).toLineSegment(); LineSegment sC = qet.getEdge(2).toLineSegment(); sA.normalize(); sB.normalize(); continue; Triangle triangle = new Triangle(i, qet.isBorder()?true:false); triangle.addEdge(edgeA); triangle.addEdge(edgeB);
public int getAdjacentTriangleEdgeIndex(int i) { return getAdjacentTriangleAcrossEdge(i).getEdgeIndex(getEdge(i).sym()); }
/** * Gets the vertices for this triangle. * * @return a new array containing the triangle vertices */ public Vertex[] getVertices() { Vertex[] vert = new Vertex[3]; for (int i = 0; i < 3; i++) { vert[i] = getVertex(i); } return vert; }
private void process(QuadEdgeTriangle currTri, TraversalVisitor visitor) { currTri.getNeighbours(); for (int i = 0; i < 3; i++) { QuadEdgeTriangle neighTri = (QuadEdgeTriangle) currTri.getEdge(i).sym().getData(); if (neighTri == null) continue; if (visitor.visit(currTri, i, neighTri)) triQueue.addLast(neighTri); } }
/** * Gets the neighbours of this triangle. If there is no neighbour triangle, * the array element is <code>null</code> * * @return an array containing the 3 neighbours of this triangle */ public QuadEdgeTriangle[] getNeighbours() { QuadEdgeTriangle[] neigh = new QuadEdgeTriangle[3]; for (int i = 0; i < 3; i++) { neigh[i] = (QuadEdgeTriangle) getEdge(i).sym().getData(); } return neigh; }
QuadEdge edgeToRemove = entryToRemove.getLeft(); int indexOfTriangleEdgeToRemove = borderTriangleToRemove.getEdgeIndex(edgeToRemove); int indexAfterRemovedEdge = QuadEdgeTriangle.nextIndex(indexOfTriangleEdgeToRemove); int indexBeforeRemovedEdge = QuadEdgeTriangle.nextIndex(indexAfterRemovedEdge); QuadEdge newBorderEdgeAfterRemovedEdge = borderTriangleToRemove.getEdge(indexAfterRemovedEdge).sym(); QuadEdgeTriangle newBorderTriangleAfterRemovedTriangle = (QuadEdgeTriangle) newBorderEdgeAfterRemovedEdge.getData(); QuadEdge newBorderEdgeBeforeRemovedEdge = borderTriangleToRemove.getEdge(indexBeforeRemovedEdge).sym(); QuadEdgeTriangle newBorderTriangleBeforeRemovedTriangle = (QuadEdgeTriangle) newBorderEdgeBeforeRemovedEdge.getData(); borderVertices.add(borderTriangleToRemove.getVertex(indexBeforeRemovedEdge));
List<QuadEdgeTriangle> qeTriangles = QuadEdgeTriangle.createOn(qes); Collection<Vertex> qeVertices = qes.getVertices(false); LineSegment lsA = qet.getEdge(0).toLineSegment(); LineSegment lsB = qet.getEdge(1).toLineSegment(); LineSegment lsC = qet.getEdge(2).toLineSegment(); lsA.normalize(); lsB.normalize();
for (int i = 0; i < 3; i++) QuadEdge edge = borderTriangleToRemove.getEdge(i); if (!isBorderEdge(edge, borderEdges)) borderVertices.remove(borderTriangleToRemove.getVertex(indexOfVertexOppositeToEdge(newBorderEdgeIndex))); replaceTwoEdgesWithOneInOrderedList(orderedBorderEdges, borderTriangleToRemove.getEdge((newBorderEdgeIndex + 2) % 3), borderTriangleToRemove.getEdge((newBorderEdgeIndex + 1) % 3), newBorderEdge);
private static List<ConcaveHullVariables> divideHullAtIntersectionTriangle(ConcaveHullVariables variables, Pair<QuadEdge, QuadEdgeTriangle> entryWithIntersectionTriangle) { Set<QuadEdge> borderEdges = variables.borderEdges; QuadEdgeTriangle intersectionTriangle = entryWithIntersectionTriangle.getRight(); QuadEdge uniqueNonBorderEdge = Arrays.stream(intersectionTriangle.getEdges()).filter(edge -> !isBorderEdge(edge, borderEdges)).findAny().get(); Vertex intersectionVertex = intersectionTriangle.getVertex(indexOfVertexOppositeToEdge(intersectionTriangle.getEdgeIndex(uniqueNonBorderEdge))); return divideHullAtIntersectionVertex(variables, intersectionVertex); }
if (triangle.isBorder()) if (triangle.isBorder(edgeIndex)) QuadEdge borderEdge = triangle.getEdge(edgeIndex); if (firstBorderEdge == null) firstBorderEdge = borderEdge.getPrimary(); QuadEdge edge = triangle.getEdge(edgeIndex); if (isEdgeCollinearWithALineSemgentOfMultiLineString(edge, constraintSegments))
private static List<ConcaveHullVariables> removeTriangleAndDivideHull(ConcaveHullVariables variables, Pair<QuadEdge, QuadEdgeTriangle> entryToRemove) { QuadEdge edgeToRemove = entryToRemove.getLeft(); QuadEdgeTriangle triangleToRemove = entryToRemove.getRight(); Vertex intersectionVertex = triangleToRemove.getVertex(indexOfVertexOppositeToEdge(triangleToRemove.getEdgeIndex(edgeToRemove))); removeTriangleWithOneBorderEdge(variables, entryToRemove); return divideHullAtIntersectionVertex(variables, intersectionVertex); }
allTriangles.addAll(QuadEdgeTriangle.createOn(subdivision));
for (QuadEdge edge : candidateTriangle.getEdges()) for (QuadEdge edge : candidateTriangle.getEdges()) QuadEdge uniqueNonBorderEdge = Arrays.stream(candidateTriangle.getEdges()).filter(edge -> !isBorderEdge(edge, borderEdges)).findFirst().get(); int vertexIndexOppositeToCandidateEdge = indexOfVertexOppositeToEdge(candidateTriangle.getEdgeIndex(uniqueNonBorderEdge)); List<QuadEdgeTriangle> adjacentTrianglesToVertex = candidateTriangle.getTrianglesAdjacentToVertex(vertexIndexOppositeToCandidateEdge);
public boolean contains(Coordinate pt) { Coordinate[] ring = getCoordinates(); return CGAlgorithms.isPointInRing(pt, ring); }
/** * Tests whether this triangle is adjacent to the outside of the subdivision. * * @return true if the triangle is adjacent to the subdivision exterior */ public boolean isBorder() { for (int i = 0; i < 3; i++) { if (getAdjacentTriangleAcrossEdge(i) == null) return true; } return false; }
public void visit(QuadEdge[] edges) { triangles.add(new QuadEdgeTriangle(edges)); }
public String toString() { return getGeometry(new GeometryFactory()).toString(); }
public QuadEdgeTriangle getAdjacentTriangleAcrossEdge(int edgeIndex) { return (QuadEdgeTriangle) getEdge(edgeIndex).sym().getData(); }
private void process(QuadEdgeTriangle currTri, TraversalVisitor visitor) { currTri.getNeighbours(); for (int i = 0; i < 3; i++) { QuadEdgeTriangle neighTri = (QuadEdgeTriangle) currTri.getEdge(i).sym().getData(); if (neighTri == null) continue; if (visitor.visit(currTri, i, neighTri)) triQueue.addLast(neighTri); } }
@SuppressWarnings("unchecked") private static Node createOrderedBorderEdgesGraphics(QuadEdgeSubdivision quadEdgeSubdivision, PlanarRegionSegmentationRawData rawData) { List<QuadEdgeTriangle> delaunayTriangles = QuadEdgeTriangle.createOn(quadEdgeSubdivision); List<QuadEdge> orderedBorderEdges = SimpleConcaveHullFactory.computeIntermediateVariables(delaunayTriangles, null).getOrderedBorderEdges(); JavaFXMultiColorMeshBuilder meshBuilder = new JavaFXMultiColorMeshBuilder(new TextureColorAdaptivePalette(16)); Point3D planeOrigin = rawData.getOrigin(); Quaternion planeOrientation = rawData.getOrientation(); double startHue = 0.0; double endHue = 240.0; double lineStartBirghtness = 0.2; double lineEndBirghtness = 1.0; for (int edgeIndex = 0; edgeIndex < orderedBorderEdges.size(); edgeIndex++) { QuadEdge edge = orderedBorderEdges.get(edgeIndex); Point3D dest = PolygonizerTools.toPointInWorld(edge.dest().getX(), edge.dest().getY(), planeOrigin, planeOrientation); Point3D orig = PolygonizerTools.toPointInWorld(edge.orig().getX(), edge.orig().getY(), planeOrigin, planeOrientation); double alpha = edgeIndex / (double) orderedBorderEdges.size(); double lineHue = (1.0 - alpha) * startHue + alpha * endHue; Color startColor = Color.hsb(lineHue, 0.9, lineStartBirghtness); Color endColor = Color.hsb(lineHue, 0.9, lineEndBirghtness); meshBuilder.addLine(orig, dest, 0.002, startColor, endColor); } MeshView meshView = new MeshView(meshBuilder.generateMesh()); meshView.setMaterial(meshBuilder.generateMaterial()); return meshView; }