Gere áreas de tamanho igual no polígono


8

Estou procurando uma lógica de pseudo-código que encontre náreas de tamanho igual em um determinado polígono. Nenhum espaço deve estar entre ou fora das áreas correspondentes. A primeira correspondência válida de áreas deve ser retornada.

Supondo o seguinte polígono [2,2, 3,1, 5,1, 5,4, 4,5, 2,3]como uma entrada:

insira a descrição da imagem aqui

... e 3como parâmetro uma saída válida pode ser [ [2,2, 3,2, 3,3, 4,3, 4,5, 2,3], [2,2, 3,1, 5,1, 4,2, 4,3, 3,3, 3,2], [4,5, 4,2, 5,1, 5,4] ]:

insira a descrição da imagem aqui

Outra saída válida com o parâmetro 3é [ [3,4, 3,3, 4,3, 4,2, 3,2, 3,1, 2,2, 2,3], [4,3, 4,2, 3,2, 3,1, 5,1, 5,3], [3,4, 3,3, 5,3, 5,4, 4,5] ]:

insira a descrição da imagem aqui

Observe que as áreas não precisam compartilhar o mesmo ponto central. Uma ou mais áreas podem cair entre outras áreas dentro do polígono.

Aqui está outro exemplo de amostra de entrada / saída.

Supondo o seguinte polígono [1,3, 1,1, 7,1, 7,2, 8,2, 8,3, 5,6, 4,6]como uma entrada:

insira a descrição da imagem aqui

..e 5como parâmetro uma saída válida pode ser [ [1,3, 1,1, 3,1, 3,2, 4,3, 3,4, 3,3], [3,2, 3,1, 7,1, 7,2, 6,2, 6,3, 5,3, 5,2], [6,2, 8,2, 8,3, 6,5, 5,5, 5,4, 6,4], [1,3, 3,3, 3,4, 5,5, 6,4, 6,5, 7,5, 6,6, 5,6], [3,4, 4,3, 3,2, 5,2, 5,3, 6,3, 6,4, 5,4, 4,5] ]:

insira a descrição da imagem aqui

As seguintes premissas são feitas:

  • direção de todas as fronteiras é divisível por 45

  • coordenadas inteiras são usadas para todos os polígonos

  • A área inteira do polígono de entrada é sempre divisível por n

  • todos os polígonos podem ser tanto convexas ou côncavas queridos

  • solucionáveis, as náreas de significado podem se encaixar adequadamente no polígono especificado


1
Compartilhar sua pesquisa ajuda a todos . Conte-nos o que você tentou e por que ele não atendeu às suas necessidades. Isso demonstra que você dedicou um tempo para tentar ajudar a si mesmo, evita reiterar respostas óbvias e, acima de tudo, ajuda a obter uma resposta mais específica e relevante. Veja também How to Ask
gnat

Você quer dizer áreas de "tamanho igual", não "igualmente distribuídas", eu acho?
Doc Brown

@DocBrown você está tão certo, eu sabia que vou ter algo errado aqui. Definitivamente, eu quis dizer o mesmo tamanho. Corrigido
Sergey Lukin 03/02

Seus polígonos de entrada são sempre convexos, como no seu exemplo?
Doc Brown

@DocBrown Qualquer formato funcionará realmente, eu apenas o escolhi porque o vi em algum lugar e achei que era o principal, mas gostaria de ser corrigido.
Sergey Lukin 03/02

Respostas:


6

Não solucionável. Eu tentei vários métodos até perceber que não podia ser feito.

Assuma uma forma com a área 4, que deve ser dividida em 2 partes com a área 2 cada:

quadrados

O triângulo e o quadrado mais à esquerda devem fazer parte da forma 1, mas precisam de outro triângulo. O único local que pode ser retirado é o quadrado à direita, mas o restante é dividido em duas regiões.


2
Não solucionável em geral , é claro, mas acho que o OP poderia estar interessado em um algoritmo que resolve o problema de cada caso em que ele pode ser resolvido e, caso contrário, gera resultados que não podem ser resolvidos ;-) Também lhe deu um voto positivo.
Doc Brown

Boa pegada. Eu não pensei sobre isso. Poderíamos adicionar uma suposição de que a área é válida desde que ela seja composta por coordenadas de caminho que não sejam interceptadas por outras áreas, o que resultaria em [ [0,1, 2,1, 2,2, 3,2, 2,3, 2,2 1,2], [2,2, 2,0, 3,0, 3,2] ] aceitar o fato de que uma exceção é lançada caso a função iterasse em todas as variantes e não encontrasse uma partida. O que você acha?
Sergey Lukin

Por uma questão de simplicidade, adicionei uma suposição de que apenas variações passíveis de solução de polígono e número de áreas são passadas como entrada. Veja minha edição. Obrigado
Sergey Lukin

6

Como eu disse no meu comentário à resposta do Doc Browns (de outra forma excelente), existe uma questão de escolha da divisão quadrado> triângulo que torna um pouco mais difícil o dispositivo de um algoritmo. Além disso, você não precisa fazê-lo em série, mas pode fazê-lo em paralelo, como mostram algumas das minhas sugestões.

Fiz várias abordagens heurísticas no início.

Voronoi: Escolha N pontos (coordenadas não inteiras) na forma, crie um mapa de voronoi. Deixe os pontos se atraírem e repelirem um ao outro em relação à sua área (atrair muito grande, repelir muito pequeno).

Útil para E / S grandes, fácil de cair nos máximos locais.

Método de círculo: o objetivo é remover áreas problemáticas e continuar usando outro método.

Escolha um ponto (não inteiro) no interior e um raio r. O interior menos o círculo criará k sub-regiões desconectadas. Se alguma das sub-regiões for do tamanho A / n, remova-a. Além disso, se houver 2 * A / n, será fácil dividi-lo e removê-los também. Abaixe um pouco o raio e continue (possivelmente use alguma pesquisa binária).

Crescimento problemático de pontos: comece a usar o método que Doc Brown menciona, mas como existem duas opções no máximo, pule o gráfico e aumente cada região na borda de maneira a criar o mínimo possível de novos pontos problemáticos (pontos problemáticos = apenas triângulos) compartilhando uma borda com o restante da forma). Por exemplo, ao escolher novos vizinhos para incluir, adicione-os em ordem de convexidade (côncava = convexidade negativa)

Crescimento da fita: Para áreas quase convexas ou convexas. Escolha um ponto na borda externa, faça uma fita de largura da unidade seguir a borda externa até que ela tenha o comprimento certo, certificando-se de nunca criar um novo ponto desconectado. Se necessário, pule os últimos triângulos e faça-o crescer um pouco de largura. Deixe a próxima faixa de opções seguir onde a última terminou até a área final ter o tamanho certo.

Orgânico ou de jogo: crie N "países". Coloque-os em locais aleatórios. Deixe-os crescer organicamente. Quando eles se encontram, aquele com a menor área atual é o mais forte e vence o triângulo. Provavelmente propenso a máximos locais?


3

A estratégia geral deve ser remover a primeira parte da área A / n do seu polígono P0 (onde A é a área total), deixando um novo polígono P1 da área AA / n. Repita isso produzindo um polígono P2, depois P3 e depois de n repetições, você terá sua solução. Observe que em cada etapa é possível que você não consiga encontrar uma peça nova em que as peças restantes ainda formem um polígono conectado, no qual é necessário voltar uma etapa e tentar encontrar outra peça ou interromper o algoritmo sem resultado. .

Para construir esse pedaço de tamanho A / n, comece dividindo seu polígono em "pedaços de grade". Qualquer quadrado da grade dentro do polígono forma uma peça assim como qualquer meio quadrado em forma de triângulo, onde a borda do polígono divide o quadrado em duas metades. Você pode utilizar um teste de ponto no polígono para iterar sobre todos os meios-quadrados dentro da caixa delimitadora do polígono e testar se o ponto médio está dentro do polígono fornecido (se as duas metades de um quadrado estiverem contidas, é possível usar o quadrado cheio). Em seguida, você cria um gráfico planar, em que cada uma das peças define um vértice (com uma "área" ou "peso" de 1 ou 1/2). As arestas desse gráfico são dadas pelas peças vizinhas. Isso reduz seu problema geométrico a um problema gráfico, em que você está procurando um subgráfico conectado com vértices de peso total A / n, e o gráfico restante ainda está conectado .

O último problema pode ser resolvido com um retornoaproximação. Comece com um vértice que pode ser removido do gráfico sem torná-lo desconectado. Você pode escolher o vértice aleatoriamente, se quiser, ou embaralhar a lista de todos os vértices aleatoriamente uma vez, para reutilização nas etapas a seguir. Agora tente encontrar um segundo vértice que esteja conectado ao primeiro, que possa ser removido do gráfico restante sem destruir sua conexão também. Se houver várias possibilidades, escolha uma aleatoriamente. Para vértices que representam um quadrado, você também pode permitir uma operação gráfica em que você divide o quadrado em dois triângulos (isso cria novos vértices de peso 1/2) por uma ou outra maneira possível. Isso é apenas um pouco mais complicado do que apenas mover um vértice do gráfico original para o sub-gráfico, mas não deve ser muito difícil.

Repita isso até que seu subgráfico atinja um peso total A / n ou você não encontre outro vértice. Se for esse o caso, "retorne" um nível e tente um vértice diferente primeiro.

Existem várias maneiras de otimizar isso, por exemplo, você precisa escolher um teste rápido de conectividade para gráficos. Acho que você encontrará muitos algoritmos para esse subproblema, use o Google ou comece aqui . Pode valer a pena procurar um algoritmo que possa verificar rapidamente se um gráfico conectado ainda está conectado quando um vértice é removido.

Espero que isto ajude.


Isso soa exatamente o que eu precisava. Imaginei essa estratégia em teoria e tudo faz sentido para mim até agora, agora é hora de colocá-la em prática. Vou relatar quando tiver algo para mostrar. Muito obrigado!
Sergey Lukin

Eu acho que há um pequeno problema com essa abordagem. Para cada quadrado, existem duas opções possíveis de triângulos. Para realmente verificar todos eles e garantir uma solução, caso exista, acho que você precisaria fazê-lo para todas as 2 ^ n opções.
precisa saber é o seguinte

@ NiklasJ: você está correto, veja minha resposta melhorada, que leva isso em conta.
Doc Brown

@SergeyLukin: Alterei um pouco minha resposta para levar em consideração o comentário de NiklasJ.
Doc Brown
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.