2014-01-05 53 views
1

我基本上想要做的是旋轉BufferedImage,然後根據它的新中心點繪製它。查找旋轉的BufferedImage的中心點

所以,最初我會剛剛完成;

graphics.drawImage(image, x - (image.getWidth()/2), y - (image.getHeight()/2), this); 

不過,我不確定如何做到這一點時,我用旋轉的AffineTransform圖像。

如果我記得在學校的基礎數學,我將需要使用Cos for the X and Sin for the Y,但我一直在使用谷歌搜索算法,但似乎無法碰到任何東西。

回答

1

我找到了如何獲得旋轉點的座標。如果x1,y1是原始座標和atAffineTransform,那麼你可以在仿射變換後得到的旋轉點的座標的原座標系與

Point2D point1origCoords = at.transform(new Point2D.Double(x1,y1),null); 

該點的座標,新座標系將是與原始座標相同。它們保持不變,因爲它是被轉換的座標系,所以你需要對它們應用仿射變換。

這是一個關於原點旋轉的演示:用於生成它

enter image description here

,代碼:

import java.awt.BasicStroke; 
import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Ellipse2D; 
import java.awt.geom.NoninvertibleTransformException; 
import java.awt.geom.Point2D; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Triangle extends JPanel { 

    public void drawTriangle(Graphics2D g, 
      int x1, int y1, int x2, int y2, int x3, int y3, 
      int s, Color c, AffineTransform at) throws NoninvertibleTransformException{ 
     g.setStroke(new BasicStroke(3.0f)); 
     g.setPaint(c); 
     int d = 10; 
     g.drawLine(x1*s, y1*s, x2*s, y2*s); 
     g.drawLine(x2*s, y2*s, x3*s, y3*s); 
     g.drawLine(x3*s, y3*s, x1*s, y1*s); 
     Ellipse2D center_of_triangle = new Ellipse2D.Double(.33*(x1+x2+x3)*s, .33*(y1+y2+y3)*s,4,4); 
     g.draw(center_of_triangle); 

     float dash1[] = {2.0f}; 
     BasicStroke dashed = 
       new BasicStroke(1.0f, 
         BasicStroke.CAP_BUTT, 
         BasicStroke.JOIN_MITER, 
         10.0f, dash1, 0.0f); 
     g.setStroke(dashed); 

     g.drawLine(0,0,x1*s,y1*s); 
     g.drawLine(0,0,x2*s,y2*s); 
     g.drawLine(0,0,x3*s,y3*s); 

     g.setColor(Color.black); 
     Point2D point1origCoords = at.transform(new Point2D.Double(x1,y1),null); 
     Point2D point2origCoords = at.transform(new Point2D.Double(x2,y2),null); 
     Point2D point3origCoords = at.transform(new Point2D.Double(x3,y3),null); 
     g.drawString("("+String.format("%.2f",point1origCoords.getX())+", " 
       +String.format("%.2f",point1origCoords.getY())+")", 
       x1*s,y1*s+2*d); 
     g.drawString("("+String.format("%.2f",point2origCoords.getX())+", " 
       +String.format("%.2f",point2origCoords.getY())+")", x2*s-4*d,y2*s-d); 
     g.drawString("("+String.format("%.2f",point3origCoords.getX())+", " 
       +String.format("%.2f",point3origCoords.getY())+")", x3*s+d,y3*s); 

     // center of the triangle 
     Point2D.Double center = new Point2D.Double(.33*(x1+x2+x3), .33*(y1+y2+y3)); 
     Point2D centerorigCoords = at.transform(center,null); 
     g.drawString("("+String.format("%.2f",centerorigCoords.getX())+", " 
       +String.format("%.2f",centerorigCoords.getY())+")", 
       (int)Math.round(center.x*s),(int)Math.round(center.y*s)-d); 

    } 

    public void drawGrid(Graphics2D g, int s) { 
     int w = getWidth(); 
     int h = getHeight(); 
     float dash1[] = {2.0f}; 
     BasicStroke dashed = 
       new BasicStroke(1.0f, 
         BasicStroke.CAP_BUTT, 
         BasicStroke.JOIN_MITER, 
         10.0f, dash1, 0.0f); 
     g.setStroke(dashed); 
     g.setColor(Color.gray); 

     int j = 0; 
     while(j <= h) { 
      g.drawLine(0,h-j,w,h-j); 
      j+=s; 
     } 
     j = 0; 
     while(j <= w) { 
      g.drawLine(j,0,j,h); 
      j+=s; 
     } 
    } 

    public void paintComponent(Graphics g){ 
     final int s=20; 
     Graphics2D g2 = (Graphics2D) g; 
     g2.setColor(Color.black); 
     Font big = new Font("Times New Roman", Font.BOLD,20); 
     g2.setFont(big); 
     drawGrid(g2,s); 
     AffineTransform at = new AffineTransform(); 
     // no rotation 
     at.rotate(Math.toRadians(0)); 
     g2.transform(at); 
     // rotated triangle 
     try { 
      drawTriangle(g2,2,26,3,12,8,21,s,Color.blue,at); 
     } catch (NoninvertibleTransformException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     at.rotate(Math.toRadians(-45)); 
     g2.transform(at); 
     try { 
      drawTriangle(g2,2,26,3,12,8,21,s,Color.magenta,at); 
     } catch (NoninvertibleTransformException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 

     JFrame frame = new JFrame("Window"); //frame is the window 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Triangle panel = new Triangle(); //panel is the graphics area where we can draw 

     frame.add(panel); //put the panel inside the window 
     frame.setSize(600,600); //set the window size to 600x600 pixels 
     frame.setVisible(true); 
    } 
} 
+0

這是最接近我需要什麼,我雖然關閉這個問題並將其作爲一個新的主題發佈,因爲我不認爲人們完全理解我想要的東西。 – ZBScripts

+0

如果你不能解釋它到stackoverflow你不能解釋它到您的計算機;-)祝你好運! – user2314737