1、计算机图形学实验4实验报告计算机图形学实验4实验报告 实验题目:参数曲线绘制实验内容:1 圆的参数曲线绘制。2显式数学曲线描绘程序。3贝赛尔曲线绘制。编写程序调用验证之。参考资料:1 circleParam.java2 explicitCurve.java3 BezierLine.java4 数学曲线绘制.ppt和实验3的参考ppt基本概念:1、圆的参数曲线绘制:圆的参数曲线绘制就是按照圆的定义,利用步长,得在显示域上每一点的位置,然后绘制。圆是图形中经常使用的元素,圆被定义为所有离一中心位置(xc,yc)距离为给定值R的点集。2、显示数学曲线描绘程序:显示曲线的绘制就是在已知的坐标系上,按照
2、方程要求在固定的点画点,然后连接成一条线。3、贝塞尔曲线的绘制:贝赛尔曲线的每一个顶点都有两个控制点,用于控制在顶点两侧的曲线的弧度。它是应用于二维图形应用程序的数学曲线。曲线的定义有四个点:起始点、终止点(也称锚点)以及两个相互分离的中间点。滑动两个中间点,贝塞尔曲线的形状会发生变化。算法设计:1、圆的算法设计:本例程体现的主要是圆的快速算法,这里的主要算法是:X=Xc+RcostY=Yc+Rsint0t2pt是圆的某一点与X轴之间的夹角。Xc和Yc分别是圆的中心,以上一个终点为下一个的起点。改变t的值,就可以得到一个圆。体现在代码中就是:/圆的参数曲线x=f(t) private doub
3、le fx(double t) return Math.cos(t)+0.2; /圆的参数曲线y=f(t) private double fy(double t) return Math.sin(t)+0.2; 2、显示数学曲线绘制:利用微分方法进行绘制,将曲线x轴分割成足够小的间距,利用绘制的公式计算出每一个x所对应的y的坐标,然后在该坐标上画点(本程序绘制函数y=x*x-x-2)数图像从x=-4.0开始绘制,分割间距为0.05,即从x=-4.0绘制到x=4.0要走过160步,在该程序中用变量x表示开始绘图的x坐标,用变量deltaX表示每次分割的最小长度,即步长,利用所绘制的公式计算出y轴
4、坐标,然后利用循环绘制出函数图像,体现在代码中就是:/描绘曲线y=x2-x-2 private double f(double x) return (x-2)*(x+1); 3、 绘制:绘制分为两部分,一部分是节点的绘制,一部分是曲线线段的绘制,在该程徐序中定义了8个节点坐标,然后在该节点上绘制一个实心圆(红色表示),再绘制直线连接每两个相邻节点,共计8个节点7条线段,再利用微分的思想,将该范围内的x轴切分,该程序中是以变量t表示,切分大小为0.01,利用公式求解出对应的y轴坐标,然后利用绘制短直线的方法绘制相邻两个点之间的线段(蓝色表示),最后从最左节点绘制到最右节点坐标后结束绘制。体现在代
5、码中就是:for(t=0;t=1;t+=0.01) /参数法求点坐标 for(i=0;in;i+) /4个节点 x1=x1+(int)(Bin(n-1,i,t)*pi.x); y1=y1+(int)(Bin(n-1,i,t)*pi.y); /i循环 g.drawLine(x0,y0,x1,y1); /划短直线 x0=x1; /下一折线 y0=y1; x1=0; y1=0; /参数t循环代码:画圆: /圆的参数曲线x=f(t) private double fx(double t) return Math.cos(t)+0.2; /圆的参数曲线y=f(t) private double fy(d
6、ouble t) return Math.sin(t)+0.2; /Applet程序的描绘方法paint public void paint(Graphics g) m.setBackground(Color.white); /背景色 m.setColor(Color.black); /前景色 m.setWindow(xmin,xmax,ymin,ymax); /用户坐标系范围 /缺省的视图为m.setViewport(0,1,0,1)和Java AWT窗口大小一样 /* 画X轴 */ double x1=xmax-0.05,xmax,xmax-0.05; double y1=-0.03,0,
7、0.03; m.fillPolygon(x1,y1,3); m.drawString(X轴,1.05,-0.15); m.drawLine(xmin,0,xmax,0); /* 画Y轴 */ double x2=-0.03,0,0.03; double y2=ymax-0.05,ymax,ymax-0.05; m.fillPolygon(x2,y2,3); m.drawString(Y轴,-0.2,1.05); m.drawLine(0,ymin,0,ymax); /* 画圆 */ double t=0.0; double x=fx(t); double y=fy(t); m.moveTo(x
8、,y); /抬笔移到起点 double x0=x,y0=y; /记住起点 int step=100; double deltat=2*Math.PI/step; for(int i=0;istep;i+) t+=deltat; x=fx(t);y=fy(t); m.lineTo(x,y); /画直线到该点 m.lineTo(x0,y0); /画直线到起点,结束 /描绘方法paint结束 /参数曲线描绘类结束画显示数学曲线/描绘曲线y=x2-x-2 private double f(double x) return (x-2)*(x+1); /Applet程序的描绘方法paint public
9、void paint(Graphics g) m.setBackground(Color.white); /背景色 m.setColor(Color.blue); /前景色 m.setWindow(xmin,xmax,ymin,ymax); /用户坐标系范围 /缺省的视图为m.setViewport(0,1,0,1)和Java AWT窗口大小一样 m.drawLine(xmin,0,xmax,0);/画x轴及刻度线 for(int i=(int)xmin;i=(int)xmax;i+) m.drawLine(double)i,-gDelta,(double)i,gDelta); m.drawS
10、tring(String.valueOf(i),i-gDelta,-0.4); m.drawLine(0,ymin,0,ymax);/画y轴及刻度线 for(int j=(int)ymin;j=(int)ymax;j+) m.drawLine(-gDelta,(double)j,gDelta,(double)j); m.drawString(String.valueOf(j),-0.4,j-gDelta); /* 画曲线 */ double x=-2.0; /曲线的起始点 double y=f(x); m.moveTo(x,y); /抬笔移动到xy点处 double deltaX=0.05;
11、/x的步长 for(int i=0;i100;i+) /x方向走10步 x+=deltaX; y=f(x); m.lineTo(x,y); /落笔画直线到xy点处 /描绘方法paint结束 /显式曲线描绘类结束画贝塞尔曲线: private Node p=new Node8; /塞尔曲线8个节点 /贝赛尔曲线类构造方法 public BezierLine() super(Bezier曲线); /调用父类Frame的构造方法,显示窗口标题 this.setSize(700,600); this.setLayout(new FlowLayout(); button_start=new Button
12、(划 线); button_start.addActionListener(this); button_close=new Button(关 闭); button_close.addActionListener(this); /测试数据:4个节点赋值 /*p0=new Node(50,400); p1=new Node(100,350); p2=new Node(200,450); p3=new Node(550,400);*/ p0=new Node(50,300); p1=new Node(120,380); p2=new Node(200,450); p3=new Node(300,41
13、0); p4=new Node(380,350); p5=new Node(300,260); p6=new Node(220,150); p7=new Node(80,200); /p0=new Node(100,260); /p1=new Node(50,150); /p2=new Node(250,120); /p3=new Node(330,250); this.add(button_start); this.add(button_close); this.setVisible(true); /显示窗口和界面 /结束贝赛尔曲线类构造方法 /辅助函数:求t的i次方 public doub
14、le pow(double t,int i) if(t=0&i=0) return 1; else return Math.pow(t,i); /辅助函数:递归求n的阶乘 public int factorial(int n) if(n=0|n=1) return 1; else return n*factorial(n-1); /定义Beinstein函数 public double Bin(int n,int i,double t) double tm; tm=factorial(n)/(factorial(i)*factorial(n-i)*pow(t,i)*pow(1-t,n-i);
15、return tm; /定义paint函数 public void paint(Graphics g) int i,j,n,x1=0,y1=0,x0,y0; double t; n=8; /贝赛尔8个节点 g.setColor(Color.red); g.fillOval(p0.x-5,p0.y-5,10,10); /实心圆 for(j=1;jn;j+) /描点,连线 g.fillOval(pj.x-5,pj.y-5,10,10); g.drawLine(pj-1.x-1,pj-1.y-1,pj.x-1,pj.y-1); x0=p0.x; /起点 y0=p0.y; g.setColor(Col
16、or.blue); for(t=0;t=1;t+=0.01) /参数法求点坐标 for(i=0;in;i+) /4个节点 x1=x1+(int)(Bin(n-1,i,t)*pi.x); y1=y1+(int)(Bin(n-1,i,t)*pi.y); /i循环 g.drawLine(x0,y0,x1,y1); /划短直线 x0=x1; /下一折线 y0=y1; x1=0; y1=0; /参数t循环 运行结果:圆心在(0,0)的元圆:圆心在(0.2,0.2)的圆:绘画y=x3-x的图:绘画y=x2-x-2的图:三种四个节点不同参数的视图:八个节点的视图:实验体会: 学习了圆的参数曲线的画法,知道了在视图上和数学上算法的不同,学习了数学曲线的画法,其方式是采用递推,步长可以由用户自定义设置,步数决定画出来图形的完整度,学习了贝塞尔曲线的画法,我了解到了更多的算法,学习到了更多的编程知识。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1