Соедините простые полигоны и нарисуйте получившиеся контуры в Eyeshot - PullRequest
0 голосов
/ 19 мая 2018

Какой самый простой способ соединить коллекцию полигонов и нарисовать получившийся контур с помощью Eyeshot?До сих пор мне удавалось получать только заполненные области, но меня интересует объединение контуров.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Поскольку у вас есть регион, из него очень легко получить контур.

// if you know the region is a simple region (not containing full circles) get the curves
List<ICurve> curves = (region.ContourList.FirstOrDefault() as CompositeCurve).CurveList;

ICurve - это линия и дуга, насколько я знаю.Таким образом, вы можете проверить:

bool isLine = curves[0] is Line
bool isArc = curves[0] is Arc

Все кривые в списке упорядочены, чтобы вы могли легко преобразовать регион.Кроме того, если region.ContourList содержит более 1 контура, это означает, что у вас есть дыры в вашем регионе.Первый элемент всегда будет основным контуром, а все последующие элементы также будут контурными, но с отверстиями.

Кривая контура дана против часовой стрелки, а внутренняя - по часовой стрелке.

0 голосов
/ 21 мая 2018

Я пришел к этому решению.Чтобы отобразить полигоны, просто выполните итерацию по объединенным областям, выполните итерацию по ContourList и создайте LinearPaths.

private List<PolyRegion2D> Joiner(IEnumerable<Polygon2D> polygons) {
        // The resulting polygons are unconnected
        List<PolyRegion2D> res = new List<PolyRegion2D>();

        // Put every polygon in a region to do the unions.
        LinkedList<PolyRegion2D> polygonRegions = new LinkedList<PolyRegion2D>();
        foreach (Polygon2D polygon in polygons) {
            polygonRegions.AddLast(new PolyRegion2D(new Polygon2D[]{polygon}));
        }

        while (polygonRegions.Count > 0) {
            PolyRegion2D first = polygonRegions.First.Value;
            polygonRegions.RemoveFirst();
            PolyRegion2D union;
            LinkedListNode<PolyRegion2D> connected = FindConnected(first, polygonRegions, out union);
            if (connected == null) {
                // Unconnected polygon
                res.Add(first);
            } else {
                // Intersection found
                polygonRegions.Remove(connected);
                polygonRegions.AddFirst(union);
            }
        }

        return res;
    }

    private LinkedListNode<PolyRegion2D> FindConnected(PolyRegion2D poly, LinkedList<PolyRegion2D> polys, out PolyRegion2D union) {
        LinkedListNode<PolyRegion2D> node = polys.First;
        while(node != null){
            PolyRegion2D[] union_ = PolyRegion2D.Union(poly, node.Value);
            if (union_.Length == 1) {
                union = union_[0];
                return node;
            }
            node = node.Next;
        }
        union = null;
        return null;
    }
...