- 1、本文档共38页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验一 直线、圆弧及曲线的生成算法
一、实验目的
1、几种直线生成算法的比较,特别掌握用Bresenham直线生成算法。
2、几种圆弧生成算法的比较,掌握Bresenham圆弧生成算法。
3、掌握用像素点法直接生成其它曲线的方法。
二、基本要求
1、用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。
2、用Bresenham生成算法在屏幕上绘制出圆弧的图形,用动画的方式表演图形的生成。
三、算法提示
1、有关直线生成算法有:DDA(数值微分)直线算法、逐点比较法、直线Bresenham生成算法。
直线Bresenham生成算法思想如下(第一象限,且斜率k1的情况 图2-1 a中的1a):
画点(x1,y1),dx=x2-x1,dy=y2-y1,计算误差初值P1=2dy-dx,i=1;
求直线下一点位置 xi+1=xi+1 如果Pi0,则yi+1=yi+1,yi+1=yi;
画点(xi+1,yi+1);
求下一个误差Pi+1点,如果Pi0,则Pi+1=Pi+2dy-2dx,Pi+1=Pi+2dy;
i=i+1,如果idx+1则转步骤2,否则结束操作。
Bresenham生成算法的优点如下;
1)不必计算直线的斜率,因此不做除法。
2)不用浮点数,只用整数。
3)只做整数加减运算和乘2运算,而乘2运算可以用移位操作实现。
Bresenham算法的速度很快,并适于用硬件实现。
对于图2-1 a中的2a,只需将xi+1=xi+1改为xi+1=xi-1。
对于图2-1 a中的1b,斜率k1的情况,可交换变量x和y,y每次长1个单位。对Pi进行判断,xi+1=xi或xi+1=xi+1。
2、有关圆弧生成算法有:逐点比较法、DDA(数值微分)直线算法、圆的Bresenham生成算法。
圆的生成算法一般将圆划分为8等份,只需计算(900,450)的八分之一圆弧,其它用对称法求得(参见图2-1 b)。
Bresenham生成算法思想如下(第一象限,且斜率k1的情况):
计算误差初值P1=3-2r,i=1,画点(0,r);
求下一个光栅点位置 xi+1=xi+1 如果Pi0,则yi+1=yi,yi+1=yi-1;
画点(xi+1,yi+1);
4) 求下一个误差Pi+1点,如果Pi0,则Pi+1=Pi+2xi+6,Pi+1=Pi+4(xi-yi)+10;
5) i=i+1,如果x=y则结束操作,否则转步骤2。
圆Bresenham算法的算式简单,只需做加减法和乘4运算
3.对屏幕布局的考虑
适当选取坐标,将屏幕分成几个区域性,在每个区域内实现一种算法,生成一个图形。也可用delay实现延时实现动画。
四、上机作业题及思考题
1、用正负法编程绘制圆弧
2、resenham生成算法绘制直线。
3、用Bresenham生成算法绘制圆。
五、参考源程序
1、 数值微分法生成斜率小于90的直线
/* DDA line 数值微分法生成斜率小于90的直线 */
#include math.h
#include display.h
main()
{
int xo,yo,xa,ya,i,j;
int dx,dy,c;
float ddx,ddy,x,y;
Initialize();
printf(input start x,y(x=0-640,y=0-480)\n);
scanf(%d,%d,xo,yo); /* 输入直线的两个点 */
printf(xa:%d-- 639 ,xo);
scanf(%d,xa);
printf( ya: 0 .. %d ,yo);
scanf(%d,ya);
printf(red line is system,yellow is create\n);
if (xa=xo xa=639 ya=0 ya=yo)
/* 数值微分法生成直线算法 */
{
outtextxy(xo,yo+5,o);
outtextxy(xa,ya-10,a);
dx=xa-xo;
dy=yo-ya;
if (dxdy) c=dx;
else c=dy;
ddx=dx*1.0/c;
ddy=dy*1.0/c;
x=xo*1.0;
y=yo*1.0;
setcolor(12);
line(xo,yo,xa,ya);
getch();
while (c=0)
{ i=round(x);
j=r
您可能关注的文档
最近下载
- DLT441-2004《火力发电厂高温高压蒸汽管道蠕变监督规程》.pdf VIP
- Unit3LivingLegendsReadingandThinking教学设计高中英语人教版.docx VIP
- 五年级美术《为作文画插图》.ppt VIP
- 2026届新高考物理冲刺复习“配速法”解决带电粒子在复合场中的运动.pptx VIP
- 玉米期货分析报告.docx VIP
- 铁道工程技术论文-铁路路基边坡病害及处理措施.docx
- 2025年小学语文部编版五年级下册《选择题》专项练习题(共4组,附答案)(必考.pdf VIP
- 信息系统应用安全第5部分:代码安全检测10929-2020-.pdf
- 月饼安全生产培训.pptx
- 2024年新高考Ⅰ卷、Ⅱ卷、甲卷诗歌鉴赏试题讲评课件.pptx
文档评论(0)