计算机图形学大作业Word格式.docx
- 文档编号:22838285
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:32
- 大小:320.38KB
计算机图形学大作业Word格式.docx
《计算机图形学大作业Word格式.docx》由会员分享,可在线阅读,更多相关《计算机图形学大作业Word格式.docx(32页珍藏版)》请在冰豆网上搜索。
并且x1>
x0恒成立,那么dx恒大于0;
且k=dy/dx;
方程y-k*x-b=0改写成y-(dy/dx)*x-b=0;
最终函数F(x,y)=y*dx-x*dy-B;
其中B=b*dx;
我们讨论
(1)0<
k<
=1的情况
沿着x轴的方向,x的值每次加一个单位,我们需要判断的就是纵坐标是加1还是保持原值。
我们判断的依据是,当中点(直线与小正方形边点的交点所在边的中点)与直线的关系,通过上面讨论的关系式进行判断。
我们知道点(x0,y0)在直线上,带入函数,函数值等于0;
我们将中点(x0+1,y0+0.5)带入函数F(x,y)中,F(x0+1,y0+0.5)=(y0+0.5)*dx-(x0+1)*dy-B=F(x0,y0)+0.5*dx-dy;
其中F(x0,y0)=0;
由于浮点数的出现会导致运算量的增大,我们令d=2*F(x,y),所以d0=dx-2*dy;
当d0>
0时,中点在直线的上方,我们选取中点下方的整数坐标对,即点(x0+1,y0),也就是x++,而y的值不变。
我们继续判断下一个中点(x0+2,y0+0.5),带入函数,d=2*F(x0+2,y0+0.5)=d0+(-2*dy);
其中d1=-2*dy看作是增量;
当d0<
=0时,中点在直线的下方,我们选取中点上方的整数坐标对,即点(x0+1,y0+1);
也就是x++,y++。
我们继续判断下一个中点(x0+2,y0+1.5),带入函数,d=2*F(x0+2,y0+0.5)=d0+2*(dx-dy);
其中d2=2*(dx-dy)看作是增量;
(2)0>
k>
=-1的情况
此时,情况有所不同,当沿着x轴,横坐标加单位1时,纵坐标在递减;
所以d0=-dx-2*dy;
0时,中点在直线上方,取中点下方的点,即x++,y--;
d1=-2*(dx+dy);
=0时,中点在直线下方,取中点上方的点,即x++,纵坐标的值保持不变;
d2=-2*dy;
(3)k>
1的情况
此时,我们需要沿着y轴的方向,纵坐标加单位1,而横坐标在递增;
我们需要判断的就是横坐标是加1还是保持原值。
编程实现:
3、以四连通区域为例说明种子填充算法的基本原理。
种子填充算法又称为边界填充算法。
其基本思想是:
从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。
如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。
这里的区域指已表示成点阵形式的填充图形,是像素的集合。
区域有两种表示形式:
内点表示和边界表示,内点表示,即区域内的所有像素有相同颜色;
边界表示,即区域的边界点有相同颜色。
区域填充指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。
区域填充算法要求区域是连通的。
区域可分为4向连通区域和8向连通区域。
4向连通区域指的是从区域上一点出发,可通过四个方向,即上、下、左、右移动的组合,在不越出区域的前提下,到达区域内的任意像素。
用这种方法填充的区域就称为四连通域;
这种填充方法称为四向连通算法。
4、举例说明中点分割线段裁剪算法并编程实现。
算法:
中点分割算法的大意是,首先对线段端点进行编码,并把线段与窗口的关系分为三种情况:
全在、完全不在和线段和窗口有交。
对前两种情况,进行一样的处理。
对于第三种情况,用中点分割的方法求出线段与窗口的交点。
即从p0点出发找出距p0最近的可见点A和从p1点出发找出距p1最近的可见点B,两个可见点之间的连线即为线段p0p1的可见部分。
从p0出发找最近可见点采用中点分割方法:
先求出p0p1的中点pm,若p0pm不是显然不可见的,并且p0p1在窗口中有可见部分,则距p0最近的可见点一定落在p0pm上,所以用p0pm代替p0p1;
否则取pmp1代替p0p1。
再对新的p0p1求中点pm。
重复上述过程,直到pmp1长度小于给定的控制常数为止,此时pm收敛于交点。
由于该算法的主要计算过程只用到加法和除2运算,所以特别适合硬件实现,同时也适合于并行计算。
A、B分别为距p0、p1最近的可见点,Pm为p0p1中点
5、什么是反走样?
以直线段的显示为例设计一种反走样方法。
反走样:
在光栅图形显示器上绘制非水平且非垂直的直线或多边形边界时,或多或少会呈现锯齿状或台阶状外观。
这是因为直线、多边形、色彩边界等是连续的,而光栅则是由离散的点组成,在光栅显示设备上表现直线、多边形等,必须在离散位置采样。
由于采样不充分重建后造成的信息失真,就叫走样(aliasing)。
而用于减少或消除这种效果的技术,就称为反走样(antialiasing)。
计算机生成图像时通常存在三种走样现象中的两种:
锯齿形边以及图形细节或纹理绘制失真。
第三种现象出现在显示非常微小对象的场合。
设计方法:
基本上反走样方法可分为两类。
第一类是提高分辨率即增加采样点(提高采样频率)。
然而,CRT光栅扫描设备显示非常精细光栅的能力是有限的,因此人们通常是在较高分辨率上对光栅进行计算,然后采用某种平均算法(滤除高频分量)得到较低分辨率的象素的属性,并显示在分辨率较低的显示器上。
这种方法称为超采样或后置滤波。
另一类反走样是把像素作为一个有限区域,对区域采样来调整像素的亮度,以光顺边界来减小锯齿现象。
这种方法等价于图像的前置滤波。
6、写出三次参数Ferguson曲线的代数形式并推导其几何形式。
代数形式:
几何形式:
其中,F0,F1,G0,G1称为调和函数(或混合函数)
7、①简述Bezier曲线的定义及性质;
②写出Bezier曲线的矩阵表达式;
③以3次Bezier曲线为例说明Bezier曲线分割递推deCastljan算法;
④绘制两条3次Bezier曲线,并将其拼接,使其在拼接处达到G1连续;
⑤绘制一条3次Bezier曲线,并将其旋转45°
。
定义:
Bezier曲线也是参数多项式曲线,它由一组控制多边形折线(控制多边形)顶点唯一地定义。
给定空间n+1个点的位置矢量Pi(i=0,1,2,…,n),则Bezier参数曲线上各点坐标的插值公式是:
其中,Pi构成该Bezier曲线的特征多边形,Bi,n(t)是n次Bernstein基函数:
0︒
=1,0!
=1
性质:
(1)端点性质
a.曲线端点位置矢量
由Bernstein基函数的端点性质可以推得,当t=0时,P(0)=P0;
当t=1时,P
(1)=Pn。
由此可见,Bezier曲线的起点、终点与相应的特征多边形的起点、终点重合。
b.切矢量
Bezier曲线的起点和终点处的切线方向和特征多边形的第一条边及最后一条边的走向一致。
c.二阶导矢
上式表明:
2阶导矢只与相邻的3个顶点有关,事实上,r阶导矢只与(r+1)个相邻点有关,与更远点无关。
得到Bezier曲线在端点的曲率分别为:
d.k阶导函数的差分表示
n次Bezier曲线的k阶导数可用差分公式为:
其中高阶向前差分矢量由低阶向前差分矢量递推地定义:
(2)对称性。
Bezier曲线形状相同,走向相反。
因为:
这个性质说明Bezier曲线在起点处有什么几何性质,在终点处也有相同的性质。
(3)凸包性
(4)几何不变性。
这是指某些几何特性不随坐标变换而变化的特性。
Bezier曲线的位置与形状与其特征多边形顶点Pi(i=0,1,...,n)的位置有关,它不依赖坐标系的选择,即有:
(5)变差缩减性。
若Bezier曲线的特征多边形P0P1...Pn是一个平面图形,则平面内任意直线与P(t)的交点个数不多于该直线与其特征多边形的交点个数,这一性质叫变差缩减性质。
此性质反映了Bezier曲线比其特征多边形的波动小,也就是说Bezier曲线比特征多边形的折线更光顺。
(6)仿射不变性
对于任意的仿射变换A:
即在仿射变换下,P(t)的形式不变。
DeCasteljau算法:
计算Bezier曲线上的点,可用Bezier曲线方程,但使用deCasteljau提出的递推算法则要简单得多。
设P0、P02、P2是一条抛物线上顺序三个不同的点。
过P0和P2点的两切线交于P1点,在P02点的切线交P0P1和P2P1于P01和P11,则如下比例成立:
这是所谓抛物线的三切线定理。
抛物线三切线定理
当P0,P2固定,引入参数t,令上述比值为t:
(1-t),即有:
t从0变到1,第一、二式就分别表示控制二边形的第一、二条边,它们是两条一次Bezier曲线。
将一、二式代入第三式得:
当t从0变到1时,它表示了由三顶点P0、P1、P2三点定义的一条二次Bezier曲线。
并且表明:
这二次Bezier曲线P02可以定义为分别由前两个顶点(P0,P1)和后两个顶点(P1,P2)决定的一次Bezier曲线的线性组合。
依次类推,由四个控制点定义的三次Bezier曲线P03可被定义为分别由(P0,P1,P2)和(P1,P2,P3)确定的二条二次Bezier曲线的线性组合,由(n+1)个控制点Pi(i=0,1,...,n)定义的n次Bezier曲线P0n可被定义为分别由前、后n个控制点定义的两条(n-1)次Bezier曲线P0n-1与P1n-1的线性组合:
由此得到Bezier曲线的递推计算公式:
这便是著名的deCasteljau算法。
用这一递推公式,在给定参数下,求Bezier曲线上一点P(t)非常有效。
上式中:
Pi0=Pi是定义Bezier曲线的控制点,P0n即为曲线P(t)上具有参数t的点。
deCasteljau算法稳定可靠,直观简便,可以编出十分简捷的程序,是计算Bezier曲线的基本算法和标准算法。
当n=3时,decasteljau算法递推出的Pik呈直角三角形,对应结果如图3.1.11所示。
从左向右递推,最右边点P03即为曲线上的点。
n=3时,Pin的递推关系
长度为t:
(1-t)的两段。
依次对原始控制多边形每一边执行同样的定比分割,所得分点就是第一级递推生成的中间顶点Pi1(i=0,1,...,n-1),对这些中间顶点构成的控制多边形再执行同样的定比分割,得第二级中间顶点Pi2(i=0,1,...,n-2)。
重复进行下去,直到n级递推得到一个中间顶点P0n即为所求曲线上的点P(t),如图3.1.12所示。
几何作图法求Bezier曲线上一点(n=3,t=1/4)
绘制及拼接:
旋转:
8、举例说明空间一物体绕空间一直线旋转的实现过程。
略
代码附录
【中点画线】
functionzd(x0,y0,x1,y1)
dx=x1-x0;
dy=y1-y0;
x=x0;
y=y0;
axis([050050])
set(gca,'
xtick'
0:
1:
50)
ytick'
gridon;
holdon;
plot(x,y,'
.'
);
if(dy/dx>
0&
&
dy/dx<
=1)
d0=dx-2*dy;
d1=-2*dy;
d2=2*(dx-dy);
while(x<
x1)
if(d0>
=0)
x=x+1;
d0=d0+d1;
elseif(d0<
0)
y=y+1;
d0=d0+d2;
end
holdon;
plot(x,y,'
)
pause(0.5);
end
-1&
d0=-dx-2*dy;
d1=-2*(dx-dy);
d2=-2*dy;
y=y-1;
1)
d0=2*dx-dy;
d2=2*dx;
d1=2*(dx-dy);
while(y<
y1)
y=y+1;
if(dy/dx<
-1)
d0=-2*dx-dy;
d1=-2*dx;
d2=-2*(dx+dy);
while(y>
【中点分割】
functionMainMenu()
%程序主菜单界面
leftbase=0;
bottombase=-50;
%初始化线段矩阵lines
setappdata(0,'
lines'
[]);
figure();
uicontrol('
Style'
'
pushbutton'
string'
生成线段'
position'
[200+leftbase300+bottombase10050],...
'
callback'
generate_callback'
裁剪'
[200+leftbase200+bottombase10050],...
sutherland_callback'
End
----------------------------------------------------------------------------------------------------------
functionLines=Cohen_Sutherland(line,Rectangle)
%编码裁剪算法
%line为线段端点矩阵,共四列,其数据含义如下:
%端点Ax坐标端点Ay坐标端点Bx坐标端点By坐标
%Rectangle为窗口边界值,共四个元素,其含义分别为Xwl,Xwr,Ywb,Ywt。
%
%首先检测参数是否合法
[rowcolumn]=size(line);
ifcolumn<
4||length(Rectangle)<
4
Lines=[];
fprintf('
参数不合法不合法'
return;
%程序中主要变量说明
%code为线段端点的编码矩阵,两行四列,第一行为点P1的编码,第二行为点P2的编码
%四列的含义为:
D0,D1,D2,D3
%依次处理line的各个线段
k=0;
fori=1:
length(line(:
1))
%取出第i条线段
P1=line(i,[1,2]);
P2=line(i,[3,4]);
%计算斜率
PP=P1-P2;
ifPP
(1)==0
k=inf;
else
k=PP
(2)/PP
(1);
finished=false;
while(~finished)
%对点P1和P2进行编码
code=[
P1
(1)<
Rectangle
(1),P1
(1)>
Rectangle
(2),P1
(2)<
Rectangle(3),P1
(2)>
Rectangle(4);
P2
(1)<
Rectangle
(1),P2
(1)>
Rectangle
(2),P2
(2)<
Rectangle(3),P2
(2)>
];
%P1,P2,k,code
%进行简取或简弃的判断
test=code(1,:
)|code(2,:
%判断是否简取
ifisempty(find(test>
0,1))
Lines=[Lines;
[P1,P2]];
finished=true;
%若当前线段处理完成,则退出
iffinished
break;
%判断是否简弃
)&
code(2,:
if~isempty(find(test>
0,1))
%确保P1在窗口之外
ifisempty(find(code(1,:
)>
%交换P1,P2的坐标值和编码
PT=P1;
P1=P2;
P2=PT;
PT=code(1,:
code(1,:
)=code(2,:
)=PT;
%从低位开始找编码值为1的地方
D=find(code(1,:
0,1);
ifD<
=2
%此时P1位于窗口的左边或右边
ifk==0
%若是水平线,则y不变,x变为窗口的左边界或右边界
%且此时k不会等于inf,否则线段处于简弃状态。
P1
(1)=Rectangle(D);
%P1
(2)=Rectangle(find(code(1,[3,4])>
0,1));
%若线段是斜线,则计算y值,x值变为窗口的左边界或右边界
P1=[Rectangle(D),P1
(2)+k*(Rectangle(D)-P1
(1))];
%此时P1位于窗口的上方或下方
ifk==inf
%若线段是竖直线,则x不变,y变为窗口的上边界或下边界
%且此时k不会等于0,否则线段将处于简弃状态。
P1
(2)=Rectangle(D);
%若线段是斜线,则计算x值,y值变为窗口的上边界或下边界。
P1=[P1
(1)+(Rectangle(D)-P1
(2))/k,Rectangle(D)];
%对P1和P2重新编码,再次计算。
%pause(10);
%scanf(D,'
%d'
%inputdlg('
'
%对最终点进行取整运算
%Lines=round(Lines);
functionDrawOriginalGraph()
%绘制原始线段图形函数
%lines矩阵共四列,每一列的含义如下:
%端点Ax坐标端点Ay坐标端点Bx坐标端点By坐标
lines=getappdata(0,'
ifisempty(lines)
errordlg('
当前尚未生成线段,无法显示!
return;
figure('
name'
原始线段图形'
holdon;
length(lines(:
plot(lines(i,[1,3]),lines(i,[2,4]));
holdoff;
functiongenerate_callback()
%生成线段回调函数
prompt={'
输入线段条数'
线段端点x坐标最大值'
线段端点y坐标最大值'
};
%设置提示字符串
title='
;
%设置标题
numline=1;
%指定输入数据行数
defdata={'
20'
100'
%指定数据的默认值
Resize='
on'
%设置对话框大小为可调节的
answer=inputdlg(prompt,title,numline,defdata,Resize);
%若用户点击“取消”键,则直接退出
ifis
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 作业
![提示](https://static.bdocx.com/images/bang_tan.gif)