Exemple #1
0
            /// <summary>
            ///
            /// </summary>
            /// <param name="points"></param>
            /// <param name="settings"></param>
            /// <returns></returns>
            public static Solver CreateFromPoints(IEnumerable <Vector3d> points, Settings settings = null)
            {
                var graph = new HeGraph();

                // add vertices
                foreach (var p in points)
                {
                    var v = graph.AddVertex();
                    v.Position   = p;
                    v.IsTerminal = true;
                }

                // add central vertex
                int nv = graph.Vertices.Count;

                graph.AddVertex().Position = points.Mean();

                // add edges
                for (int i = 0; i < nv; i++)
                {
                    graph.AddEdge(i, nv);
                }

                return(new Solver(graph, settings));
            }
Exemple #2
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]);
                        }
                    }
                }