Swing/AffineTransform
Java AffineTransform example
Soul-Learner
2016. 8. 18. 16:34
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()); } }