示例#1
0
        public static HalfEdge[] FromTriangles(int[] triangles)
        {
            var index2vertex = new Dictionary<int, Vertex>();
            var halfEdges = new List<HalfEdge>();
            var vertex2halfEdges = new Dictionary<Vertex, LinkedList<HalfEdge>>();
            for (var i = 0; i < triangles.Length; i+=3) {
                var face = new Face();
                var i0 = triangles[i];
                var v0 = index2vertex.ContainsKey(i0) ? index2vertex[i0] : (index2vertex[i0] = new Vertex(){ index = i0 });
                var he0 = new HalfEdge() { vertex = v0, face = face };
                halfEdges.Add(he0);
                v0.halfedge = he0;
                var hedges0 = vertex2halfEdges.ContainsKey(v0) ? vertex2halfEdges[v0] : (vertex2halfEdges[v0] = new LinkedList<HalfEdge>());
                hedges0.AddLast(he0);

                var i1 = triangles[i+1];
                var v1 = index2vertex.ContainsKey(i1) ? index2vertex[i1] : (index2vertex[i1] = new Vertex(){ index = i1 });
                var he1 = new HalfEdge() { vertex = v1, face = face };
                halfEdges.Add(he1);
                v1.halfedge = he1;
                var hedges1 = vertex2halfEdges.ContainsKey(v1) ? vertex2halfEdges[v1] : (vertex2halfEdges[v1] = new LinkedList<HalfEdge>());
                hedges1.AddLast(he1);

                var i2 = triangles[i+2];
                var v2 = index2vertex.ContainsKey(i2) ? index2vertex[i2] : (index2vertex[i2] = new Vertex(){ index = i2 });
                var he2 = new HalfEdge() { vertex = v2, face = face };
                halfEdges.Add(he2);
                v2.halfedge = he2;
                var hedges2 = vertex2halfEdges.ContainsKey(v2) ? vertex2halfEdges[v2] : (vertex2halfEdges[v2] = new LinkedList<HalfEdge>());
                hedges2.AddLast(he2);

                face.halfedge = he0;
                he0.next = he1;
                he1.next = he2;
                he2.next = he0;
            }

            foreach (var he in halfEdges) {
                if (he.opposite != null)
                    continue;

                var opposites = vertex2halfEdges[he.next.vertex];
                foreach (var opposite in opposites) {
                    if (opposite.next.vertex == he.vertex) {
                        he.opposite = opposite;
                        opposite.opposite = he;
                        break;
                    }
                }
            }

            return halfEdges.ToArray();
        }
示例#2
0
        public void FlipEdge(HalfEdge he)
        {
            var f0 = he.face;
            var f1 = he.opposite.face;
            var he0a = he.next;
            var he0b = he0a.next;
            var he1 = he.opposite;
            var he1a = he1.next;
            var he1b = he1a.next;

            he.vertex = he1b.vertex;
            he1.vertex = he0b.vertex;

            f0.halfedge = he0b;
            he.face = he0b.face = he1a.face = f0;
            f1.halfedge = he1b;
            he1.face = he1b.face = he0a.face = f1;

            he0b.next = he1a;
            he1a.next = he;
            he.next = he0b;
            he1.next = he1b;
            he1b.next = he0a;
            he0a.next = he1;

            _flipCheck.Push(he1a);
            _flipCheck.Push(he1b);
        }
示例#3
0
        public HalfEdge[] SplitTriangle(HalfEdge.Face f, Vector2 p)
        {
            faces.Remove(f);
            var he = f.halfedge;
            var f0 = new HalfEdge.Face(){ halfedge = he };
            var f1 = new HalfEdge.Face(){ halfedge = he.next };
            var f2 = new HalfEdge.Face(){ halfedge = he.next.next };
            he.face = f0;
            he.next.face = f1;
            he.next.next.face = f2;
            faces.Add(f0); faces.Add(f1); faces.Add(f2);

            var v = new HalfEdge.Vertex(){ index = vertices.Count };
            vertices.Add(p);

            var he0a = new HalfEdge(){ vertex = v, next = he, face = f0 };
            var he0b = new HalfEdge(){ vertex = he.next.vertex, next = he0a, face = f0 };
            he = he.next;
            he0a.next.next = he0b;
            var he1a = new HalfEdge(){ vertex = v, next = he, face = f1 };
            var he1b = new HalfEdge(){ vertex = he.next.vertex, next = he1a, face = f1 };
            he = he.next;
            he1a.next.next = he1b;
            var he2a = new HalfEdge(){ vertex = v, next = he, face = f2 };
            var he2b = new HalfEdge(){ vertex = he.next.vertex, next = he2a, face = f2 };
            he = he.next;
            he2a.next.next = he2b;
            he0a.opposite = he2b; he2b.opposite = he0a;
            he1a.opposite = he0b; he0b.opposite = he1a;
            he2a.opposite = he1b; he1b.opposite = he2a;
            halfEdges.AddRange(new HalfEdge[]{ he0a, he0b, he1a, he1b, he2a, he2b });
            return new HalfEdge[]{ f0.halfedge, f1.halfedge, f2.halfedge };
        }