Example #1
0
 public void AddNeighbor(TriangleFace face)
 {
     if (Faces.Count < 4)
     {
         Faces.Add(face);
     }
 }
Example #2
0
        public override bool Equals(object obj)
        {
            TriangleFace edge = obj as TriangleFace;

            return(edge != null &&
                   EqualityComparer <Vertex> .Default.Equals(P1, edge.P1) &&
                   EqualityComparer <Vertex> .Default.Equals(P2, edge.P2) &&
                   EqualityComparer <Vertex> .Default.Equals(P3, edge.P3) &&
                   EqualityComparer <Tetra> .Default.Equals(RightTetra, edge.RightTetra) &&
                   EqualityComparer <Tetra> .Default.Equals(LeftTetra, edge.LeftTetra));
        }
Example #3
0
 public Tetra(TriangleFace face1, TriangleFace face2, TriangleFace face3, TriangleFace face4)
 {
     P1 = face1.P1;
     P2 = face1.P2;
     P3 = face1.P3;
     FindLastVertexOfTetra(face2);
     if (!IsTetraDirect)
     {
         MakeTetraDirect();
     }
     ComputeCircumcircleInfos();
     Faces.Add(face1);
     Faces.Add(face2);
     Faces.Add(face3);
     Faces.Add(face4);
 }
Example #4
0
 private void FindLastVertexOfTetra(TriangleFace face2)
 {
     Vertex[] vertices = new Vertex[3] {
         P1, P2, P3
     };
     if (!vertices.Contains(face2.P1))
     {
         P4 = face2.P1;
     }
     if (!vertices.Contains(face2.P2))
     {
         P4 = face2.P2;
     }
     if (!vertices.Contains(face2.P3))
     {
         P4 = face2.P3;
     }
 }
Example #5
0
        private HashSet <TriangleFace> GetPolygonalHoleFromBadTetras(HashSet <Tetra> badTetras)
        {
            HashSet <TriangleFace> polyHole = new HashSet <TriangleFace>();

            foreach (Tetra badTetra in badTetras)
            {
                foreach (TriangleFace face in badTetra.Faces)
                {
                    Tetra otherTetraOfFace = face.GetOtherTetraThan(badTetra);
                    if (!badTetras.Contains(otherTetraOfFace))
                    {
                        TriangleFace newFace = new TriangleFace(face.P1, face.P2, face.P3, otherTetraOfFace);
                        polyHole.Add(newFace);
                    }
                }
            }
            return(polyHole);
        }
Example #6
0
 public Tetra(TriangleFace baseFace, Vertex vertex)
 {
     P1 = baseFace.P1;
     P2 = baseFace.P2;
     P3 = baseFace.P3;
     P4 = vertex;
     if (!IsTetraDirect)
     {
         MakeTetraDirect();
     }
     ComputeCircumcircleInfos();
     if (!baseFace.HasOneNeighborTetraNull())
     {
         throw new Exception("Trying to construct a tetrahedron with a base that already has 2 neighboring tetrahedrons registered.");
     }
     else
     {
         baseFace.RegisterNeighbor(this);
     }
     Faces.Add(baseFace);
 }
Example #7
0
        private HashSet <Tetra> GetNewTetrasFromPolygonalHole(Vertex vertex, HashSet <TriangleFace> polyHole)
        {
            HashSet <Tetra> tetrasToAdd = new HashSet <Tetra>();

            foreach (TriangleFace face in polyHole)
            {
                Tetra newTetra = new Tetra(face, vertex);
                tetrasToAdd.Add(newTetra);
            }
            foreach (Tetra tetra in tetrasToAdd)
            {
                foreach (Tetra otherTetra in tetrasToAdd)
                {
                    if (tetra.IsNeighborOf(otherTetra))
                    {
                        TriangleFace face = new TriangleFace(tetra, otherTetra);
                        tetra.AddNeighbor(face);
                    }
                }
            }

            return(tetrasToAdd);
        }