本文整理汇总了C#中Microsoft.Msagl.Core.Layout.GeometryGraph.GetFlattenedNodesAndClusters方法的典型用法代码示例。如果您正苦于以下问题:C# GeometryGraph.GetFlattenedNodesAndClusters方法的具体用法?C# GeometryGraph.GetFlattenedNodesAndClusters怎么用?C# GeometryGraph.GetFlattenedNodesAndClusters使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Microsoft.Msagl.Core.Layout.GeometryGraph
的用法示例。
在下文中一共展示了GeometryGraph.GetFlattenedNodesAndClusters方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: GetClusteredConnectedComponents
/// <summary>
/// Extension method to break a GeometryGraph into connected components taking into consideration clusters.
/// Leaves the original graph intact, the resultant components contain copies of the original elements, with
/// the original elements referenced in their UserData properties.
/// </summary>
/// <returns>
/// the set of components, each as its own GeometryGraph.
/// </returns>
public static IEnumerable<GeometryGraph> GetClusteredConnectedComponents(this GeometryGraph graph) {
var flatGraph = FlatGraph(graph);
var basicFlatGraph = new BasicGraph<AlgorithmDataEdgeWrap>(
from e in flatGraph.Edges
select (AlgorithmDataEdgeWrap) e.AlgorithmData,
flatGraph.Nodes.Count);
var nodes = flatGraph.Nodes.ToList();
var graphComponents = new List<GeometryGraph>();
foreach (
var componentNodes in ConnectedComponentCalculator<AlgorithmDataEdgeWrap>.GetComponents(basicFlatGraph)) {
var g = new GeometryGraph();
var topClusters = new List<Cluster>();
var topNodes = new List<Node>();
foreach (int i in componentNodes) {
var v = nodes[i];
var original = (Node) v.UserData;
bool topLevel = ((AlgorithmDataNodeWrap) original.AlgorithmData).TopLevel;
if (v.UserData is Cluster) {
if (topLevel) {
topClusters.Add((Cluster) original);
}
} else {
// clear edges, we fix them up below
v.ClearEdges();
g.Nodes.Add(v);
if (topLevel) {
topNodes.Add(v);
}
}
}
// copy the cluster hierarchies from the original graph
int index = g.Nodes.Count;
if (topClusters.Count != 0) {
var root = new Cluster(topNodes);
foreach (var top in topClusters) {
root.AddChild(CopyCluster(top, ref index));
}
g.RootCluster = root;
}
// add the real edges from the original graph to the component graph
foreach (var v in g.GetFlattenedNodesAndClusters()) {
var original = v.UserData as Node;
Debug.Assert(original != null);
foreach (var e in original.InEdges) {
var source = GetCopy(e.Source);
var target = GetCopy(e.Target);
var copy = new Edge(source, target) {
Length = e.Length,
UserData = e,
EdgeGeometry = e.EdgeGeometry
};
e.AlgorithmData = copy;
g.Edges.Add(copy);
}
}
graphComponents.Add(g);
}
return graphComponents;
}