作业帮 > 综合 > 作业

三次Bezier曲线绘制编程

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/14 18:10:53
三次Bezier曲线绘制编程
已知三次Bezier曲线调和函数如下:
B0(t)=(1-t)^3
B1(t)=3*t*(1-t)^2
B2(t)=3*(t^2)*(1-t)
B3(t)=t^3
试编写drawBezier(Graphics g,int x0,int y0,int x1,int y1,int x2,int y2,int rx3,int ry3),绘制Bezier曲线,其中g为绘制设备对象,可以调用函数g.drawLine(startx,starty,endx,endy)绘制直线,x0,x1,x2,y1,y2,y3为控制点坐标
顺便练一下贝塞尔函数,写了一个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 {\x09private static final long serialVersionUID=-1570645570118871214L;\x09private int px[],py[];\x09private Random rnd;\x09@Override\x09public void init(){\x09\x09rnd=new Random(System.currentTimeMillis());\x09\x09px=new int[4];\x09\x09py=new int[4];\x09\x09\x09\x09Timer t=new Timer();\x09\x09t.scheduleAtFixedRate(new TimerTask() {\x09\x09\x09@Override\x09\x09\x09public void run() {\x09\x09\x09\x09\x09\x09repaint();\x09\x09\x09}\x09\x09}, 0, 1000);\x09}\x09private void generate(){\x09\x09\x09\x09for(int i=0;i<4;i++){\x09\x09\x09px[i]=rnd.nextInt(150);\x09\x09\x09py[i]=rnd.nextInt(150);\x09\x09}\x09}\x09static public void drawBezier(\x09\x09Graphics g,\x09\x09int x0,int y0, \x09\x09int x1,int y1,\x09\x09int x2,int y2,\x09\x09int x3,int y3){\x09\x09int \x09\x09\x09px[]={x0,x1,x2,x3},\x09\x09\x09py[]={y0,y1,y2,y3};\x09\x09\x09\x09g.setColor(Color.RED);\x09\x09for(int i=0;i<px.length;i++){\x09\x09\x09g.fillOval(px[i], py[i], 5, 5);\x09\x09}\x09\x09g.setColor(Color.GREEN);\x09\x09double x=0,y=0;\x09\x09int c=0;\x09\x09for(double t=0;t<=1;t+=0.01){\x09\x09\x09double dx=cubicBezier(t, px),\x09\x09\x09\x09dy=cubicBezier(t,py);\x09\x09\x09System.out.println("dx:"+dx+", dy:"+dy);\x09\x09\x09if(c++>0) g.drawLine((int)x, (int)y, (int)dx, (int)dy);\x09\x09\x09x=dx; y=dy;\x09\x09}\x09}\x09static private double cubicBezier(double t,int p[]){\x09\x09return Math.pow(1-t,3)*p[0]+\x09\x09\x09\x093*t*Math.pow(1-t,2)*p[1]+\x09\x09\x09\x093*Math.pow(t,2)*(1-t)*p[2]+\x09\x09\x09\x09Math.pow(t,3)*p[3];\x09}\x09@Override\x09public void paint(Graphics g){\x09\x09generate();\x09\x09drawBezier(g, \x09\x09\x09px[0],py[0],\x09\x09\x09px[1],py[1],\x09\x09\x09px[2],py[2],\x09\x09\x09px[3],py[3]\x09\x09);\x09}}