Beispiel #1
0
        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);
        }
Beispiel #2
0
 private ECEdge(ECEdge twin, ECVertex org)
 {
     this.v1 = org;
     this.v1.LinkEdge(this);
     this.AdjFace = twin.AdjFace;
     this.twin    = twin;
 }
Beispiel #3
0
 public ECEdge(ECVertex v1, ECVertex v2)
 {
     this.v1 = v1;
     v1.LinkEdge(this);
     AdjFace = new List <ECFace>(2);
     twin    = new ECEdge(this, v2);
 }
Beispiel #4
0
 public void KillEdge(ECEdge e)
 {
     if (e.IsValid())
     {
         e.Kill();
         ValidEdgesCount--;
     }
 }
Beispiel #5
0
 public void UnlinkEdge(ECEdge edge)
 {
     AdjEdges.Remove(edge);
     if (AdjEdges.Count == 0)
     {
         Kill();
     }
 }
Beispiel #6
0
        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);
        }
Beispiel #7
0
 public void ReplaceBy(ECEdge edge)
 {
     if (edge != this)
     {
         for (int i = 0; i < AdjFace.Count; i++)
         {
             AdjFace[i].ReplaceEdge(this, edge);
         }
         Kill();
     }
 }
Beispiel #8
0
        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);
        }
Beispiel #9
0
 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;
 }
Beispiel #10
0
 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;
     }
 }
Beispiel #11
0
        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);
        }
Beispiel #12
0
        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();
        }
Beispiel #13
0
 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();
 }
Beispiel #14
0
        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);
        }
Beispiel #15
0
        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);
            }
        }
Beispiel #16
0
 public void LinkEdge(ECEdge edge)
 {
     AdjEdges.Add(edge);
 }