ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:402.13KB ,
资源ID:4909544      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4909544.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(计算机图形学实验4实验报告.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

计算机图形学实验4实验报告.docx

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