- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
数学与软件科学学院实验报告
学期:2010至2011第一学期2010年10月5日
课程名称:计算机图形学专业:信息与计算科学2007级5班
实验编号:03实验工程:圆弧生成算法
指导教师:庞朝阳学号实验成绩:
一、实验目的及要求
1:圆弧上的八个对称点的算法描述;
2:了解圆弧的的根本绘制算法;
3:绘制椭圆;
二.根本思想
1:圆弧被定义为到给定中心位置〔x0,y0〕距离为r的点集,圆心为与原点的圆有四条对称轴:x=0,y=0,x=y,x=-y。圆弧上一点〔x,y〕,那么可以的到关于四条对称轴的其他7个点〔八对称性〕,因此只需要扫描八分之一的圆弧就可以求的整个圆弧的所有点。
三:首先来了解一下圆弧上的八个对称点的算法描述〔以中心在原点,半径为整数R的圆为例〕。
Voidcirclepoints(intx,inty,intcolor)
{
Setpixel(x,y,color);setpixel(y,x,color);
Setpixel(-x,y,color);setpixel(y,-x,color);
Setpixel(x,-y,color);setpixel(-y,x,color);
Setpixel(-x,-y,color);setpixel(-y,-x,color);
}
四:八分之一圆弧的扫描变换的实现。
算法根据圆的根本方,沿X轴从0到/2R,以单位步长计算
对应的y值来获得圆周上每点的位置:y=,
缺点:算法每一步均包含大量的复杂计算〔浮点乘〕且所绘制的像素间隔不一致
解决方法:使用极坐标r和来计算圆弧上的点
∈〔0,〕
该算法使用了三角函数和浮点运算,运算速度依然很慢。
五:中点画圆法〔以从〔0,R〕到〔R/,R/〕的1/8圆为例〕
根本原理
假定当前已确定了圆弧上的一个个像素点P(x,y),那么下一像素点只会是右方的P(x,y)或右下方的P〔x,y〕如图
构造函数F〔x,y〕=x+y-R,对于圆上的点有F〔x,y〕=0;对于圆外点有F〔x,y〕0,对于圆内点有F〔x,y〕0
设M为P、P的中点,即M〔x,y〕.那么当F〔M〕0时,中点M在圆内,即P离圆弧较近,那么取点P为F的下一像素。
F〔M〕0时,P离圆弧较近,取P为F的下一像素点
当F〔M〕=0时,约定取P。
根据以上原理,构造判别式:
d=F(M)=F〔x,y〕=(x)+(y)-R
假设d0,那么取P为下一像素点,且再下一像素点的判别式为
d=F(M)=F〔x,y〕=(x)+(y)-R
=d+2x+3
假设d0那么取p作为下一像素点,且再下一像素点的判别式为
d=F〔x,y〕=(x)+(y)-R
=d+2(x-y)+5
取第一个像素点为〔0.R〕那么判断式d的初始值为:
d=F=1.25-R
为防止浮点运算,令e=d-0.25
此时初始化运算d=1.25-R对应于e=1-R
判别式d0对应于e-0.25,又由于e的初始值和运算过程中的增值为整数故e始终为整数,那e-0.25可用e0代替。
2.代码实现及结果:
#includeiostream
#includestdafx.h
usingnamespacestd;
classYuan
{
public:
intx;
inty;
intr;
intcolor;
public:
voidMidpointCircle(intr,intcolor,CDC*pDC);
voidCirclePoints(intx,inty,intcolor,CDC*pDC);
voidChu(intx,inty);
};
voidYuan::Chu(intx,inty)
{
this-x=x;
this-y=y;
}
voidYuan::CirclePoints(intx,inty,intcolor,CDC*pDC)
{
pDC-SetPixel(x+200,y+200,color);
pDC-SetPixel(y+200,x+200,color);
pDC-SetPixel(-x+200,y+200,color);
pDC-SetPixel(y+200,-x+200,color);
pDC-SetPixel(x+200,-y+200,color);
pDC-SetPixel(-y+200,x+200,color);
pDC-SetPixel(
文档评论(0)