Beispiel #1
0
            /// <summary>
            /// Reads this buffer to the given graph.
            /// </summary>
            public void ReadTo <V, E>(HeGraph <V, E> graph, Action <V, VA> setVertexAttributes = null, Action <E, EA> setHedgeAttributes = null)
                where V : HeGraph <V, E> .Vertex
                where E : HeGraph <V, E> .Halfedge
            {
                var verts  = graph.Vertices;
                var hedges = graph.Halfedges;

                int nv  = verts.Count;
                int nhe = hedges.Count;

                // add new vertices
                for (int i = 0; i < _vertexRefs.Length; i++)
                {
                    graph.AddVertex();
                }

                // add new halfedges
                for (int i = 0; i < _hedgeRefs.Length; i += 2)
                {
                    graph.AddEdge();
                }

                // link up vertices
                for (int i = 0; i < _vertexRefs.Length; i++)
                {
                    var v = verts[i + nv];

                    var first = _vertexRefs[i];
                    if (first > -1)
                    {
                        v.First = hedges[first + nhe];
                    }
                }

                // link up halfedges
                for (int i = 0; i < _hedgeRefs.Length; i++)
                {
                    var he   = hedges[i + nhe];
                    var refs = _hedgeRefs[i];

                    var prev = refs[0];
                    if (prev != -1)
                    {
                        he.Previous = hedges[prev + nhe];
                    }

                    he.Next = hedges[refs[1] + nhe];

                    var start = refs[2];
                    if (start > -1)
                    {
                        he.Start = verts[start + nhe];
                    }
                }

                // TODO validate topology?

                // set vertex attributes
                if (setVertexAttributes != null)
                {
                    for (int i = 0; i < _vertexAttributes.Length; i++)
                    {
                        setVertexAttributes(verts[i + nv], _vertexAttributes[i]);
                    }
                }

                // set vertex attributes
                if (setHedgeAttributes != null)
                {
                    for (int i = 0; i < _hedgeAttributes.Length; i++)
                    {
                        setHedgeAttributes(hedges[i + nhe], _hedgeAttributes[i]);
                    }
                }
            }