Example #1
0
            private void AddGeometry(DrawingGroup group, Geometry g)
            {
                if (group.ClipGeometry != null && !group.ClipGeometry.FillContains(g))
                {
                    var cg = new CombinedGeometry();
                    cg.Geometry1           = group.ClipGeometry;
                    cg.Geometry2           = g;
                    cg.GeometryCombineMode = GeometryCombineMode.Intersect;
                    g = cg.GetOutlinedPathGeometry(Flatness, ToleranceType.Relative);
                }

                var intersections = Geometries.Where(gg => gg.FillContainsWithDetail(g) != IntersectionDetail.Empty);

                foreach (var ig in intersections)
                {
                    Geometries.Remove(ig);
                    var cg = new CombinedGeometry();
                    cg.Geometry1           = g;
                    cg.Geometry2           = ig;
                    cg.GeometryCombineMode = GeometryCombineMode.Union;
                    g = cg.GetOutlinedPathGeometry(Flatness, ToleranceType.Relative);
                }

                ApplyTransform(group.Transform, g);
                //ApplyTransform(Transform, g);

                Geometries.Add(g);
            }
Example #2
0
        public void BuildGrid(object sender, RoutedEventArgs e)
        {
            Canvas canvas = gridCanvas as Canvas;

            if (canvas == null)
            {
                return;
            }

            canvas.Children.Clear();

            GeometryGroup row    = new GeometryGroup();
            GeometryGroup column = new GeometryGroup();

            // Row
            for (int i = 0; i < canvas.ActualHeight; i += gridSize * 2)
            {
                var start = i + gridSize; // 幅を2倍でとっているのでその中心に来るようにする
                row.Children.Add(new RectangleGeometry(new Rect(0, start, canvas.ActualWidth, gridSize)));
            }

            // Column
            for (int i = 0; i < canvas.ActualWidth; i += gridSize * 2)
            {
                var start = i + gridSize; // 幅を2倍でとっているのでその中心に来るようにする
                var end   = start + gridSize;
                column.Children.Add(new RectangleGeometry(new Rect(start, 0, gridSize, canvas.ActualHeight)));
            }

            CombinedGeometry combind = new CombinedGeometry(GeometryCombineMode.Xor, row, column);

            Path path = new Path()
            {
                Stroke          = Brushes.Transparent,
                StrokeThickness = 0,
                Fill            = this.FindResource("gridFrontBrushKey") as Brush
            };

            path.Data = combind.GetOutlinedPathGeometry();

            canvas.Background = this.FindResource("gridBackBrushKey") as Brush;
            canvas.Children.Add(path);

            //for (int ix = 0; ix < canvas.ActualWidth; ix += gridSize)
            //{
            //    var actual_ix = ix / gridSize;
            //    for (int iy = 0; iy < canvas.ActualHeight; iy += gridSize)
            //    {
            //        var actual_iy = iy / gridSize;

            //        var isBackColor = (actual_ix % 2 == 0 && actual_iy % 2 == 0) || (actual_ix % 2 == 1 && actual_iy % 2 == 1);

            //        Path path = new Path()
            //        {
            //            Data = new RectangleGeometry(new Rect(new Point(ix, iy), new Size(gridSize, gridSize))),
            //            Stroke = Brushes.Transparent,
            //            StrokeThickness = 0,
            //            Fill = (isBackColor ? this.FindResource("gridBackBrushKey") : this.FindResource("gridFrontBrushKey")) as Brush
            //        };

            //        path.Data.Transform = scaleTransform;

            //        canvas.Children.Add(path);
            //    }
            //}
        }