본문 바로가기

Swing/AffineTransform

Java AffineTransform example

Java Graphics2D 회전시 AffineTransform 클래스를 사용하여 이동/회전 변환된 좌표를 구하는 예


AffineTransform 을 사용하여 변환된 점 좌표를 구하는 핵심적인 부분의 코드

import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;

import javax.swing.*;

public class Main extends JFrame 
{
	public static void main(String[] args) 
	{
		AffineTransform at = new AffineTransform();
		at.translate(100, 100);
		at.rotate(Math.toRadians(90));
		
		// 위에 설정된 변환을 ptSrc에 적용하여 그 결과를 Point2D에 저장하여 리턴한다
		Point2D ptSrc = new Point2D.Double(100,0);
		Point2D ptDst = at.transform(ptSrc, null);
		System.out.printf("변환 후: x(%f), y(%f) %n", ptDst.getX(), ptDst.getY());
	}
}




package org.kdea.swing.transform;

import java.awt.EventQueue;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;

import javax.swing.*;

public class AffineTransformTest extends JFrame 
{
	public AffineTransformTest(){
		setTitle("다양한 콤포넌트");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		getContentPane().setLayout(null);
		setBounds(100,50,640,500);
		
		GamePanel gp = new GamePanel();
		add(gp);
		
		setVisible(true);
	}
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			@Override
			public void run() {
				new AffineTransformTest();
			}
		});
	}
}


paintComponent() 내용을 확인해보세요

package org.kdea.swing.transform;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.swing.*;

public class GamePanel extends JPanel
{
	BufferedImage line;
	double rotDeg;
	
	public GamePanel() {
		setBounds(10,10,600,400);
		setBackground(Color.WHITE);
		setFocusable(true);
		requestFocus();
		
		line = new BufferedImage(500,1,BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2d = (Graphics2D) line.getGraphics();
		g2d.setColor(Color.BLACK);
		g2d.drawLine(0, 0, 500, 0);
		g2d.dispose();
		
		this.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				switch(e.getKeyCode()){
					case KeyEvent.VK_A: rotDeg--; break;
					case KeyEvent.VK_D: rotDeg++; break;
				}
				repaint();
			}
		});
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;
		
		AffineTransform at = new AffineTransform();

		at.translate(getWidth()/2, getHeight()/2);
		at.rotate(Math.toRadians(rotDeg));
		at.translate(-line.getWidth()/2, 0);
		
		g2d.drawImage(line, at, null);
		
		//선의 시작점이 변환된 결과 새로운 좌표를 구한다
		Point2D lineStart = new Point2D.Double(0,0);		// 변환전 선의 시작 좌표
		Point2D lineStartDst = at.transform(lineStart, null);	// 변환후 선의 시작 좌표
		
		//선의 끝점이 변환된 결과 새로운 좌표를 구한다
		Point2D lineEnd = new Point2D.Double(500, 0);	// 변환전 선의 끝 좌표
		Point2D lineEndDst = at.transform(lineEnd, null);	// 변환후 선의 끝 좌표

		System.out.printf("(%f,%f),(%f,%f) %n", 
				lineStartDst.getX(),lineStartDst.getY(),
				lineEndDst.getX(), lineEndDst.getY());
	}
}