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

上传人:b****8 文档编号:8942746 上传时间:2023-05-16 格式:DOCX 页数:16 大小:123.60KB
下载 相关 举报
《计算机图形学》实验4实验报告.docx_第1页
第1页 / 共16页
《计算机图形学》实验4实验报告.docx_第2页
第2页 / 共16页
《计算机图形学》实验4实验报告.docx_第3页
第3页 / 共16页
《计算机图形学》实验4实验报告.docx_第4页
第4页 / 共16页
《计算机图形学》实验4实验报告.docx_第5页
第5页 / 共16页
《计算机图形学》实验4实验报告.docx_第6页
第6页 / 共16页
《计算机图形学》实验4实验报告.docx_第7页
第7页 / 共16页
《计算机图形学》实验4实验报告.docx_第8页
第8页 / 共16页
《计算机图形学》实验4实验报告.docx_第9页
第9页 / 共16页
《计算机图形学》实验4实验报告.docx_第10页
第10页 / 共16页
《计算机图形学》实验4实验报告.docx_第11页
第11页 / 共16页
《计算机图形学》实验4实验报告.docx_第12页
第12页 / 共16页
《计算机图形学》实验4实验报告.docx_第13页
第13页 / 共16页
《计算机图形学》实验4实验报告.docx_第14页
第14页 / 共16页
《计算机图形学》实验4实验报告.docx_第15页
第15页 / 共16页
《计算机图形学》实验4实验报告.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《《计算机图形学》实验4实验报告.docx》由会员分享,可在线阅读,更多相关《《计算机图形学》实验4实验报告.docx(16页珍藏版)》请在冰点文库上搜索。

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

《计算机图形学》实验4实验报告

实验4实验报告格式

《计算机图形学》实验4实验报告

实验题目:

参数曲线绘制

实验内容:

1圆的参数曲线绘制。

2显式数学曲线描绘程序。

3贝赛尔曲线绘制。

编写程序调用验证之。

参考资料:

1circleParam.java

2explicitCurve.java

3BezierLine.java

4数学曲线绘制.ppt和实验3的参考ppt

基本概念:

(详细叙述自己对实验内容的理解)

(1)圆的参数曲线绘制:

  圆的参数曲线绘制就是按照圆的定义,利用步长,得在显示域上每一点的位置,然后绘制,圆是图形中经常使用的元素,圆被定义为所有离一中心位置

距离为给定值 

的点集,其函数方程为:

        

参数方程为:

根据已知的Xc和Yc,以及t可以确定一个圆。

(2)显示数学曲线描绘程序:

显示曲线的绘制就是在已知的坐标系上,按照方程要求在固定的点画点,然后连接成一条线,例如如果曲线的方程式:

,利用这个公式的递推演算,我们依次从-x到+x来绘制。

(3)贝塞尔曲线的绘制:

贝赛尔曲线的每一个顶点都有两个控制点,用于控制在顶点两侧的曲线的弧度。

它是应用于二维图形应用程序的数学曲线。

曲线的定义有四个点:

起始点、终止点(也称锚点)以及两个相互分离的中间点。

滑动两个中间点,贝塞尔曲线的形状会发生变化。

例如下面的公式:

算法设计:

(详细叙述自己设计的的算法)

(1)圆的算法设计:

 

本例体现的主要是圆的快速算法,这里的主要算法是:

 t是圆的某一点与X轴之间的夹角。

Xc和Yc分别是圆的中心,以上一个终点为下一个的起点。

改变t的值,就可以得到一个圆。

体现在代码中就是:

//圆的参数曲线x=f(t)

privatedoublefx(doublet){

returnMath.cos(t);

}

//圆的参数曲线y=f(t)

privatedoublefy(doublet){

returnMath.sin(t);

}

(2)显示数学曲线绘制:

 

本例主要演示绘制曲线

,其基本算法:

利用这个公式的递推演算,我们依次从-x到+x来绘制。

体现在代码中就是:

//描绘曲线y=x^3-1

privatedoublef(doublex){

returnx*x*x-1;

}

(3)贝塞尔曲线绘制:

 

贝塞尔曲线是两个端点不变,中间的点在变,其连线使用圆弧来代替,其实就相当于模拟曲线。

体现在代码中就是:

for(t=0;t<=1;t+=0.01){//参数法求点坐标

for(i=0;i

x1=x1+(int)(Bin(n-1,i,t)*p[i].x);

y1=y1+(int)(Bin(n-1,i,t)*p[i].y);

}//i循环

g.drawLine(x0,y0,x1,y1);//划短直线

x0=x1;//下一折线

y0=y1;

x1=0;

y1=0;

}//参数t循环

代码:

(给出主要的Java程序和注解)

(1)package实验4;

//circleParam.java

//参数曲线描绘程序

importjava.awt.*;//绘图基于javaAWT包

importjava.applet.Applet;

//定义参数曲线描绘类

publicclasscircleParamextendsApplet{

MyCanvasm;//定义MyCanvas的对象

privatedoublexmin=-1.2;//x轴的最小值

privatedoubleymin=-1.2;//y轴的最小值

privatedoublexmax=1.2;//x轴的最大值

privatedoubleymax=1.2;//y轴的最大值

//Applet程序的自动初始化方法init

publicvoidinit(){

setSize(500,500);

m=newMyCanvas(this);//生成MyCanvas类的对象

}

//圆的参数曲线x=f(t)

privatedoublefx(doublet){

returnMath.cos(t);

}

//圆的参数曲线y=f(t)

privatedoublefy(doublet){

returnMath.sin(t);

}

//Applet程序的描绘方法paint

publicvoidpaint(Graphicsg){

m.setBackground(Color.gray);//背景色

m.setColor(Color.red);//前景色

m.setWindow(xmin,xmax,ymin,ymax);//用户坐标系范围

//缺省的视图为m.setViewport(0,1,0,1)和JavaAWT窗口大小一样

/*画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);

/*画圆*/

doublet=0.0;

doublex=fx(t);

doubley=fy(t);

m.moveTo(x,y);//抬笔移到起点

doublex0=x,y0=y;//记住起点

intstep=100;

doubledeltat=2*Math.PI/step;

for(inti=0;i

t+=deltat;

x=fx(t);y=fy(t);

m.lineTo(x,y);//画直线到该点

}

m.lineTo(x0,y0);//画直线到起点,结束

}//描绘方法paint结束

}//参数曲线描绘类结束

(2)package实验4;

//explicitCurve.java

//显式曲线描绘程序

importjava.awt.*;//绘图基于javaAWT包

importjava.applet.Applet;

//定义显式曲线描绘类

publicclassexplicitCurveextendsApplet{

MyCanvasm;//定义MyCanvas的对象

privatedoublexmin=-4;//x轴的最小值

privatedoubleymin=-4;//y轴的最小值

privatedoublexmax=4;//x轴的最大值

privatedoubleymax=4;//y轴的最大值

privatedoublegDelta=0.10;//坐标轴刻度间距

//Applet程序的自动初始化方法init

publicvoidinit(){

setSize(500,500);

m=newMyCanvas(this);//生成MyCanvas类的对象

}

//描绘曲线y=x^3-1

privatedoublef(doublex){

returnx*x*x-1;

}

//Applet程序的描绘方法paint

publicvoidpaint(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{

protectedintx,y;

protectedNode(){//构造1

this.x=0;

this.y=0;

}

protectedNode(intx,inty){//构造2

this.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);

//测试数据:

4个节点赋值

/*p[0]=newNode(50,150);

p[1]=newNode(100,250);

p[2]=newNode(150,300);

p[3]=newNode(200,350);*/

/*p[0]=newNode(100,200);

p[1]=newNode(200,100);

p[2]=newNode(300,200);

p[3]=newNode(200,300);*/

p[0]=newNode(100,260);

p[1]=newNode(150,150);

p[2]=newNode(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);

returntm;

}

//定义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

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

x1=x1+(int)(Bin(n-1,i,t)*p[i].x);

y1=y1+(int)(Bin(n-1,i,t)*p[i].y);

}//i循环

g.drawLine(x0,y0,x1,y1);//划短直线

x0=x1;//下一折线

y0=y1;

x1=0;

y1=0;

}//参数t循环

}

//定义按钮事件响应函数

publicvoidactionPerformed(ActionEvente){

if(e.getSource()==button_start)

repaint();//调用paint()绘图

if(e.getSource()==button_close)

System.exit(0);//结束

}

//窗口缩放事件

publicvoidcomponentResized(ComponentEvente){

repaint();

}

//其它事件响应虚函数

publicvoidcomponentMoved(ComponentEvente){}

publicvoidcomponentHidden(ComponentEvente){}

publicvoidcomponentShown(ComponentEvente){}

//========主方法========

publicstaticvoidmain(Stringarg[]){

BezierLinebl=newBezierLine();//定义对象

/*激活构造方法*/

}

}//结束贝赛尔曲线类

运行结果:

(给出运行结果的截屏和说明)

(1)

(2)

(3)

实验体会:

(简单说明学习到的知识点和收获)

1.学习了圆的曲线的画法

2.学习了数学曲线的画法,他是递推的一种方式来完成,不同的是他的步长可以由用户设置 

3.学习了贝塞尔曲线的画法

4.巩固了以前学习的画坐标,直线的方法

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2