计算机图形学实验报告.docx
《计算机图形学实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告.docx(32页珍藏版)》请在冰豆网上搜索。
计算机图形学实验报告
电脑图形学实验报告
:
学号:
班级:
专业:
电脑科学与技术
完成日期:
2017
实验一OpenGL图形编程
1.实验目的
(1)点的绘制
(2)直线的绘制
(3)多边形面的绘制
2.实验内容
点的绘制
glBegin(GL_POINTS);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(10.0f,0.0f,0.0f);
glEnd();
点的属性〔大小〕
voidglPointSize(GLfloatsize);
直线的绘制模式
GL_LINES
GL_LINE_STRIP
GL_LINE_LOOP
直线的属性
线宽
voidglLineWidth(GLfloatwidth)
线型
glEnable(GL_LINE_STIPPLE);
glLineStipple(GLintfactor,GLushortpattern);
三角形面的绘制
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
四边形面的绘制
GL_QUADS
GL_QUADS_STRIP
多边形面的绘制〔GL_POLYGON〕
多边形面的绘制规则
所有多边形都必须是平面的。
多边形的边缘决不能相交,而且多边形必须是凸的。
解决:
对于非凸多边形,可以把它分割成几个凸多边形〔通常是三角形〕,再将它绘制出来。
3.实验代码与实验结果
(1)画矩形
#include
voidInitial(void){
glClearColor(1.0f,1.0f,1.0f,1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}
voidDisplay(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glRectf(50.0f,100.0f,150.0f,50.0f);
glFlush();
}
intmain(intargc,char*argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,120);
glutCreateWindow("矩形");
glutDisplayFunc(Display);
Initial();
glutMainLoop();
return0;
}
(2)画点
glPointSize(3);
glBegin(GL_POINTS);
glColor3f(1.0f,0.0f,0.0f);
glVertex2i(10,140);
glVertex2i(100,75);
glVertex2i(190,10);
glEnd();
(3)画直线
glPointSize(3);
glBegin(GL_LINE_LOOP);
glColor3f(1.0f,0.0f,0.0f);
glVertex2i(20,10);
glVertex2i(60,50);
glVertex2i(20,50);
glVertex2i(60,10);
glVertex2i(40,70);
glEnd();
(4)画等边三角形
glPointSize(3);
glBegin(GL_TRIANGLES);
glColor3f(1.0f,0.0f,0.0f);
glVertex2i(20,10);
glVertex2i(60,10);
glVertex2f(40.0,44.64);
glEnd();
实验二直线绘制实验
1.实验目的和实验内容
(1)掌握数值微分算法编程绘制直线
(2)掌握中点画线算法编程绘制直线
(3)掌握Bresenham算法编程绘制直线
2.实验代码和实验结果
(1)掌握数值微分算法编程绘制直线
#include
#include
voidInitial(void){
glClearColor(1.0f,1.0f,1.0f,1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}
voidDisplay(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glPointSize(3);
intdx,dy,epsl,k;
floatx,y,xIncre,yIncre;
intx0=10;
inty0=10;
intx1=20;
inty1=80;
dx=x1-x0;
dy=y1-y0;
x=x0;
y=y0;
if(abs(dx)>abs(dy))
epsl=abs(dx);
else
epsl=abs(dy);
xIncre=(float)dx/(float)epsl;
yIncre=(float)dy/(float)epsl;
for(k=0;k<=epsl;k++){
glBegin(GL_POINTS);
glVertex2i(int(x+0.5),(int)(y+0.5));
glEnd();
x+=xIncre;
y+=yIncre;
}
glFlush();
}
intmain(intargc,char*argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,120);
glutCreateWindow("矩形");
glutDisplayFunc(Display);
Initial();
glutMainLoop();
return0;
}
(2)掌握中点画线算法编程绘制直线
voidDisplay(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glPointSize(3);
intdx,dy,d,UpIncre,DownIncre,x,y;
intx0=10;
inty0=10;
intx1=80;
inty1=20;
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;
while(x<=x1){
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
x++;
if(d<0){
y++;
d+=UpIncre;
}
else
d+=DownIncre;
}
glFlush();
}
(3)掌握Bresenham算法编程绘制直线
voidDisplay(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glPointSize(3);
intx,y,dx,dy,e;
intx0=10;
inty0=10;
intx1=80;
inty1=20;
dx=x1-x0;
dy=y1-y0;
e=-dx;x=x0;y=y0;
while(x<=x1){
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
x++;
e=e+2*dy;
if(e>0){
y++;
e=e-2*dx;
}
}
glFlush();
}
实验三圆绘制实验
1.实验目的和实验内容
(1)实现八分法画圆程序
(2)实现Bresenham算法绘制圆
(3)实现中点Bresenham算法绘制椭圆
2.实验代码实验结果
(1)实现八分法画圆程序
#include
#include
voidInitial(void){
glClearColor(1.0f,1.0f,1.0f,1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}
voidputpixel(intx,inty){
x+=20;
y+=20;
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
}
voidCirclePoint(intx,inty){
putpixel(x,y);
putpixel(y,x);
putpixel(-y,x);
putpixel(-x,y);
putpixel(-x,-y);
putpixel(-y,-x);
putpixel(y,-x);
putpixel(x,-y);
}
voidDisplay(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glPointSize(3);
CirclePoint(5,2);
glFlush();
}
intmain(intargc,char*argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,120);
glutCreateWindow("矩形");
glutDisplayFunc(Display);
Initial();
glutMainLoop();
return0;
}
(2)实现Bresenham算法绘制圆
#include
#include
voidInitial(void){
glClearColor(1.0f,1.0f,1.0f,1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}
voidputpixel(intx,inty){
x+=75;
y+=75;
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
}
voidCirclePoint(intx,inty){
putpixel(x,y);
putpixel(y,x);
putpixel(-y,x);
putpixel(-x,y);
putpixel(-x,-y);
putpixel(-y,-x);
putpixel(y,-x);
putpixel(x,-y);
}
voidMidBressenhamCircle(intr){
intx,y,d;
x=0;y=r;d=1-r;
while(x<=y){
CirclePoint(x,y);
if(d<0)
d+=x*x+3;
else{
d+=2*(x-y)+5;
y--;
}
x++;
}
}
voidDisplay(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glPointSize(3);
MidBressenhamCircle(50);
glFlush();
}
intmain(intargc,char*argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,120);
glutCreateWindow("矩形");
glutDisplayFunc(Display);
Initial();
glutMainLoop();
return0;
}
(3)实现中点Bresenham算法绘制椭圆
#include
#include
voidInitial(void){
glClearColor(1.0f,1.0f,1.0f,1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,200.0,0.0,150.0);
}
voidputpixel(intx,inty){
x+=100;
y+=75;
glBegin(GL_POINTS);
glVertex2i(x,y);
glEnd();
}
voidMidBressenhamElipse(inta,intb){
intx,y;
floatd1,d2;
x=0;y=b;
d1=b*b+a*a*(-b+0.25);
putpixel(x,y);
putpixel(-x,-y);
putpixel(-x,y);
putpixel(x,-y);
while(b*b*(x+1)if(d1<=0){
d1+=b*b*(2*x+3);
x++;
}
else{
d1+=b*b*(2*x+3)+a*a*(-2*y+2);
x++;
y--;
}
putpixel(x,y);
putpixel(-x,-y);
putpixel(-x,y);
putpixel(x,-y);
}/*while上半部分*/
d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;
while(y>0){
if(d2<=0){
d2+=b*b*(2*x+2)+a*a*(-2*y+3);
x++;
y--;
}
else{
d2+=a*a*(-2*y+3);
y--;
}
putpixel(x,y);
putpixel(-x,-y);
putpixel(-x,y);
putpixel(x,-y);
}
}
voidDisplay(void){
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f,0.0f,0.0f);
glPointSize(3);
MidBressenhamElipse(80,60);
glFlush();
}
intmain(intargc,char*argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,120);
glutCreateWindow("矩形");
glutDisplayFunc(Display);
Initial();
glutMainLoop();
return0;
}
实验四填充算法实验
1.实验目的
(1)掌握用扫描线种子填充法
(2)实现扫描线种子填充算法填充任一多边形区域的程序
2.实验内容
(1)堆栈库
#include//实现了堆栈操作
structPoint
{
GLintx;
GLinty;
};
std:
:
stackstk;
structPointpoint1;
stk.pop(point1);//pop从栈中弹出最上面的元素并取得它
stk.push(point1);//压入一个元素
stk.empty();//判空
point1=stk.top();//取得栈最上面元素,但不弹出,仍在栈中
(2)获取像素颜色
typedeffloatColor[3];
Colorc;
glReadPixels(cur_point.x,cur_point.y,1,1,GL_RGB,GL_FLOAT,c);//
3.实验代码和实验结果
#include
#include
#include
#include
#include
#include
typedeffloatColor[3];
structPoint
{
GLintx;
GLinty;
};
std:
:
stackstk;
voidinit(void)
{
glClearColor(1.0,1.0,1.0,0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0,400.0,0.0,400.0);
}
//种子像素坐标
voidsetPixel(Pointcur_point)
{
glBegin(GL_POINTS);
glVertex2i(cur_point.x,cur_point.y);
glEnd();
glFlush();
}
voidgetPixel(Pointcur_point,Colorc)
{
glReadPixels(cur_point.x,cur_point.y,1,1,GL_RGB,GL_FLOAT,c);
}
boolrgbColorEqual(Colorc1,Colorc2)
{
if((abs(c1[0]-c2[0])>0.001)||(abs(c1[1]-c2[1])>0.001)||(abs(c1[2]-c2[2])>0.001))
return0;
else
return1;
}
intFillLineRegion(Pointcur_point,ColorfillColor,ColorborderColor,intdirection)
{
intcount=0;
ColorinteriorColor;
glColor3f(fillColor[0],fillColor[1],fillColor[2]);
getPixel(cur_point,interiorColor);
while(!
(rgbColorEqual(interiorColor,borderColor))&&!
(rgbColorEqual(interiorColor,fillColor)))
{
setPixel(cur_point);
if(direction==0)
cur_point.x++;
else
cur_point.x--;
getPixel(cur_point,interiorColor);
count++;
}
returncount;
}
intisPixelValid(Pointcur_point,ColorfillColor,ColorborderColor)
{
ColorinteriorColor;
getPixel(cur_point,interiorColor);
if(!
(rgbColorEqual(interiorColor,borderColor))&&!
(rgbColorEqual(interiorColor,fillColor)))
return1;
else
return0;
}
voidSearchLineNewSeed(intxLeft,intxRight,inty,ColorfillColor,ColorborderColor)
{
intxt=xLeft;
intseed_left=-1;
Pointtemp_point;
Pointseed_point;
while(xt<=xRight){
seed_left=-1;
temp_point.x=xt;
temp_point.y=y;
while(xt<=xRight){
if(isPixelValid(temp_point,fillColor,borderColor)){
seed_left=temp_point.x;
break;
}
else{
xt++;
temp_point.x=xt;
}
}
while(xt<=xRight){
if(isPixelValid(temp_point,fillColor,borderColor)){
xt++;
temp_point.x=xt;
}
else{
break;
}
}
if(seed_left!
=-1){
seed_point.x=seed_left;
seed_point.y=y;
stk.push(seed_point);
}
}
}
voidscanLine(Pointcur_point,ColorfillColor,ColorborderColor)
{
intcount=0;
intright,left;
Pointtemp_poin