Ce problème a de nombreuses solutions valides. L'un d'eux fonctionne un peu comme votre description, mais au lieu de découper les polygones à des emplacements "aléatoires", vous pouvez le faire de manière délibérée de manière à minimiser la quantité de calcul.
Voici l'algorithme de base. Son entrée se compose de n'importe quelle direction de balayage plan, d'un polygone P de zone non nulle, d'une zone cible a entre zéro et la zone du polygone, et d'un seuil non négatif t (en unités de surface). Son but est de diviser P avec une ligne perpendiculaire à la direction de balayage en deux parties, une à droite de la ligne et l'autre à gauche de la ligne, de sorte que la différence entre la zone de droite et la zone cible a n'est pas supérieur à t .
Soit L toute ligne orientée perpendiculaire à la direction de balayage. Définissez f (L) comme l'aire de P trouvée à droite de L, moins a . En ces termes, la tâche consiste à trouver un zéro de f . Parce que f est peu susceptible d'être différentiables, mais continue, utilisez une méthode bissectrice, la méthode sécante , ou - ma favorite- méthode de -Brent . Tous sont simples et garantis de converger. Utilisez t pour la tolérance de convergence de l'argument.
C'est ça. Voyons ce qui entre dans le codage de cela. La recherche de racine est routinière - vous pouvez utiliser un morceau de code générique pour cela - donc le travail SIG se résume au codage f . Cela nécessite
1. Splitting the polygon by a line.
2. Computing the area of the piece(s) to the right of the line.
Les deux opérations sont implémentées dans presque tous les SIG vectoriels. Sinon, vous pouvez remplacer la ligne par un très grand rectangle représentant le demi-plan à droite de la ligne. L'étape 1 devient
1'. Clip the polygon to the rectangle.
C'est une opération vraiment basique.
Pour commencer avec la recherche de racine, vous devez trouver un intervalle dans lequel le zéro de f est garanti. C'est simple: projetez l'enveloppe du polygone ("boîte englobante") dans la direction du balayage de ligne. La projection est l'intervalle souhaité.
Cette question a une longue histoire. J'ai implémenté cet algorithme pour ArcView 3.x il y a longtemps et je l'ai décrit à plusieurs reprises dans les anciens forums d'utilisateurs ESRI. Google
site de polygone divisé huber: forums.esri.com
pour les discussions, les liens vers le code, les améliorations et les variations (telles que la division des polygones en parties de tailles souhaitées aussi compactes que possible) et les algorithmes pour les données raster.
Voici à quoi ressemblent les États continentaux des États-Unis (dans une projection à surface égale) avec le tiers inférieur de chaque État ombré. De toute évidence, la direction de balayage était verticale.