Este problema tiene muchas soluciones válidas. Uno de ellos funciona un poco como su descripción, pero en lugar de cortar los polígonos en ubicaciones "aleatorias", puede hacerlo a propósito de una manera diseñada para minimizar la cantidad de cómputo.
Aquí está el algoritmo básico. Su entrada consiste en cualquier dirección de barrido de plano, un polígono P de área distinta de cero, un área objetivo a entre cero y el área del polígono, y un umbral no negativo t (en unidades de área). Su propósito es dividir P con una línea perpendicular a la dirección de barrido en dos partes, una a la derecha de la línea y la otra a la izquierda de la línea, de modo que la diferencia entre el área de la derecha y el área objetivo a no sea mayor que t .
Sea L cualquier línea orientada perpendicular a la dirección de barrido. Defina f (L) como el área de P que se encuentra a la derecha de L, menos a . En estos términos, la tarea es encontrar un cero de f . Debido a que es poco probable que f sea diferenciable, pero es continuo, use un método de bisección, el método secante o, mi favorito, el método de Brent . Todos son simples y garantizados para converger. Use t para la tolerancia de convergencia para el argumento.
Eso es. Consideremos qué implica codificar esto. El hallazgo de la raíz es rutinario; puede usar un fragmento genérico de código para él, por lo que el trabajo del SIG se reduce a la codificación f . Hacerlo requiere
1. Splitting the polygon by a line.
2. Computing the area of the piece(s) to the right of the line.
Ambas operaciones se implementan en casi cualquier SIG basado en vectores. De lo contrario, puede reemplazar la línea por un rectángulo muy grande que represente el semiplano a la derecha de la línea. El paso 1 se convierte
1'. Clip the polygon to the rectangle.
Esa es una operación realmente básica.
Para comenzar con la búsqueda de la raíz, debe encontrar un intervalo en el que se garantice que el cero de f se encuentra. Esto es fácil: proyecte el sobre del polígono ("cuadro delimitador") en la dirección del barrido de línea. La proyección es el intervalo que desea.
Esta pregunta tiene una larga historia. Implementé este algoritmo para ArcView 3.x hace mucho tiempo y lo describí muchas veces en los antiguos foros de usuarios de ESRI. Google
sitio de polígono dividido huber: forums.esri.com
para debates, enlaces a código, mejoras y variaciones (como dividir polígonos en partes de tamaños deseados que sean lo más compactos posible) y algoritmos para datos ráster.
Así es como se ven los estados continentales de EE. UU. (En una proyección de área igual) con el tercio inferior de cada estado sombreado. Evidentemente, la dirección del barrido era vertical.