У нас есть устаревшая программа, которая выполняет отсечение полигонов — объединение, разность, пересечение, исключение или полигонов и мультиполигонов.
Он использует GPC Университета Манчестера — General Polygon Clipper Library .
В настоящее время мы занимаемся переписыванием. Я думал, что стандартные библиотеки .NET 4.5 могут включать функции для управления геометрией, но я не смог их найти.
Мы рассматриваем альтернативы GOC по двум причинам:
В дополнение к № 2, нам нужен многоугольник, границы которого немного выходят за пределы оригинала. Предположим, у меня есть набор старых полигонов, и я рисую новый полигон. Я хочу обрезать новый полигон по объединению старых полигонов, затем я хочу немного расширить его, чтобы он немного перекрывал существующие полигоны.
В нашей проблемной области небольшое перекрытие допустимо, а зазор — каким бы малым он ни был — нет. А учитывая то, как работают сравнения с плавающей запятой, наличие небольшого перекрытия — единственный способ гарантировать отсутствие разрыва.
В устаревшем приложении мы попробовали два подхода к созданию этого расширения:
Есть два альтернативных подхода, о которых я могу думать:
Итак, мы ищем библиотеки геометрии, поддерживающие отсечение, масштабирование или буферизацию и реализованные в виде сборок .NET без внешних библиотек DLL.
У кого-нибудь есть указатели?
Вы должны взглянуть на NetTopologySuite . Мы использовали его для операций с 2D-геометрией. Это чистый C# и обладает большим количеством функций, которые слишком велики, чтобы перечислять их здесь. У вас могут возникнуть небольшие проблемы с поиском документации, но как только вы начнете, все обретет смысл.
Отсечение, буферизация, логические операции и алгоритмы триангуляции (делоне, вороной и т. д.) — элементарные вещи в НТС.
Взгляните на мою библиотеку Clipper .
Бесплатная библиотека с открытым исходным кодом, написанная на C# (а также на C++ и Delphi) с очень разрешительной лицензией Boost (которая позволяет использовать ее в коммерческих приложениях бесплатно). Может быть скомпилирован непосредственно в ваши приложения, поэтому внешние библиотеки DLL не нужны.
Смещение (расширение и сжатие) полностью поддерживается.
Вут