贵州大学实验二圆和椭圆的生成算法.docx
- 文档编号:5903579
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:14
- 大小:82.71KB
贵州大学实验二圆和椭圆的生成算法.docx
《贵州大学实验二圆和椭圆的生成算法.docx》由会员分享,可在线阅读,更多相关《贵州大学实验二圆和椭圆的生成算法.docx(14页珍藏版)》请在冰豆网上搜索。
贵州大学实验二圆和椭圆的生成算法
贵州大学实验报告
学院:
计算机科学与信息学院专业:
软件工程班级:
102
姓名
学号
实验组
实验时间
指导教师
成绩
实验项目名称
实验二:
圆和椭圆的生成算法
实验目的
掌握圆和椭圆的中点算法及二次差分法,了解并掌握在光栅显示系统中圆和椭圆的生成和显示算法,并在自己熟悉的平台上实现相应的测试代码。
实验要求
1,掌握圆的基本特性(八对称性)
2,掌握椭圆的基本特性(四对称性)
3,掌握中点算法和二次差分法的思想
4,熟练的编写出测试代码
实验原理
一、中点算法画圆和椭圆的实验原理
(一)画圆
因为圆具有八对称性,可以先画出第二个八分圆,利用八对称性画出其它八分圆。
已知圆弧的隐函数的形式为:
F(x,y)=x2+y2-R2=0。
所以可知:
F(x,y)>0,(x,y)在园外;
F(x,y)<0,(x,y)在园内,
F(x,y)=0,(x,y)在园上。
假设(xi,yi)为已确定的象素坐标,则下一个象素只能是正右方的T点或右下方的B点。
设M是T和B的中点,则M的坐标为(xi+1,yi-0.5)
如F(M)<0,则M在园内,下一点取正右方T点;
如F(M)>0,则M在园外,下一点取右下方B点;
如F(M)=0,则M在园上,下一点取T点或B点均可。
构造判别式:
d=F(M)=F(xi+1,yi-0.5)=(xi+1)2+(yi-0.5)2-R2
(1)d<0,中点在圆内,选正右方的T点,再下一个象素的判别式为:
dnew=F(xi+2,yi-0.5)=(xi+2)2+(yi-0.5)2-R2=d+(2xi+3)
则d的增量为:
ΔT=2xi+3
(2)d>=0,中点在圆外,选右下方的B点,再下一个象素的判别式为:
dnew=F(xi+2,yi-1.5)=(xi+2)2+(yi-1.5)2-R2=d+(2xi+3)+(-yi+2)
=d+2(xi-yi)+5
则d的增量为:
ΔB=2(xi-yi)+5
d初始值为:
d0=F(1,R-0.5)=1+(R-0.5)2-R2=1.25-R
因为在d的运算中包含了浮点数的运算,使复杂度提高,为了消除d中的浮点数运算,可以令d=1-r.
(二)画椭圆
为方便说明,可以选取中心在原点的椭圆,方程为:
x2/a2+y2/b2=1。
则隐函数的形式为:
F(x,y)=b2x2+a2y2-(ab)2=0.因为椭圆具有四对称性,可只考虑第一象限的椭圆,其他的椭圆弧可以通过对称求得。
椭圆上的法向量可以将椭圆弧分为上下两个部分,在上半部分,x的增量大于y的增量,在下半部分,y的增量大于x的增量。
可以得到这样的一个不等式来判别椭圆弧是否已从上半部分过度到下半部分:
b2(Xp+1) 椭圆的正负划分性: F(X,Y)=0: (X,Y)在椭圆上 F(X,Y)<0: (X,Y)在椭圆内 F(X,Y)>0: (X,Y)在椭圆外 (1)对于椭圆弧的上半部分: 假设Pi(xi,yi)已确定,则下一对待选像素的中点是: M(xi+1,yi-0.5) d=F(M)=F(xi+1,yi-0.5)=b2(xi+1)2+a2(yi-0.5)2-a2b2 初始点为(0,b),则M为(1,b-0.5),d的初值为: d0=F(1,b-0.5)=b2+a2/(-b+1/4) (a)当d<0(取T点)时,下一点(i+1)点的坐标为(xi+1,Yi),为确定i+2点取的下一个中点M的坐标为: (xi+2,yi-0.5).则d1=F(xi+2,yi-0.5),故增量为: b2(2xi+3) (b)当d>=0(取B点)时,下一点(i+1)点的坐标为(xi+1,Yi-1),为确定i+2点取的下一个中点M的坐标为: (xi+2,Yi-1.5).则d2=F(xi+2,yi-1.5),故增量为: b2(2xi+3)+a2(-2yi+2). (2)对于椭圆弧的下半部分 在每一次迭代中都要判断椭圆是否已从上半部进入了下半部,如果b2x>=a2y,则椭圆进入下半部份,此时令△y=1,且: d0=b2(x+0.5)2+a2(y-1)2-a2b2 (a)若d<0,则M在椭圆内部,取右下方像素R,则d=F(xp+1.5,yp-2),增量为2(b2xi+1-a2yi+1)+a2 (b)若d>=0,M在椭圆的外部,取正下方像素L,则d=F(xp+0.5,yp-2),增量为: a2(-2yi+1+1) 下半部分的终止条件为y=0 二、二次差分法画圆和椭圆的实验原理 (一)画圆 二次差分法的基本思想就是在现选像素点的基础上进行二次选择,计算增量,从而达到消除中点算法中的乘法运算,降低增量阶数的目的。 假设现有点为P(xp,yp),在中心法画圆中已求得正右方的增量为ΔT=2xi+3,右下方的增量为ΔB=2(xi-yi)+5 若现已选择P(xp,yp)点正右方的T点,下一个点可以选T点正右方的点和T点右下方的点。 如果选择T点正右方的点,增量为: ΔTE=2(xp+1)+3-(2xp+3)=2; 如果选择T点右下方的点,增量为: ΔTSE=2(xp+1-yp)+5-[2(xp-yp)+5]=2 若现已选择P(xp,yp)点右下方的B点,下一个点可以选择B点正右方的点和B点右下方的点。 如果选择B点正右方的点,增量为: ΔBE=2(xp+1)+3-(2xp+3)=2; 如果选择B点右下方的点,增量为: ΔBSE=2[(xp+1)-(yp-1)]+5-[2(xp-yp)+5]=4; 通过以上的分析可以得知,二次差分法画圆比中心法画圆简单,因为它消除了中心法画圆中的乘法运算,降低了增量的阶数,从而降低了算法的复杂度。 (三)画椭圆 二次差分法画椭圆的原理类似于画圆,区别在于要考虑椭圆弧的上下两个部分。 对于椭圆弧的上半部分: 假设现有点为P(xp,yp),在中心法画椭圆中已求得正右方的增量为ΔT=b2(2xi+3),右下方的增量为ΔB=b2(2xi+3)+a2(-2yi+2)。 若现已选择P(xp,yp)点正右方的T点,下一个点可以选T点正右方的点和T点右下方的点。 如果选择T点正右方的点,增量为: ΔTE=b2[2(xi+1)+3]-[b2(2xi+3)]=2b2 如果选择T点右下方的点,增量为: ΔTSE=b2[2(xi+1)+3]+a2(-2yi+2)-[b2(2xi+3)+a2(-2yi+2)]=2b2 若现已选择P(xp,yp)点右下方的B点,下一个点可以选择B点正右方的点和B点右下方的点。 如果选择B点正右方的点,增量为: ΔBE==b2[2(xi+1)+3]-[b2(2xi+3)]=2b2 如果选择B点右下方的点,增量为: ΔBSE=b2[2(xi+1)+3]+a2[-2(yi-1)+2]-[b2(2xi+3)+a2(-2yi+2)]=2b2+2a2. 对于椭圆弧的下半部分: 假设现有点为P(xi,yi),在中心法画椭圆中已求得正下方的增量为ΔL=a2(-2yi+3),右下方的增量为ΔR=b2(2xi+2)+a2(-2yi+3)。 若现已选择P(xi,yi)点正下方的L点,下一个点可以选L点正下方的点和L点右下方的点。 如果选择L点正下方的点,增量为: ΔLS=a2[-2(yi-1)+3]-[a2(-2yi+3)]=2a2 如果选择L点右下方的点,增量为: ΔLSE=b2(2xi+2)+a2[-2(yi-1)+3]-[b2(2xi+2)+a2(-2yi+3)]=2a2 若现已选择P(xi,yi)点右下方的R点,下一个点可以选择R点正下方的点和R点右下方的点。 如果选择R点正下方的点,增量为: ΔRS=a2[-2(yi-1)+3]-[a2(-2yi+3)]=2a2 如果选择R点右下方的点,增量为: ΔRSE=b2[2(xi+1)+2]+a2[-2(yi-1)+3]-[b2(2xi+2)+a2(-2yi+3)]=2b2+2a2 实验环境 硬件平台: PC机 软件: Windows平台,eclipse 编程语言: java 实验步骤 1.掌握中点算法和二次差分法画圆和椭圆的基本原理; 2.依据算法,在eclipse下编写源程序并进行调试; 3.对运行过程中的错误进行修改; 4.对运行结果进行分析与总结; 5.书写实验报告。 实验内容 中心算法画圆的核心代码如下: publicvoidmidPointDrawCircle(intr,Graphicsg){ intx,y; floatd; x=0; y=r; d=1-r; g.drawLine(x+MOVE,y+MOVE,x+MOVE,y+MOVE); g.drawLine(x+MOVE,-y+MOVE,x+MOVE,-y+MOVE); while(x<=y){ if(d<0){//M在圆的内部,取正右方的点 d+=2*x+3; x++; }else{//M在圆的外部,取右下方的点 d+=2*(x-y)+5; y--; x++; } //画对称位置上的圆 g.drawLine(x+MOVE,y+MOVE,x+MOVE,y+MOVE); g.drawLine(y+MOVE,x+MOVE,y+MOVE,x+MOVE); g.drawLine(-x+MOVE,y+MOVE,-x+MOVE,y+MOVE); g.drawLine(y+MOVE,-x+MOVE,y+MOVE,-x+MOVE); g.drawLine(x+MOVE,-y+MOVE,x+MOVE,-y+MOVE); g.drawLine(-y+MOVE,x+MOVE,-y+MOVE,x+MOVE); g.drawLine(-x+MOVE,-y+MOVE,-x+MOVE,-y+MOVE); g.drawLine(-y+MOVE,-x+MOVE,-y+MOVE,-x+MOVE); } } 中心算法画椭圆的核心代码如下: publicvoidmidPointDrawEllipse(inta,intb,Graphicsg){ intx,y; doubled1,d2; x=0; y=b; g.drawLine(x+MOVE,y+MOVE,x+MOVE,y+MOVE); g.drawLine(x+MOVE,-y+MOVE,x+MOVE,-y+MOVE); /*画椭圆的上半部分*/ d1=(b*b+a*a*(-b+0.25));//M的初始值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 贵州 大学 实验 椭圆 生成 算法