《计算机图形学》实验4实验报告.doc_第1页
《计算机图形学》实验4实验报告.doc_第2页
《计算机图形学》实验4实验报告.doc_第3页
《计算机图形学》实验4实验报告.doc_第4页
《计算机图形学》实验4实验报告.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验4实验报告格式计算机图形学实验4实验报告实验题目:参数曲线绘制实验内容:1 圆的参数曲线绘制。2显式数学曲线描绘程序。3贝赛尔曲线绘制。编写程序调用验证之。参考资料:1 circleParam.java2 explicitCurve.java3 BezierLine.java4 数学曲线绘制.ppt和实验3的参考ppt基本概念:(详细叙述自己对实验内容的理解)(1)圆的参数曲线绘制:圆的参数曲线绘制就是按照圆的定义,利用步长,得在显示域上每一点的位置,然后绘制,圆是图形中经常使用的元素,圆被定义为所有离一中心位置距离为给定值的点集,其函数方程为:参数方程为:根据已知的Xc和Yc,以及t可以确定一个圆。(2)显示数学曲线描绘程序:显示曲线的绘制就是在已知的坐标系上,按照方程要求在固定的点画点,然后连接成一条线,例如如果曲线的方程式:,利用这个公式的递推演算,我们依次从-x到+x来绘制。(3)贝塞尔曲线的绘制:贝赛尔曲线的每一个顶点都有两个控制点,用于控制在顶点两侧的曲线的弧度。它是应用于二维图形应用程序的数学曲线。曲线的定义有四个点:起始点、终止点(也称锚点)以及两个相互分离的中间点。滑动两个中间点,贝塞尔曲线的形状会发生变化。例如下面的公式:算法设计:(详细叙述自己设计的的算法)(1)圆的算法设计:本例体现的主要是圆的快速算法,这里的主要算法是: t是圆的某一点与X轴之间的夹角。Xc和Yc分别是圆的中心,以上一个终点为下一个的起点。改变t的值,就可以得到一个圆。体现在代码中就是:/圆的参数曲线x=f(t)private double fx(double t) return Math.cos(t);/圆的参数曲线y=f(t)private double fy(double t) return Math.sin(t);(2)显示数学曲线绘制:本例主要演示绘制曲线,其基本算法:利用这个公式的递推演算,我们依次从-x到+x来绘制。体现在代码中就是:/描绘曲线y=x3-1private double f(double x) return x*x*x-1;(3)贝塞尔曲线绘制:贝塞尔曲线是两个端点不变,中间的点在变,其连线使用圆弧来代替,其实就相当于模拟曲线。体现在代码中就是: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循环代码:(给出主要的Java程序和注解)(1)package 实验4;/circleParam.java/参数曲线描绘程序import java.awt.*;/绘图基于java AWT包import java.applet.Applet;/定义参数曲线描绘类public class circleParam extends Applet MyCanvas m;/定义MyCanvas的对象private double xmin=-1.2;/x轴的最小值private double ymin=-1.2;/y轴的最小值private double xmax=1.2;/x轴的最大值private double ymax=1.2;/y轴的最大值/Applet程序的自动初始化方法initpublic void init() setSize(500,500);m=new MyCanvas(this);/生成MyCanvas类的对象/圆的参数曲线x=f(t)private double fx(double t) return Math.cos(t);/圆的参数曲线y=f(t)private double fy(double t) return Math.sin(t);/Applet程序的描绘方法paintpublic void paint(Graphics g) m.setBackground(Color.gray);/背景色m.setColor(Color.red);/前景色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,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,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结束/参数曲线描绘类结束(2)package 实验4;/explicitCurve.java/显式曲线描绘程序import java.awt.*;/绘图基于java AWT包import java.applet.Applet;/定义显式曲线描绘类public class explicitCurve extends Applet MyCanvas m;/定义MyCanvas的对象private double xmin=-4;/x轴的最小值private double ymin=-4;/y轴的最小值private double xmax=4;/x轴的最大值private double ymax=4;/y轴的最大值private double gDelta=0.10;/坐标轴刻度间距/Applet程序的自动初始化方法initpublic void init() setSize(500,500);m=new MyCanvas(this);/生成MyCanvas类的对象/描绘曲线y=x3-1private double f(double x) return x*x*x-1;/Applet程序的描绘方法paintpublic void paint(Graphics g) m.setBackground(Color.gray);/背景色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.drawString(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;/x的步长for(int i=0;i80;i+) /x方向走80步x+=deltaX; y=f(x);m.lineTo(x,y); /落笔画直线到xy点处/描绘方法paint结束/显式曲线描绘类结束(3)package 实验4;/Java图形学之贝赛尔曲线 Application程序/贝塞尔曲线是依据四个位置任意的点坐标绘制出的一条光滑曲线。/本程序直接在JAVA AWT坐标系下绘图(没有用户坐标系和视图)/考试内容1:利用MyCanvas包,加上用户坐标系,四个点的坐标为用户坐标系/考试内容2:把n个点用贝塞尔曲线分段连接为一条光滑曲线import java.awt.*;import java.awt.event.*;import javax.swing.*;/贝赛尔曲线类public class BezierLine extends Frame /继承窗体implements ActionListener,ComponentListener /接口private Button button_start,button_close;/两个按钮/内部类定义节点类protected class Node extends Object protected int x,y;protected Node() /构造1this.x=0;this.y=0;protected Node(int x,int y) /构造2this.x=x;this.y=y; /结束内部节点类private Node p=new Node4;/塞尔曲线4个节点/贝赛尔曲线类构造方法public BezierLine() super(Bezier曲线);/调用父类Frame的构造方法,显示窗口标题this.setSize(500,500);this.setLayout(new FlowLayout();button_start=new Button(划 线);button_start.addActionListener(this);button_close=new Button(关 闭);button_close.addActionListener(this);/测试数据:4个节点赋值/*p0=new Node(50,150);p1=new Node(100,250);p2=new Node(150,300);p3=new Node(200,350);*/*p0=new Node(100,200);p1=new Node(200,100);p2=new Node(300,200);p3=new Node(200,300);*/p0=new Node(100,260);p1=new Node(150,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 double 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);return tm;/定义paint函数public void paint(Graphics g) int i,j,n,x1=0,y1=0,x0,y0;double t;n=4;/贝赛尔4个节点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(Color.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

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论