(JAVA)MyLine1(绕任一点旋转)
//实现功能:点鼠标时,线段绕一个端点旋转.每次15度
绕原点旋转的公式见"MyLine"
本例是端点1绕端点0(端点0不在原点)旋转.
由于端点0不在原点,所以不能直接使用旋转公式.
首先须将端点1平移,
若端点0的坐标为(X0,Y0),平移的向量就是:-(X0,Y0)
完成旋转计算后,再次平移端点1,平移的向量为(X0,Y0).
为了表述方便,以后我们称第一次平移为"原点平移",第二次平移为"复位平移"
当图形不是绕原点作旋转(或其它类型)变换时,都要先进行"原点平移",完成旋转计算后再作"复位平移"
import java.awt.Graphics;
import java.awt.Event;
import java.awt.event.*;
import java.applet.*;
public class MyLine1 extends Applet implements
MouseListener{
float
X[],Y[];
static
final double PI=3.1416;
public
void init(){
X=new float[2];
Y=new float[2];
X[0]=100;
Y[0]=100;
X[1]=50;
Y[1]=50;
addMouseListener(this);
}
public
void paint(Graphics g){
g.drawLine((int)X[0], (int)Y[0], (int)X[1], (int)Y[1]);
}
public void
mouseClicked(MouseEvent e) {
double
theta=15;
theta *= (PI
/ 180);
double mycos = Math.cos(theta);
double mysin = Math.sin(theta);
double XX,YY;
//绕(X[0],Y[0])旋转:
//"原点平移",平移的向量为-(X[0],Y[0])
XX=X[1]-X[0];
YY=Y[1]-Y[0];
//旋转
X[1]=(float)(XX*mycos-YY*mysin);
Y[1]=(float)(XX*mysin+YY*mycos);
//"复位平移", 平移的向量为(X[0],Y[0])
X[1]=X[1]+X[0];
Y[1]=Y[1]+Y[0];
repaint();
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void
destroy() {
removeMouseListener(this);
}
}