计算机图形学代码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中点Bresenham算法画直线.cpp

#include<iostream>
using namespace std;
#include<windows.h>
#include<gl/glut.h>
#include<gl/graphics.h>

void MidBresenhamLine(int x0,int y0,int x1,int y1,int color)
{



int dx,dy,d,UpIncre,DownIncre,x,y;
if(x0>x1)
{

x=x1;x1=x0;x0=x;
y=y1;y1=y0;y0=y;
}
x=x0;y=y0;
dx=x1-x0;dy=y1-y0;
d=dx-2*dy;
UpIncre=2*dx-2*dy;DownIncre=-2*dy;


glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();


while(x<=x1)
{
// putpixel(x,y,color);
x++;
if(d<0)
{
y++;
d+=UpIncre;

}
else
d+=DownIncre;



glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
glFlush();


}
}










void Initial(void)
{
glClearColor(1.0f,1.0f,1.0f,1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}

void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);

// glRectf(50.0f,100.0f,150.0f,50.0f);

MidBresenhamLine(1,1,150,130,1);

glFlush();
}

int main(int argc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,120);
glutCreateWindow("中点Bresenham画直线");
glutDisplayFunc(Display);
Initial();
glutMainLoop();


closegraph();
return 0;

}

中点Bresenham画圆.cpp


#include<iostream>
using namespace std;
#include<gl/graphics.h>
#include<windows.h>
#include<gl/glut.h>
#include<gl/glu.h>
#include<gl/gl.h>
/*
void main()
{
void MidBresenhamCircle(int r,int color);
MidBresenhamCircle(1,2);
}
*/

void CirclePoint(int x,int y,int color)
{

/*
putpixel(x,y,color);putpixel(y,x,color);
putpixel(-y,x,color);putpixel(-x,y,color);
putpixel(-x,-y,color);putpixel(-y,-x,color);
putpixel(y,-x,color);putpixel(x,-y,color);
*/

glBegin(GL_POINTS);
glVertex2i(x,y);glVertex2i(y,x);
glVertex2i(-y,x);glVertex2i(-x,y);
glVertex2i(-x,-y);glVertex2i(-y,-x);
glVertex2i(y,-x);glVertex2i(x,-y);
glEnd();
}


void MidBresenhamCircle(int r,int color)
{
int x,y,d;
x=0;y=r;d=1-r;


/*glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
*/
while(x<=y)
{
CirclePoint(x,y,10);
if(d<0)
{
d+=2*x+3;
}
else
{
d+=2*(x-y)+5;y--;
}
x++;

glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
glFlush();

}
}

void Initial(void)
{

glClearColor(1.0f,1.0f,1.0f,1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}

void Display(void)
{

glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);

//glRectf(50.0f,100.0f,150.0f,50.0f);
MidBresenhamCircle(120,70);

glFlush();
}

int main(int argc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(120,70);
glutCreateWindow("中点Bresenham画圆");

glutDisplayFunc(Display);

Initial();


glutMainLoop();
return 0;

}



绘制Bezier曲线.cpp
#include<gl/graphics.h>
#include<iostream>
using namespace std;
#include<windows.h>
#include<math.h>
#include<gl/glut.h>

void initial(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glLineWidth(4.0);
GLfloat ControlP[4][3]={{-80.0,-40.0,0.0},{-10.0,90.0,0.0},{10.0,-90.0,0.0},{80.0,40.0,0.0}};
glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,4,*ControlP);
glEnable(GL_MAP1_VERTEX_3);

}

void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glMapGrid1f(100,0.0,1.0);
glEvalMesh1(GL_LINE,0,100);
glFlush();
}

void Reshape(GLint newWidth,GLint newHeight)
{
glViewport(0,0,newWidth,newHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-100.0,100.0,-100.0,100.0);
}




void main(void)
{

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("Bezier曲线");
initial();
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutMainLoop();

}


Bresenham算法画直线.cpp
include<GL/glut.h>
#include<stdlib.h>
#include<math.h>

void lineBre(int x0,int y0,int xEnd,int yEnd)
{
int dx=fabs(xEnd-x0),dy=fabs(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;
}
//setPixel(x,y);
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
while (x<xEnd)
{
x++;
if(p<0)
p+=twoDy;
else
{
y++;
p+=twoDyMinusDx;
}
//setPixel(x,y);
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
glFlush();

}
}

void init(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}


void lineSegment(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);

lineBre(20,10,150,90);


glFlush();
}



void main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(50,100);
glutInitWindowSize(400,300);
glutCreateWindow("直线");
init();


glutDisplayFunc(lineSegment);


glutMainLoop();
}

Bezier拼接.cpp
#include<gl/graphics.h>
#include<iostream>
using namespace std;
#include<windows.h>
#include<math.h>
#include<gl/glut.h>


void initial(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glLineWidth(4.0);
int num;
//GLfloat ControlP[8][3];

cout<<" 1 调用默认值 2 输入控制点三维坐标"<<endl;
cin>>num;

if(num=1)
{
cout<<"调用默认值 第一段{-80.0,-40.0,0.0},{-10.0,90.0,0.0},{10.0,-90.0,0.0},{80.0,40.0,0.0})"<<endl;
cout<<"调用默认值 第二段{80.0,40.0,0.0},{-100.0,500.0,0.0},{100.0,-900.0,0.0},{380.0,430.0,0.0})"<<endl;
GLfloat ControlP[8][3]={{-80.0,-40.0,0.0},{-10.0,90.0,0.0},{10.0,-90.0

,0.0},{80.0,40.0,0.0},
{80.0,40.0,0.0},{-100.0,500.0,0.0},{100.0,-900.0,0.0},{380.0,430.0,0.0}};
glMa
p1f(GL_MAP1_VERTEX_3,0.0,1.0,3,8,*ControlP);
}
else
{
cout<<"输入八个三维控制点坐标(4、5相同以保证连接)"<<endl;
GLfloat Control1P[8][3];
for(int x=0;x<8;x++)
{
for(int y=0;y<3;y++)
{
cin>>Control1P[x][y];

}
}
glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,8,*Control1P);

}
// glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,8,*ControlP);
glEnable(GL_MAP1_VERTEX_3);

}



void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0.0,0.0);
glMapGrid1f(100,0.0,1.0);
glEvalMesh1(GL_LINE,0,100);
glFlush();
}

void Reshape(GLint newWidth,GLint newHeight)
{
glViewport(0,0,newWidth,newHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-100.0,100.0,-100.0,100.0);
}




void main(void)
{

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowPosition(100,100);
glutInitWindowSize(400,400);
glutCreateWindow("Bezier曲线拼接");
initial();
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glutMainLoop();

}





相关文档
最新文档