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 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); }
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> > GetNeigborFaces(ConvexFaceExt <DualSite3d> currentFace) { List <ConvexFaceExt <DualSite3d> > list = new List <ConvexFaceExt <DualSite3d> >(); for (int i = 0; i < currentFace.Adjacency.Length; i++) { ConvexFaceExt <DualSite3d> convexFaceExt = currentFace.Adjacency[i]; if (convexFaceExt != null) { list.Add(convexFaceExt); } } return(list); }
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 Edge GetEdge(ConvexFaceExt <DualSite3d> face0, ConvexFaceExt <DualSite3d> face1) { Edge edge = null; for (int i = 0; i < face0.Vertices.Length; i++) { for (int j = 0; j < face1.Vertices.Length; j++) { if (face0.Vertices[i] == face1.Vertices[j]) { if (edge == null) { edge = new Edge(face0.Vertices[i], null); } else { edge.Second = face0.Vertices[i]; } } } } return(edge); }