Suite

Obtenir la largeur et la hauteur d'un polygone rectangulaire dans PostGIS


J'ai une table avec des entités ponctuelles enregistrées dans ma base de données PostgreSQL, et je peux exécuter la requête suivante pour obtenir l'étendue des entités ponctuelles et j'ai reconverti l'étendue en géométrie :

SELECTIONNER ST_AsText(ST_SetSRID(ST_Extent(pts.geom), 4026)) AS Extent_Geom FROM Table_w_Point_Features pts

Voici à quoi ressemble la géométrie en sortie d'un polygone rectangle qui représente l'étendue des entités ponctuelles :

POLYGONE((-117.536012078 33.7130048820001, -117.536012078 34.3860049530001, -116.825011941 34.3860049530001, -116.825011941 33.7130048820001, -117.536012078 33.7130048820001))

Existe-t-il un moyen dans PostGIS d'obtenir la largeur et la hauteur de l'étendue que j'ai créée ci-dessus?


j'irais avec leGéométrieAccesseurs pourXpour donner la largeur : ST_XMax - ST_XMin, et les fonctions associées pourOuipour la hauteur.


Calculer les limites du rectangle intérieur du polygone en fonction de ses limites constantes avec la bordure

Hier, j'ai posé cette question ne semble pas clair. Donc, j'écris une nouvelle question avec des termes mathématiques uniquement.

Voici quelques points sur les formes que j'ai utilisées:

  • Carré: Rectangle dont tous les angles sont à 90 ° et tous les côtés sont de longueur égale. Alors, considérez Carré aussi un Rectangle.
  • Triangle: J'ai utilisé un triangle équilatéral, c'est un triangle dont les trois côtés ont la même longueur.
  • Polygone: un nombre fini de segments de ligne droite reliés pour former un fermé.

Donc, ici après j'utilise le terme Polygone à décrire des formes de triangle et de rectangle quand il est nécessaire de mentionner considérer cette forme comme un polygone . Parce que j'ai utilisé triangle (polygone régulier) pour simplifier le travail pour trouver la formule.

Variables utilisées dans ce problème :

Limites du rectangle extérieur (r) entourant le polygone (p) :

  • X = Origine x
  • oui = Origine y
  • w = Largeur
  • h = Hauteur

Donc, si r = (x,y,w,h) alors, les limites du rectangle intérieur qui entoure le polygone intérieur (p1) (r1) = (x1,y1,w1,h1)

Ici, polygone intérieur = Polygone en soustrayant la largeur de la bordure.

Quel est mon objectif final :

Je devrais pouvoir calculer la limite du rectangle intérieur de n'importe quel polygone comme l'image ci-dessous, j'ai des angles, les limites du rectangle extérieur et la largeur de la bordure. Le problème est de trouver les limites du rectangle intérieur au rectangle extérieur en fonction du polygone à celui délimité par le rectangle intérieur.

Considérons un polygone (p) comme une forme de rectangle (r) dont la largeur (w) est de 100 et la hauteur (h) est de 100. La largeur de la bordure du polygone est de 10. Quelle est la limite intérieure du rectangle qui entoure le polygone intérieur ?

Noter: Je l'ai résolu par calcul mental (je n'ai pas pris d'angles dans le calcul). Mais nous ne pouvons pas appliquer cette même formule pour le triangle. Donc ce n'est pas la solution à mon problème.

Considérez le polygone (ne considérez pas régulier) avec trois arêtes et trois sommets et tous les angles sont de même mesure.

Si la limite du rectangle (r) est zéro et que la taille (w, h) est (100,87) qui englobe le polygone (p) avec la largeur de la bordure du polygone comme 10, alors

Quelles sont les limites du rectangle intérieur (r2) qui entoure le polygone intérieur (p2) ?

J'espère avoir clairement expliqué le problème. Si quelque chose me manque, merci de me le faire savoir. Merci d'avance.


Supposons que la largeur et la hauteur inconnues soient $x$ et $y$, et qu'on vous donne une diagonale $d$ et un rapport $m:n$ de largeur à hauteur. Ce rapport signifie que la largeur est $frac$ fois la hauteur, donc vous savez que $x=fracy$. Vous obtenez une deuxième relation entre $x$ et $y$ du théorème de Pythagore : $x$, $y$ et $d$ sont les longueurs des deux jambes et l'hypoténuse d'un triangle rectangle, donc $x^2 +y^2=d^2$.

Maintenant, remplacez $fracy$ pour $x$ dans cette deuxième équation pour obtenir $displaystyleleft(fracydroit)^2 + y^2 = d^2$. En simplifiant cela, vous obtenez à son tour : $fracy^2 + y^2 = d^2,$ $gauche(frac+1droit)y^2 = d^2,$ $gauche(frac ight)y^2=d^2,$ et $(m^2+n^2)y^2=d^2n^2.$ Enfin, résolvez $y$ : $displaystyle y^2 = fracturation$, donc $y=displaystylefrac>$.
Une fois que vous avez une valeur numérique pour $y$, vous pouvez la brancher sur $x=fracy$ pour obtenir une valeur pour $x$.
(Ou vous pouvez le faire symboliquement : $displaystyle x=fraccdot frac> =$ $style d'affichagefrac>$.)


Couvrir un polygone avec des rectangles

Je fatigue pour couvrir un simple polygone concave avec un minimum de rectangles. Mes rectangles peuvent être de n'importe quelle longueur, mais ils ont des largeurs maximales et le polygone n'aura jamais un angle aigu.

J'ai pensé à essayer de décomposer mon polygone concave en triangles qui produisent un ensemble de rectangles se chevauchant au minimum et délimitant au minimum chaque triangle, puis en fusionnant ces rectangles en de plus grands. Cependant, je ne pense pas que cela fonctionnera pour les petites encoches sur les bords du polygone. Les triangles créés par les sommets réflexes sur ces encoches créeront les mauvais rectangles. Je recherche des rectangles qui couvriront/ignoreront les encoches.

Je ne connais vraiment rien à la géométrie computationnelle, donc je ne sais pas vraiment comment commencer à poser la question.

J'ai trouvé d'autres articles similaires, mais pas ce dont j'ai besoin :

Quelques exemples : Le noir est l'entrée. Le rouge est la sortie acceptable.

Autre exemple : la deuxième sortie est préférée. Cependant, générer les deux sorties et utiliser un autre facteur pour déterminer la préférence est probablement nécessaire et ne relève pas de la responsabilité de cet algorithme.

Les polygones qui imitent des courbes sont extrêmement rares. Dans ce scénario, une grande partie de la surface des rectangles est gaspillée. Cependant, cela est acceptable car chaque rectangle obéit à la contrainte de largeur maximale.

De plus, j'ai trouvé cet article proche de ce dont j'avais besoin:

Peut-être qu'une meilleure question est "Comment puis-je identifier des portions de type rectangulaire d'un polygone concave ?"

Voici une image montrant l'implémentation souhaitée :

Le vert est l'utilisation réelle du matériau. Les rectangles rouges sont les mises en page. Le bleu est le MBR de l'ensemble du polygone. Je pense que je devrais essayer d'obtenir de petits MBR et de les remplir. Les 2-3 rectangles verts dans le coin supérieur gauche qui se terminent au milieu du polygone sont chers. C'est ce que je veux minimiser. Les rectangles verts ont une largeur et une hauteur min et max, mais je peux utiliser autant de lignes et de colonnes que nécessaire pour couvrir une région. Encore une fois, je dois minimiser le nombre de rectangles qui ne s'étendent pas sur l'entrée. Je peux également modifier la forme du rectangle vert pour qu'il s'adapte à de petits endroits, ce qui est également très coûteux. En d'autres termes, obtenir autant de rectangles que possible pour couvrir autant que possible est idéal.


Sélectionnez l'outil rectangle et accédez à l'option rectangle, vous pouvez y mettre une taille fixe dans le menu déroulant.

une autre chose est que vous pouvez créer la même sélection de chapiteau avec une hauteur et une largeur fixes, voir les photos ci-jointes.

J'espère que cela vous aidera et que les images en disent plus que des mots.

Dans Photoshop CS6, cliquez simplement sur la toile avec l'outil Rectangle sélectionné, entrez la largeur et la hauteur.

Dans les versions antérieures à Photoshop CS6, vous pouvez définir la taille dans les options de forme, avant de dessiner la forme elle-même (veuillez consulter l'autre réponse sur cette page pour des captures d'écran et plus d'informations). Cela fonctionne également dans Photoshop CS6, mais un simple clic sur la toile est plus facile, si vous avez CS6.

Vous pouvez également dessiner la forme tout en regardant le panneau d'informations et/ou ajuster ensuite en poussant (assurez-vous que l'accrochage des pixels est activé, de sorte que vous ajustez par incréments de pixels entiers).


Autres méthodes

Il est possible de créer un terrain entièrement dans le pipeline de shader. Si l'algorithme s'exécute uniquement dans le fragment/pixel shader, le détail peut être pratiquement illimité alors que l'impact mémoire est quasiment nul. Les inconvénients évidents sont presque aucun contrôle sur la forme et les problèmes lorsque la caméra coupe la surface de rendu d'origine. C'est toujours utile dans les jeux spatiaux où les joueurs n'interagissent pas avec la surface d'une planète. Les animations de paramètres fonctionnent mieux avec ce type de terrain.

Il devrait être possible de télécharger la géométrie du terrain générée à partir de la carte graphique pour l'utiliser pour le reste du moteur de jeu, mais je ne sais pas quelles en sont les performances ou si cela a été fait jusqu'à présent.


1 réponse 1

Position

Vous pouvez placer le rectangle par rapport au coin inférieur droit du triangle et spécifier le sud-ouest comme point d'ancrage du rectangle, c'est-à-dire

Notez que l'ancre doit être spécifiée après le positionnement, comme right=of. place l'ancre automatiquement.

Flèche

Notez également que pour rendre la flèche horizontale, j'ai utilisé -| , c'est à dire.

qui trace une ligne de tortilla queue.east jusqu'au point qui se trouve à l'intersection d'une ligne horizontale tirée de tortilla queue.east et d'une ligne verticale tirée de tortilla station.west .

Si vous le souhaitez, vous pouvez obtenir une flèche horizontale à partir du centre vertical du rectangle en utilisant la bibliothèque d'intersections pour trouver l'intersection d'une ligne horizontale de tortilla station.west et du côté le plus proche du triangle.

Style de file d'attente alternatif

Pour que le texte soit plus centré dans le triangle, vous pouvez utiliser la forme polygonale régulière, au lieu du triangle isocèle . Cela donnera aux coins des noms différents, le coin inférieur droit étant le coin 3 . Ainsi, par exemple


2 réponses 2

commencer C&=leftlfloorfrac WL ight floor& R&=leftlfloorfrac HL ight floor end

être respectivement le nombre maximum de lignes et de colonnes. On dirait que vous cherchez le maximum de $L^*$ tel que, lorsque $L=L^*$, nous avons $CRge N$. Laisser

commencer L_0&=sqrtN> C_0&=gauchelceilfrac W ight ceil=leftlceilsqrtH> ight ceil& R_0&=leftlceilfrac H ight ceil=leftlceilsqrtW>droit ceil. finir

Remarquez que $Llemin<>$ est suffisant, et $Lle L_0$ est nécessaire :

commencer frac&geleftlfloorfrac WL ight floorleftlfloorfrac HL ight floor=CRge N L&lesqrtN>=L_0, fin

avec égalité seulement si $W/L_0$ et $H/L_0$ sont tous les deux des entiers. En conséquence, la solution optimale a pour dimension soit $C_0 imeslceil N/C_0 ceil$ soit $lceil N/R_0 ceil imes R_0$.

Une autre approche possible consiste à rechercher de bonnes approximations rationnelles du rapport $W/H$, c'est-à-dire des entiers positifs $r,s$ tels que $r/s approx W/H$.

Toute bonne solution à votre problème donne immédiatement une si bonne approximation rationnelle (il suffit de laisser $r = $ le nombre de rangées de carrés et $s = $ le nombre de colonnes). De même, toute bonne approximation rationnelle de $W/H$ suggère une solution candidate à votre problème (soit $k=lceil sqrt floor$, puis considérons un arrangement avec environ $kr$ lignes et $ks$ colonnes). Ainsi, une approche plausible pourrait être de générer un tas de bonnes approximations rationnelles de $W/H$, puis de tester chaque disposition candidate correspondante pour voir laquelle est la meilleure.

Il existe divers algorithmes pour générer de bonnes approximations rationnelles d'un nombre souhaité $alpha in mathbb$. Par exemple, vous pouvez utiliser des fractions continues pour générer un ensemble d'approximations candidates. Il existe une garantie mathématique que chaque candidat sera une très bonne approximation, dans un sens mathématique bien défini. Le temps d'exécution pour générer et examiner toutes ces fractions continues sera poly-logarithmique en $N$. Cependant, je ne sais pas si ce sera mieux en pratique que votre simple $O(sqrt)$ algorithme de temps.


1 réponse 1

Cela peut être fait en définissant d'abord une zone dans laquelle vous souhaitez obtenir les géométries des régions rouges. J'ai fait un rectangle quelque part dans la région où vous avez affiché la carte. Ensuite, vous étiquetez chaque zone 'rouge' connectée individuelle avec une étiquette différente à l'aide de connectedComponents. Vous pouvez ensuite appliquer reduceToVectors et exporter ces vecteurs, par exemple sous forme de fichiers KMZ que vous pouvez prévisualiser dans Google Earth. Notez la variabilité dans les régions qui est faite en faisant varier le paramètre d'échelle dans reduceToVectors.

Ici, il y a un lien vers le code complet. La prochaine fois, veuillez ajouter un texte descriptif à votre code pour le rendre lisible pour les autres.


Chemins de pack [concave et convexe]

Je voudrais concevoir un algorithme pour emballer des chemins fermés dans un rectangle. Un exemple d'un de ces chemins est ci-dessous :

Le rectangle aura une largeur fixe, mais la hauteur augmentera pour s'adapter aux chemins.

Une approche simple que j'ai déjà essayée:

Calculez le plus petit rectangle qui inscrit le chemin. (Les résultats ont ensuite été améliorés en faisant pivoter le chemin jusqu'à ce que sa largeur soit aussi petite que possible). Emballez les chemins de gauche à droite, et si la largeur restante est trop petite, augmentez la hauteur et emballez sur la rangée suivante. Cette approche, cependant, perd des optimisations avec la concavité. Je veux que des optimisations comme celle-ci soient faites :

Mais avec l'approche actuelle, j'obtiens ceci:

Quel type d'algorithmes peut être utilisé pour optimiser à la fois l'emballage de forme concave et convexe ?

Les chemins ne peuvent pas se chevaucher, être déformés ou contenir d'autres chemins (comme un carré dans un carré), mais ils peuvent être tournés pour un emballage optimal


Voir la vidéo: 8 - كيفية رسم مستطيل في الاوتوكاد .? How to Draw a Rectangle in AutoCAD (Octobre 2021).