(JAVA)绕原点旋转(MyLine)
实现功能:点击鼠标,线段绕显示区原点(左上角)旋转,每次10度.
要点:
1)已知向量(X0,Y0),其与X轴的夹角为A,求绕原点旋转角度B后的(X1,Y1):
X0=|R|*cosA (1)
Y0=|R|*sinA (2)
X1=|R|*cos(A+B)=|R|*(cosAcosB-sinAsinB) (3)
Y1=|R|*sin(A+B)=|R|*(sinAcosB+cosAsinB) (4)
将(1),(2)代入(3)(4),化简后得:
X1=X0*cosB-Y0*sinB (5)
Y1=X0*sinB+Y0*cosB (6)
2)关于旋转的方向
按上述的推导出来的公式,在解析几何的坐标系中,旋转方向应为逆时针.
但由于屏幕坐标系的Y轴坐标向下增大,所以实际旋转的方向是顺时针.
两者遵循同一规律:从X坐标轴的正方向,向Y轴坐标正方向旋转.
实际上,对于简单图形, 旋转的方向不是大问题. 如果在调试过程中发现
旋转的方向不是我们所希望的,可以很容易地通地改变旋转角度的正负来解决.
(比如本例,想让线段顺时地转,只要将 theta=10了改为 theta=-10.
3)本例使用了鼠标事件。
使用鼠标事件的五步骤:
1.导入. 在代码开头导入相应的包:import java.awt.event.*;
2.声明. 在类声明中声明接口:……implements MouseListener
3.注册. 在init方法中注册: addMouseListener(this);
4. 添加事件代码. MouseListener可以处理mouse点击、松开等若干个鼠标事件(具体见代码中的注释),本例虽然只用到其中一个,但其它方法也要添加(用空方法复盖继承来的原方法)
注:MouseListener
不能处理鼠标拖动事件。若要处理鼠标拖动事件,需要使用MouseMotionListener接口。
5. 销毁. 在destroy()事件中销毁: removeMouseListener(this);
以下是用JAVA写的代码
import java.awt.Graphics;
//import java.awt.Event;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
public class MyLine 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]=0;//端点0
Y[0]=0;
X[1]=100;//端点1
Y[1]=40;
addMouseListener(this);
}
public
void paint(Graphics g){
g.drawLine((int)X[0], (int)Y[0], (int)X[1], (int)Y[1]);
}
//以下是处理mouse事件的几个方法,虽然只用到其中一个,但其它方法也要添加(用空方法复盖继承来的原方法)
public void
mouseClicked(MouseEvent e) {
float XX,YY;
//用以保存旋转前的坐标值
double
theta=10; //每次旋转的角度
theta *= (PI
/ 180); //化为弧度
double mycos = Math.cos(theta);
double mysin = Math.sin(theta);
XX=X[1]; //将旋转前的坐标值存入XX,YY
YY=Y[1];
//旋转
X[1]=(float)(XX*mycos-YY*mysin);
Y[1]=(float)(XX*mysin+YY*mycos);
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);
}
}