Neste post, procuramos algoritmos / idéias sobre como encontrar o retângulo de área máxima dentro de um polígono convexo .
Na figura a seguir, os números são as áreas dos retângulos ajustados. Conforme mostrado, um retângulo desejado pode variar em cada dimensão e pode estar em qualquer ângulo.
Não temos nenhuma ideia clara de como lidar com o problema mencionado, como pedimos aqui. No entanto, acreditamos que o retângulo de área máxima possa ser um daqueles que possuem uma aresta alinhada (não necessariamente a mesma aresta de comprimento, é claro) uma aresta do polígono.
Você poderia especificar qual software está usando? Além disso, poste seu trabalho até agora ou a abordagem geral que você elaborou para resolver isso. Talvez alguém possa melhorar o que você já fez. Na minha experiência, isso resultará em respostas muito mais úteis do que apenas postar uma pergunta "do nada".
Intimamente relacionado: gis.stackexchange.com/questions/22895/… .
@Martin Software: A programação Pythonentão será efetuada, Fortranse necessário. Temos um palpite de que, com base em nosso post anterior aqui também mencionado acima, whuberque pode ser um retângulo com uma aresta em comum com o polígono, seria uma resposta.
Seu problema é realmente interessante e acho que consegui encontrar um algoritmo de solução aqui e aqui .
@nickves Obrigado pelos links. Você poderia colocar essas informações como resposta com uma pequena explicação dos algoritmos? Será potencialmente uma boa resposta a ser aceita.
Algumas notas grandes demais para serem colocadas em um comentário (embora isso não sugira um algoritmo óbvio):
A linha de perfuração (EDITADA) : Pelo menos dois vértices do retângulo da área máxima devem estar no limite do polígono (ou seja, ao longo de uma aresta ou em um vértice). E se o retângulo da área máxima não for um quadrado, pelo menos três vértices devem estar no limite do polígono.
Eu provei para mim mesmo em quatro etapas:
Nota 1 : pelo menos um vértice do retângulo de área máxima sempre estará no limite do polígono. Isso é bastante óbvio, mas uma prova pode ser assim (por contradição): suponha que você tenha um retângulo "máximo" sem vértice no limite do polígono. Isso significa que haveria pelo menos um pequeno espaço em torno de cada um de seus vértices. Então você pode expandir um pouco seu retângulo, contradizendo sua máxima.
Nota 2 : pelo menos dois vértices do retângulo de área máxima sempre estarão no limite do polígono. Uma prova poderia ser assim (novamente por contradição): Suponha que você tenha um retângulo "máximo" com apenas um vértice no limite (garantido pela Nota 1). Considere as duas arestas não adjacentes a esse vértice. Como os pontos de extremidade NÃO estão no limite, há um pequeno espaço em torno de cada um. Portanto, qualquer uma dessas arestas poderia ser "extrudada" um pouco, expandindo a área do polígono e contradizendo sua máxima.
Nota 3 : Existem dois vértices diagonalmente opostos do retângulo de área máxima que se encontram no limite do polígono. (Sabemos pela nota nº 2 que existem pelo menos dois, mas não necessariamente que eles estão um em frente ao outro.) Mas, novamente, por contradição, se os únicos dois vértices de fronteira eram adjacentes, então a aresta oposta (nenhum dos vértices de quem estão no limite) podem ser extrudados um pouco, aumentando a área do retângulo e contradizendo sua máxima.
Nota # 4 : (EDITADO) Se o retângulo da área máxima não for um quadrado, três de seus vértices estarão no limite do polígono.
Para provar, suponha que não seja esse o caso, ou seja, que o retângulo da área máxima não seja um quadrado, mas apenas dois de seus vértices estejam no limite do polígono. Vou mostrar como construir um retângulo maior, contradizendo a máxima.
Chame os vértices do rectângulo A, B, C, e D. Sem perda de generalidade, assuma que Be Dsão os dois que estão no limite do polígono. Como Ae Cestão no interior do polígono, há espaço de manobra ao redor deles (representado com círculos ao redor Ae Cna figura abaixo). Agora, desenhe um círculo ao redor do retângulo e deslize os pontos Ae Cum pouco ao redor do círculo na mesma quantidade (para criar A'e C', na foto abaixo), para que o novo retânguloA'BC'Dé mais quadrado que o retângulo original. Esse processo cria um novo retângulo que também está dentro do polígono original e tem uma área maior. Isso é uma contradição, então a prova está pronta.
Para acreditar nessa prova, você precisa se convencer de que a área de um retângulo inscrito em um círculo aumenta à medida que se torna "mais quadrada" (ou seja, a diferença entre os comprimentos das arestas fica menor). Você também precisa que o polígono seja convexo para que todas as novas linhas fiquem dentro dele. E provavelmente há outros pequenos detalhes sendo varridos para debaixo do tapete, mas tenho certeza de que todos dão certo.
A nota 4 é suspeita, porque "mexendo" os outros dois vértices criarão não retângulos.
Verdade. No entanto, sua visualização do quarto exemplo não está correta (se 2 vértices estiverem no limite do polígono, você não poderá esticá-lo ainda mais). Não consigo encontrar exatamente como explicar isso (tentei escrever um comentário, mas fiquei muito confuso), mas confio que você está certo.
— Saryk # 3/13
Eu acredito que existem contra-exemplos à nota 4. Os que eu encontrei levam alguns cálculos envolvidos para mostrar; o mais simples é a perturbação de um hexágono irregular (um quadrado com dois cantos opostos ligeiramente cortado).
Concordou que a Nota 4 é suspeita. Vou dar uma olhada mais de perto esta noite e corrigi-lo ou removê-lo.
— Csd #
+1 Essa é uma boa resolução da dificuldade. Obrigado pela edição!
Fiz um esboço muito rápido e hediondo sobre sua nota verde na pergunta. Como não pude postá-lo como comentário, tive que escrever uma resposta, mesmo que não fosse uma.
Acredito que na imagem abaixo temos um retângulo de área máxima (não é perfeito, é apenas um esboço feito no Paint para dar uma idéia), e não acho que você possa encontrar um maior que tenha um lado comum com o fronteiras do plygon preto ...
No entanto, posso estar errado, nesse caso, você tem todas as minhas desculpas.
— Saryk
Bom ponto (+1). Há um contra-exemplo muito mais simples: considere o problema de inscrever um retângulo de área máxima dentro de um octógono regular. É fácil ver (e fácil provar, encontrando pela primeira vez um quadrado máximo dentro do circulo do octógono) que os cantos da solução coincidem com os vértices alternados do octógono e que essa solução é substancialmente maior do que qualquer retângulo inscrito alinhado por arestas.
Na verdade (eu tenho uma grande dúvida agora), o menor retângulo externo (os desta publicação ) deste polígono não tem a mesma orientação de um dos lados, não é? (Eu veria a mesma orientação que o meu retângulo vermelho)
A propósito, esse polígono não é convexo. A pergunta original se restringe a polígonos convexos.
@csd Esse é um ótimo ponto, mas Saryk ainda está correto, como mostra meu contra-exemplo. Saryk, não há nenhum problema com o retângulo delimitador da área mínima: é fácil provar (rigorosamente) que ele deve incluir um lado do casco convexo. Acredito que o retângulo inscrito na área máxima (de um polígono convexo) precisa ter apenas dois vértices tocando o limite, não mais.
A maioria dos outros algoritmos encontra a área máxima do retângulo retilíneo inscrita em um polígono convexo e possui uma complexidade de O(log n). Eu não acho que seu palpite de que o polígono da área máxima esteja alinhado com um dos lados esteja correto, porque tudo o que você precisa fazer é girar os ntempos do polígono , resultando em uma complexidade O(n log n)e, em minha breve pesquisa, não consegui. encontre algo dizendo que foi tão fácil.
No entanto, o artigo Maiores retângulos inscritos em polígonos convexos de Knauer, et. al., descreve um algoritmo de aproximação que o aproximará da resposta correta.
Da melhor maneira que eu entendo, o algoritmo é construído sobre um dos polígonos conhecidos de área máxima alinhada ao eixo e, em seguida, faz uma amostragem aleatória de pontos dentro do espaço do polímero, gera vários eixos a partir dessas amostras aleatórias, itera sobre o eixo e aplica o eixo algoritmo -alinhado a cada um e, em seguida, retorna o maior retângulo naquele conjunto.
Existe talvez um erro de digitação na primeira frase? Não pode haver um algoritmo O (log (n)) porque simplesmente ler as coordenadas é uma operação O (n)!