Como calcular a rotação de figuras com eficiência?

13

Imagem 1 Quadro 2

Eu tenho uma figura representada através de uma matriz de bytes (matriz semelhante a bitmap). Exemplo A figura é mostrada no Picture 1.

O objetivo é encontrar o melhor ângulo de rotação de alguma figura . Quando a Figura é girada pelo melhor ângulo, o retângulo paralelo aos eixos X e Y e inscreve a Figura possui a menor área.

Os retângulos que inscrevem a figura são mostrados em cinza claro nas figuras. No Picture 2, você pode ver que a rotação ideal da figura é de cerca de 30 graus no sentido horário.

Agora, eu sei algoritmo como encontrar esse ângulo, mas parece-me que é muito ineficiente. É assim:

  1. Faça um loop pelos ângulos de 0 a 45.
  2. Para o ângulo atual, para cada ponto da figura, calcule o novo local girado
  3. Encontre os limites do retângulo que contém a figura (mínimo e máximo x, y) e registre-o se for a melhor correspondência até o momento
  4. Próximo ângulo

Esse é um tipo de método de força bruta e funciona bem e razoavelmente rápido para as pequenas figuras. No entanto, preciso trabalhar com números que contenham até 10 milhões de pontos e meu algoritmo se torna lento.

Qual seria um bom algoritmo para esse problema?

Dusan
fonte

Respostas:

20

Parece que você pode encontrar a caixa delimitadora mínima arbitrariamente alinhada usando o algoritmo de pinças rotativas de tempo linear .

Depois de ter a caixa delimitadora, você só precisa determinar o ângulo de rotação calculando a inclinação de um dos lados.

Dan Pichelman
fonte
Esta é uma ótima solução, muito boa.
InformedA
Ótimo, já que eu já classifiquei os pontos por x e y, posso encontrar o casco convexo com este en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/… e usar o algoritmo existente com pontos do casco.
Dusan
12

O primeiro passo da sua abordagem é falho - há um número infinito de valores reais entre 0 e 45, portanto, não faz sentido "percorrê-los". No entanto, seu algoritmo pode ser reparado:

  • encontre o casco convexo do polígono

  • loop através do número finito (!) de ângulos dados pelas arestas externas do casco convexo

  • agora aplique as etapas 2 a 4 usando esses ângulos.

Isso funciona porque pode ser demonstrado que o retângulo mínimo envolvente deve tocar uma das arestas externas do casco convexo.

Doc Brown
fonte
Sim, é exatamente isso que vou fazer, já encontrei a ajuda da resposta do Dan. Obrigado.
Dusan
@Dusan: Não tenho certeza de que a outra resposta descreva a mesma abordagem, portanto tentei descrever a solução de uma maneira mais simples, espero que seja um pouco mais clara. Encontre aqui uma descrição: cgm.cs.mcgill.ca/~orm/maer.html
Doc Brown
Sim, você está certo, sua abordagem é muito mais concreta, mais simples e clara, mas eu mesmo concluí a mesma abordagem pelas dicas dadas na resposta de Dan, então aceitei-o. Espero que sua resposta ganhe muito mais votos positivos. Sem ressentimentos. Felicidades!
Dusan