Questo problema ha molte soluzioni valide. Uno di questi funziona un po 'come la tua descrizione, ma invece di tagliare i poligoni in posizioni "casuali" puoi farlo intenzionalmente in un modo progettato per ridurre al minimo la quantità di calcolo.
Ecco l'algoritmo di base. Il suo ingresso è costituito da qualsiasi direzione del piano di spazzata, un poligono P di zona diverso da zero, un'area bersaglio una tra zero e l'area del poligono, e una soglia non negativo t (in unità di area). Il suo scopo è quello di dividere P con una linea perpendicolare alla direzione dello sweep in due parti, una a destra della linea e l'altra a sinistra della linea, in modo tale che la differenza tra l'area destra e l'area target a non sia maggiore di t .
Sia L qualsiasi linea orientata perpendicolare alla direzione di scansione. Definisci f (L) come area di P trovata a destra di L, meno a . In questi termini il compito è trovare uno zero di f . Poiché è improbabile che f sia differenziabile, ma è continuo, utilizzare un metodo di bisection, il metodo secant o il metodo del mio preferito -Brent . Tutti sono semplici e garantiti per convergere. Utilizzare t per la tolleranza di convergenza per l'argomento.
Questo è tutto. Consideriamo cosa succede nel codificare questo. La ricerca della radice è di routine - è possibile utilizzare un pezzo generico di codice per esso - quindi il lavoro GIS si riduce alla codifica f . Per farlo è necessario
1. Splitting the polygon by a line.
2. Computing the area of the piece(s) to the right of the line.
Entrambe le operazioni sono implementate in quasi tutti i GIS basati su vettori. In caso contrario, è possibile sostituire la linea con un rettangolo molto grande che rappresenta il mezzo piano a destra della linea. Il passaggio 1 diventa
1'. Clip the polygon to the rectangle.
Questa è un'operazione davvero di base.
Per iniziare con la ricerca della radice, è necessario trovare un intervallo in cui è garantito lo zero di f . Questo è facile: proiettare l'inviluppo del poligono ("rettangolo di selezione") nella direzione dello sweep della linea. La proiezione è l'intervallo desiderato.
Questa domanda ha una lunga storia. Ho implementato questo algoritmo per ArcView 3.x molto tempo fa e l'ho descritto molte volte nei vecchi forum degli utenti ESRI. Google
sito poligonale diviso huber: forums.esri.com
per discussioni, collegamenti a codice, miglioramenti e variazioni (come la divisione di poligoni in parti delle dimensioni desiderate che sono il più compatte possibile) e algoritmi per dati raster.
Ecco come appaiono gli stati degli Stati Uniti continentali (in una proiezione di uguale area) con il terzo inferiore di ogni stato ombreggiato. Evidentemente la direzione della spazzata era verticale.