




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
华北水利水电大学 计算机图形学 实验报告2017-2018学年 第一学期 2014级 计算机科学与技术 专业 指导老师 曹源昊 班级 2014157 学号 201415717 姓名 李卫朋 实验三、画圆与凸多边形填充算法1. 实验目的练习直线和圆的光栅扫描线算法,多边形的扫描转换算法。2. 实验内容和要求按要求完成以下三个作业。提交纸质实验报告,同时提交实验报告和源代码的电子版。(I). 利用Bresenham直线扫描算法绘制任意直线段。输入为起点坐标(x0,y0)和终点坐标(x1,y1)以及线宽w,利用Bresenham算法计算离散的近似像素点,并在OpenGL窗口中绘制该线段。要求绘制至少五条线段,具有不同的斜率,不同的起点和终点,不同的线宽。不允许直接调用GL_LINES来实现。(II). 利用中点画圆算法绘制圆。输入为圆心(xc,yc)和圆的的半径r,利用中点画圆算法计算离散的近似像素点,并在OpenGL窗口中绘制。要求绘制至少四个圆,构成一个图案,比如奥迪车标或五环。(III). 实现多边形的扫描转换算法。输入一个凸多边形的顶点序列,利用活性边表计算每条扫描线上位于多边形内部的像素,并填充上一个新颜色,最终达到填充多边形内部的目的。建议:为了实现坐标点和像素的一一对应,建议坐标轴的范围和窗口像素宽高一致,比如:glutInitWindowSize(800, 600);/像素宽800,高600坐标系设定为:gluOrtho2D(-400, 400, -300, 300);/坐标轴x方向宽为800,y方向高为6003. 算法描述使用OpenGL进行画图,采用VS编程环境。4. 源程序代码(1)/ bresenham直线.cpp : 定义控制台应用程序的入口点。/#include stdio.h#include stdafx.h#include glut.h#include stdlib.h#include math.h#include iostreamusing namespace std;GLsizei winWidth = 400, winHeight = 300; / 屏幕显示宽高.int a100,b100,c100,d100,n=-1;void init( )glClearColor(1.0, 1.0, 1.0, 1.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0, 200.0, 0.0, 150.0);void lineBres(int x0,int y0,int xEnd,int yEnd) int dx = abs(xEnd - x0),dy = abs(yEnd - y0); int p = 2*dy - dx; int twoDy = 2*dy, twoDyMinusDx = 2*(dy - dx); int x,y;if(x0 xEnd) x = xEnd; y = yEnd; xEnd = x0;else x = x0; y = y0; glBegin(GL_POINTS); glVertex2i(x,y); glEnd(); while(xxEnd) x+;if(p 0)p += twoDy;elsey+;p += twoDyMinusDx;glBegin(GL_POINTS); glVertex2i(x,y); glEnd(); void displayFcn() glColor3f(1.0, 0.0, 0.0); for(int i=0;i=n;i+) lineBres(ai,bi,ci,di);glFlush();void winReshpeFcn(GLint newWidth, GLint newHeight)glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight);glClear(GL_COLOR_BUFFER_BIT);winWidth = newWidth;winHeight = newHeight;int _tmain(int argc, char* argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(100, 100);glutInitWindowSize(winWidth, winHeight);glutCreateWindow(bresenham直线);init();int h=1;while(h=1)printf(输入起点和终点的坐标);n+;scanf_s(%d %d %d %d,&an,&bn,&cn,&dn);glutDisplayFunc(displayFcn);printf(继续输入请按1,退出请按0);scanf_s(%d,&h);glutReshapeFunc(winReshpeFcn);glutMainLoop();return 0;(2)/ 中点画圆法.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include glut.h#include stdlib.h#include math.h#include iostreamusing namespace std;const GLdouble twoPi = 6.283185;GLsizei winWidth = 400, winHeight = 300; / 屏幕显示宽高.class screenPt public:screenPt()x = y = 0;GLint x, y;void setCoords(GLint xCoordValue, GLint yCorrdValue)x = xCoordValue;y = yCorrdValue;GLint getx() constreturn x;GLint gety() constreturn y;void incrementx()x+;void incrementy()y-;void init( )glClearColor(1.0, 1.0, 1.0, 1.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0, 200.0, 0.0, 150.0);void setPixel(GLint xCoord, GLint yCoord)glBegin(GL_POINTS);glVertex2i(xCoord, yCoord);glEnd();void circleMidpoint(GLint xc, GLint yc, GLint radius)screenPt circPt;GLint p = 1 - radius;/中点参数初值circPt.setCoords(0, radius);void circlePlotPoints(GLint, GLint, screenPt);circlePlotPoints(xc, yc, circPt);while (circPt.getx() circPt.gety()circPt.incrementx();if (p 0)p += 2 * circPt.getx() + 1;elsecircPt.incrementy();p += 2 * (circPt.getx() - circPt.gety() + 1;circlePlotPoints(xc, yc, circPt);void circlePlotPoints(GLint xc, GLint yc, screenPt circPt)setPixel(xc + circPt.getx(), yc + circPt.gety();setPixel(xc - circPt.getx(), yc + circPt.gety();setPixel(xc + circPt.getx(), yc - circPt.gety();setPixel(xc - circPt.getx(), yc - circPt.gety();setPixel(xc + circPt.gety(), yc + circPt.getx();setPixel(xc - circPt.gety(), yc + circPt.getx();setPixel(xc + circPt.gety(), yc - circPt.getx();setPixel(xc - circPt.gety(), yc - circPt.getx();void pieChart( )screenPt circCtr, piePt;GLint radius = winWidth / 16; circCtr.x = winWidth / 4; circCtr.y = winHeight / 1.5;circleMidpoint(circCtr.x, circCtr.y, radius); / 调用中点画圆方法 glColor3f(0.0, 0.0, 1.0); circleMidpoint(circCtr.x+60, circCtr.y, radius);glColor3f(0.0, 0.0, 0.0); circleMidpoint(circCtr.x+120, circCtr.y, radius); glColor3f(1.0, 1.0, 0.0); circleMidpoint(circCtr.x+30, circCtr.y-30, radius);glColor3f(0.0, 1.0, 0.0); circleMidpoint(circCtr.x+90, circCtr.y-30, radius);void displayFcn( )glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); pieChart();glFlush();void winReshpeFcn(GLint newWidth, GLint newHeight)glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight);glClear(GL_COLOR_BUFFER_BIT);winWidth = newWidth;winHeight = newHeight;int _tmain(int argc, char* argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(100, 100);glutInitWindowSize(winWidth, winHeight);glutCreateWindow(Pie Chart);init();glutDisplayFunc(displayFcn);glutReshapeFunc(winReshpeFcn);glutMainLoop();(3)#include stdafx.hconst int POINTNUM=10; /多边形点数./*定义结构体用于活性边表AET和新边表NET*/typedef struct XETfloat x;float dx,ymax;XET* next;AET,NET;/*定义点结构体point*/struct pointfloat x;float y;polypointPOINTNUM=100, 200, 122, 131, 195, 131, 136, 88, 159, 19, 100, 62, 41, 19, 64, 88, 5, 131, 78, 131;/五角星void PolyScan()/计算最高点的y坐标(扫描到此结束)int MaxY=0;int i;for(i=0;iMaxY)MaxY=polypointi.y;/初始化AET表AET *pAET=new AET;pAET-next=NULL;/初始化NET表NET *pNET1024;for(i=0;inext=NULL;glClear(GL_COLOR_BUFFER_BIT); /赋值的窗体显示. glColor3f(0.0,0.0,0.0); /设置直线的颜色红色glBegin(GL_POINTS);/扫描并建立NET表for(i=0;i=MaxY;i+)for(int j=0;jpolypointj.y)NET *p=new NET;p-x=polypointj.x;p-ymax=polypoint(j-1+POINTNUM)%POINTNUM.y;p-dx=(polypoint(j-1+POINTNUM)%POINTNUM.x-polypointj.x)/(polypoint(j-1+POINTNUM)%POINTNUM.y-polypointj.y);p-next=pNETi-next;pNETi-next=p;if(polypoint(j+1+POINTNUM)%POINTNUM.ypolypointj.y)NET *p=new NET; p-x=polypointj.x;p-ymax=polypoint(j+1+POINTNUM)%POINTNUM.y;p-dx=(polypoint(j+1+POINTNUM)%POINTNUM.x-polypointj.x)/(polypoint(j+1+POINTNUM)%POINTNUM.y-polypointj.y);p-next=pNETi-next;pNETi-next=p;/建立并更新活性边表AETfor(i=0;inext;while(p)p-x=p-x + p-dx;p=p-next;/更新后新AET先排序/断表排序,不再开辟空间AET *tq=pAET;p=pAET-next;tq-next=NULL;while(p)while(tq-next & p-x = tq-next-x)tq=tq-next;NET *s=p-next;p-next=tq-next;tq-next=p;p=s;tq=pAET;/(改进算法)先从AET表中删除ymax=i的结点AET *q=pAET;p=q-next;while(p)if(p-ymax=i)q-next=p-next;delete p;p=q-next;elseq=q-next;p=q-next;/将NET中的新点增加AET,并用插入法按X值递增排序p=pNETi-next;q=pAET;while(p)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 培训文员考试题库及答案
- 森林火灾逃生知识培训课件
- 桶装纯净水知识培训
- 2025年面试技巧与题库解析企业产品经理岗位招聘备考宝典
- 2025年大数据工程师招考笔试练习题及解析手册
- 2025年家庭照护者、健康照护师岗位专业技能资格知识考试题库与答案
- 2025年外贸业务专员高级英语面试题解析
- 2025年教育心理学教师招聘笔试模拟题及答案解析
- 湖南省衡阳市重点中学2026届化学高二第一学期期中调研模拟试题含解析
- 2025年篮球理论考试题及答案
- 壁挂炉购销合同-合同范本
- 陈腐垃圾施工方案
- 渤海大学《软件工程》2022-2023学年第一学期期末试卷
- 税务会计岗位招聘笔试题及解答(某大型国企)2024年
- ICD-10疾病编码完整版
- 消防设备设施操作讲解培训讲课文档
- 内分泌科医疗管理制度
- 临床开展十二项细胞因子检测临床意义
- FlowmasterV7中文技术手册
- 房屋承包出租合同
- 石油化学工业的发展历程与前景
评论
0/150
提交评论