package ProGAL.geom3d.complex; import java.util.ArrayList; import java.util.List; import ProGAL.geom3d.Point; public class CVertex extends Point { private static final long serialVersionUID = 1L; private boolean degenerate=false; public enum DegenerateCase { ONFACE, ONEDGE }; private DegenerateCase degCase; private CVertex degPointOpposite; private CVertex degPointA; private CVertex degPointB; private final boolean bigPoint; public final int idx; private final List adjacentEdges = new ArrayList(); public boolean isBigpoint() { return bigPoint; } public CVertex getDegPointA() { return degPointA; } public void setDegPointA(CVertex degPointA) { this.degPointA = degPointA; } public CVertex getDegPointB() { return degPointB; } public void setDegPointB(CVertex degPointB) { this.degPointB = degPointB; } public DegenerateCase getDegCase() { return this.degCase; } public void setDegCase(DegenerateCase degCase) { this.degCase = degCase; } public boolean isDegenerate() { return degenerate; } public void setDegenerate(boolean degenerate) { this.degenerate = degenerate; } public CVertex(Point p, int idx){ this(p, false, idx); } public CVertex(Point p, boolean bigpoint, int idx){ super(p); setDegenerate(false); this.bigPoint = bigpoint; this.idx = idx; } public CVertex getDegPointOpposite() { return degPointOpposite; } public void setDegPointOpposite(CVertex degPointOpposite) { this.degPointOpposite = degPointOpposite; } public void addAdjacentEdge(CEdge e){ adjacentEdges.add(e); } public List getAdjacentEdges(){ return adjacentEdges; } public List getAdjacentTriangles() { List adjacentTriangles = new ArrayList(); for (CEdge edge : adjacentEdges) { List triangles = edge.getAdjacentTriangles(); for (CTriangle triangle : triangles) { if (!adjacentTriangles.contains(triangle)) adjacentTriangles.add(triangle); } } return adjacentTriangles; } public List getOppositeTriangles() { List oppositeTriangles = new ArrayList(); for (CTetrahedron tetr : getAllAdjacentTetrahedra()) { int index = tetr.findpoint(this); if (!tetr.containsBigPoint()) oppositeTriangles.add(tetr.getTriangle(index)); } return oppositeTriangles; } public List getAdjacentTetrahedra() { List adjacentTetrahedra = new ArrayList(); for (CTriangle triangle : getAdjacentTriangles()) { for (int i = 0; i < 2; i++) { CTetrahedron tetr = triangle.getAdjacentTetrahedron(i); if (!tetr.containsBigPoint()) { if (!adjacentTetrahedra.contains(tetr)) adjacentTetrahedra.add(tetr); } } } return adjacentTetrahedra; } // public List getOppositeTetrahedra() { // List oppositeTetrahedra = new ArrayList(); // for (CTetrahedron tetr : getAllAdjacentTetrahedra()) { // tetr. // // } // } /** returns all tetrahedra adjacent to the vertex (including big tetrahedra) */ public List getAllAdjacentTetrahedra() { List adjacentTetrahedra = new ArrayList(); for (CTriangle triangle : getAdjacentTriangles()) { for (int i = 0; i < 2; i++) { CTetrahedron tetr = triangle.getAdjacentTetrahedron(i); if (!adjacentTetrahedra.contains(tetr)) adjacentTetrahedra.add(tetr); } } return adjacentTetrahedra; } /** returns all big tetrahedra adjacent to the vertex */ public List getBigAdjacentTetrahedra() { List adjacentBigTetrahedra = new ArrayList(); for (CTetrahedron tetr : getAllAdjacentTetrahedra()) { if (tetr.containsBigPoint() && !adjacentBigTetrahedra.contains(tetr)) adjacentBigTetrahedra.add(tetr); } return adjacentBigTetrahedra; } public String toString(){ return toString(2); } public String toString(int dec) { return String.format("CVertex[x=%."+dec+"f,y=%."+dec+"f,z=%."+dec+"f%s]",x(),y(),z(),bigPoint?",big point":""); } }