欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    实验三画圆与凸多边形填充算法.doc

    • 资源ID:1091304       资源大小:147.50KB        全文页数:19页
    • 资源格式: DOC        下载积分:10金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    实验三画圆与凸多边形填充算法.doc

    word华北水利水电大学 计算机图形学 实验报告计算机科学与技术 专业实验三、画圆与凸多边形填充算法1. 实验目的练习直线和圆的光栅扫描线算法,多边形的扫描转换算法。2. 实验内容和要求按要求完成以下三个作业。提交纸质实验报告,同时提交实验报告和源代码的电子版。(I). 利用Bresenham直线扫描算法绘制任意直线段。输入为起点坐标(x0,y0)和终点坐标(x1,y1)以与线宽w,利用Bresenham算法计算离散的近似像素点,并在OpenGL窗口中绘制该线段。要求绘制至少五条线段,具有不同的斜率,不同的起点和终点,不同的线宽。不允许直接调用GL_LINES来实现。(II). 利用中点画圆算法绘制圆。输入为圆心(xc,yc)和圆的的半径r,利用中点画圆算法计算离散的近似像素点,并在OpenGL窗口中绘制。要求绘制至少四个圆,构成一个图案,比如奥迪车标或五环。(III). 实现多边形的扫描转换算法。输入一个凸多边形的顶点序列,利用活性边表计算每条扫描线上位于多边形内部的像素,并填充上一个新颜色,最终达到填充多边形内部的目的。建议:为了实现坐标点和像素的一一对应,建议坐标轴的X围和窗口像素宽高一致,比如: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"iostream"usingnamespace 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(intx0,inty0,intxEnd,intyEnd)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(x<xEnd) x+;if(p < 0)p += twoDy;elsey+;p += twoDyMinusDx;glBegin(GL_POINTS); glVertex2i(x,y); glEnd(); void displayF()glColor3f(1.0, 0.0, 0.0); for(int i=0;i<=n;i+) lineBres(ai,bi,ci,di);glFlush();void winReshpeF(GLintnewWidth, GLintnewHeight)glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight);glClear(GL_COLOR_BUFFER_BIT);winWidth = newWidth;winHeight = newHeight;int_tmain(intargc, 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(displayF);printf("继续输入请按1,退出请按0");scanf_s("%d",&h);glutReshapeFunc(winReshpeF);glutMainLoop();return 0;2/ 中点画圆法.cpp : 定义控制台应用程序的入口点。/#include"stdafx.h"#include"glut.h"#include"stdlib.h"#include"math.h"#include"iostream"usingnamespace std;constGLdouble twoPi = 6.283185;GLsizei winWidth = 400, winHeight = 300; / 屏幕显示宽高.classscreenPt public:screenPt()x = y = 0;GLint x, y;void setCoords(GLintxCoordValue, GLintyCorrdValue)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(GLintxCoord, GLintyCoord)glBegin(GL_POINTS);glVertex2i(xCoord, yCoord);glEnd();void circleMidpoint(GLintxc, GLintyc, GLintradius)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(GLintxc, GLintyc, screenPtcircPt)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 displayF( )glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 0.0, 0.0); pieChart();glFlush();void winReshpeF(GLintnewWidth, GLintnewHeight)glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight);glClear(GL_COLOR_BUFFER_BIT);winWidth = newWidth;winHeight = newHeight;int_tmain(intargc, char* argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(100, 100);glutInitWindowSize(winWidth, winHeight);glutCreateWindow("Pie Chart");init();glutDisplayFunc(displayF);glutReshapeFunc(winReshpeF);glutMainLoop();3#include"stdafx.h"constint POINTNUM=10; /多边形点数./*定义结构体用于活性边表AET和新边表NET*/typedefstructXETfloat x;float dx,ymax;XET* next;AET,NET;/*定义点结构体point*/structpointfloat 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;i<POINTNUM;i+)if(polypointi.y>MaxY)MaxY=polypointi.y;/初始化AET表AET *pAET=newAET;pAET->next=NULL;/初始化NET表NET *pNET1024;for(i=0;i<=MaxY;i+)pNETi=newNET;pNETi->next=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;j<POINTNUM;j+)if(polypointj.y=i) /一个点跟前面的一个点形成一条线段。跟后面的点也形成线段 if(polypoint(j-1+POINTNUM)%POINTNUM.y>polypointj.y)NET *p=newNET;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.y>polypointj.y)NET *p=newNET; 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;i<=MaxY;i+)/计算新的交点x,更新AETNET *p=pAET->next;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)while(q->next && p->x >= q->next->x)q=q->next;NET *s=p->next;p->next=q->next;q->next=p;p=s;q=pAET;/配对填充颜色p=pAET->next;while(p && p->next)for(float j=p->x;j<=p->next->x;j+)glVertex2i(static_cast<int>(j),i);p=p->next->next;/考虑端点情况glEnd();glFlush(); void init(void)glClearColor(1.0,1.0,1.0,1.0);/窗体的背景颜色设置为白色glMatrixMode(GL_PROJECTION);/gluOrtho2D(0.0,600.0,0.0,450.0);gluOrtho2D(-400, 400, -300, 300);void main(intargc,char* argv) glutInit(&argc,&argv); /I初始化 GLUT. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); /设置显示模式:单个缓存和使用RGB模型 glutInitWindowPosition(50,100); /设置窗体的顶部和左边位置 glutInitWindowSize(800,600); /设置窗体的高度和宽度 glutCreateWindow("五角星"); /创建显示窗体 init(); glutDisplayFunc(PolyScan); glutMainLoop(); 5. 实验结果12319 / 19

    注意事项

    本文(实验三画圆与凸多边形填充算法.doc)为本站会员(李司机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开