旋转JAVA_(JAVA)绕原点旋转(MyLine)

(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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值