Ordenação de pontos de um polígono convexo

Olá…
Essa semana implementei um algoritmo intuitivo para determinar o envelope convexo de uma determinada nuvem de pontos dispotos sobre um plano bidimensional…Para quem não está familiarizado com o problema, o envelope convexo de uma nuvem de pontos é o meno conjunto de pontos que descreve um polígono convexo cuja área contém todos os outros pontos da nuvem…Esse algoritmo tem diversas aplicações. Pode ser usado, inclusive na otimização linear, para determinar o limites de um determinado conjunto de soluções de uma função de otimização…

Bem…Meu algoritmo já está funcionando. De uma menira pouco otimizada ainda, mas já estou trabalhando nisso…Minha dúvida é a seguinte. Meu algoritmo já devolve o conjunto de pontos que forma esse envelope convexo, só que eu gostaria de plotar esse envelope, ligando os pontos através de retas, de modo que eu pudesse apresentar um polígono. Só que eu esbarrei em um problema aparentemente trivial, mas cuja resolução me escapa completamente. Dado um conjunto de pontos que descreve um polígono convexo, como ordenar tais pontos de modo que, se eu desenhar uma reta entre dois pontos em sequência, eu obtenha no final um polígono?

Obrigado, desde já…

Ninguém? Parece que o problema não é tão trivial assim, então…

Primeiramente, até que enfim um tópico mais algorítmico!
“Segundamente”, oi.

[quote=Jokabeludoido]Olá…
Essa semana implementei um algoritmo intuitivo para determinar o envelope convexo de uma determinada nuvem de pontos dispotos sobre um plano bidimensional…Para quem não está familiarizado com o problema, o envelope convexo de uma nuvem de pontos é o meno conjunto de pontos que descreve um polígono convexo cuja área contém todos os outros pontos da nuvem…Esse algoritmo tem diversas aplicações. Pode ser usado, inclusive na otimização linear, para determinar o limites de um determinado conjunto de soluções de uma função de otimização…[/quote]
Existem maneira mais fáceis de se calcular o limite. No plano 2D, é mais fácil determinar a região de factibilidade e calcular o vértice da solução otima. Essa é a melhor solução. As outras, que são boas, mas não as ótimas, podem ser determinadas usando a equação da reta - basta você saber quais retas estão formando um vértice.

Isso não responde a sua dúvida, mas se você está tentando fazer esse negócio do polígono, o que falei acima acredito que já resolva (não tenho certeza).

[quote=Jokabeludoido]Bem…Meu algoritmo já está funcionando. De uma menira pouco otimizada ainda, mas já estou trabalhando nisso…Minha dúvida é a seguinte. Meu algoritmo já devolve o conjunto de pontos que forma esse envelope convexo, só que eu gostaria de plotar esse envelope, ligando os pontos através de retas, de modo que eu pudesse apresentar um polígono. Só que eu esbarrei em um problema aparentemente trivial, mas cuja resolução me escapa completamente. Dado um conjunto de pontos que descreve um polígono convexo, como ordenar tais pontos de modo que, se eu desenhar uma reta entre dois pontos em sequência, eu obtenha no final um polígono?

Obrigado, desde já…[/quote]
Eu resolvi um problema que achei bastante parecido com o que você precisa. É assim: dado um plano e um conjunto de pontos, determinar o tamanho máximo do lado de um quadrado quando se expande todos os pontos para os lados direito e esquerdo e para cima e para baixo. Eu tinha bolado uma solução de simulação, mas ficaria pouco eficiente. O que você pode fazer (que foi o que cheguei a fazer depois): ordenar pelo “x” e depois pelo “y”. Depois disso, você liga o primeiro ponto com o último.

Não tenho ideia se isso funciona. Mas para resolver o problema que falei, bastou. Se você tiver alguma outra ideia (ou se o que falei pode ter clareado um pouco mais a sua mente), fala aí que nós podemos trabalhar em cima dela.

Além disso, eu aconselho você a dar uma lida em Convex Hull. Não acredito que seja a resposta, mas pode dar algumas novas ideias.

Abraço.

Sem dúvidas…Quando falamos de otimização linear, existem outras opções. Só queria exemplificar mesmo :slight_smile:

Isto não é o evelope retangular? Obter os limites em X (maior e menor) e em Y (maior e menor) e plotar a caixa que envolve tudo isso?Não sei se entendi direito.

Na verdade, me parece que precisaria ordenar levando X e Y em conta ao mesmo tempo…E isso ainda não basta. É necessária uma heurística que ainda não surgiu pra mim…

Pois é…Meu problema é exatamente o Convex Hull…Fui desafiado pela minha professora de visualização científica a bolar uma estratégia intuitiva (particular, sem ter acesso a literatura) pra solucionar o problema…Bolei uma abordagem força bruta (baseada na triangulação de toda a área) que resultou num algoritmo n^4 :lol: Mas que funciona perfeitamente…Meu programa já estava funcionando na aula, só que esbarrei nesse outro problema (que, confesso, me parecia menor) na hora de plotar a convex hull…Consigo determinar todo o conjunto de pontos, mas não consigo ordená-los de forma que eu consiga plotar o polígono convexo resultante apenas ligando por retas os pontos em série…

A propósito, usei algumas estratégias de otimização aqui e já reduzia bastante a complexidade do meu algoritmo :lol:
Retirei um livro de geometria computacional e vi que existem algoritmos NlogN para a tarefa (tipo a “varredura de Graham” ou “Graham scan”)…

Opa.

[quote=Jokabeludoido]Isto não é o evelope retangular? Obter os limites em X (maior e menor) e em Y (maior e menor) e plotar a caixa que envolve tudo isso?Não sei se entendi direito[/quote].
É, na verdade, uma adaptação disso. Eu não sabia que existia nome.
O problema foi resolvido ordenando x e y e pegando os dois pontos com as menores diferenças - primeiro pegava a menor diferença do “x” dos pontos e depois dos “y”. Eu retornava o menor destes dois.

Bom, se é uma abordagem convincente, deixa pra otimizar depois, certo? Hehe. E não dá pra dizer que não funciona! :slight_smile:

A priori, eu também achei que seria um problema mais fácil de resolver. Mas acho que exige um pouco mais de raciocínio por ser Convexo, né? Que envolve todo o assunto da circunferência e tal… sei lá, posso estar falando caca (grandes chances de isso ser verdade, eheh), mas é legal discutir esses assuntos.

[editado]Nossa, olhando as propriedades de um polígono convexo eu pude ver que é beeem menos simples de resolver isso.[/editado]

Você faz mestrado?
Abraço!

[quote]É, na verdade, uma adaptação disso. Eu não sabia que existia nome.
O problema foi resolvido ordenando x e y e pegando os dois pontos com as menores diferenças - primeiro pegava a menor diferença do “x” dos pontos e depois dos “y”. Eu retornava o menor destes dois.[/quote]
Certo…Acho que entendi…

É…Logo em seguida fiz intuitivamente uma otimização neste algoritmo e, sem premeditar, resultou no algoritmo conhecido na literatura como QuickHull…Louca essa maneira como uma coisa sugere a outra quando estamos trabalhando num problema. Nós refazemos certas linhas de raciocínio.

Pois é…Estou achando que tem algo relacionado com a angulatura…Estou investigando neste sentido…

É…Entrei esse ano…Vamos ver o que é que dá :smiley:
E você?

Abraço…

É…Entrei esse ano…Vamos ver o que é que dá :smiley:
E você?

Abraço…[/quote]
Eu termino a graduação esse ano.

Bons estudos pra você! :slight_smile:
Sinto não poder ajudar mais.

Abraço.

Bem, pelo que entendi os seus pontos estão em um plano, afinal você quer um polígono, e não um poliedro, certo?

Eu proponho esse algoritmo:

Primeiro obtenha um ponto que seja interior ao polígono. Como você já sabe que ele é convexo, tirar o ponto médio de todos os vértices deve funcionar (ou seja, a média do X e a média do Y).

Tendo esse ponto interior, você descreve os pontos do polígono relativo a esse ponto interior. Ou seja, move esse ponto para a origem arrastando todos os vértices junto com eles, algo que é muito fácil, basta pegar as coordenadas de cada vértice e subtrair as coordenadas do ponto interior. Assim você terá um polígono cujos vértices “giram” em redor do ponto (0, 0).

Daí, converte as coordenadas de cada vértice em coordenadas polares, e ordene-os de acordo com o ângulo. Problema resolvido!
:smiley:

Nada como ter um raciocínio matemático mais completo :smiley:
Eu costumo esquecer completamente que existe o sistema de coordenadas polares :oops:

Valeu pela força, cara…Acho que vai resolver meu problema sim, pensando matematicamente…

Cara…Pior que não rolou, bicho…
Não funcionou, às vezes ele plota um pl~igono convexo como se fosse um polígono entrecruzado*.
Ele está seguindo uma ordem interessante e lá pelas tantas, ao invés de continuar traçando o polígono pelas bordas, ele liga um ponto do outro lado do polígono com uma linha que cruza o polígono convexo esperado…Acho que a ordenação por ângulos polares ainda não é a a solução para o problema…

*Para maiores esclarecimentos, ver polígono entrecruzado na figura abaixo:

[quote=Jokabeludoido]Cara…Pior que não rolou, bicho…
Não funcionou, às vezes ele plota um pl~igono convexo como se fosse um polígono entrecruzado*.
Ele está seguindo uma ordem interessante e lá pelas tantas, ao invés de continuar traçando o polígono pelas bordas, ele liga um ponto do outro lado do polígono com uma linha que cruza o polígono convexo esperado…Acho que a ordenação por ângulos polares ainda não é a a solução para o problema…

*Para maiores esclarecimentos, ver polígono entrecruzado na figura abaixo:
http://upload.wikimedia.org/wikipedia/commons/c/c6/Polígonos_diferentes.PNG[/quote]

Cara, não consigo imaginar um caso onde isso possa ocorrer. Pode fornecer um exemplo real onde isso ocorre com as coordenadas?

Vou tentar produzir um exemplo aqui…Assim que conseguir, posto aqui…

Agradeço a atenção.