示例#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));
            }
示例#2
0
            /// <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);
            }
示例#3
0
            /// <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();
            }
示例#4
0
            /// <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);
            }
示例#5
0
                /// <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]);
                        }
                    }
                }
示例#6
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="other"></param>
 public HeGraph(HeGraph other)
 {
     Append(other);
 }
示例#7
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]);
                        }
                    }
                }