Объединить геометрию программно, сохраняя отдельные позиции каждой фигуры? - PullRequest
0 голосов
/ 25 апреля 2018

Что у меня есть:

Если пользователь нажимает и удерживает пользовательский элемент управления, добавляются формы круга.Представьте себе старую старую кисть paint.exe.

Запущен поток, который добавляет фигуры со скоростью ~ 120 фигур в секунду.Производительность получает большой успех после примерно 300 форм, так что это максимум.

Я хочу объединить все фигуры в 1 фигуру, каждая добавленная пятая фигура должна объединить все фигуры в 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
    }

Вот мой метод слияния.В результате после запуска остается только 1 маленький круг, возможно объединяя все фигуры в одно и то же место.

    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 фигуру / контур, который сохраняет местоположение / поле каждой отдельной фигуры?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...