62,620
社区成员
发帖
与我相关
我的任务
分享
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();
}
}