Ця проблема має безліч дійсних рішень. Один з них трохи схожий на ваш опис, але замість того, щоб нарізати багатокутники за "випадковими" місцями, ви можете це робити цілеспрямовано таким чином, щоб мінімізувати кількість обчислень.
Ось основний алгоритм. Його вхід складається з будь-якого напрямку розгортки площини, багатокутника P ненульової області, цільової області a між нулем та площею полігону та негативного порогу t (в одиницях площі). Її мета - розділити P лінією, перпендикулярною напрямку напряму розгортки, на дві частини, одну праворуч від лінії, а іншу зліва від лінії, так що різниці між правою рукою та цільовою площею a немає більше, ніж t .
Нехай L - будь-яка орієнтована лінія, перпендикулярна напрямку зміщення. Визначте f (L) площу P, яка знаходиться праворуч від L, мінус a . У цих умовах завдання - знайти нуль f . Оскільки f навряд чи може бути диференційованим, але є безперервним, використовуйте або метод розбиття, метод сексанта , або - метод мого улюбленого- Брента . Усі прості та гарантовано схожі. Використовуйте t для допуску конвергенції для аргументу.
Це воно. Розглянемо, що стосується кодування цього. Виявлення кореня є рутинним - ви можете використовувати для цього загальний фрагмент коду - так робота ГІС зводиться до кодування f . Для цього потрібно
1. Splitting the polygon by a line.
2. Computing the area of the piece(s) to the right of the line.
Обидві операції реалізовані практично в будь-яких векторних ГІС. Якщо ні, ви можете замінити лінію дуже великим прямокутником, що представляє півплощину праворуч від лінії. Крок 1 стає
1'. Clip the polygon to the rectangle.
Це дійсно основна операція.
Щоб почати пошук кореня, потрібно знайти інтервал, в якому гарантовано лежати нуль f . Це легко: спроектуйте конверт полігону ("обмежувальний ящик") у напрямку розгортки лінії. Проекція - потрібний інтервал.
Це питання має давню історію. Я давно реалізував цей алгоритм для ArcView 3.x і багато разів описував його на старих форумах користувачів ESRI. Google
сайт полігону huber split: forums.esri.com
для обговорення, посилання на код, удосконалення та варіації (наприклад, розбиття багатокутників на потрібні розміри, максимально компактні) та алгоритми для растрових даних.
Ось як виглядають континентальні штати США (в проекції рівних районів) з нижньою третиною кожного штату затіненою. Очевидно, напрям розгортки був вертикальним.