




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一 直线段的生成算法3.26-4.9一、实验目的及要求1、掌握Bresenham算法的原理;2、熟悉Bresenham算法的具体c语言实现;3、掌握dda算法的原理;4、熟悉dda算法的具体c语言实现。二、实验学时4学时三、实验任务1、 Bresenham算法的c语言实现2、 DDA算法的c语言实现四、实验重点、难点对Bresenham算法的原理以及c语言程序的具体实现 (一)Bresenham算法的实现#include stdafx.h#include graphics.h#include stdlib.h#include stdio.h#include conio.hvoid Bresenham_line(int x1,int y1,int x2,int y2,int value)int x,y,s1,s2,increx,increy,temp,interchange;int e,i;x=x1;y=y1;if(x2-x10)s1 = 1;else s1=-1;if(y2-y10)s2 = 1;else s2=-1;increx=abs(x2-x1);increy=abs(y2-y1);if (increyincrex)temp=increx;increx=increy;increy=temp;interchange=1;elseinterchange=0;e=2*increy-increx;for (i=1;i=0)if(interchange=1) x=x+s1;elsey=y+s2; e=e-2*increx;if (interchange=1)y=y+s2;elsex=x+s1; e=e+2*increy; void main()int gdriver = DETECT, gmode, errorcode;initgraph(&gdriver, &gmode, );Bresenham_line(100,100,300,300,5);getch();closegraph(); (二)DDA算法的实现#include stdafx.h#include graphics.h#include stdlib.h#include stdio.h#include math.h#include conio.hvoid DDAline(int x1,int y1,int x2,int y2,int color)float increx,increy,x,y,length;int i;if( abs ( x2 - x1 ) abs ( y2 - y1 ) )length = abs( x2 - x1 );elselength = abs( y2 - y1 );increx = (x2-x1)/length;increy = (y2-y1)/length;x=x1;y=y1;for(i = 1; i0;i-,j-)setfillstyle(EMPTY_FILL,0);pieslice(387+j,290,start,end,37);pieslice(525+j,290,start,end,37);start+=40;end+=40;delay(5); /处于运动状态的自行车车轮的轴线的绘制 putimage(i-1,200,w,COPY_PUT);line(2,327,562,327);delay(10); /自行车行驶动画的实现 for(i=0;ix=xx;new_node-y=yy;new_node-next=stack;stack=new_node;/pop an elementvoid pop(int &xx,int &yy)link top;top=stack;xx=stack-x;yy=stack-y;stack=stack-next;delete top;/fill the plotvoid fill(int x,int y)int x0,y0,xl,xr,xlold,xrold;/*x0,y0用来标记x,y的值,xl记录x的最左值,xr记录x的最右值*/int go=0,go2=0;int i=0;push(x,y);/种子像素入栈while(stack!=0)/如果栈不空则循环,stack=0表示栈空go=0; /go只是一个标记pop(x,y); /从栈中将栈顶元素弹出putpixel(x,y,4); /将该点置色x0=x+1;/取种子右边的像素while(getpixel(x0,y)!=4)/fill right 填充右边像素putpixel(x0,y,4);x0=x0+1;xr=x0-1;/记录最右值xrold=xr;/再记录一次最右值,以备后用x0=x-1;/取种子左边的像素while(getpixel(x0,y)!=4)/fill left 填充左边像素putpixel(x0,y,4);x0=x0-1;xl=x0+1;/记录最左值xlold=xl;/再记录一次最左值,以备后用y0=y+1;/go up 向上移一条扫描线go2=0;/go2 也只是一个用来标记的变量while(xrxl&go=0)/查找上一条线的最右值,并记录为xrif(getpixel(xr,y0)=4)/看看上一条扫描线最右值是否超出了当前扫描线的坐标范围xr=xr-1; /如果超出,则减1elsego=1;/若go=1这句执行的话就说明找到了最右值,并在while中的go=0中判断并退出whilewhile(xlxr&go2=0)/查找上一条线的最左值,并记录为xlif(getpixel(xl,y0)=4)/看看上一条扫描线最左值是否超出了当前扫描线的坐标范围xl=xl+1; /如果超出,则加1elsego2=1;/go2=1这句执行就说明找到了最左值,并在此while中的go2=0中退出whileif(go=1&go2=1)/如果找到了最左值和最右值,则执行下面的语句push(xr,y0);/先将上一条线上的最右点作为种子点入栈for(i=xl;ixl&go=0)/找下一条扫描线的最右像素if(getpixel(xr,y0)!=4)go=1;elsexr-;while(xlxr&go2=0)/找下一条扫描线的最左像素if(getpixel(xl,y0)!=4)go2=1;elsexl+;if(go=1&go2=1)/如果找到最左和最右,则执行push(xr,y0);for(i=xl;i=xr;i+)if(getpixel(i,y0)!=4)else if(getpixel(i-1,y0)!=4)push(i-1,y0);void main()void fill(int x,int y);int gdriver,gmode;/*显示模式*/detectgraph(&gdriver,&gmode);initgraph(&gdriver,&gmode,);int i,j;int n,u,px,py,px0,py0,px1,py1;int ya=0,yi=getmaxy();printf(pleas input the number of the polygons:);scanf(%d,&u);/看看究竟有多少个多边形(可能多边形里包含了多边形)for(int k=0;ku;k+)printf(pleas input the number of the top points:);scanf(%d,&n);/看看该多边形究竟有几个端点for(i=0;in;i+)/从键盘接受各顶点的坐标,依次入栈,并记录最大Y值和最小Y值printf(please input the coordinate of the points-like:100,200 :);scanf(%d,%d,&px,&py);if(yapy)yi=py;/yi是最小Y值push(px,py);setbkcolor(0); /cleardevice(); setcolor(4);pop(px0,py0);/输入的最后一个顶点出栈px=px0;py=py0;/记录最后一个顶点/draw the plotwhile(stack != 0)pop(px1,py1);line(px0,py0,px1,py1);px0=px1;py0=py1;delay(500);/时延,慢慢画line(px0,py0,px,py);/依次画线,画出多边形/画完多边形后,栈为空/find the y valuej=(ya+yi)/2;/找Y的中间值,就是第一个种子点的Y值i=0;n=0;/记录入栈个数/find the seed elementwhile(igetmaxx()&n!=2)/按X值从0到X最大值依次查找,并在入栈个数为2的时候退出if(getpixel(i,j)=4)/如果是多边形上的点,则入栈,用n记录入栈的个数push(i,j);n=n+1;i=i+1;/i是记录当前的X值pop(i,j);/第二个交点出栈pop(n,j);/第一个交点出栈,虽然覆盖了Y值,但这不重要,我们要的是X值i=(i+n)/2;/现在i是我们要找的种子点的X值 /fill the plotfill(i,j);/将种子点作为参数传入fill()方法delay(1000);outtextxy(100,410,the red line was drawing,fill ove
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年雇佣执行经理合同范本
- 医疗器械法规知识培训试题及答案(单体药店或连锁门店)
- 2025年VTE、伤口造口相关知识培训后考核试题及答案
- 树木寻访记探究课件
- 2025年山西省保密知识教育考试题(含答案)
- 2024年设备监理师之设备监理合同练习题一及答案
- 2024年事业单位考试南京A类《职业能力倾向测验》高分冲刺试题含解析
- 标点符号的争吵课件
- 标准差已知统计法课件
- 2025红十字救护员理论考核试题及答案
- 2025届甘肃平凉中考真题试卷数学试题【含答案】
- 装饰装修施工应急响应措施
- JJG 264-2025谷物容重器检定规程
- 桂电计〔2025〕91号附件-电网工程建设预算编制与计算标准实施细则
- 实验室人员培训
- 人工流产护理查房
- 公司反恐防暴管理制度
- 《宜宾陈酿草本白酒》标准编制说明
- 政治●广西卷丨2024年广西普通高中学业水平选择性考试高考政治真题试卷及答案
- 2025血管内导管相关性血流感染预防与诊治指南
- 合肥民政局离婚协议书
评论
0/150
提交评论