计算机图形学实验报告.docx

上传人:b****8 文档编号:9869651 上传时间:2023-02-07 格式:DOCX 页数:37 大小:133.36KB
下载 相关 举报
计算机图形学实验报告.docx_第1页
第1页 / 共37页
计算机图形学实验报告.docx_第2页
第2页 / 共37页
计算机图形学实验报告.docx_第3页
第3页 / 共37页
计算机图形学实验报告.docx_第4页
第4页 / 共37页
计算机图形学实验报告.docx_第5页
第5页 / 共37页
点击查看更多>>
下载资源
资源描述

计算机图形学实验报告.docx

《计算机图形学实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告.docx(37页珍藏版)》请在冰豆网上搜索。

计算机图形学实验报告.docx

计算机图形学实验报告

计算机图形学实验报告

 

计算机图形学实验报告

 

姓名:

学号:

班级:

专业:

计算机科学与技术

完成日期:

2017.1.3

 

实验一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,ColorborderCo

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1