图形学实验三--线画图元生成算法实验

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《计算机图形学》实验报告线画图元生成算法实验姓名闫学森学号3013216087专业计算机科学与技术班级三班天津大学计算机科学与技术学院2015年12月5日一、实验目的(1)实现DDA直线生成算法(2)实现Bresenham直线生成算法(3)实现中点画圆算法二、实验内容(1)自定义直线段起始点和终点坐标;(2)采用不同的彩色显示两种算法生成的直线结果;三、实验结果四、实验分析和总结此实验是图形学的第一个算法,按照书上的步骤一步一步的实现也有难度。DDA算法比较简单,向上取整即可。Bresenham比较复杂,变量较多。两个算法有几个方面需要注意:1.斜率大于一,x,y坐标互换;2.斜率为负时,起始点与终止点坐标互换。五、源代码voidDrawCir(inta,intb,intx3,inty3,CDC*pDC){//画圆的对称点CPenmyPen1;myPen1.CreatePen(PS_SOLID,1,RGB(0,255,0));CPen*pOldPen=pDC-SelectObject(&myPen1);//设置点的颜色intx,y;//所画点的坐标//对称的八个点x=a+x3;//第一象限y=b+y3;for(inti=0;i3;++i){//将点所在的地方涂色pDC-MoveTo(100+x*3+i,100+y*3);pDC-LineTo(100+x*3+i,100+y*3+3);}for(inti=0;i3;++i){//将点所在的地方涂色pDC-MoveTo(100+y*3+i,100+x*3);pDC-LineTo(100+y*3+i,100+x*3+3);}x=-a+x3;//第三象限y=-b+y3;for(inti=0;i3;++i){//将点所在的地方涂色pDC-MoveTo(100+x*3+i,100+y*3);pDC-LineTo(100+x*3+i,100+y*3+3);}for(inti=0;i3;++i){//将点所在的地方涂色pDC-MoveTo(100+y*3+i,100+x*3);pDC-LineTo(100+y*3+i,100+x*3+3);}x=-a+x3;//第二象限y=b+y3;for(inti=0;i3;++i){//将点所在的地方涂色pDC-MoveTo(100+x*3+i,100+y*3);pDC-LineTo(100+x*3+i,100+y*3+3);}for(inti=0;i3;++i){//将点所在的地方涂色pDC-MoveTo(100+y*3+i,100+x*3);pDC-LineTo(100+y*3+i,100+x*3+3);}x=a+x3;//第四象限y=-b+y3;for(inti=0;i3;++i){//将点所在的地方涂色pDC-MoveTo(100+x*3+i,100+y*3);pDC-LineTo(100+x*3+i,100+y*3+3);}for(inti=0;i3;++i){//将点所在的地方涂色pDC-MoveTo(100+y*3+i,100+x*3);pDC-LineTo(100+y*3+i,100+x*3+3);}}voidCtest21lineView::OnDraw(CDC*pDC){Ctest21lineDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CPenmyPen1;myPen1.CreatePen(PS_SOLID,1,RGB(0,0,0));CPen*pOldPen=pDC-SelectObject(&myPen1);for(intx=100;x=700;x+=3){//画y轴线pDC-MoveTo(x,100);pDC-LineTo(x,700);}for(inty=100;y=700;y+=3){//画x轴线pDC-MoveTo(100,y);pDC-LineTo(700,y);}intx0=12,y0=14,x1=40,y1=54,x2=80,y2=54;//设置起始点终止点if(x1x0){x0=x0+x1;x1=x0-x1;x0=x0-x1;y0=y0+y1;y1=y0-y1;y0=y0-y1;}myPen1.DeleteObject();myPen1.CreatePen(PS_SOLID,1,RGB(255,0,0));pOldPen=pDC-SelectObject(&myPen1);//设置DDA点的颜色doublem1=(double)(y1-y0)/(double)(x1-x0);intx=x0,y=y0;//所画点的坐标doubleyi,xi;yi=y0;//DDA算法xi=x0;if(m11){//斜率小于1for(intj=0;x=x1;++j){for(inti=0;i3;++i){//将点所在的地方涂色pDC-MoveTo(100+x*3+i,100+y*3);pDC-LineTo(100+x*3+i,100+y*3+3);}y=yi+m1+0.5;//算下一个点的坐标x=x+1;yi=yi+m1;}}else{//斜率大于1,对称for(intj=0;y=y1;++j){for(inti=0;i3;++i){pDC-MoveTo(100+x*3+i,100+y*3);pDC-LineTo(100+x*3+i,100+y*3+3);}x=xi+1/m1+0.5;y=y+1;xi=xi+1/m1;}}myPen1.DeleteObject();myPen1.CreatePen(PS_SOLID,1,RGB(0,0,255));pOldPen=pDC-SelectObject(&myPen1);//Bresenham算法点颜色yi=y0;xi=x0;//画第一个点x=x0;y=y0;for(inti=0;i6;++i){pDC-MoveTo(100+x0*3+i,100+y0*3);pDC-LineTo(100+x0*3+i,100+y0*3+3);}inta=x2-x0,b=y2-y0;if((double)b/(double)a1){//Bresenham算法intc=2*b,d=c-2*a;intp=c-a;for(inti=0;ia;++i){if(p0)++y;++x;for(inti=0;i3;++i){pDC-MoveTo(100+x*3+i,100+y*3);pDC-LineTo(100+x*3+i,100+y*3+3);}if(y-yi==1)p=p+d;elsep=p+c;yi=y;}}else{intc=2*a,d=c-2*b;intp=c-b;for(inti=0;ib;++i){if(p0)++x;++y;if(x-xi0)p=p+d;elsep=p+c;xi=x;}}intx3=30,y3=30,r=15;//中点画圆doublep=5/4.0-r;x=0,y=r;yi=y;while(x=y){DrawCir(x,y,x3,y3,pDC);if(p=0)--y;++x;if(y==yi)p=p+2*x+1;elsep=p+2*x+1-2*y;yi=y;}}

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功