62,621
社区成员
发帖
与我相关
我的任务
分享
package to.shin.sai;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Test4Rotate extends JFrame {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
new Test4Rotate();
}
public Test4Rotate() {
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final MyPanel mp = new MyPanel();
getContentPane().add(mp);
mp.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent mouseevent) {
int diagonal = (int)(50/Math.sin(Math.toRadians(45)));
int x = 5 + (diagonal-50)/2;
int y = 5 + (diagonal-50)/2;
mp.bi = new BufferedImage(diagonal + 10 , diagonal + 10, BufferedImage.TRANSLUCENT);
Graphics g = mp.bi.getGraphics();
g.setColor(Color.red);
g.drawLine(x, y, x+50, y);
g.setColor(Color.blue);
g.drawLine(x+50, y, x+50, y+50);
g.setColor(Color.green);
g.drawLine(x, y, x, y+50);
g.setColor(Color.orange);
g.drawLine(x, y+50, x+50, y+50);
mp.repaint();
}
});
JButton jb = new JButton();
jb.setText("right 15°");
jb.setSize(80, 20);
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
mp.rotate = (mp.rotate + 15) % 360;
mp.repaint();
}
});
mp.add(jb);
setVisible(true);
}
class MyPanel extends JPanel {
private static final long serialVersionUID = 1L;
private BufferedImage bi = null;
private double rotate = 0;
AffineTransform trans = null;
private Image back = null;
public MyPanel() {
super();
setOpaque(false);
trans = new AffineTransform();
try {
back = ImageIO.read(new File("c:\\1.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void paintComponent(Graphics g) {
g.drawImage(back, 0, 0, 500, 300, null);
if (null != bi) {
Graphics2D gg = (Graphics2D)g;
trans.setToIdentity();
trans.setToRotation(Math.toRadians(rotate), bi.getWidth()/2, bi.getHeight()/2);
//gg.drawImage(back, trans, null);
gg.drawImage(bi, trans, null);
}
super.paintComponent(g);
}
}
}
private double calAngle(int x, int y, double A) {
// 计算起始点象限
int quadrant = 1;
int tempY = 0;
if (startX >= coorX && startY <= coorY)
quadrant = 1;
else if (startX < coorX && startY <= coorY)
quadrant = 2;
else if (startX < coorX && startY > coorY)
quadrant = 3;
else if (startX >= coorX && startY > coorY)
quadrant = 4;
tempY = (x - coorX) * (startY-coorY) / (startX-coorX) + coorY;
switch (quadrant) {
case 1:
case 4:
if (tempY > y)
return -A;
break;
case 2:
case 3:
if (tempY < y)
return -A;
break;
}
return A;
}
package to.shin.sai;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Test4Rotate extends JFrame {
private static final long serialVersionUID = 1L;
int startX = -1;
int startY = -1;
int coorX = 0;
int coorY = 0;
public static void main(String[] args) {
new Test4Rotate();
}
public Test4Rotate() {
setSize(500, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final MyPanel mp = new MyPanel();
mp.setLayout(null);
getContentPane().add(mp);
int diagonal = (int) (100 / Math.sin(Math.toRadians(45)));
int x = (diagonal - 100) / 2;
int y = (diagonal - 100) / 2;
BufferedImage bi = new BufferedImage(diagonal, diagonal, BufferedImage.TRANSLUCENT);
Graphics g = bi.getGraphics();
g.setColor(Color.red);
g.drawLine(x, y, x + 100, y);
g.setColor(Color.blue);
g.drawLine(x + 100, y, x + 100, y + 100);
g.setColor(Color.green);
g.drawLine(x, y, x, y + 100);
g.setColor(Color.orange);
g.drawLine(x, y + 100, x + 100, y + 100);
final MyLabel ml = new MyLabel(bi);
ml.setBounds(50, 50, diagonal, diagonal);
ml.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent mouseevent) {
ml.dragging = true;
startX = mouseevent.getX();
startY = mouseevent.getY();
}
@Override
public void mouseReleased(MouseEvent mouseevent) {
ml.dragging = false;
startX = -1;
startY = -1;
ml.img = ml.imgIcon;
repaint();
super.mouseReleased(mouseevent);
}
});
ml.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent mouseevent) {
if (ml.dragging) {
// 根据余弦定理求得旋转角度
int newPX = mouseevent.getX();
int newPY = mouseevent.getY();
double a2 = Math.pow(newPX - startX, 2) + Math.pow(newPY - startY, 2);
double b2 = Math.pow(newPX - coorX, 2) + Math.pow(newPY - coorY, 2);
double c2 = Math.pow(startX - coorX, 2) + Math.pow(startY - coorY, 2);
// cosA=(b2+c2-a2)/2bc
double A = Math.acos((b2 + c2 - a2) / (2 * Math.sqrt(b2) * Math.sqrt(c2)));
ml.rotate(calAngle(newPX, newPY, A));
}
super.mouseMoved(mouseevent);
}
});
mp.add(ml);
coorX = ml.getWidth() / 2;
coorY = ml.getHeight() / 2;
setVisible(true);
}
/**
* 计算角度(正负)
*
* @param x
* @param y
* @param A
* @return
*/
private double calAngle(int x, int y, double A) {
// 计算起始点象限
int quadrant = 1;
int tempY = 0;
if (startX >= coorX && startY <= coorY)
quadrant = 1;
else if (startX < coorX && startY <= coorY)
quadrant = 2;
else if (startX < coorX && startY > coorY)
quadrant = 3;
else if (startX >= coorX && startY > coorY)
quadrant = 4;
switch (quadrant) {
case 1:
case 4:
tempY = x * startY / startX;
if (tempY > y)
return -A;
break;
case 2:
case 3:
tempY = x * startY / startX;
if (tempY < y)
return -A;
break;
}
return A;
}
class MyPanel extends JPanel {
private static final long serialVersionUID = 1L;
private Image back = null;
public MyPanel() {
super();
setOpaque(false);
try {
back = ImageIO.read(new File("c:\\1.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void paintComponent(Graphics g) {
g.drawImage(back, 0, 0, 500, 300, null);
super.paintComponent(g);
}
}
class MyLabel extends JLabel {
private static final long serialVersionUID = 1L;
private BufferedImage img = null;
private BufferedImage imgIcon = null;
AffineTransform trans = null;
boolean dragging = false;
public MyLabel(BufferedImage bi) {
super(new ImageIcon(bi));
setOpaque(false);
trans = new AffineTransform();
this.img = bi;
}
public void rotate(double rotate) {
if (null != img) {
imgIcon = new BufferedImage(img.getWidth(), img.getHeight(),
BufferedImage.TRANSLUCENT);
Graphics2D gg = (Graphics2D) imgIcon.getGraphics();
trans.setToIdentity();
trans.setToRotation(rotate, img.getWidth() / 2, img.getHeight() / 2);
gg.drawImage(img, trans, null);
setIcon(new ImageIcon(imgIcon));
}
}
@Override
public void paintComponent(Graphics g) {
if (dragging) {
//描绘旋转圆心
Graphics2D gg = (Graphics2D) g;
gg.setStroke(new BasicStroke(2));
gg.setColor(Color.white);
gg.drawOval(getWidth() / 2 - 2, getHeight() / 2 - 2, 4, 4);
}
super.paintComponent(g);
}
}
}