计算机图形学代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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();
}