Eu gostaria de escrever um programa simples que aceite um conjunto de janelas (largura + altura) e a resolução da tela e produza um arranjo dessas janelas na tela, para que as janelas ocupem mais espaço. Portanto, é possível redimensionar uma janela, mantendo output size >= initial size
e a proporção. Então, para a janela , eu gostaria que o algoritmo retornasse uma tupla .( x , y , w i d t h , h e i g h t )
Eu acredito que isso pode ser uma variação da mochila 2D. Eu tentei revisar os resultados na Web, mas eles tinham muitos antecedentes (e nenhuma implementação) que dificultavam o meu acompanhamento.
Estou menos interessado no algoritmo mais rápido possível, mas mais em algo que seja prático para minha necessidade específica.
algorithms
computational-geometry
packing
user-interface
daniel.jackson
fonte
fonte
Respostas:
Embora sua pergunta não diga isso, estou assumindo que você não deseja que as janelas se sobreponham.
Uma abordagem para esse problema é usar um solucionador de restrições como o Choco . Basta escrever as restrições que codificam o seu problema, ajustar o solucionador para agir de maneira inteligente e depois deixá-lo funcionar. Isso significa que todo o pensamento que você precisa fazer será gasto em encontrar uma boa maneira de codificar o problema, não em criar um algoritmo e fazer a programação e o ajuste. Aqui está uma resposta parcial para você começar.
Suponha que o tamanho da tela seja .xm a x× ym a x
Para cada janela, , você terá um conjunto de variáveis e restriçõesx i , y i , h i , w iWEu xEu, yEu, hEu, wEu
Agora você precisa cuidar da sobreposição da janela. Para cada par de janelas, , onde i ≠ j , você vai gerar constrangimentos como o seguinte, que capturam que nenhum canto do W j aparece dentro W i . Para ( x , y ) ∈ { ( x j , y j ) , ( x j + w j , y j ) , ( x j , yWEu, Wj i ≠ j Wj WEu , gera restrição:( x , y) ∈ { ( xj, yj) , ( xj+ wj, yj) , ( xj, yj+ hj) , ( xj+ wj, yj+ hj) }
As restrições especificadas até agora descrevem apenas janelas não sobrepostas que não se espalham pelas laterais da tela, que atendem a algumas restrições de tamanho mínimo e que preservam sua proporção.
Para obter um bom ajuste, é necessário especificar uma métrica que capture o que significa ser um bom layout. Uma possibilidade é supor que você deseja manter as janelas aproximadamente iguais em tamanho e / ou que deseja minimizar o "espaço em branco". Eu não acho que isso possa ser especificado usando o Choco, mas pode ser possível com outra solução de restrição (alguém pode ajudar aqui).
Choco permite maximizar o wrt para uma função objetiva especificada como uma única variável. Com base nessa idéia, você pode maximizar o seguinte:
escrevendo uma restrição e dizendo ao Choco para maximizar c o s t .c o s t = ∑Eu( hEu+ wEu) c o s t
fonte
Comecei a escrever um protótipo para uma solução de força bruta, que espero possa ser otimizada até um ponto em que seja prático.
Primeiro, algumas definições: Seja o conjunto de todas as janelas. Cada janela w é composta por x w , y w , w w , h w para as coordenadas x, y e a largura e altura. Uma janela é inicializada com largura e altura mínimas.W W xW, yW, wW, hW
A entrada do algoritmo é a tela , que possui largura e altura e uma lista de janelas.S
Funciona aproximadamente assim:
Há algumas coisas que devem ser melhoradas:
S.coordinates()
está muito lento agora. Ele itera todos os pontosS.width x S.height
e verifica se cada um está em uma das janelas de S.S.put()
verifica se o seu parâmetro se sobrepõe ao restante das janelas de S fazendo o teste mencionado na resposta de Dave. Talvez isso possa ser melhorado usando árvores de intervalo ?S.score()
Atualmente, estou tentando descobrir uma estrutura de dados adequada para representar a tela e suas janelas, ele precisa oferecer suporte a essas consultas:
fonte