Exemple #1
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();
            }
Exemple #2
0
            /// <summary>
            ///
            /// </summary>
            void CollapseEdges()
            {
                var hedges = _graph.Halfedges;
                int count  = 0;

                double dmin = _settings.MinLength;

                dmin *= dmin;

                for (int i = 0; i < hedges.Count; i += 2)
                {
                    var he0 = hedges[i];
                    var he1 = hedges[i + 1];

                    var v0 = he0.Start;
                    var v1 = he1.Start;

                    if (v0 == v1)
                    {
                        he0.MakeUnused(); // remove if self loop
                    }
                    else if (he0.IsAtDegree2 && !v0.IsTerminal)
                    {
                        CollapseEdge(he0); // collapse degree 2
                    }
                    else if (he1.IsAtDegree2 && !v1.IsTerminal)
                    {
                        CollapseEdge(he1); // collapse degree 2
                    }
                    else
                    {
                        var p0 = v0.Position;
                        var p1 = v1.Position;

                        // collapse short edges
                        if (p0.SquareDistanceTo(p1) < dmin)
                        {
                            if (v0.IsTerminal)
                            {
                                if (!v1.IsTerminal)
                                {
                                    CollapseEdge(he1);
                                }
                            }
                            else if (v1.IsTerminal)
                            {
                                if (!v0.IsTerminal)
                                {
                                    CollapseEdge(he0);
                                }
                            }
                            else
                            {
                                CollapseEdge(he0);
                            }
                        }
                    }
                }

                void CollapseEdge(E hedge)
                {
                    _graph.CollapseEdge(hedge);
                    count++;
                }

                /*
                 * // cleanup any multi-edges created during collapse
                 * // only required if input graph isn't a tree
                 * _graph.RemoveMultiEdges();
                 */

                // compact and update attributes if any edges were collapsed
                if (count > 0)
                {
                    _graph.Compact();
                    UpdateAttributes();
                }
            }