计算机图形学实验4实验报告.doc
《计算机图形学实验4实验报告.doc》由会员分享,可在线阅读,更多相关《计算机图形学实验4实验报告.doc(10页珍藏版)》请在冰豆网上搜索。
实验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个