/// <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> /// /// </summary> /// <param name="path"></param> /// <param name="graph"></param> /// <param name="setVertexAttributes"></param> /// <param name="setHedgeAttributes"></param> public static void ReadFromJson <V, E, VA, EA>(string path, 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 buffer = Interop.DeserializeJson <HeGraphJsonBuffer <VA, EA> >(path); buffer.ReadTo(graph, setVertexAttributes, setHedgeAttributes); }
/// <summary> /// /// </summary> /// <param name="graph"></param> /// <param name="settings"></param> internal Solver(HeGraph graph, Settings settings = null) { _graph = graph; _graph.Compact(); _settings = settings ?? new Settings(); //SetTerminalStatus(); UpdateAttributes(); }
/// <summary> /// /// </summary> /// <typeparam name="V"></typeparam> /// <typeparam name="E"></typeparam> /// <typeparam name="VA"></typeparam> /// <typeparam name="EA"></typeparam> /// <param name="graph"></param> /// <param name="path"></param> /// <param name="getVertexAttributes"></param> /// <param name="getHedgeAttributes"></param> public static void WriteToJson <V, E, VA, EA>(HeGraph <V, E> graph, string path, Func <V, VA> getVertexAttributes = null, Func <E, EA> getHedgeAttributes = null) where V : HeGraph <V, E> .Vertex where E : HeGraph <V, E> .Halfedge { var buffer = new HeGraphJsonBuffer <VA, EA>(); buffer.WriteFrom(graph, getVertexAttributes, getHedgeAttributes); Interop.SerializeJson(buffer, path); }
/// <summary> /// Writes the given graph to this buffer. /// </summary> public void WriteFrom <V, E>(HeGraph <V, E> graph, Func <V, VA> getVertexAttributes = null, Func <E, EA> getHedgeAttributes = null) where V : HeGraph <V, E> .Vertex where E : HeGraph <V, E> .Halfedge { var verts = graph.Vertices; var hedges = graph.Halfedges; _vertexRefs = new int[verts.Count]; _hedgeRefs = new int[hedges.Count][]; // write vertex topology for (int i = 0; i < verts.Count; i++) { var v = verts[i]; _vertexRefs[i] = v.First ?? -1; } // write halfedge topology for (int i = 0; i < hedges.Count; i++) { var he = hedges[i]; _hedgeRefs[i] = new int[] { he.Previous ?? -1, he.Next, he.Start }; } // write vertex attributes if (getVertexAttributes != null) { _vertexAttributes = new VA[verts.Count]; for (int i = 0; i < verts.Count; i++) { _vertexAttributes[i] = getVertexAttributes(verts[i]); } } // write halfedge attributes if (getHedgeAttributes != null) { _hedgeAttributes = new EA[hedges.Count]; for (int i = 0; i < hedges.Count; i++) { _hedgeAttributes[i] = getHedgeAttributes(hedges[i]); } } }
/// <summary> /// /// </summary> /// <param name="other"></param> public HeGraph(HeGraph other) { Append(other); }
/// <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]); } } }