Ищу библиотеку манипулирования геометрией

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

Он использует GPC Университета Манчестера — General Polygon Clipper Library .

В настоящее время мы занимаемся переписыванием. Я думал, что стандартные библиотеки .NET 4.5 могут включать функции для управления геометрией, но я не смог их найти.

Мы рассматриваем альтернативы GOC по двум причинам:

  1. GPOC зависит от бинарной dll, gpc.dll, которую необходимо установить на целевой машине, и мы бы предпочли то, что было упаковано в сборку .NET.
  2. Нам нужна одна дополнительная функциональность, которую GPC не предоставляет — нам нужно расширить полигон на фиксированную величину.

В дополнение к № 2, нам нужен многоугольник, границы которого немного выходят за пределы оригинала. Предположим, у меня есть набор старых полигонов, и я рисую новый полигон. Я хочу обрезать новый полигон по объединению старых полигонов, затем я хочу немного расширить его, чтобы он немного перекрывал существующие полигоны.

В нашей проблемной области небольшое перекрытие допустимо, а зазор — каким бы малым он ни был — нет. А учитывая то, как работают сравнения с плавающей запятой, наличие небольшого перекрытия — единственный способ гарантировать отсутствие разрыва.

В устаревшем приложении мы попробовали два подхода к созданию этого расширения:

  1. Напишите код, который проходит по каждой точке, определяет направление внутрь и сдвигает точку наружу на желаемую величину. Это оказалось очень сложным кодом для правильного понимания.
  2. Создайте новые полигоны, которые являются дубликатами оригинала, сдвиньте желаемую величину на север, юг, восток и запад, а затем создайте окончательный результат как объединение всех дубликатов. Это создает полигоны с очень маленькими пиками в каждой из исходных вершин, что значительно увеличивает количество точек, которые необходимо сохранить. Поскольку мы не смогли заставить #1 работать надежно, сейчас мы делаем #2.

Есть два альтернативных подхода, о которых я могу думать:

  1. Некоторые пакеты позволяют добавлять к фигуре буфер. Это было бы именно то, что нам нужно.
  2. Если это не сработает, если пакет допускает масштабирование полигонов, мы могли бы просто расширить внешние полигоны на расчетную величину и уменьшить внутренние отверстия на ту же величину.

Итак, мы ищем библиотеки геометрии, поддерживающие отсечение, масштабирование или буферизацию и реализованные в виде сборок .NET без внешних библиотек DLL.

У кого-нибудь есть указатели?

Привет, я работаю над клипером в течение года, и похоже, что у вас есть очень болезненные входные данные, которые я хотел бы добавить в свою реализацию для тестирования. Не могли бы вы поделиться некоторыми образцами данных для игры?

Ответы (2)

Вы должны взглянуть на NetTopologySuite . Мы использовали его для операций с 2D-геометрией. Это чистый C# и обладает большим количеством функций, которые слишком велики, чтобы перечислять их здесь. У вас могут возникнуть небольшие проблемы с поиском документации, но как только вы начнете, все обретет смысл.

Отсечение, буферизация, логические операции и алгоритмы триангуляции (делоне, вороной и т. д.) — элементарные вещи в НТС.

Можете ли вы указать мне, где он поддерживает расширение и сжатие?
Помимо простых аффинных преобразований (масштабирование, перевод, сдвиг, поворот и т. д.), вот методы буфера, например: nettopologysuite.github.io/html/…

Взгляните на мою библиотеку Clipper .

Бесплатная библиотека с открытым исходным кодом, написанная на C# (а также на C++ и Delphi) с очень разрешительной лицензией Boost (которая позволяет использовать ее в коммерческих приложениях бесплатно). Может быть скомпилирован непосредственно в ваши приложения, поэтому внешние библиотеки DLL не нужны.

Смещение (расширение и сжатие) полностью поддерживается.