private List <Site> GenerateNeighbors(DualSite3d dualSite, ConvexFaceExt <DualSite3d> startingFace)
        {
            List <Site> list = new List <Site>();
            List <ConvexFaceExt <DualSite3d> >  list2 = new List <ConvexFaceExt <DualSite3d> >();
            Stack <ConvexFaceExt <DualSite3d> > stack = new Stack <ConvexFaceExt <DualSite3d> >();

            stack.Push(startingFace);
            while (stack.Count > 0)
            {
                ConvexFaceExt <DualSite3d> convexFaceExt = stack.Pop();
                list2.Add(convexFaceExt);
                for (int i = 0; i < convexFaceExt.Adjacency.Length; i++)
                {
                    if (ContainsVert(convexFaceExt.Adjacency[i], dualSite) && !list2.Contains(convexFaceExt.Adjacency[i]))
                    {
                        Edge       edge       = GetEdge(convexFaceExt, convexFaceExt.Adjacency[i]);
                        DualSite3d dualSite3d = (edge.First != dualSite) ? edge.First : edge.Second;
                        Debug.Assert(dualSite3d != dualSite, "We're our own neighbour??");
                        Debug.Assert(dualSite3d.site.id == -1 || !list.Contains(dualSite3d.site), "Tried adding a site twice!");
                        list.Add(dualSite3d.site);
                        stack.Push(convexFaceExt.Adjacency[i]);
                    }
                }
            }
            return(list);
        }
 private bool ContainsVert(ConvexFaceExt <DualSite3d> face, DualSite3d target)
 {
     for (int i = 0; i < face.Vertices.Length; i++)
     {
         if (face.Vertices[i] == target)
         {
             return(true);
         }
     }
     return(false);
 }
        private List <ConvexFaceExt <DualSite3d> > TouchingFaces(DualSite3d site, ConvexFaceExt <DualSite3d> startingFace)
        {
            List <ConvexFaceExt <DualSite3d> >  list  = new List <ConvexFaceExt <DualSite3d> >();
            Stack <ConvexFaceExt <DualSite3d> > stack = new Stack <ConvexFaceExt <DualSite3d> >();

            stack.Push(startingFace);
            while (stack.Count > 0)
            {
                ConvexFaceExt <DualSite3d> convexFaceExt = stack.Pop();
                if (ContainsVert(convexFaceExt, site) && !list.Contains(convexFaceExt))
                {
                    list.Add(convexFaceExt);
                    for (int i = 0; i < convexFaceExt.Adjacency.Length; i++)
                    {
                        if (ContainsVert(convexFaceExt.Adjacency[i], site) && !list.Contains(convexFaceExt.Adjacency[i]))
                        {
                            stack.Push(convexFaceExt.Adjacency[i]);
                        }
                    }
                }
            }
            return(list);
        }
 private ConvexFaceExt <DualSite3d> GetNeigborFaceForEdge(ConvexFaceExt <DualSite3d> currentFace, DualSite3d sharedVert0, DualSite3d sharedVert1)
 {
     for (int i = 0; i < currentFace.Adjacency.Length; i++)
     {
         ConvexFaceExt <DualSite3d> convexFaceExt = currentFace.Adjacency[i];
         if (convexFaceExt != null)
         {
             int num = 0;
             for (int j = 0; j < convexFaceExt.Vertices.Length; j++)
             {
                 if (sharedVert0 == convexFaceExt.Vertices[j])
                 {
                     num++;
                 }
                 else if (sharedVert1 == convexFaceExt.Vertices[j])
                 {
                     num++;
                 }
                 if (num == 2)
                 {
                     return(convexFaceExt);
                 }
             }
         }
     }
     return(null);
 }