欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    计算机图形学实验C++代码(共11页).doc

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

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

    计算机图形学实验C++代码(共11页).doc

    精选优质文档-倾情为你奉上一、 bresenham算法画直线#include <glut.h>#include <math.h>#include <stdio.h>void draw_pixel(int ix,int iy)glBegin(GL_POINTS);glVertex2i(ix,iy);glEnd();void Bresenham(int x1,int y1,int xEnd,int yEnd)int dx=abs(xEnd-x1),dy=abs(yEnd-y1);int p=2*dy-dx;int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx;int x,y;if (x1>xEnd)x=xEnd;y=yEnd;xEnd=x1;elsex=x1;y=y1;draw_pixel(x,y);while(x<xEnd)x+;if(p<0)p+=twoDy;elsey+;p+=twoDyMinusDx;draw_pixel(x,y);void display()glClear(GL_COLOR_BUFFER_BIT);Bresenham(0,0,400,400);glFlush();void myinit()glClearColor(0.8,1.0,1.0,1.0);glColor3f(0.0,0.0,1.0);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,500.0,0.0,500.0);void main(int argc,char *argv )glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(200.0,200.0);glutCreateWindow("CG_test_Bresenham_Line example");glutDisplayFunc(display);myinit();glutMainLoop();二、 中点法绘制椭圆#include <glut.h>#include <math.h>#include <stdio.h>inline int round(const float a)return int (a+0.5);void setPixel(GLint xCoord,GLint yCoord)glBegin(GL_POINTS);glVertex2i(xCoord,yCoord);glEnd();void ellipseMidpoint(int xCenter,int yCenter,int Rx,int Ry)int Rx2=Rx*Rx;int Ry2=Ry*Ry;int twoRx2=2*Rx2;int twoRy2=2*Ry2;int p;int x=0;int y=Ry;int px=0;int py=twoRx2*y;void ellipsePlotPoints(int,int,int,int);ellipsePlotPoints(xCenter,yCenter,x,y);p=round(Ry2-(Rx2*Ry)+(0.25*Rx2);while(px<py)x+;px+=twoRy2;if(p<0)p+=Ry2+px;elsey-;py-=twoRx2;p+=Ry2+px-py;ellipsePlotPoints(xCenter,yCenter,x,y);p=round(Ry2*(x+0.5)*(x+0.5)+Rx2*(y-1)*(y-1)-Rx2*Ry2);while(y>0)y-;py-=twoRx2;if(p>0)p+=Rx2-py;elsex+;px+=twoRy2;p+=Rx2-py+px;ellipsePlotPoints(xCenter,yCenter,x,y);void ellipsePlotPoints(int xCenter,int yCenter,int x,int y)setPixel(xCenter+x,yCenter+y);setPixel(xCenter-x,yCenter+y);setPixel(xCenter+x,yCenter-y);setPixel(xCenter-x,yCenter-y);void display()glClear(GL_COLOR_BUFFER_BIT);ellipseMidpoint(200,200,50,30);glFlush();void myinit()glClearColor(0.8,1.0,1.0,1.0);glColor3f(0.0,0.0,1.0);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,300.0,0.0,300.0);void main(int argc,char *argv )glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(300,300);glutInitWindowPosition(200.0,200.0);glutCreateWindow("circleMId example");glutDisplayFunc(display);myinit();glutMainLoop();三、 抛物线#include <glut.h>#include <math.h>#include <stdio.h>inline int round(const float a)return int (a+0.5);void setPixel(GLint xCoord,GLint yCoord)glBegin(GL_POINTS);glVertex2i(xCoord,yCoord);glEnd();void ellipseMidpoint(int xCenter,int yCenter,int a,int b)int p;int x=xCenter;int y=yCenter;int px=0,py=0;void ellipsePlotPoints(int,int,int,int);ellipsePlotPoints(xCenter,yCenter,px,py);p=yCenter+a*(x+1-xCenter)*(x+1-xCenter)+b*(x+1-xCenter)-y-0.5;doif(p<0)x=x+1;y=y;p=yCenter+a*(x+1-xCenter)*(x+1-xCenter)+b*(x+1-xCenter)-y-0.5;elsex=x+1;y=y-1;p=yCenter+a*(x+1-xCenter)*(x+1-xCenter)+b*(x+1-xCenter)-y-0.5;px=x-xCenter;py=y-yCenter;ellipsePlotPoints(xCenter,yCenter,px,py);while(px<py);for(;)if(p<0)x=x-1;y=y+1;p=yCenter+a*(x+0.5-xCenter)*(x+0.5-xCenter)+b*(x+0.5-xCenter)-y-1;elsex=x;y=y+1;p=yCenter+a*(x+0.5-xCenter)*(x+0.5-xCenter)+b*(x+0.5-xCenter)-y-1;px=x-xCenter;py=y-yCenter;ellipsePlotPoints(xCenter,yCenter,px,py);void ellipsePlotPoints(int xCenter,int yCenter,int x,int y)setPixel(xCenter+x,yCenter+y);setPixel(xCenter-x,yCenter+y);void display()glClear(GL_COLOR_BUFFER_BIT);ellipseMidpoint(150,150,1,0);glFlush();void myinit()glClearColor(0.8,1.0,1.0,1.0);glColor3f(0.0,0.0,1.0);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,300.0,0.0,300.0);void main(int argc,char *argv )glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(200.0,200.0);glutCreateWindow("circleMId example");glutDisplayFunc(display);myinit();glutMainLoop();四、 基本图元输出#include <glut.h>#include <math.h>#include <stdio.h>void Polygon(int*p1,int*p2,int*p3,int*p4,int*p5,int*p6)glBegin(GL_POLYGON); glVertex2iv(p1); glVertex2iv(p2); glVertex2iv(p3); glVertex2iv(p4); glVertex2iv(p5); glVertex2iv(p6);glEnd();void Triangles(int*p1,int*p2,int*p3,int*p4,int*p5,int*p6)glBegin(GL_TRIANGLES); glVertex2iv(p1); glVertex2iv(p2); glVertex2iv(p6); glVertex2iv(p3); glVertex2iv(p4); glVertex2iv(p5);glEnd();void Trianglefan(int*p1,int*p2,int*p3,int*p4,int*p5,int*p6)glBegin(GL_TRIANGLE_FAN); glVertex2iv(p1); glVertex2iv(p2); glVertex2iv(p3); glVertex2iv(p4); glVertex2iv(p5); glVertex2iv(p6);glEnd();void Trianglestrip(int*p1,int*p2,int*p3,int*p4,int*p5,int*p6)glBegin(GL_TRIANGLE_STRIP); glVertex2iv(p1); glVertex2iv(p2); glVertex2iv(p6); glVertex2iv(p3); glVertex2iv(p5); glVertex2iv(p4);glEnd();void glRect_s(GLint a,GLint b,GLint c,GLint d)glRecti(a,b,c,d);void display()int p1=60,170;int p2=100,100;int p3=180,100;int p4=220,170;int p5=180,240;int p6=100,240;int p7=60,100;glClear(GL_COLOR_BUFFER_BIT);/Triangles(p1,p2,p3,p4,p5,p6);/Polygon(p1,p2,p3,p4,p5,p6);/glRect_s(160,30,10,100);Trianglestrip(p1,p2,p3,p4,p5,p6);/Trianglefan(p1,p2,p3,p4,p5,p6);glFlush();void myinit()glClearColor(0.8,1.0,1.0,1.0);glColor3f(0.0,0.0,1.0);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,300.0,0.0,300.0);void main(int argc,char *argv )glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(300.0,300.0);glutCreateWindow("circleMId example");glutDisplayFunc(display);myinit();glutMainLoop();五、 区域填充#include "glut.h"#include "windows.h"const int POINTNUM=7; /多边形点数./定义结构体用于活性边表AET和新边表NETtypedef struct XETfloat x;float dx,ymax;XET* next;AET,NET;/定义点结构体pointstruct pointfloat x;float y;polypointPOINTNUM=250,50,350,150,50,40,250,20,200,30,100,100,10,300;/多边形顶点void PolyScan()/计算最高点的y坐标(扫描到此结束)int MaxY=0;int i;for(i=0;i<POINTNUM;i+)if(polypointi.y>MaxY)MaxY=polypointi.y;/初始化AET表AET *pAET=new AET;pAET->next=NULL;/初始化NET表NET *pNET1024;for(i=0;i<=MaxY;i+)pNETi=new NET;pNETi->next=NULL;glClear(GL_COLOR_BUFFER_BIT); /赋值的窗口显示. glColor3f(0.9,1.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=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.y>polypointj.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;for(i=0;i<=MaxY;i+)/计算新的交点x,更新AETNET *p=pAET->next;while(p)p->x=p->x + p->dx;p=p->next;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,0.0);/窗口的背景颜色设置为白色glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,600.0,0.0,450.0);void lineSegment(void)glClear(GL_COLOR_BUFFER_BIT); /赋值的窗口显示. glColor3f(0.0,1.0,0.0); /设置直线的颜色红色glBegin(GL_LINES);glVertex2i(180,15); /Specify line-segment geometry.glVertex2i(10,145);glEnd();glFlush(); /Process all OpenGL routines as quickly as possible.void main(int argc,char* argv)glutInit(&argc,&argv); /I初始化GLUT.glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); /设置显示模式:单个缓存和使用RGB模型glutInitWindowPosition(50,100); /设置窗口的顶部和左边位置glutInitWindowSize(400,300); /设置窗口的高度和宽度glutCreateWindow("扫描线填充算法"); /创建显示窗口init(); /调用初始化过程glutDisplayFunc(PolyScan); /图形的定义传递glutMainLoop(); /显示所有的图形并等待专心-专注-专业

    注意事项

    本文(计算机图形学实验C++代码(共11页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

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




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开