QA@IT

WPF(C#)で、図形の結合を考えています。polygon図形の結合で悩んでます。

5025 PV

お世話になります
suzukiといいます。

みなさん力を貸して下さい。

表題の様に、コード上で図形の結合を考えているのですが、
単純なRectangleGeometryを2つ結合は、できたのですが、

Polygon(のようなPathでも可)の図形をXORで結合できないかと考えています。
期待の表示結果としては、「大きな四角形の上に、好きな形状(多角形)で、中窓を作りたい」
というイメージです

実行できないソースですが、
僕のとらえているイメージになります。

# Sample code.


            RectangleGeometry rec = new RectangleGeometry();
      rec.Rect = new Rect(50, 50, 150, 150);

      //ポリゴンの図形
            Polygon poly = new Polygon();
      Point pp;
      pp = new Point(30, 30);
      poly.Points.Add(pp);

      pp = new Point(100, 120);
      poly.Points.Add(pp);

      pp = new Point(130, 150);
      poly.Points.Add(pp);

      pp = new Point(130, 100);
      poly.Points.Add(pp);

      pp = new Point(80, 50);
      poly.Points.Add(pp);

      pp = new Point(30, 30);
      poly.Points.Add(pp);

      poly.Stroke = Brushes.Gray;
      poly.Fill = Brushes.Pink;
      poly.FillRule = FillRule.Nonzero;

      //2つの図形をXORで結合
            //*****実際は、こんな指定は出来ません****
            CombinedGeometry com = new CombinedGeometry(GeometryCombineMode.Xor, poly, poly);

みなさん、お力添えよろしくお願いします。

回答

owadonさん

ありがとうございます。
実行結果確認できました。
まさに、やりたかったことでした。

1週間悩んだ、疲れがとれました。
ありがとございます

編集 履歴 (0)
  • お役に立てて良かったです。 -

最後の行の「poly, poly」は「rect, poly」の間違いでしょうか?(「poly, poly」のままですと打ち消し合って消えてしまうので)その前提で、Polygonの代わりにPolyLineSegmentを用意して、PathGeometryのFiguresへ追加、RectGeometryとPathGeometryをXORしてみました。

例示されたPolygonの座標をそのまま使っているため、RectangleGeometryの外側にPolyLineSegmentがはみ出してますが、XORの効果は確認できると思います。

using System.Windows;
using System.Windows.Media;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var rect = new RectangleGeometry();
            rect.Rect = new Rect(50, 50, 150, 150);

            var segment = new PolyLineSegment();
            segment.Points.Add(new Point(30, 30));
            segment.Points.Add(new Point(100, 120));
            segment.Points.Add(new Point(130, 150));
            segment.Points.Add(new Point(130, 100));
            segment.Points.Add(new Point(80, 50));
            segment.Points.Add(new Point(30, 30));
            segment.IsStroked = false;

            var figure = new PathFigure();
            figure.Segments.Add(segment);

            var path = new PathGeometry();
            path.Figures.Add(figure);

            Path1.Data = new CombinedGeometry(GeometryCombineMode.Xor, rect, path);
        }
    }
}

XAMLはこんな感じです。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="300" Width="300">
    <Grid>
        <Path Stroke="Gray" StrokeThickness="1" Fill="Pink" Name="Path1"/>
    </Grid>
</Window>
編集 履歴 (2)
ウォッチ

この質問への回答やコメントをメールでお知らせします。