`
love19820823
  • 浏览: 934044 次
文章分类
社区版块
存档分类
最新评论

Java模拟桌球打击处理及绘制

 
阅读更多
由于Java可以很轻易的完成比较复杂的数学运算,所以我们经常能看到物理领域的问题借助Java实现效果演示,下面我给出一个桌球碰撞的处理及绘制实例。

packageorg.test.mail;

importjava.awt.Color;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Panel;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.awt.event.MouseMotionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.awt.image.BufferedImage;

/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:Java桌球演示
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*
@authorchenpeng
*@email:ceponline@yahoo.com.cn
*
@version0.1
*/


publicclassJavaBilliardsextendsPanelimplementsRunnable,MouseListener,
MouseMotionListener
...{

/***//**
*
*/

privatestaticfinallongserialVersionUID=-5019885590391523441L;

//
privatedouble_ball;

//缓存用背景
privateImage_screen;

//画布
privateGraphics_graphics;

//台桌
privateImage_table;

privatedoublec[];

privatedoubled[];

privatedoublee[];

privatedoublef[];

privateintcountBall;

privateinth;

privatedoublei[];

privatedoublej[];

privatedoublek[];

privatedoublel[];

privatedoublem[];

privatedoublen[];

privatedoubleo[];

privatedoublep[];

privatebooleanq[];

privatedoubler;

privateinta;

privateintu;

privateintv;

privateintw;

privateintx;

privatebooleany;

privateintz;

privateintA;

/***//**
*初始化
*
*/

publicJavaBilliards()...{
a
=0;
r
=10D;
z
=300;
A
=0;
setBounds(
50,50,700,350);
Frameframe
=newFrame("Java桌球演示");
frame.add(
this);
frame.setBounds(
0,0,700,380);
frame.setResizable(
false);
frame.setVisible(
true);
frame.addWindowListener(
newWindowAdapter()...{
publicvoidwindowClosing(WindowEvente)...{
System.exit(
0);
}

}
);
requestFocus();
initialize();
}


publicvoidinitialize()...{
//基础数据
base();
//注入实例
immit();
//缓存背景
_screen=newBufferedImage(this.getWidth(),this.getHeight(),1);
//背景图形
_graphics=_screen.getGraphics();
//绘制台桌
makeTable();
//设置监听
addMouseListener(this);
addMouseMotionListener(
this);
//启动
newThread(this).start();
}


/***//**
*初始化数据
*
*/

publicvoidbase()...{

//球体
_ball=16D;
c
=(newdouble[]...{40D,(double)(getWidth()-40)});
d
=(newdouble[]...{c[0],(double)getHeight()-c[0]});
e
=(newdouble[]...{c[0]+20D,(double)(getWidth()/2),c[1]-20D});
f
=(newdouble[]...{d[0]+20D,d[1]-20D});
}


/***//**
*注入实例
*
*/

publicvoidimmit()...{
countBall
=16;
i
=newdouble[countBall];
j
=newdouble[countBall];
k
=newdouble[countBall];
l
=newdouble[countBall];
m
=newdouble[countBall];
n
=newdouble[countBall];
o
=newdouble[countBall];
p
=newdouble[countBall];
q
=newboolean[countBall];
//打击对象
hitObject();
//打击用球
hitBall();
}


/***//**
*打击用球数值
*
*/

publicvoidhitBall()...{
i[
0]=(1.0D*(e[2]-e[0]))/3D;
j[
0]=this.getHeight()/2;
k[
0]=0.0D;
l[
0]=0.0D;
q[
0]=true;
}


/***//**
*打击对象
*
*/

publicvoidhitObject()...{
intil=1;
h
=countBall-1;
//求平方根
doubledl=Math.sqrt(3.5D);
for(intj1=0;j1<5;j1++)...{
doubled2=((double)getWidth()*2D)/3D+(double)j1*dl*r;
doubled3=(double)(getHeight()/2)-(double)j1*r;
for(intk1=0;k1<=j1;k1++)...{
i[il]
=d2;
j[il]
=d3;
k[il]
=0.0D;
l[il]
=0.0D;
q[il]
=true;
d3
+=2D*r;
il
++;
}


}


}



这么点代码居然不能一次都发了……

/***//**
*绘制台球桌
*
*/

publicvoidmakeTable()...{
_table
=newBufferedImage(this.getWidth(),this.getHeight(),1);
Graphicsg
=_table.getGraphics();
g.setColor(Color.GRAY);
g.fillRect(
0,0,getWidth(),getHeight());
g.setColor((
newColor(200,100,50)).darker());
g.fill3DRect((
int)c[0],(int)d[0],(int)(c[1]-c[0]),
(
int)(d[1]-d[0]),true);
g.setColor(Color.BLACK);
g.fill3DRect((
int)e[0],(int)f[0],(int)(e[2]-e[0]),
(
int)(f[1]-f[0]),false);
g.setColor(Color.GREEN.darker());
g.drawLine((
int)((1.0D*(e[2]-e[0]))/3D),(int)f[0],
(
int)((1.0D*(e[2]-e[0]))/3D),(int)f[1]);
g.fillOval((
int)((1.0D*(e[2]-e[0]))/3D)-2,
(
int)((f[1]+f[0])/2D)-2,4,4);
g.drawArc((
int)((1.0D*(e[2]-e[0]))/3D)-20,
(
int)((f[1]+f[0])/2D)-20,40,40,90,180);
g.setColor(Color.BLACK);
doubled1=_ball-2D;
for(inti1=0;i1<3;i1++)...{
for(intj1=0;j1<2;j1++)...{
g.fillOval((
int)(e[i1]-d1),(int)(f[j1]-d1),
(
int)(2D*d1),(int)(2D*d1));
}

}

}


/***//**
*线程处理
*/

publicvoidrun()...{
longtimeStart;
timeStart
=System.currentTimeMillis();
//死循环反复处理
for(;;)...{
longtimeEnd=System.currentTimeMillis();
switch(a)...{
default:
break;

case1:
//根据时间换算运动轨迹
conversion(timeEnd-timeStart);
//过程处理
course();
break;

case2:
conversion(timeEnd
-timeStart);
//过程处理
course();
booleanflag=true;
for(inti1=0;flag&&i1<countBall;i1++)
flag
=k[i1]==0.0D&&l[i1]==0.0D;

if(flag)...{
a
=1;
//击球
if(!q[0])...{
hitBall();
}

}

if(h==0)
a
=3;
break;

case3:
hitObject();
hitBall();
a
=0;
break;
}


repaint();
timeStart
=timeEnd;
try...{
Thread.sleep(
10L);
}
catch(InterruptedExceptione1)...{
e1.printStackTrace();
}

}


}


publicvoidcourse()...{
//限制区域
limit();
//入袋处理
pocket();
//运动演算
play();
for(inti1=0;i1<countBall;i1++)
if(q[i1])...{
i[i1]
=m[i1];
j[i1]
=n[i1];
}

}


/***//**
*变换时间为动作数据
*
*
@paramvalue
*/

publicvoidconversion(longvalue)...{
doubled1=(double)value/1000D;
for(inti1=0;i1<countBall;i1++)
if(q[i1])...{
m[i1]
=i[i1]+k[i1]*d1;
n[i1]
=j[i1]+l[i1]*d1;
k[i1]
*=0.98999999999999999D;
l[i1]
*=0.98999999999999999D;
if(Math.abs(Math.hypot(k[i1],l[i1]))<2D)...{
k[i1]
=0.0D;
l[i1]
=0.0D;
}

}


}


publicvoidpocket()...{
for(inti1=0;i1<countBall;i1++)
if(q[i1])...{
for(intj1=0;j1<3;j1++)...{
for(intk1=0;k1<2;k1++)
if(Math.hypot(e[j1]-i[i1],f[k1]-j[i1])<_ball)...{
q[i1]
=false;
if(i1!=0)...{
h
--;
}

k[i1]
=0.0D;
l[i1]
=0.0D;
}


}


}


}


publicvoidplay()...{
for(inti1=0;i1<countBall;i1++)
if(q[i1])...{
for(intj1=i1+1;j1<countBall;j1++)...{
booleanflag;
if(q[j1]&&(flag=randball(i1,j1)))...{
for(intk1=0;k1<10&&flag;k1++)...{
m[i1]
=(m[i1]+i[i1])/2D;
n[i1]
=(n[i1]+j[i1])/2D;
m[j1]
=(m[j1]+i[j1])/2D;
n[j1]
=(n[j1]+j[j1])/2D;
flag
=randball(i1,j1);
}


if(flag)...{
m[i1]
=i[i1];
n[i1]
=j[i1];
m[j1]
=i[j1];
n[j1]
=j[j1];
}

doubled1=m[j1]-m[i1];
doubled2=n[j1]-n[i1];
doubled3=Math.hypot(m[i1]-m[j1],n[i1]-n[j1]);
doubled4=d1/d3;
doubled5=d2/d3;
o[j1]
=k[j1]-k[j1]*d4*d4;
o[j1]
-=l[j1]*d4*d5;
o[j1]
+=k[i1]*d4*d4;
o[j1]
+=l[i1]*d4*d5;
p[j1]
=l[j1]-l[j1]*d5*d5;
p[j1]
-=k[j1]*d4*d5;
p[j1]
+=k[i1]*d4*d5;
p[j1]
+=l[i1]*d5*d5;
o[i1]
=k[i1]-k[i1]*d4*d4;
o[i1]
-=l[i1]*d4*d5;
o[i1]
+=k[j1]*d4*d4;
o[i1]
+=l[j1]*d4*d5;
p[i1]
=l[i1]-l[i1]*d5*d5;
p[i1]
-=k[i1]*d4*d5;
p[i1]
+=k[j1]*d4*d5;
p[i1]
+=l[j1]*d5*d5;
k[i1]
=o[i1];
l[i1]
=p[i1];
k[j1]
=o[j1];
l[j1]
=p[j1];
}

}


}


}


publicbooleanrandball(inti1,intj1)...{
//hypot随机决定两值之一
returnMath.hypot(m[i1]-m[j1],n[i1]-n[j1])<2D*r;
}


/***//**
*限制区域
*
*/

publicvoidlimit()...{
for(inti=0;i<countBall;i++)
if(q[i])...{
if(m[i]-r<e[0])...{
m[i]
=e[0]+r;
k[i]
*=-1D;
}
elseif(m[i]+r>e[2])...{
m[i]
=e[2]-r;
k[i]
*=-1D;
}

if(n[i]-r<f[0])...{
n[i]
=f[0]+r;
l[i]
*=-1D;
}
elseif(n[i]+r>f[1])...{
n[i]
=f[1]-r;
l[i]
*=-1D;
}

}


}


publicvoidmakeScreen(GraphicsscreenGraphics)...{

screenGraphics.drawImage(_table,
0,0,null);
if(q[0])...{
_graphics.setColor(Color.WHITE);
_graphics.fillOval((
int)(i[0]-r),(int)(j[0]-r),
(
int)(r*2D),(int)(r*2D));
}

screenGraphics.setColor(Color.RED);
for(inti1=1;i1<countBall;i1++)
if(q[i1])
screenGraphics.fillOval((
int)(i[i1]-r),(int)(j[i1]-r),
(
int)(r*2D),(int)(r*2D));

screenGraphics.setColor(Color.BLACK);
for(intj1=0;j1<countBall;j1++)
if(q[j1])...{
screenGraphics.drawOval((
int)(i[j1]-r),(int)(j[j1]-r),
(
int)(r*2D),(int)(r*2D));
}


if(a==1)...{
makeHelper(screenGraphics);
}

if(a==0)...{
intk1=getWidth()/2-85;
intl1=getHeight()/2;
screenGraphics.setColor(Color.BLACK);
screenGraphics.drawString(
"点击画面开始",k1+2,l1+2);
if((System.currentTimeMillis()/1000L&1L)==0L)...{
screenGraphics.setColor(Color.YELLOW);
}

else...{
screenGraphics.setColor(Color.CYAN);
}

screenGraphics.drawString(
"点击画面开始",k1,l1);
}

}


/***//**
*绘制球杆及辅助线
*
*
@paramscreenGraphics
*/

publicvoidmakeHelper(GraphicsscreenGraphics)...{
doubled1=Math.hypot(i[0]-(double)u,j[0]-(double)v);
doubled2=((double)u-i[0])/d1;
doubled3=((double)v-j[0])/d1;
doubled4=y?n()/10D:1.0D;
doubled5=i[0]+d2*(r+d4);
doubled6=i[0]+d2*(r+(double)z+d4);
doubled7=j[0]+d3*(r+d4);
doubled8=j[0]+d3*(r+(double)z+d4);
screenGraphics.setColor(Color.ORANGE);
screenGraphics.drawLine((
int)d5,(int)d7,(int)d6,(int)d8);
inti1=0;
intj1=y?(int)(150D*(d4/1000D)):15;
doubled9;
doubled10=(d9=30D)*d2;
doubled11=d9*d3;
doubled12=i[0]+(double)A*d2;
doubled13=j[0]+(double)A*d3;
A
--;
A
%=d9;
screenGraphics.setColor(Color.WHITE);
for(;i1<j1;i1++)...{
if(d12<e[0])...{
d12
=e[0]-d12;
d12
=e[0]+d12;
d10
*=-1D;
}
elseif(d12>e[2])...{
d12
-=e[2];
d12
=e[2]-d12;
d10
*=-1D;
}

if(d13<f[0])...{
d13
=f[0]-d13;
d13
=f[0]+d13;
d11
*=-1D;
}
elseif(d13>f[1])...{
d13
-=f[1];
d13
=f[1]-d13;
d11
*=-1D;
}

screenGraphics.fillOval((
int)d12-2,(int)d13-2,4,4);
d12
-=d10;
d13
-=d11;
}


}


publicdoublen()...{
if(y)...{
returnMath.min(1000D,10D*Math.hypot(i[0]-(double)w,j[0]
-(double)x));
}
else...{
returnMath.min(1000D,10D*Math.hypot(u-w,v-x));
}

}


publicvoidupdate(Graphicsg)...{
paint(g);
}


publicvoidpaint(Graphicsg)...{
makeScreen(_graphics);
g.drawImage(_screen,
0,0,null);
}


publicvoidmousePressed(MouseEventmouseevent)...{
y
=true;
}


publicvoidmouseReleased(MouseEventmouseevent)...{
if(a==1)...{
doubled1=Math.hypot(i[0]-(double)u,j[0]-(double)v);
doubled2=(i[0]-(double)u)/d1;
doubled3=(j[0]-(double)v)/d1;
doubled4;
if((d4=n())>0.0D)...{
a
=2;
k[
0]=d4*d2;
l[
0]=d4*d3;
}

}

y
=false;
}


publicvoidmouseClicked(MouseEventmouseevent)...{
if(a==0)
a
=1;
}


publicvoidmouseEntered(MouseEventmouseevent)...{
}


publicvoidmouseExited(MouseEventmouseevent)...{
}


publicvoidmouseMoved(MouseEventmouseevent)...{
w
=mouseevent.getX();
x
=mouseevent.getY();
u
=w;
v
=x;
}


publicvoidmouseDragged(MouseEventmouseevent)...{
w
=mouseevent.getX();
x
=mouseevent.getY();
}


publicstaticvoidmain(Stringargs[])...{
newJavaBilliards();
}


}

运行结果如下:



PS:本来今天想写个关于javamail方面的,后来觉得要写的东西太多临时改主意了……
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics