计算机图形学—弹跳的球体

天涯流星雨 2013-09-05 08:26:51
发出来给大家分享一下......小白学习了java 2个月随便做的课程设计



package 计算机图形学;

/**
* 球体类
*/
public class Ball {
//球体上面的点
int[][][] f=new int[11][21][2];

//得到球体上面的点
public int[][][] getF() {
return f;
}
//得到球体上的点的二维坐标
public Ball(double k) {
int r=50;
double emp = 3.14 / 10;
for (int i = 0; i <=10; i++)
for (int j = 0; j <=20; j++) {
//求出球体坐标系的x,y,z的值
double x = Math
.round(r * Math.sin(emp * i) * Math.cos(emp * j));
double y = Math
.round(r * Math.sin(emp * i) * Math.sin(emp * j));
double z = Math.round(r * Math.cos(emp * i));

//三维坐标转化成二维坐标
y=Math.round( Math.sqrt(1)/2*y-z);

//旋转球体(k为弧度)
f[i][j][0] = (int) (x*Math.cos(k)-y*Math.sin(k));
f[i][j][1] = (int) (x*Math.sin(k)+y*Math.cos(k));
}
}
}

package 计算机图形学;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.Timer;

/**
*球体的显示窗口
*/
public class BallFrame extends JFrame{
// π的弧度=PI
private final double PI=Math.toRadians(180);
// 下落的高度
int h;
//球体的水平,垂直方向移动的距离
int x,y;
//定时器让球体定时移动
Timer time;
//球体旋转的角度
int style=0;

public BallFrame() {
init();
setVisible(true);
}

private void init() {
this.setSize(800, 600);
this.setResizable(false);
this.setLocationRelativeTo(null);
this.setLayout(null);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setTitle("弹跳的球体");

initListener();
restart();
}

/**
* 键盘事件响应
*/
private void initListener() {
this.addKeyListener(new KeyAdapter(){

public void keyPressed(KeyEvent arg) {
if ( arg.getKeyCode()==KeyEvent.VK_ESCAPE){
time.stop();
time=null;
restart();
}else{
if (time==null){
initTime();
time.start();
}
}
if ( arg.getKeyCode()==KeyEvent.VK_UP ){
if (time!=null){
int t=time.getDelay()-10;
if (t>0){
time.setDelay(t);
}
}
}else if ( arg.getKeyCode()==KeyEvent.VK_DOWN ){
if (time!=null){
int t=time.getDelay()+10;
time.setDelay(t);
}
}
}
});
}

/**
* 创建定时器,并进行监听
*/
private void initTime(){

time=new Timer(200, new ActionListener() {
public void actionPerformed(ActionEvent e) {
x+=1;
y=(int)( h* Math.abs( Math.sin(2*PI/300*x)) );
repaint();
if (-1<y && y<1){
if (h>0) {
h=h-100;
}else h=0;
}
if (x>700) {
BallFrame.this.time.stop();
}
BallFrame.this.requestFocus();
}
});
}
/**
*画球
*/
private void drawBall(Graphics g){
g.setColor(Color.GREEN);

double k=Math.toRadians( 5*(style) );
int[][][] f=new Ball(k).getF();
style=(++style)%36;

int x0=this.x,y0=500-this.y;

for (int i=0;i<=10;i++)
for (int j=0;j<=20;j++){
if (i<10){
g.drawLine(f[i][j][0]+x0,f[i][j][1]+y0 , f[i+1][j][0]+x0, f[i+1][j][1]+y0);
}

if (j<20){
g.drawLine(f[i][j][0]+x0,f[i][j][1]+y0, f[i][j+1][0]+x0, f[i][j+1][1]+y0);
}
}
}
/**
* 双缓冲画图
*/
public void paint(Graphics g) {
Image img=createImage(800, 600);
Graphics i=img.getGraphics();

i.setColor(Color.PINK);
i.fillRect(0, 0, 800, 500);
i.setColor(Color.YELLOW);
i.fillRect(0, 500, 800, 100);
i.setColor(Color.BLACK);

i.setFont(new Font("宋体", Font.BOLD, 18));
if (time==null){
i.drawString("按任意键开始", 100, 70);
}else {
i.drawString("按ESC键结束", 100, 70);
}

i.drawString("按↑加快移动速度", 500, 50);
i.drawString("按↓减慢移动速度。", 500, 80);

drawBall(i);
g.drawImage(img, 0,0,null);
}

public void update(Graphics g) {
paint(g);
}
/**
* 重新开始
*/
public void restart(){
h=400;
x=100;
y=(int)( h* Math.abs( Math.sin(2*PI/300*x)) );

repaint();

}
public static void main(String[] args) {
new BallFrame();
}

}
...全文
348 5 打赏 收藏 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
天涯流星雨 2013-09-06
  • 打赏
  • 举报
回复
BallFrame.this.requestFocus(); 是让BallFrame这个JFrame类获得焦点。是我不小心写上去了,在这程序中没什么用。关于焦点我也不是特别清楚, 可能是你设置焦点写错了位置,所以无法获得监听事件
天涯流星雨 2013-09-06
  • 打赏
  • 举报
回复
其实学好书本,多做两道题,没什么压力的
SelinaBB 2013-09-05
  • 打赏
  • 举报
回复
BallFrame.this.requestFocus(); 这段话请楼主给讲解下呗~ 在什么时候调用才能让JFrame获得焦点啊。 我之前写过一个程序,在JPanel初始化中使用了这个,但是它还是无法获得键盘点击事件。
调皮的芋头 2013-09-05
  • 打赏
  • 举报
回复
谢谢分享,学习了。
地下室森林 2013-09-05
  • 打赏
  • 举报
回复
计算机图形学这学期开始学,不过都是数学推导,有点压力

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧