Dúvida sobre implementação de Zoom

4 respostas
V

Olá pessoal, estou desenvolvendo o meu TCC, cujo o objetivo é um gerador de mapas temáticos com base em arquivos Shapefile, já consegui talvez a parte mais dificil que é carregar os dados geográficos do mapa e realizar o seu desenho na tela, porém agora pretendo implementar a funcionalidade de Zoom utilizando o AffineTransform.

Eu gostaria de implementar o Zoom no qual o mapa é redimensionado a partir do clique do usuário clica em uma determinada região da tela, porém estou com dificuldades para realizar o calculo de translação, pois gostaria que após clique do usuário aquela região seja aumentada porém gostaria de centralizar ela na tela.

Sei que para realizar a translação devo usar o método translate, porém a minha dificuldade é na realização do calculo, não entendo muito bem como ele é feito.

Será que alguém poderia me ajudar a entender como é realizado este cálculo? Pois só dependo dele para finalizar esta funcionalidade.

Desde já, obrigado.

4 Respostas

E

Espera um pouco. Como é que você quer fazer o zoom - in (ou seja, aumentar)?

a) Você quer marcar um retângulo na tela. Esse retângulo ocupará a tela inteira.
b) Você quer clicar com o botão esquerdo no centro da área a ser visualizada. A quantidade de zoom irá ser fixa, dependendo de uma configuração do seu programa.
c) Clicar uma escala de zoom e o centro da área a ser visualizada continuará a ser o centro da área visualizada. A quantidade de zoom depende de um spinner ou scrollbar.

Para fazer o zoom out (reduzir), como você quer fazer?

a) Teclar ESC para desfazer o último zoom.
b) Clicar com o botão direito para desfazer o último zoom.
c) Clicar uma escala de zoom e o centro da área a ser visualizada continuará a ser o centro da área visualizada. A quantidade de zoom depende de um spinner ou scrollbar.

E

O seu problema é mais ou menos o de fazer uma regra de três, só que com o tal do AffineTransform (e além do mais seu problema é simplificado porque você não está fazendo, no caso do zoom, rotações).

V

entanglement:
Espera um pouco. Como é que você quer fazer o zoom - in (ou seja, aumentar)?

a) Você quer marcar um retângulo na tela. Esse retângulo ocupará a tela inteira.
b) Você quer clicar com o botão esquerdo no centro da área a ser visualizada. A quantidade de zoom irá ser fixa, dependendo de uma configuração do seu programa.
c) Clicar uma escala de zoom e o centro da área a ser visualizada continuará a ser o centro da área visualizada. A quantidade de zoom depende de um spinner ou scrollbar.

Para fazer o zoom out (reduzir), como você quer fazer?

a) Teclar ESC para desfazer o último zoom.
b) Clicar com o botão direito para desfazer o último zoom.
c) Clicar uma escala de zoom e o centro da área a ser visualizada continuará a ser o centro da área visualizada. A quantidade de zoom depende de um spinner ou scrollbar.

Então, para fazer o zoom-in, eu gostaria de fazer igual ao item a), marcar um retângulo e ele aumentar a área selecionada pelo retângulo, e para fazer o zoom-out eu gostaria somente de desfazer o zoom anterior, a minha dificuldade é saber como fazer a translação, pois após o zoom, para o objeto ficar centralizado imagino que eu devo fazer uma translação de x pixels e y pixels até o centro.

V

Estou implementando o meu zoom desta forma:

código resumido…

@Override
    protected void paintComponent(Graphics g1) {
        Graphics2D g2d = (Graphics2D)g1;
        
        super.paintComponent(g2d);
        
        Shape r = new Ellipse2D.Double(x, y, 100, 100);
        
        g2d.translate(x, y);  
        g2d.scale(zoom, zoom);  
        g2d.translate(-x, -y); 
        g2d.draw(r);
    }

A minha dificuldade é saber quanto de x, e quanto de y tenho que transladar para que o objeto fique no centro da tela.

Criado 9 de dezembro de 2012
Ultima resposta 11 de dez. de 2012
Respostas 4
Participantes 2