计算机图形学实验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(); /显示所有的图形并等待专心-专注-专业