public static VertexType ClassifyVertex(ECVertex v) { int count = 0; for (int i = 0; i < v.AdjEdges.Count; i++) { if (ECEdge.ClassifyEdge(v.AdjEdges[i]) == EdgeType.BORDER) { count++; } } if (count == v.AdjEdges.Count) { return(VertexType.BORDER_ONLY); } else if (count == 0) { return(VertexType.INTERIOR); } else if (count > 0) { return(VertexType.BORDER); } return(VertexType.BORDER_ONLY); }
private ECEdge(ECEdge twin, ECVertex org) { this.v1 = org; this.v1.LinkEdge(this); this.AdjFace = twin.AdjFace; this.twin = twin; }
public ECEdge(ECVertex v1, ECVertex v2) { this.v1 = v1; v1.LinkEdge(this); AdjFace = new List <ECFace>(2); twin = new ECEdge(this, v2); }
public void KillEdge(ECEdge e) { if (e.IsValid()) { e.Kill(); ValidEdgesCount--; } }
public void UnlinkEdge(ECEdge edge) { AdjEdges.Remove(edge); if (AdjEdges.Count == 0) { Kill(); } }
public ECEdge CreateEdge(ECVertex v1, ECVertex v2) { ECEdge e = new ECEdge(v1, v2); Edges.Add(e); e.UId = Edges.Count - 1; e.Twin().UId = e.UId; ValidEdgesCount++; return(e); }
public void ReplaceBy(ECEdge edge) { if (edge != this) { for (int i = 0; i < AdjFace.Count; i++) { AdjFace[i].ReplaceEdge(this, edge); } Kill(); } }
public ECFace CreateFace(ECVertex v1, ECVertex v2, ECVertex v3) { ECEdge e0 = this.GetEdge(v1, v2); ECEdge e1 = this.GetEdge(v2, v3); ECEdge e2 = this.GetEdge(v3, v1); ECFace f = new ECFace(e0, e1, e2); Faces.Add(f); f.UId = Faces.Count - 1; ValidFacesCount++; return(f); }
public ECFace(ECEdge e0, ECEdge e1, ECEdge e2) { AdjEdges = new ECEdge[3]; AdjEdges[0] = e0; AdjEdges[1] = e1; AdjEdges[2] = e2; AdjEdges[0].LinkFace(this); AdjEdges[1].LinkFace(this); AdjEdges[2].LinkFace(this); P = new Plane(e0.OrgV(), e1.OrgV(), e2.OrgV()); tag = false; }
public void InitTypes() { for (int i = 0; i < Vertices.Count; i++) { VertexType type = ECVertex.ClassifyVertex(Vertices[i]); Vertices[i].Type = type; } for (int i = 0; i < Edges.Count; i++) { EdgeType type = ECEdge.ClassifyEdge(Edges[i]); Edges[i].Type = type; } }
public ECEdge GetEdge(ECVertex org, ECVertex v) { List <ECEdge> eu = org.AdjEdges; for (int i = 0; i < eu.Count; i++) { if (eu[i].DestV() == v) { return(eu[i]); } } ECEdge e = CreateEdge(org, v); return(e); }
static void Main(string[] args) { Mesh m = Sample.GetSampleMesh2(100); PlyManager.Output(m, "D://VTKproj//sample.ply"); ECMesh ecm = ECMesh.GetECMesh(m); List <EdgeAndWeight> edgeWeights = new List <EdgeAndWeight>(ecm.Edges.Count); Random r = new Random(); for (int i = 0; i < ecm.Edges.Count; i++) { EdgeAndWeight ew = new EdgeAndWeight(); ew.edgeID = i; ew.weight = r.Next(0, 10000); edgeWeights.Add(ew); } edgeWeights.Sort(); int deciCount = ecm.Edges.Count / 10; int index = 0; while (deciCount != 0) { if (index == edgeWeights.Count) { break; } EdgeAndWeight ew = edgeWeights[index]; ECEdge edge = ecm.Edges[ew.edgeID]; if (edge.IsValid() && edge.OrgV().Type == VertexType.INTERIOR && edge.DestV().Type == VertexType.INTERIOR) { ECVertex v0 = edge.OrgV(); ECVertex v1 = edge.DestV(); Point3d mid = new Point3d(v0.X / 2 + v1.X / 2, v0.Y / 2 + v1.Y / 2, v0.Z / 2 + v1.Z / 2); ecm.Contract(v0, v1, mid); deciCount--; index++; } else { index++; continue; } } m = ecm.GetMesh(); PlyManager.Output(m, "test2.ply"); Console.WriteLine("\nCMP!"); Console.Read(); }
public void ReplaceEdge(ECEdge from, ECEdge to) { for (int i = 0; i < 3; i++) { if (AdjEdges[i] == from) { AdjEdges[i] = to; to.LinkFace(this); } else if (AdjEdges[i] == from.Twin()) { AdjEdges[i] = to.Twin(); to.Twin().LinkFace(this); } } MarkPlaneInvalid(); }
public static EdgeType ClassifyEdge(ECEdge e) { int c = e.AdjFace.Count; if (c >= 3) { return(EdgeType.NONMANIFOLD); } if (c == 2) { return(EdgeType.MANIFOLD); } if (c == 1) { return(EdgeType.BORDER); } return(EdgeType.BOGUS); }
public void MayFixFace(ECFace face) { ECVertex v0 = face.GetVertex(0); ECVertex v1 = face.GetVertex(1); ECVertex v2 = face.GetVertex(2); ECEdge e0 = face.GetEdge(0); ECEdge e1 = face.GetEdge(1); ECEdge e2 = face.GetEdge(2); bool a = (v0 == v1); bool b = (v0 == v2); bool c = (v1 == v2); if (a && c) { KillEdge(e0); KillEdge(e1); KillEdge(e2); KillFace(face); } else if (a) { KillEdge(e0); e1.ReplaceBy(e2.Twin()); KillFace(face); } else if (b) { KillEdge(e2); e0.ReplaceBy(e1.Twin()); KillFace(face); } else if (c) { KillEdge(e1); e0.ReplaceBy(e2.Twin()); KillFace(face); } }
public void LinkEdge(ECEdge edge) { AdjEdges.Add(edge); }