Estou trabalhando em alguns exemplos de classe em Python implementados no ArcMap para calcular a distância antipodal dentro de um polígono. Isso é bastante rotineiro para polígonos convexos, no entanto, para polígonos côncavos, desejo excluir soluções (formadas por um raio que conecta os pontos de contorno), que não estão completamente dentro do polígono e não no limite ou na interseção do polígono. Eu interpretei a definição errada ou esse animal tem outro nome?
Considere estes dois polígonos
pnts = [[0,0], [0,1], [1,4], [3,5], [5,4], [4,1], [0,0]] # um loop fechado convexo
pnts = [[0,0], [2,1], [1,4], [3,5], [5,4], [4,1], [0,0]] # um loop fechado polígono côncavo
Na minha interpretação, o ponto 0,0 não deve ter uma distância antipodal associada a ele, já que o vetor que o conecta aos outros pontos é auto-interceptando o polígono ou está no limite do polígono.
Se alguém tiver algum esclarecimento sobre a definição ou possíveis soluções, eu agradeceria.
Um visual do polígono convexo e das linhas desejadas (mostradas em vermelho) é anexado (vetores de exemplo do ponto 0 são mostrados apenas).
No exemplo convexo, o primeiro ponto não possui vetores antipodais; no entanto, o segundo ponto.
EDIT: Eu tive algum sucesso em pesquisar usando "busca de polígono" ou "diâmetro de polígono" na Web, suspeito que é isso que estou procurando.
fonte
Respostas:
Se eu estivesse escrevendo um algoritmo, simplesmente verificaria se uma linha entre dois vértices no polígono cruza qualquer linha que forma uma das arestas. Aqui está o meu pseudo-código:
armazene todas as distâncias do valide com referência aos vértices em 1.
faça o que quiser com os resultados, escreva novas linhas, armazene a mais longa para cada polígono ...
Agora, não tenho certeza se é isso que você procura, mas você certamente pode fazer o acima no ArcPy.
Edição: código para o passo 2.2:
Se h estiver entre 0 e 1, as linhas se cruzam, caso contrário não. Se F * P é zero, é claro que você não pode fazer o cálculo, mas neste caso as linhas são paralelas e, portanto, só se cruzam nos casos óbvios. Se h for 1, as linhas terminam no mesmo ponto. Lide com isso como quiser! (Eu diria que eles se cruzam, isso me facilita).
Outro exemplo para a etapa 2.2 daqui: http://en.wikipedia.org/wiki/Line-line_intersection
Primeiro verifique se o denominador não é igual a 0, o que significa que as linhas são paralelas.
Em seguida, verifique se as coordenadas encontradas acima não estão fora da caixa delimitadora das duas linhas.
Mais informações: http://compgeom.cs.uiuc.edu/~jeffe/teaching/373/notes/x06-sweepline.pdf
fonte
Eu ficaria tentado a fazer isso usando anjos, quase como uma linha de visão. Se ao iterar os vértices na forma, os ângulos entre o vértice de origem e o vértice de destino continuarem em uma direção consistente, todos os pontos serão candidatos ao antípoda. Se um ângulo muda de direção, esse ponto fica oculto ou oculta o ponto anterior. Se estiver oculto pelo ponto anterior, o ponto precisará ser ignorado. Se ocultar o ponto anterior, é necessário remover o (s) ponto (s) anterior (s) da lista de candidatos.
Não sei o que fazer com casos em que a origem e dois outros vértices caem na mesma linha. Nesse caso, o ângulo seria o mesmo. Se você tivesse um polígono com orifícios, poderia encontrar o ângulo mínimo / máximo de cada orifício e remover qualquer ponto candidato que estivesse dentro desse intervalo.
A principal vantagem dessa abordagem seria que você não precisa testar a interseção de linha entre o segmento de linha atual e todas as arestas do polígono.
Isso funciona ... eu acho. Atualizei o pseudo-código acima e o python para facilitar a leitura.
Essa deve ser a última edição. O exemplo abaixo deve encontrar o maior anitólio para uma determinada geometria. Alterei o script para usar pontos e vetores, para tentar facilitar a leitura.
fonte
Talvez considere triangular o conjunto de dados. Quais linhas são comuns às arestas dos polígonos seriam fáceis de estabelecer e as demais poderiam ser comparadas para encontrar as mais longas? A questão, então, é qual algoritmo de triangulação você precisa.
É apenas um palpite, mas suspeito (ironicamente) que a triangulação de "menor qualidade" que se pode criar deve conter a linha que você está procurando, por exemplo, a Figura 1 em 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
fonte