Как отделить внутренний многоугольник от внешнего многоугольника из списка точек в C# - PullRequest
0 голосов
/ 04 августа 2020

Предположим, что это многоугольник, как показано ниже

многоугольник, нарисованный с использованием списка точек

У меня есть форма, как указано выше, и список точек любого порядка

Point[] polygon = { A(x,y), B (x,y) ..... L(x,y) }

Мне нужно отделить внешний многоугольник от внутреннего многоугольника.

Point[] outerpoly = { A(x,y), B(x,y), C(x,y)... H(x,y) }

Point[] innerpoly = { I(x,y), J(x,y), K(x,y), L(x,y) }

В целях алгоритма мы можем предположить, что Point может быть в System.Windows.Point или System.Drawing.Point.

Пожалуйста, помогите мне найти алгоритм для получения списка точек внутреннего и внешнего многоугольника .

1 Ответ

0 голосов
/ 05 августа 2020

Используя систему координат, где увеличивающиеся значения go вниз и вправо, вы можете просто отсортировать и выбрать точки для каждого многоугольника.

Создайте List<Point> s для сохранения результатов:

var outerpoly = new List<Point>();
var innerpoly = new List<Point>();

Теперь отсортируйте точки по вертикали для начального выбора:

var vertical = polygon.OrderByDescending(p => p.Y).ToList();

Затем для каждого раздела отсортируйте их по горизонтали и извлеките то, что вам нужно.

Сначала внешний многоугольник :

var outerBottom = vertical.Take(2).OrderBy(p => p.X);    
outerpoly.AddRange(outerBottom);

var outerRightBottomIn = vertical.Skip(2).Take(4).OrderByDescending(p => p.X).Take(2);
outerpoly.AddRange(outerRightBottomIn);

var outerRightTopOut = vertical.Skip(8).Take(2).OrderBy(p => p.X);
outerpoly.AddRange(outerRightTopOut);

var outerTop = vertical.Skip(10).OrderByDescending(p => p.X);
outerpoly.AddRange(outerTop);

Тогда внутренний многоугольник:

var innerBottom = vertical.Skip(2).Take(4).OrderBy(p => p.X).Take(2);
innerpoly.AddRange(innerBottom);

var innerTop = vertical.Skip(6).Take(2).OrderByDescending(p => p.X);
innerpoly.AddRange(innerTop);
...