Je travaille sur quelques exemples de classe en Python implémentés dans ArcMap pour calculer la distance antipodale dans un polygone. Ceci est assez courant pour les polygones convexes, cependant, pour les polygones concaves, je souhaite exclure les solutions (formées par un rayon reliant les points limites), qui ne sont pas complètement à l'intérieur du polygone et pas sur la limite du polygone ou qui le coupent. Ai-je mal interprété la définition ou cette bête porte-t-elle un autre nom?
Considérez ces deux polygones
pnts = [[0,0], [0,1], [1,4], [3,5], [5,4], [4,1], [0,0]] # a boucle fermée convexe
pnts = [[0,0], [2,1], [1,4], [3,5], [5,4], [4,1], [0,0]] # a boucle fermée polygone concave
Selon mon interprétation, le point 0,0 ne devrait pas être associé à une distance antipodale, car le vecteur le reliant aux autres points est lui-même coupant le polygone ou se trouve sur la frontière du polygone.
Si quelqu'un a des éclaircissements sur la définition ou les solutions potentielles, je l'apprécierais.
Un visuel du polygone convexe et des lignes souhaitées (montrées en rouge) est inclus (les exemples de vecteurs du point 0 ne sont montrés que).
Dans l'exemple convexe, le premier point n'a pas de vecteurs antipodaux, cependant, le deuxième en a.
EDIT J'ai réussi à chercher en utilisant "polygon fetch" ou "polygon diamètre" sur le web, je soupçonne que c'est ce que je recherche.
Réponses:
Si j'écrivais un algorithme, je vérifierais simplement si une ligne entre deux sommets du polygone coupe une ligne qui forme l'un des bords. Voici mon pseudo code:
mémoriser toutes les distances valides en référence aux sommets en 1.
faites ce que vous voulez avec les résultats, écrivez de nouvelles lignes, stockez la plus longue pour chaque polygone ...
Maintenant, je ne sais pas si c'est ce que vous recherchez, mais vous pouvez certainement faire ce qui précède dans ArcPy.
EDIT: Code pour l'étape 2.2:
Si h est compris entre 0 et 1, les lignes se coupent, sinon elles ne le sont pas. Si F * P est nul, vous ne pouvez bien sûr pas faire le calcul, mais dans ce cas, les lignes sont parallèles et ne se coupent donc que dans les cas évidents. Si h est 1, les lignes se terminent au même point. Manipulez cela comme vous voulez! (Je dirais qu'ils se croisent, ça me facilite les choses.)
Un autre exemple pour l'étape 2.2 à partir d'ici: http://en.wikipedia.org/wiki/Line-line_intersection
Vérifiez d'abord que le dénominateur n'est pas égal à 0, ce qui signifie que les lignes sont parallèles.
Vérifiez ensuite que les coordonnées ci-dessus ne se trouvent pas en dehors du cadre de délimitation de l'une ou l'autre ligne.
Plus de lecture: http://compgeom.cs.uiuc.edu/~jeffe/teaching/373/notes/x06-sweepline.pdf
la source
Je serais tenté de le faire en utilisant des anges, presque comme une ligne de vue. Si, tout en itérant les sommets de la forme, les angles entre le sommet d'origine et le sommet de destination continuent dans une direction cohérente, tous les points sont candidats à l'antipode. Si un angle change de direction, ce point est masqué ou masque le point précédent. S'il est masqué par le point précédent, le point doit être ignoré. S'il masque le point précédent, le ou les points précédents doivent être supprimés de la liste des candidats.
Je ne sais pas quoi faire avec les cas où l'origine et deux autres sommets tombent tous sur la même ligne. Dans ce cas, l'angle serait le même. Si vous aviez un polygone avec des trous, vous pouvez trouver l'angle min / max de chaque trou et supprimer tout point candidat se trouvant dans cette plage.
Le principal avantage de cette approche est que vous n'avez pas à tester l'intersection de lignes entre le segment de ligne actuel et toutes les arêtes du polygone.
Cela fonctionne ... je pense. J'ai mis à jour le pseudo code ci-dessus et le python afin de le rendre plus facile à lire.
Ce devrait être la dernière modification. L'exemple ci-dessous devrait trouver le plus grand anitpole pour une géométrie donnée. J'ai modifié le script pour qu'il utilise des points et des vecteurs, pour essayer de le rendre plus facile à lire.
la source
Pensez peut-être à trianguler l'ensemble de données. Quelles lignes sont communes aux polygones, les arêtes seraient faciles à établir et les autres pourraient être comparées pour trouver les plus longues? La question est alors de savoir de quel algorithme de triangulation vous avez besoin.
Ce n'est qu'une intuition mais je soupçonne (ironiquement) que la triangulation de "qualité la plus basse" que l'on puisse créer doit contenir la ligne que vous recherchez, par exemple Fig 1 dans https://www.google.co.uk/url?sa=t&rct= j & q = & esrc = s & source = web & cd = 6 & ved = 0CEoQFjAF & url = http% 3A% 2F% 2Fhrcak.srce.hr% 2Ffile% 2F69457 & ei = alIcUsb6HsLnswbfnYHoDw & usg = AFQjCJVKVF
la source