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

下载本文档

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

文档简介

《计算机图形学》实验4实验报告(x-xc)2+(y-yc)2=R2{根据已知的Xc和Yc,以及t可以确定一个圆。(2)显示数学曲线描绘程序:显示曲线的绘制就是在已知的坐标系上,按照方程要求(3)贝塞尔曲线的绘制:贝赛尔曲线的每一个顶点都有两个控制点,用于控制在顶点会发生变化。例如下面的公式:i=0本例体现的主要是圆的快速算法,这里的主要算法是:{t是圆的某一点与X轴之间的夹角。Xc和Yc分别是圆的中心,以上一个终点为下一个的//圆的参数曲线x=f(t)privatedoublefx(doublet){returnreturnMath.cos(t);}//圆的参数曲线y=f(t)privatedoublefy(doublet){returnMath.sin(t);}//描绘曲线y=x^3-1privatedoublef(doublex){returnreturnx*x*x-1;}for(t=0;t<=1;t+=0.01){//参数法求点坐标for(i=0;i<n;i++){//4个节点x1=x1+(int)(Bin(n-1,i,t)*p[i].x);y1=y1+(int)(Bin(n-1,i,t)*p[i].y);g.drawLine(x0,y0,x1,y1);//划短直线x0=x1;//下一折线y0=y1;x1=0;y1=0;//circleParam.java//参数曲线描绘程序importjava.awt.*;//绘图基于javaAWT包importjava.applet.Applet;//定义参数曲线描绘类publicclasscircleParamextendsApplet{MyCanvasm;doubledoubledoubledouble//定义MyCanvas的对象xmin=-1.2;//x轴的最小值ymin=-1.2;//y轴的最小值xmax=1.2;//x轴的最大值ymax=1.2;//y轴的最大值//Applet程序的自动初始化方法initsetSize(500,500);m=newMyCanvas(this);//生成MyCanvas类的对象}//圆的参数曲线x=f(t)privatedoublefx(doublet){returnMath.cos(t);}//圆的参数曲线y=f(t)privatedoublefy(doublet){returnMath.sin(t);}//Applet程序的描绘方法paintpublicvoidpaint(Graphicsg){m.setBackground(Color.gray);//背景色m.setColor(Color.red);//前景色m.setWindow(xmin,xmax,ymin,ymax);//用户坐标系范围//缺省的视图为m.setViewport(0,1,0,1)和JavaAWT窗口大小一样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);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);doubledoubledoublet=0.0;x=fx(t);y=fy(t);m.moveTo(x,y);//抬笔移到起点doublex0=x,y0=y;//记住起点doubledeltat=2*Math.PI/step;for(inti=0;i<step;i++){t+=deltat;x=fx(t);y=fy(t);m.lineTo(x,y);//画直线到该点}m.lineTo(x0,y0);//画直线到起点,结束}//描绘方法paint结束}//参数曲线描绘类结束//explicitCurve.java//显式曲线描绘程序importjava.awt.*;//绘图基于javaAWT包importjava.applet.Applet;//定义显式曲线描绘类publicclassexplicitCurveextendsApplet{MyCanvasm;privatedoubledoubledoubledoubledouble//定义MyCanvas的对象xmin=-4;ymin=-4;xmax=4;ymax=4;//x轴的最小值//y轴的最小值//x轴的最大值//y轴的最大值gDelta=0.10;//坐标轴刻度间距//Applet程序的自动初始化方法initsetSize(500,500);m=newMyCanvas(this);//生成MyCanvas类的对象}//描绘曲线y=x^3-1privatedoublef(doublex){returnx*x*x-1;}//Applet程序的描绘方法paintpublicvoidpaint(Graphicsg){m.setBackground(Color.gray);//背景色m.setColor(Color.blue);//前景色m.setWindow(xmin,xmax,ymin,ymax);//用户坐标系范围//缺省的视图为m.setViewport(0,1,0,1)和JavaAWT窗口大小一样m.drawLine(xmin,0,xmax,0);//画x轴及刻度线for(inti=(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(intj=(int)ymin;j<=(int)ymax;j++){m.drawLine(-gDelta,(double)j,gDelta,(double)j);m.drawString(String.valueOf(j),-0.4,j-gDelta);}doublex=-2.0;//曲线的起始点doubley=f(x);m.moveTo(x,y);//抬笔移动到xy点处doubledeltaX=0.05;//x的步长for(inti=0;i<80;i++){//x方向走80步x+=deltaX;y=f(x);m.lineTo(x,y);//落笔画直线到xy点处}}//描绘方法paint结束}//显式曲线描绘类结束(3)package实验4;//Java图形学之贝赛尔曲线Application程序//贝塞尔曲线是依据四个位置任意的点坐标绘制出的一条光滑曲线。//本程序直接在JAVAAWT坐标系下绘图(没有用户坐标系和视图)//考试内容1:利用MyCanvas包,加上用户坐标系,四个点的坐标为用户坐标系//考试内容2:把n个点用贝塞尔曲线分段连接为一条光滑曲线importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;//贝赛尔曲线类publicclassBezierLineextendsFrame//继承窗体implementsActionListener,ComponentListener{//接口privateButtonbutton_start,button_close;//两个按钮//内部类定义节点类protectedclassNodeextendsObject{protectedNode(){//构造1this.x=0;this.y=0;}protectedNode(intx,inty){//构造2this.x=x;this.y=y;}}//结束内部节点类privateNodep[]=newNode[4];//塞尔曲线4个节点//贝赛尔曲线类构造方法publicBezierLine(){super("Bezier曲线");//调用父类Frame的构造方法,显示窗口标题this.setSize(500,500);this.setLayout(newFlowLayout());button_start=newButton("划线");button_start.addActionListener(this);button_close=newButton("关闭");button_close.addActionListener(this);/*p[0]=newNode(50,150);Node(100,250);Node(150,300);Node(200,350);*//*p[0]=newNode(100,200);p[1]=newNode(200,100);Node(300,200);Node(200,300);*/Node(100,260);Node(150,150);Node(250,120);p[3]=newNode(330,250);this.add(button_start);this.add(button_close);this.setVisible(true);//显示窗口和界面}//结束贝赛尔曲线类构造方法//辅助函数:求t的i次方publicdoublepow(doublet,inti){if(t==0&&i==0)return1;elsereturnMath.pow(t,i);}//辅助函数:递归求n的阶乘publicintfactorial(intn){if(n==0||n==1)return1;elsereturnn*factorial(n-1);}//定义Beinstein函数publicdoubleBin(intn,inti,doublet){doubletm;tm=factorial(n)/(factorial(i)*factorial(n-i))*pow(t,i)*pow(1-t,n-i);}//定义paint函数publicvoidpaint(Graphicsg){inti,j,n,x1=0,y1=0,x0,y0;doublet;n=4;//贝赛尔4个节点g.setColor(Color.red);g.fillOval(p[0].x-5,p[0].y-5,10,10);//实心圆for(j=1;j<n;j++){//描点,连线g.fillOval(p[j].x-5,p[j].y-5,10,10);g.drawLine(p[j-1].x-1,p[j-1].y-1,p[j].x-1,p[j].y-1);}x0=p[0].x;//起点y0=p[0].y;g.setColor(Color.blue);for(t=0;t<=1;t+=0.01){//参数法求点坐标for(i=0;i<n;i++){//4个节点x1=x1+(int)(Bin(n-1,i,t)*p[i].x);y1=y1+(int)(Bin(n-1,i,t)*p[i].y);g.drawLine(x0,y0,x1,y1);//划短直线x0=x1;//下一折线y0=y1;x1=0;y1=0;}//定义按钮事件响应函数publicvoidactionPerformed(ActionEvente){if(e.getSource()==button_start)repaint();//调用paint()绘图if(e.getSource()==button_close)System.exit(0);//结束}//窗口缩放事件publicvoidcomponentResized(ComponentEvente){}//其它事件响应虚函数public

温馨提示

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

评论

0/150

提交评论