/// <summary> /// construct EdgeSpan from a list of edges of mesh /// </summary> public static EdgeSpan FromEdges(DMesh3 mesh, IList <int> edges) { int[] Edges = new int[edges.Count]; for (int i = 0; i < Edges.Length; ++i) { Edges[i] = edges[i]; } int[] Vertices = new int[Edges.Length + 1]; Index2i start_ev = mesh.GetEdgeV(Edges[0]); Index2i prev_ev = start_ev; if (Edges.Length > 1) { for (int i = 1; i < Edges.Length; ++i) { Index2i next_ev = mesh.GetEdgeV(Edges[i]); Vertices[i] = IndexUtil.find_shared_edge_v(ref prev_ev, ref next_ev); prev_ev = next_ev; } Vertices[0] = IndexUtil.find_edge_other_v(ref start_ev, Vertices[1]); Vertices[Vertices.Length - 1] = IndexUtil.find_edge_other_v(prev_ev, Vertices[Vertices.Length - 2]); } else { Vertices[0] = start_ev[0]; Vertices[1] = start_ev[1]; } return(new EdgeSpan(mesh, Vertices, Edges, false)); }
void find_cut_paths(HashSet <int> CutEdges) { Spans = new List <EdgeSpan>(); Loops = new List <EdgeLoop>(); // [TODO] what about if vert appears more than twice in list? we should check for that! var Remaining = new HashSet <int>(CutEdges); while (Remaining.Count > 0) { int start_edge = Remaining.First(); Remaining.Remove(start_edge); Index2i start_edge_v = Mesh.GetEdgeV(start_edge); bool isLoop; List <int> forwardSpan = walk_edge_span_forward(Mesh, start_edge, start_edge_v.a, Remaining, out isLoop); if (isLoop == false) { List <int> backwardSpan = walk_edge_span_forward(Mesh, start_edge, start_edge_v.b, Remaining, out isLoop); if (isLoop) { throw new Exception("find_cut_paths: how did this possibly happen?!?"); } if (backwardSpan.Count > 1) { backwardSpan.Reverse(); backwardSpan.RemoveAt(backwardSpan.Count - 1); backwardSpan.AddRange(forwardSpan); Index2i start_ev = Mesh.GetEdgeV(backwardSpan[0]); Index2i end_ev = Mesh.GetEdgeV(backwardSpan[backwardSpan.Count - 1]); // [RMS] >2 check here catches two-edge span case, where we do have shared vert but // can never be loop unless we have duplicate edge (!) isLoop = backwardSpan.Count > 2 && IndexUtil.find_shared_edge_v(ref start_ev, ref end_ev) != DMesh3.InvalidID; forwardSpan = backwardSpan; } } if (isLoop) { var loop = EdgeLoop.FromEdges(Mesh, forwardSpan); Util.gDevAssert(loop.CheckValidity()); Loops.Add(loop); } else { var span = EdgeSpan.FromEdges(Mesh, forwardSpan); Util.gDevAssert(span.CheckValidity()); Spans.Add(span); } } }
/// <summary> /// construct EdgeLoop from a list of edges of mesh /// </summary> public static EdgeLoop FromEdges(DMesh3 mesh, IList <int> edges) { int[] Edges = new int[edges.Count]; for (int i = 0; i < Edges.Length; ++i) { Edges[i] = edges[i]; } int[] Vertices = new int[Edges.Length]; Index2i start_ev = mesh.GetEdgeV(Edges[0]); Index2i prev_ev = start_ev; for (int i = 1; i < Edges.Length; ++i) { Index2i next_ev = mesh.GetEdgeV(Edges[i % Edges.Length]); Vertices[i] = IndexUtil.find_shared_edge_v(ref prev_ev, ref next_ev); prev_ev = next_ev; } Vertices[0] = IndexUtil.find_edge_other_v(ref start_ev, Vertices[1]); return(new EdgeLoop(mesh, Vertices, Edges, false)); }