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