/// <summary> /// find base-mesh interior vertices of region (ie does not include region boundary vertices) /// </summary> public HashSet <int> CurrentBaseInteriorVertices() { var verts = new HashSet <int>(); IndexHashSet borderv = Region.BaseBorderV; foreach (int tid in cur_base_tris) { Index3i tv = BaseMesh.GetTriangle(tid); if (borderv[tv.a] == false) { verts.Add(tv.a); } if (borderv[tv.b] == false) { verts.Add(tv.b); } if (borderv[tv.c] == false) { verts.Add(tv.c); } } return(verts); }
public void ComputeBoundaryInfo(IEnumerable <int> triangles, int tri_count) { // set of base-mesh triangles that are in submesh IndexFlagSet sub_tris = new IndexFlagSet(BaseMesh.MaxTriangleID, tri_count); foreach (int ti in triangles) { sub_tris[ti] = true; } BaseBorderV = new IndexHashSet(); BaseBorderE = new IndexHashSet(); BaseBoundaryE = new IndexHashSet(); // Iterate through edges in submesh roi on base mesh. If // one of the tris of the edge is not in submesh roi, then this // is a boundary edge. // // (edge iteration via triangle iteration processes each internal edge twice...) foreach (int ti in triangles) { Index3i tedges = BaseMesh.GetTriEdges(ti); for (int j = 0; j < 3; ++j) { int eid = tedges[j]; Index2i tris = BaseMesh.GetEdgeT(eid); if (tris.b == DMesh3.InvalidID || sub_tris[tris.a] != sub_tris[tris.b]) { if (tris.b == DMesh3.InvalidID) { BaseBoundaryE[eid] = true; } else { BaseBorderE[eid] = true; } Index2i ve = BaseMesh.GetEdgeV(eid); BaseBorderV[ve.a] = true; BaseBorderV[ve.b] = true; } } } }