以编程方式合并几何图形,同时保持每个形状的各个位置?

时间:2018-04-25 09:29:37

标签: c# wpf path geometry

我有什么:

如果用户点击并按住用户控件,则会添加圆形。想象一下,画好一个paint.exe画笔。

启动一个线程,它以每秒约120个形状的速率添加形状。在大约300个形状之后,性能正在受到重创,所以这是最大的。

我希望将所有形状组合成1个形状,每增加5个形状,应将所有形状合并为1个或类似形状。

到目前为止我有什么:

List<Path> pathList = new List<Path>();

    public void PaintEllipse(Point pos, Size size)
    {
        double left = pos.X - (size.Width / 2);
        double top = pos.Y - (size.Height / 2);

        EllipseGeometry ellipseGeometry = new EllipseGeometry();
        ellipseGeometry.Center = new Point(size.Width / 2, size.Height / 2);
        ellipseGeometry.RadiusX = size.Width;
        ellipseGeometry.RadiusY = size.Height;

        var path = new Path();
        path.Margin = new Thickness(left, top, 0, 0);
        path.Data = ellipseGeometry;
        path.Fill = brush;


        var newShapes = GetShapesList(); // returns List<Shape> of pathList
        newShapes.Add(path);

        if(ShapesGUID == Guid.Empty) // updating the overlay 
            ShapesGUID = imageViewer.ShapesOverlayAdd(newShapes, new ShapesOverlayRenderParameters() { ZOrder = 100 });
        else
            imageViewer.ShapesOverlayUpdate(ShapesGUID, newShapes);

        pathList.Add(path);

        UpdateStatusString(); //updates a text shape with # of shapes
    }

这是我的合并方法。结果是在运行后只剩下一个小圆圈,可能将所有形状合并到同一位置。

    public void MergeGeometry()
    {
        for (int i = pathList.Count-1; i > 0; i--)
        {
            if(i - 1 > 0)
            {
                var combined = new CombinedGeometry(GeometryCombineMode.Union, pathList[i].RenderedGeometry, pathList[i - 1].RenderedGeometry);
                pathList[i - 1] = new Path() { Data = combined };
                pathList.RemoveAt(i);
            }
        }

        UpdateStatusString();
    }

那么我如何将所有路径合并为1个形状/路径,以保持每个形状的位置/边距?

0 个答案:

没有答案