Rotacao java2D

4 respostas
L

Pessoal, to com um problema que não estou conseguindo resolver. Eu tenho algumas imagens criadas com com graphics2D e estou precisando fazer uma rotação. O método rotate gira toda a tela, mas preciso girar apenas uma imagem isolada dentre várias imagens. me falaram em que eu poderia usar o affineTransforme, mas não encontrei muitas coisas a respeito, somente consegui espelhar a imagem com este método. Segue o código, neste exemplo tenho dois triângulos e quero girar um, se alguém poder me ajudar fico muito grato... vlww

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;

public class FormasGeometricas extends Canvas{
	int[] x = {50,75,25};
	int[] y = {0,50,50};
	
	public FormasGeometricas(){
		setSize(200, 150);
		setBackground(Color.GRAY);
	}
	
	public void paint (Graphics g){
		Graphics2D g2 =(Graphics2D) g;

		GeneralPath triangulo= new GeneralPath();
		triangulo.moveTo(x[0], y[0]);
		for (int i = 0; i < x.length; i++) {
			triangulo.lineTo(x[i], y[i]);
		}
		triangulo.closePath();
		g2.setColor(Color.GREEN);
		g2.fill(triangulo);
		
		for (int i = 0; i < y.length; i++) {
			x[i]+=150;
			y[i]+=150;
		}
		
		
		GeneralPath triangulo2 = new GeneralPath();
		triangulo2.moveTo(x[0], y[0]);
		for (int i = 0; i < x.length; i++) {
			triangulo2.lineTo(x[i], y[i]);
		}
		for (int i = 0; i < x.length; i++) {
			triangulo2.lineTo(x[i], y[i]);
		}
		triangulo2.closePath();
		g2.setColor(Color.GREEN);
		g2.fill(triangulo2);
		
	
	}
	
}

4 Respostas

M

O método create() e dispose() permitem salvar o estado do desenho (transforms) e retornar ao ponto original, mas mesmo salvando o estado antes do rotate, no segundo desenho o primeiro também será movido. No seu caso, o ideal é girar o Path ou desenhar em um Graphics temporario e depois desenha-lo na tela.

L

É exatamente isto que queria Marky, girar o Path, mas esta sua idéia de criar um temporário é boa tbm… quero determinar determinadas rotações, como por exemplo 90º ao clicar com o mouse… Será que teria como mudar as coordenadas dos pontos e desenhas um novo Path?

M

Applicar um AffineTrasnform no transform do Path não resolve?

V

Você pode fazer o rotate, desde que use o Graphics2D como ele foi feito para ser usado:

public void paint (Graphics g){ Graphics2d g2d = (Graphics2D) g.create(); //Aqui vc gira o canvas g2d.dispose(); }

No caso do seu código, pode ser necessário fazer 2 create() e 2 dispose(). Mas o ideal é compreender melhor como funcionam matrizes de transformação. Assim vc desenha suas imagens centralizadas no (0,0) e usa o AffineTransform para girar e posicionar:
http://www.pontov.com.br/site/arquitetura/54-matematica-e-fisica/238-matrizes-e-transformacoes-parte-1
http://pontov.com.br/site/arquitetura/54-matematica-e-fisica/267-matrizes-e-transformacoes-parte-2

Criado 1 de setembro de 2013
Ultima resposta 2 de set. de 2013
Respostas 4
Participantes 3