Suite

Comment calculer un ensemble de boîtes englobantes minimales pour un polygone

Comment calculer un ensemble de boîtes englobantes minimales pour un polygone


J'ai besoin de calculer un ensemble de cadres de délimitation minimum pour un polygone. Id est ayant un polygone complexe, je veux l'envelopper avec un ensemble de petites boîtes au lieu d'un grand.


Je suppose que ce que vous voulez faire est de créer une grille de polygones et de sélectionner toutes les cellules de la grille qui coupent la géométrie du polygone.

Si j'ai raison, veuillez reformuler votre question car elle n'a pas de sens telle qu'elle est actuellement. Par définition, une géométrie a exactement une boîte englobante ou un rectangle englobant minimum comme on l'appelle aussi.


La plupart des logiciels spatiaux vous permettront de trouver une boîte englobante. L'utilisation des coordonnées max/min dans les directions lon/lat facilitera également l'établissement des coordonnées d'angle pour une zone de délimitation. Vous trouverez la réponse à ce défi particulier en utilisant python dans QGIS ici.

Quant à la division, vous pouvez utiliser n'importe quel ensemble de polygones. Vous pouvez créer une résille de votre choix ou en utiliser une existante. Ensuite, faites une intersection entre votre cadre de délimitation et le jeu de résille/polygone que vous utilisez.


Par boîte englobante, je suppose que vous entendez la boîte (carré) dans laquelle le cercle est inscrit, comme sur cette image :

Notez que le rayon du cercle est exactement la moitié de la longueur d'un côté du carré.

Donc, si le centre du cercle est $(10,-5)$ et le rayon du cercle est $23$, et si nous supposons un système de coordonnées standard (les valeurs $y$ augmentent vers le haut et $x Les valeurs $ augmentent dans le bon sens), alors les coins de la boîte sont situés aux points suivants :


Étendue de la couverture

L'étendue de la couverture représente la limite extérieure d'une couverture. Il s'agit du rectangle de délimitation minimal qui définit les limites de coordonnées (coordonnées minimales et maximales extrêmes) des points d'étiquette des arcs de couverture et, par définition, des polygones, des systèmes d'itinéraires et des régions.

Les informations sur l'étendue géographique d'une couverture sont stockées dans le fichier bnd.adf. Le fichier bnd.adf est utilisé par de nombreuses applications logicielles Esri pour définir l'étendue géographique pour dessiner une couverture. De plus, il est souvent utilisé comme étendue de carte par défaut pour un affichage rapide de la couverture. De nombreux processus spatiaux utilisent le fichier bnd.adf pour déterminer si une couverture chevauche une autre et pour trier les entités de couverture par emplacement pour le traitement.

Le fichier BND contient les éléments suivants :

La coordonnée x du coin inférieur gauche de l'étendue de la couverture

La coordonnée y du coin inférieur gauche de l'étendue de la couverture

La coordonnée x du coin supérieur droit de l'étendue de la couverture

La coordonnée y du coin supérieur droit de l'étendue de la couverture

Les coordonnées des liens, des tics et des annotations peuvent se trouver en dehors du fichier bnd.adf. Une couverture ne contenant ni arcs ni points d'étiquette (ou un seul point d'étiquette) aura un bnd.adf indéfini.

Généralement, ArcGIS gère l'étendue pour vous, en la mettant à jour à mesure que vous ajoutez ou supprimez des entités d'une couverture. Si, pour une raison quelconque, l'étendue affichée ne correspond pas à l'étendue réelle des entités, cliquez sur Ajuster dans la boîte de dialogue Propriétés de la couverture pour recalculer l'étendue de la couverture. Vous pouvez également saisir de nouvelles valeurs d'étendue dans les zones de texte appropriées.


L'utilisation de numpy rend la gestion d'une grande quantité de coordonnées beaucoup plus efficace. Pour cet exemple, nous supposerons que vous avez stocké les coordonnées dans un tableau en forme de (n,2). Pour l'exemple de coordonnées ci-dessus, c'est facile :

Nous pouvons utiliser les fonctions min et max intégrées de numpy pour calculer le min/max au lieu de les écrire nous-mêmes. Vous pouvez consulter le code source, mais pour la plupart des applications, il est recommandé d'installer UliEngineering et d'utiliser simplement le code :

Vous pouvez l'utiliser sur une liste de coordonnées sans les convertir explicitement en un tableau numpy, car min et max convertiront implicitement la liste. Cependant, cela est inefficace, car il sera converti deux fois : une fois en min et une fois en max .


Détection du poignet basée sur une zone de délimitation minimale et des caractéristiques géométriques

La détection du poignet est un élément crucial dans les processus d'estimation de la pose de la main et de reconnaissance des gestes de la main dans les applications d'interaction homme-machine. La plupart des méthodes utilisent des lignes parallèles horizontales pour rechercher l'emplacement d'une ligne de poignet. Les problèmes difficiles de la détection du poignet consistent à déterminer l'orientation et à localiser les lignes parallèles horizontales qui recherchent diverses poses de main. La méthode proposée détecte automatiquement un poignet, sur la base d'une boîte englobante minimale et de caractéristiques géométriques. Il détermine également les points de départ et d'arrêt pour localiser l'analyse. L'évaluation a utilisé un ensemble de 1240 images de main avec des données de vérité terrain tirées de trois ensembles de données. Les images de main contenaient plusieurs gestes et individus pour prouver que la méthode est robuste contre divers gestes. L'évaluation montre que la méthode détecte avec succès l'orientation de l'image et les points du poignet avec une grande précision.


Quelle est la méthode pour trouver le volume limite minimal représenté par les plans ?

Faute d'une meilleure méthode, je suggère de trianguler la surface de votre forme et d'itérer sur ces triangles, de calculer un déterminant pour chacun et d'ajouter tout cela. Assurez-vous d'utiliser une orientation cohérente pour les triangles, afin qu'ils soient tous orientés de la même manière lorsqu'ils sont vus de l'intérieur. Divisez le résultat par 6 et vous avez le volume. La raison en est que vous ajoutez un certain nombre de volumes pyramidaux orientés, qui s'annulent à l'extérieur de votre forme et finissent par décrire exactement l'intérieur.

Aussi, est-ce que la forme a une dimension infinie ?


Collections de géométrie (facultatif)¶

Cette partie n'est pas obligatoire mais elle contient des informations utiles liées à la construction et à l'utilisation des collections de géométrie et de certains objets géométriques spéciaux, tels que le cadre de sélection.

Dans certaines occasions, il est utile de stocker par ex. plusieurs lignes ou polygones sous une seule entité (c'est-à-dire qu'une seule ligne dans un fichier de formes représente plus d'une ligne ou d'un objet polygone). Les collections de points sont implémentées à l'aide d'un objet MultiPoint, les collections de courbes à l'aide d'un objet MultiLineString et les collections de surfaces par un objet MultiPolygon. Ces collections ne sont pas significatives en termes de calcul, mais sont utiles pour modéliser certains types de caractéristiques. Une entité linéaire en forme de Y (telle qu'une route) ou plusieurs polygones (par exemple, des îles sur un même site), peuvent être présentés correctement dans leur ensemble en utilisant MultiLineString ou MultiPolygon en conséquence. Créer et visualiser une zone de délimitation minimale, par ex. autour de vos points de données est une fonction vraiment utile à de nombreuses fins (par exemple, essayer de comprendre l'étendue de vos données), nous montrons ici comment en créer une à l'aide de Shapely.

Les collections de géométries peuvent être construites de la manière suivante :

Nous pouvons voir que les sorties sont similaires aux objets géométriques de base que nous avons créés précédemment, mais maintenant ces objets contiennent plusieurs caractéristiques de ces points, lignes ou polygones.

Collection de géométrie -attributs et fonctions des objets¶

Nous pouvons également obtenir de nombreux attributs utiles de ces objets :

D'après ce qui précède, nous pouvons voir que les multipolygones ont exactement les mêmes attributs disponibles que les objets géométriques simples, mais maintenant les informations telles que la zone calculent la zone de TOUS les objets individuels combinés. Certaines fonctionnalités supplémentaires sont également disponibles, telles que est valable attribut qui indique si les polygones ou les lignes se croisent.

Lancer dans le web/MyBinder :

Remerciements :

© Copyright 2019, Géoinformatique du paysage Dernière mise à jour le 04 mars 2020.


2 réponses 2

Vous pouvez trouver un algorithme détaillé sur le Drexel Math Forum, dû à Vladimir Zajic. C'est un calcul désordonné mais élémentaire. Vous devrez d'abord calculer le centre du cercle contenant l'arc, et les angles de début et de fin, un calcul qui peut être trouvé partout sur le Web, par exemple, à la page MathWorld sur Cercle.

J'ai réussi à le faire. La première phase consiste à calculer le centre du cercle et les angles, comme l'a dit Joseph. Ensuite, vous devez calculer les angles entre le vecteur (1,0) et le (x_n-cx, y_n-cy) où n est [0,1,2]. Le premier et le dernier angle ainsi que le cercle définissent un secteur. Maintenant, calculez les quatre points cardinaux sur le cercle. Nord, Est, Sud et Ouest. Une idée clé est que les seuls points qui peuvent se croiser avec la bbox sont la fin de l'arc, le début et ces quatre "points de boussole". Filtrez ceux de ces six points, début, fin, nord, est, sud, ouest qui sont en dehors du secteur défini précédemment. Ensuite, prenez les points extrêmes de chaque point et créez une bbox à partir d'eux.

EDIT: J'ai fini par utiliser un système CAS pour résoudre les équations donnant cx et cy car c'est compliqué et long, mais conceptuellement facile.

Voici le code Haskell qui fait cela :


Variante simplifiée : rectangles

Supposons que nous nous concentrons sur le cas le plus simple où $mathcal

$ doit être un rectangle aligné sur l'axe. Ensuite, je peux donner un algorithme de temps $O(n^2 (lg n)^2)$.

Sans perte de généralité, la $x$-coordonnée des côtés gauche et droit de ce rectangle doit être en accord avec la $x$-coordonnée d'une paire de points, et de même pour les côtés supérieur et inférieur.

Donc, devinez la $x$-coordonnée du côté gauche du rectangle (il y a $le n$ possibilités), disons $x_L$. Maintenant, faites une recherche binaire sur la largeur du rectangle (il y a $le n$ possibilités), en utilisant les idées suivantes.

Étant donné une estimation de la largeur $w$ du rectangle, vous pouvez calculer le nombre maximum de points pouvant tenir dans un rectangle autorisé avec ces $x$-coordonnées pour les côtés gauche et droit, comme suit. Commencez par filtrer tous les points dont la $x$-coordonnée n'est pas dans $[x_L,x_L+w]$. Triez les points restants par leur axe $y$. Recherchez maintenant la valeur $y$ $y_B$ pour le côté inférieur du rectangle, qui maximise le nombre de points restants dont la $y$-coordonnée est dans la plage $[y_B,y_B+A/w]$. Cela peut être trouvé avec un simple balayage linéaire des points restants (avec deux pointeurs avançant de manière monotone).

Avec cela, étant donné $x_L$, vous pouvez faire une recherche binaire pour $w$. Chaque estimation à $w$ demande un travail de $O(n lg n)$ pour calculer le nombre maximum de points pouvant tenir dans un rectangle de cette sorte. Puisqu'il y a $le n$ valeurs possibles pour $w$, vous ferez $O(lg n)$ itérations dans la recherche binaire. Puisqu'il y a $le n$ possibilités pour $x_L$, le temps d'exécution global est $O(n^2 (lg n)^2)$.

Puisqu'un rectangle est un polygone convexe, cela vous donne une limite inférieure sur le nombre de points pouvant être couverts par un polygone convexe d'aire $le A$. Ce n'est peut-être pas une limite inférieure particulièrement serrée, mais c'est peut-être un début.


Le plus grand cercle enfermé dans une boîte englobante minimale orientée mais n'incluant pas les points/lignes

Je me demande si quelqu'un peut suggérer un moyen de trouver le plus grand cercle pouvant tenir dans la boîte englobante minimale orientée pour un ensemble de points/lignes, qui n'inclut aucun des points/lignes.

Considérez ces deux images :

Chaque image est entourée par sa boîte englobante minimale orientée (juste parallèlement à l'axe X-Y pour faciliter les choses).

La figure "Cross" aura un cercle qui s'insère dans l'un des triangles tandis que la figure "Tee" aura un cercle qui s'adaptera sur un côté du "T."

Ainsi, l'enjeu est de trouver une approche généralisée permettant de retrouver un tel cercle et son rayon/diamètre.

Cela semble être un problème différent de celui de trouver le cercle délimitant minimum, le cercle inscrit maximum ou le problème du plus grand cercle vide.

Le plus grand problème de cercle vide semble proche, mais (s'il se concentre uniquement sur les points/lignes) dépasserait la taille de la boîte englobante.

Je recherche un moyen généralisé de trouver le cercle et son rayon/diamètre qui fonctionnera pour n'importe quel cadre de délimitation minimum orienté et nombre de points/lignes dans un espace 2D.


Voir la vidéo: 6e Calculer le périmètre dun polygone