2

私はそのような単一の System.Windows.Media.PathGeometry を持っています: 1 そして、それぞれの灰色の形状が新しい Geometry オブジェクトになるように、ジオメトリを分割したいと思います。PathGeometry の FigureColletion を反復処理して、各図を新しいジオメトリに配置しようとしましたが、結果は期待どおりではありません。これは、一部の図形が加法的に適用され、一部が減法的に適用されることを意味します。 2 ジオメトリを正しく分割するには、どの PathFigures が加法的に適用され、どの PathFigures がどの減法的に適用されるかを把握する必要があります。PathFigure 型には Property がなく、その適用方法に関する情報が得られます。この問題を解決する方法を知っている人はいますか?

前もって感謝します。

4

2 に答える 2

3

私は現在同じことをしようとしているので、ここに私の計画と思考プロセスの一部を示します。

まず、すべてを 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 の孫を差し引くことができます。次に、ルートからすべての子を削除し、ルートのひ孫を新しい子のリストに変更して、繰り返します。

うまくいけば、これは明らかです。そうでない場合は、回答を改善する方法を教えてください。

于 2016-11-09T16:18:11.290 に答える
0

あなたが述べたように、 がPathFigure交差しない場合、つまり封じ込めが完了している場合、結果として、PathFigureA に B が含まれている場合、A の AABB 境界にも B の境界が含まれます。

残念ながら、私はそのようなプロパティを持っているとは思わないので、これを克服する 1 つの方法は、プロパティ内のそれぞれからPathFigure個別の新しいPathGeometryオブジェクトを作成し、これらを配列に格納することです。次に、従来の並べ替えルーチンの比較演算の代わりに、https ://msdn.microsoft.com/en-us/library/ms557978(v=vs.110).aspx プロパティを使用してこの配列を並べ替えます。PathFigure.Figures.Bounds.Contains

これで、「マトリョーシカ人形」PathGeometryのリストができました。最も外側のものから始めて、連続するすべてのペアを選択し、それらの結合を取ります(.Combineあなたが言ったように)。配列の要素数が奇数の場合、つまり末尾に 1 つ残っている場合は、図 4 のようになります。

于 2016-06-08T12:22:22.210 に答える