/// <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)); }
/// <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]); } } }