順便練壹下貝塞爾函數,寫了壹個applet,每秒鐘隨機生成4個點展示效果。
滿足題目要求的接口。
import?java.applet.Applet;
import?java.awt.Color;
import?java.awt.Graphics;
import?java.util.Random;
import?java.util.Timer;
import?java.util.TimerTask;
public?class?Test?extends?Applet?{
private?static?final?long?serialVersionUID=-1570645570118871214L;
private?int?px[],py[];
private?Random?rnd;
@Override
public?void?init(){
rnd=new?Random(System.currentTimeMillis());
px=new?int[4];
py=new?int[4];
Timer?t=new?Timer();
t.scheduleAtFixedRate(new?TimerTask()?{
@Override
public?void?run()?{
repaint();
}
},?0,?1000);
}
private?void?generate(){
for(int?i=0;i<4;i++){
px[i]=rnd.nextInt(150);
py[i]=rnd.nextInt(150);
}
}
static?public?void?drawBezier(
Graphics?g,
int?x0,int?y0,?
int?x1,int?y1,
int?x2,int?y2,
int?x3,int?y3){
int?
px[]={x0,x1,x2,x3},
py[]={y0,y1,y2,y3};
g.setColor(Color.RED);
for(int?i=0;i<px.length;i++){
g.fillOval(px[i],?py[i],?5,?5);
}
g.setColor(Color.GREEN);
double?x=0,y=0;
int?c=0;
for(double?t=0;t<=1;t+=0.01){
double?dx=cubicBezier(t,?px),
dy=cubicBezier(t,py);
System.out.println("dx:"+dx+",?dy:"+dy);
if(c++>0)?g.drawLine((int)x,?(int)y,?(int)dx,?(int)dy);
x=dx;?y=dy;
}
}
static?private?double?cubicBezier(double?t,int?p[]){
return?Math.pow(1-t,3)*p[0]+
3*t*Math.pow(1-t,2)*p[1]+
3*Math.pow(t,2)*(1-t)*p[2]+
Math.pow(t,3)*p[3];
}
@Override
public?void?paint(Graphics?g){
generate();
drawBezier(g,?
px[0],py[0],
px[1],py[1],
px[2],py[2],
px[3],py[3]
);
}
}