私は現在同じことをしようとしているので、ここに私の計画と思考プロセスの一部を示します。
まず、すべてを PathGeometry に変換します。メソッドは、FillContains(Geometry geometry)
何が何の中にあるかを確認するために使用したいものです。問題.Bounds.Contains
は、中央にドットがある C 形状の場合、ドットは外接する四角形に含まれますが、形状には含まれないことです。
次に、ツリー データ構造を作成します。PathGeometry A に PathGeometry B が含まれている場合、A はツリー内で B の祖先になります。ここでの他の回答では、リストを使用することを提案していますが、それもうまくいきません。この段落の残りの部分で、その理由を説明します。2 つの PathFigures があり、どちらも他方の中にないとします。リストを並べ替えた後、一方が他方の中にあると仮定します。余分な作業をしなくてもこれを説明できますが、3 番目の PathFigure (数字の 8 など) で囲まれた 2 つの PathFigure があるとします。並べ替え後、8 の一部である穴は 1 つしか得られません。それも。最後の問題: A に B が含まれ、C に D が含まれているとしますが、それらは {A,C,B,D} の順序でリストに入れられます。その隣人を含みます。
では、ツリーのルート ノードは何でしょうか。ルート ノードは、すべてを含むものになります。そのようなものを作成したい場合は、すべての PathGeometry の Union を取得して を使用できます.Bounds
。それがうまくいかない奇妙なケースがあるかもしれませんが、それは重要ではありません。
私たちの木はどのように見えるでしょうか?あなたの例の数字を使用します。ツリーを見るにはここをクリックしてください。
木はどうやって作るの?この疑似コードは、私が説明しようとするよりも理解しやすいと思います。
TreeNode.AddNode(PathGeometry geomToAdd)
{
bool containedByChild = false
foreach (TreeNode current in this.Children)
{
if (current.FillContains(geomToAdd)
{
containedByChild = true
current.AddNode(geomToAdd)
}
}
if (!containedByChild)
this.Children.Add(geomToAdd)
}
二分木とは異なり、固定数の子の代わりに子のリストがあります。ツリーのリーフは、子のリストが空のノードです。ルート ノードにはすべてが含まれることになっているため、ルートの PathGeometry を定義する必要なく、ルートでこのメソッドを呼び出すことができます。
ツリーを PathGeometry に変換するにはどうすればよいでしょうか? root の子から始めます。これらは加算 PathFigure であり、その子は減算 PathFigure です。.Combine()
withを使用するとGeometryCombineMode.Exclude
、root の子から root の孫を差し引くことができます。次に、ルートからすべての子を削除し、ルートのひ孫を新しい子のリストに変更して、繰り返します。
うまくいけば、これは明らかです。そうでない場合は、回答を改善する方法を教えてください。