当前位置:文档之家› 计算机图形学实验报告 终极

计算机图形学实验报告 终极

计算机图形学实验报告 终极
计算机图形学实验报告 终极

课程名称:计算机图形学学生姓名:

学号:6100409003 专业班级:卓越091班

2012年月日

目录

一、直线和圆的生成 (1)

二、种子填充 (3)

三、裁剪 (5)

四、B e z i e r曲线 (10)

五、B L i n e (19)

南昌大学实验报告

---直线和圆的生成

学生姓名:学号:6100409003 专业班级:卓越091班

实验类型:□验证□综合□设计□创新实验日期:2012-4-12 实验成绩:

一、实验目的

1.掌握MoveTo(),LineTo()生成直线的方法

2.掌握Ellipse()生成圆的方法

二、实验内容

1.实现用MoveTo(),LineTo()生成直线

2.实现用Ellipse()生成圆

三、实验指导

记录左键按下、弹起的坐标,用这两个坐标作为一条直线的端点,利用Ellipse()函数,通过设置半径直接可以生成圆。

四、实验代码

1.生成直线

void CLineCircleView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

m_point = point;

CView::OnLButtonDown(nFlags, point);

}

void CLineCircleView::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CClientDC dc(this);

dc.MoveTo(m_point);

dc.LineTo(point);

CView::OnLButtonUp(nFlags, point);

}

2.生成圆

void CLineCircleView::OnCircle()

{

// TODO: Add your command handler code here

CClientDC dc(this);

dc.Ellipse(40+m_icoodinate,100+m_icoodinate,240+m_icoodinate,300+m_icoodinate);

m_icoodinate += 20;

}

四、实验截图

南昌大学实验报告

---种子填充

学生姓名:学号:6100409003 专业班级:卓越091班

实验类型:□验证□综合□设计□创新实验日期:2012-4-19 实验成绩:

一、实验目的

掌握边界表示的四连通区域的递归填充算法

二、实验内容

实现边界表示的四连通区域的递归填充算法

三、实验指导

此实验是边界表示的四连通区域的填充,递归填充相邻的四个像素。

四、实验代码

void CSeedFillView::BoundaryFill(int x, int y, int boundarycolor, int newcolor)

{

CClientDC dc(this);

//dc.PolyBezier()

int color = dc.GetPixel(x,y);

if (color != newcolor && color != boundarycolor)

{

dc.SetPixel(x,y,newcolor);

BoundaryFill(x,y+1,boundarycolor,newcolor);

BoundaryFill(x,y-1,boundarycolor,newcolor);

BoundaryFill(x-1,y,boundarycolor,newcolor);

BoundaryFill(x+1,y,boundarycolor,newcolor);

}

}

void CSeedFillView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

m_point = point;

CView::OnLButtonDown(nFlags, point);

}

void CSeedFillView::OnLButtonUp(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CClientDC dc(this);

CPen pen(PS_SOLID,1,RGB(0,255,0));

CPen *m_pOldPen = dc.SelectObject(&pen);

dc.Rectangle(m_point.x,m_point.y,point.x,point.y);

BoundaryFill((point.x-m_point.x)/2+m_point.x, (point.y-m_point.y)/2+m_point.y,

RGB(0,255,0), RGB(255,0,0));

dc.SelectObject(m_pOldPen);

CView::OnLButtonUp(nFlags, point);

}

void CSeedFillView::OnDraw(CDC* pDC)

{

CSeedFillDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

// TODO: add draw code for native data here

int currentColor =RGB(255,0,0);

CPen m_pen(PS_SOLID,2,currentColor);

CPen *m_pOldPen = pDC->SelectObject(&m_pen);

pDC->Ellipse(50,50,100,100);

BoundaryFill(75,75,currentColor,RGB(0,0,0));

pDC->SelectObject(m_pOldPen);

}

五、实验截图

南昌大学实验报告

---裁剪

学生姓名:学号:6100409003 专业班级:卓越091班

实验类型:□验证□综合□设计□创新实验日期:2012-4-26 实验成绩:一、实验目的

掌握Sutherland-Cohen 直线裁剪算法

二、实验内容

实现Sutherland-Cohen 直线裁剪算法

三、实验指导

直线段编码裁剪算法(Cohen-Sutherland 算法)

任意平面线段和矩形窗口的位置关系只会有如下3种。

完全落在窗口内。

完全落在窗口外。

部分落在窗口内,部分落在窗口外。

要想判断线段和窗口的位置关系,只要找到线段的两端点相对于矩形窗口的位置即可,线段的两端点相对于矩形窗口的位置可能会有如下几种情况。

线段的两个端点均在窗口内,这时线段全部落在窗口内,完全可见,应予以保留。

线段的两个端点均在窗口边界线外同侧,这时线段全部落在窗口外,完全不可见,应予以舍弃。

线段的一个端点在窗口内,另一个端点在窗口外,这时线段部分可见,应求出线段与窗口边界线的交点,从而得到线段在窗口内的可见部分。

线段的两个端点均不在窗口内,但不处于窗口边界线外同侧,这时有可能线段是部分可见的,也可能是完全不可见的。

Cohen-Sutherland裁剪算法就是按照上述思路来对线段进行裁剪的,只是在线段的两端点相对于矩形窗口的位置上,巧妙地运用了编码的思想。

首先,如下图所示,延长窗口的四条边界线,将平面划分成9个区域,然后,用四位二进制数C3C2C1C0对这9个区域进行编码,编码规则如下:

1001 1000 1010

0001 0000 0010

0101 0100 0110

第0位C0:当线段的端点在窗口的左边界之左时,该位编码为1,否则,该位编码为0。

第1位C1:当线段的端点在窗口的右边界之右时,该位编码为1,否则,该位编码为0。

第2位C2:当线段的端点在窗口的下边界之下时,该位编码为1,否则,该位编码为0。

第3位C3:当线段的端点在窗口的上边界之上时,该位编码为1,否则,该位编码为0。

于是算法步骤可描述如下:

步骤1:根据上述编码规则,对线段的两个端点进行编码。

步骤2:根据线段的两端点编码判断线段相对于窗口的位置关系,从而决定对线段如何剪取。

两端点编码全为0000时,说明线段完全位于窗口内,是完全可见的,于是显示此线段。

两端点编码逐位逻辑与不为0时,说明线段的两个端点位于窗口外同侧,即此线段完全位

于窗口外,是完全不可见的,于是全部舍弃,不显示此线段。

两端点编码逐位逻辑与为0时,说明此线段或者部分可见,或者完全不可见。此时需要计

算出线段与窗口某一边界线或边界线的延长线的交点,若交点在窗口边界线的延长线上,

则说明该线段完全位于窗口外,不予以显示;若交点在窗口边界线上,则对以其中一个

交点为分割点的两端线段,再分别对其端点进行编码,并按照上述(1)和(2)所示的

方法进行测试,从而舍弃完全位于窗口外的一段线段,保留并显示完全位于窗口内的一

段线段。

四、实验代码

void CLineClipView::CS_LineClip(float x1, float y1, float x2, float y2, float XL, float XR, float YB, float YT)

{

CClientDC dc(this);

CPen pen(PS_SOLID,3,RGB(255,0,0));

CPen *m_oldPen=dc.SelectObject(&pen);

float x,y;

int code1,code2,code;

code1 = EnCode(x1,y1);

code2 = EnCode(x2,y2);

while (code1 != 0 || code2 != 0)

{

if ((code1&code2) != 0) // 在同一侧

return;

if(code1 != 0) // 不在区域内的点

code = code1;

else

code = code2;

if ((LEFT & code) != 0) //在左侧

{

x = XL;

y = y1+(y2-y1)*(XL-x1)/(x2-x1);

}

else if ((RIGHT & code) != 0) //在右侧

{

x = XR;

y = y1+(y2-y1)*(XR-x1)/(x2-x1);

}

else if ((BOTTOM & code) != 0) //在下侧

{

y = YB;

x = x1+(x2-x1)*(YB-y1)/(y2-y1);

}

else if ((TOP & code) != 0) //在上侧

{

y = YT;

x = x1+(x2-x1)*(YT-y1)/(y2-y1);

}

if (code == code1)

{

x1 = x;

y1 = y;

code1 = EnCode(x,y);

}

else

{

x2 = x;

y2 = y;

code2 = EnCode(x,y);

}

}

Sleep(500);

Invalidate();

UpdateWindow();

dc.MoveTo(x1,y1);

dc.LineTo(x2,y2);

dc.SelectObject(m_oldPen);

}

int CLineClipView::EnCode(float x, float y)

{

int c = 0;

if(x

if(x>m_fxr) c |= RIGHT;

if(y>m_fyb) c |= BOTTOM;

if(y

return c;

}

void CLineClipView::OnLButtonDown(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default CClientDC dc(this);

m_point = point;

if (m_nClickTime <100)

{

m_arrPoint[m_nClickTime] = m_point;

m_nClickTime++;

}

CPen pen(PS_SOLID,2,RGB(0,0,0));

CPen *pOldPen = dc.SelectObject(&pen);

dc.SetPixel(m_arrPoint[0],RGB(255,0,0));

for (int i = 1;i < m_nClickTime;i++)

{

dc.SetPixel(m_arrPoint[i],RGB(255,0,0));

dc.MoveTo(m_arrPoint[i-1]);

dc.LineTo(m_arrPoint[i]);

}

dc.SelectObject(pOldPen);

CView::OnLButtonDown(nFlags, point);

}

void CLineClipView::OnDraw(CDC* pDC)

{

CLineClipDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

// TODO: add draw code for native data here

CRect rect;

GetClientRect(rect);

pDC->Rectangle(rect.Width()/2-200,rect.Height()/2-100,rect.Width()-300,rect.Height()-100);

m_fxl = rect.Width()/2-200;

m_fxr = rect.Width()-300;

m_fyb = rect.Height()-100;

m_fyt = rect.Height()/2-100;

}

五、实验截图

南昌大学实验报告

---bezier 曲线

学生姓名: 学 号: 6100409003 专业班级: 卓越091班

实验类型:□ 验证 □ 综合 □ 设计 □ 创新 实验日期: 2012-5-3 实验成绩:

一、实验目的

1、掌握参数化曲线曲面的原理和方法。

2、理解参数化曲线曲面的基本性质,特别是Bezier 曲线的基本性质。

3、掌握型值点和控制顶点以及控制多边形的概念,理解控制点对曲线的控制作用。 二、实验内容

贝赛尔曲线的每一个顶点都有两个控制点,用于控制在该顶点两侧的曲线的弧度。它是应用于二维图形应用程序的数学曲线。曲线的定义有四个点:起始点、终止点(也称锚点)以及两个相互分离的中间点。滑动两个中间点,贝塞尔曲线的形状会发生变化。

三、实验指导

Besier 曲线定义:

给定空间n+1个点的位置矢量Pi (i=0,1,2,…,n ) 则Bezier 曲线可定义为:

]

1,0[),

()(,0

∈=

∑=t t B P

t P n i i

n

i

其中,Pi 构成该Bezier 曲线的特征多边形,

四、实验代码

void CMFCtempletView::OnDraw(CDC* pDC) { CMFCtempletDoc* pDoc = GetDocument(); ASSERT_V ALID(pDoc);

char *str="请在菜单“曲线选择”一栏中选择需要构造的曲线,然后进行选点。";

Draw();

pDC->TextOut(10,10,str);

// TODO: add draw code for native data here

}

int CMFCtempletView::OnCreate(LPCREA TESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1;

PIXELFORMA TDESCRIPTOR pfd = { sizeof(PIXELFORMA TDESCRIPTOR), // pfd 的大小 1, // 版本号

PFD_DRA W_TO_WINDOW | // 支持window PFD_SUPPORT_OPENGL | // 支持OpenGL PFD_DOUBLEBUFFER, // 使用双缓存 PFD_TYPE_RGBA, // RGBA 类型 24, // 32位颜色深度 0, 0, 0, 0, 0, 0, // 忽略的颜色位 0, // 支持alpha 缓存 0, // 忽略移位 0, // 无累积缓存 0, 0, 0, 0, // 忽略的累积位 32, // 32位z 缓存 0, // 无模板(stencil)缓存 0, // 无辅助缓存

PFD_MAIN_PLANE, // 主层main layer

0P 1

P 2P

3

P 图3.1.8 三次Bezier曲线0P 1P 2

P 3

P

0, // 保留位

0, 0, 0 // 忽略的层掩盖};

m_hDC=GetDC()->GetSafeHdc();

//选择匹配的像素格式

int nPixelFormat=::ChoosePixelFormat(m_hDC,&pfd);

//设置像素格式

ASSERT(SetPixelFormat(m_hDC,nPixelFormat,&pfd));

//建立新的图形操作描述表

m_hRC=::wglCreateContext(m_hDC);

//设置当前新的图形操作描述表

::wglMakeCurrent(m_hDC,m_hRC);

return 0;

}

void CMFCtempletView::OnDestroy()

{

CView::OnDestroy();

//设置当前图形操作表为空

::wglMakeCurrent(NULL, NULL);

//销毁图形操作描述表

::wglDeleteContext(m_hRC);

// TODO: Add your message handler code here

}

BOOL CMFCtempletView::OnEraseBkgnd(CDC* pDC)

{

// TODO: Add your message handler code here and/or call default

return true;

}

void CMFCtempletView::OnSize(UINT nType, int cx, int cy)

{

CView::OnSize(nType, cx, cy);

ccx=cx;

ccy=cy;

//进入世界坐标系

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-(GLfloat)ccx/2.0,(GLfloat)ccx/2.0,-(GLfloat)ccy/2.0,(GLfloat)ccy/2.0, -(GLfloat)ccx/2.0,(GLfloat)ccx/2.0);

glViewport(0, 0, cx, cy);//注意如果改变视口长宽比例,会使图像变形

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

void CMFCtempletView::Draw()

{

glClearColor(1,1,1,1.0);//背景颜色设置

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//使深度缓存测试有效

glEnable(GL_DEPTH_TEST);

//取景变换

glLoadIdentity();

//gluLookAt(0,0,-9,0,0,0,0,1,0);

//glRotatef(90,1,1,0);

//设置前景色

glColor3f(0,1,0);

yourcode();

//开始绘图

int i;

float vcoord[3];

//glColor3f(1,0,0);

glLineWidth(1.5);

glBegin(GL_LINES);

for(i=0;i

{

vcoord[0]=vertexx[i];

vcoord[1]=vertexy[i];

//vcoord[2]=pointz[i];

glV ertex3f((GLfloat)vcoord[0],(GLfloat)vcoord[1],(GLfloat)0.0);

vcoord[0]=vertexx[i+1];

vcoord[1]=vertexy[i+1];

//vcoord[2]=pointz[i+1];

glV ertex3f((GLfloat)vcoord[0],(GLfloat)vcoord[1],(GLfloat)0.0);

}

glEnd();

glColor3f(1,0,0);

glPointSize(5.0);

glBegin(GL_POINTS);

for(i=0;i

{

vcoord[0]=vertexx[i];

vcoord[1]=vertexy[i];

//vcoord[2]=pointz[i];

glV ertex3f((GLfloat)vcoord[0],(GLfloat)vcoord[1],(GLfloat)0.0);

}

glEnd();

glColor3f(0,0,0);

glLineWidth(1.5);

glBegin(GL_LINES);

for(i=0;i

{

vcoord[0]=pointx[i];

vcoord[1]=pointy[i];

vcoord[2]=pointz[i];

glV ertex3f((GLfloat)vcoord[0],(GLfloat)vcoord[1],(GLfloat)vcoord[2]);

vcoord[0]=pointx[i+1];

vcoord[1]=pointy[i+1];

vcoord[2]=pointz[i+1];

glV ertex3f((GLfloat)vcoord[0],(GLfloat)vcoord[1],(GLfloat)vcoord[2]);

}

glEnd();

//////////////////////////////////////////////////////////////

SwapBuffers(m_hDC);

}

int CMFCtempletView::yourcode()

{

float PI;

int i,n;

//float centerx,centery,centerz,scale;

PI=(float)3.1415926;

for(i=0;i<500;i++)

{

pointx[i]=0;

pointy[i]=0;

pointz[i]=0;//存储离散点坐标的数组

}

///////////////加入你的代码///////////////////////////////////

/////////////以下示例应该被替换的部分//////////////////////

n=500;//这是离散点的个数,一定需要的语句,不能超过500

switch(curve)

{

case 1:

{

if(clicktimes>2)

{

for(i=0;i

{

pointx[i]=Bezier(clicktimes,(float)i/(float)(n-1),vertexx);

pointy[i]=Bezier(clicktimes,(float)i/(float)(n-1),vertexy);

//pointx[i]=(float)cos(i*2*PI/(n-1));

//pointy[i]=(float)sin(i*2*PI/(n-1));

}

}

};

break;//bezier曲线的代码

case 2:

{

if(clicktimes>3)

{

for(i=0;i

{

for(int j=0;j<20;j++)

{

pointx[j+20*i]=SPlines((float)j/20,vertexx,i);

pointy[j+20*i]=SPlines((float)j/20,vertexy,i);

}

}

n=20*(clicktimes-3);

}

};

break;//BSplines曲线

case 3:

{

if(clicktimes>2)

{

float *controlx,*controly;

controlx=new float[clicktimes+2];

controly=new float[clicktimes+2];

BSplines2(vertexx,controlx,clicktimes);

BSplines2(vertexy,controly,clicktimes,Differencial1(vertexx,vertexy),Differencialn(vertexx,vertexy ,clicktimes-1));

/*for(i=0;i

{

pointx[i]=controlx[i];

pointy[i]=controly[i];

}*/

for(i=0;i

{

for(int j=0;j<20;j++)

{

pointx[j+20*i]=SPlines((float)j/20,controlx,i);

pointy[j+20*i]=SPlines((float)j/20,controly,i);

}

}

delete []controlx;

delete []controly;

n=20*(clicktimes-1);

}

}

}

pointnum=n;

return n;

}

void CMFCtempletView::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default CView::OnLButtonDown(nFlags, point);

if(clicktimes<200)

{

vertexx[clicktimes]=(float)((float)(point.x)-(float)ccx/2.0);

vertexy[clicktimes]=-(float)((float)(point.y)-(float)ccy/2.0);

clicktimes++;

}

Invalidate();

}

void CMFCtempletView::OnBezier()

{

// TODO: Add your command handler code here

curve=1;

Invalidate();

}

void CMFCtempletView::OnBsplines()

{

// TODO: Add your command handler code here

curve=2;

Invalidate();

}

void CMFCtempletView::OnBsplineso()

{

// TODO: Add your command handler code here

curve=3;

Invalidate();

}

void CMFCtempletView::OnMYRedraw()

{

// TODO: Add your command handler code here

curve=0;

pointnum=0;

clicktimes=0;

Invalidate();

}

五、实验截图

三次贝塞尔曲线:

计算机图形学作业

计算机图形学第一次作业 计算机X班XXX 1XXX010XXX 1.你是否想用图形学的有关知识去解决一两个实际问题?你想解决的问题是什么?考虑如何解决? 答:我希望可以解决的有设计汽车外壳和制作动画。 解决方法:(1)汽车外壳 使用3D MAX/AutoCAD软件进行设计。 (2)制作动画 利用动画制作软件(3D MAX)在计算机上制作动画 2.某彩色图形显示系统,CRT显示器的分辨率为1024×1024,它可以从2^17次方种颜色中选择出2^15次方来显示,其帧缓冲器的容量应该如何计算?查色表的长度和宽度应为多少? 解:16b==2B 因为分辨率为1024x1024 所以1024*1024*2B=2MB 3.采用Bresenham画线算法,绘出起点(1,3),终点为(9,18)的直线段。 解: void DrawBresenhamline(int x0, int y0, int x1, int y1) { int dx = x1 - x0;//x偏移量 int dy = y1 - y0;//y偏移量 int ux = dx >0 ?1:-1;//x伸展方向 int uy = dx >0 ?1:-1;//y伸展方向 int dx2 = dx <<1;//x偏移量乘2 int dy2 = dy <<1;//y偏移量乘2 if(abs(dx)>abs(dy)) {//以x为增量方向计算 int e = -dx; //e = -0.5 * 2 * dx,把e 用2 * dx* e替换 int x = x0;//起点x坐标 int y = y0;//起点y坐标 for (x = x0; x < x1;x+=ux) { printf ("%d,%d\n",x, y); e=e + dy2;//来自2*e*dx= 2*e*dx + 2dy (原来是e = e + k) if (e > 0)//e是整数且大于0时表示要取右上的点(否则是右下的点) { y += uy; e= e - dx2;//2*e*dx = 2*e*dx - 2*dx (原来是e = e -1) } } } else {//以y为增量方向计算

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号:2012211632 班级:计算机12-2班 实验地点:逸夫楼507 实验时间:15.04.10 15.04.17

实验一 1 实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力; 编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。 2 实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One (自制平台) 3 实验结果 3.1 程序流程图 (1)DDA 算法 是 否 否 是 是 开始 计算k ,b K<=1 x=x+1;y=y+k; 绘点 x<=X1 y<=Y1 绘点 y=y+1;x=x+1/k; 结束

(2)Mid_Bresenham 算法 是 否 否 是 是 是 否 是 否 开始 计算dx,dy dx>dy D=dx-2*dy 绘点 D<0 y=y+1;D = D + 2*dx - 2*dy; x=x+1; D = D - 2*dy; x=x+1; x

3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; }

计算机图形学期末大作业3D建模

深圳大学实验报告 课程名称:计算图形学 实验名称:3D建模和真实感图形绘制 学院:计算机与软件学院专业:计算机科学与技术报告人:学号:2012150 班级: 1 同组人:无 指导教师:周虹 实验时间:2014年11、12月 实验报告提交时间:2014/12/28 教务处制

一.实验目的 1、使用OpenGL创建和动画你自己设计的角色。 2、熟悉3D层次建模和转换。 二.实验步骤 1、打开VC6.0打开工作空间modeler.dsw, 可以看到工程的所有工程都包含进来了。找到sample.cpp并打开。 2、找到sample.cpp中的draw函数,在这个函数中绘制图形。首先,在一对glPushMatrix()和glPopMatrix()之间用glTranslated函数确定绘制图形坐标系的原点(以下图形的绘制均用到这对函数,后面不再赘述)。然后用三角形绘制平行四边形的地板,用

setDiffuseColor函数设定不同的颜色参数。 主要代码如下: 2、为模型绘制背景,即三角旋转阶梯。同样的,用三角形绘制,使得整个画面看起来像舞台般宽敞华丽。

截断): 拼接柱子,并且颜色设置成黄白相间,使气氛柔和淡雅。

4、柱子一般都有柱台的。此处用长方体作为柱台,大气得体。颜色选择淡蓝色,正好跟柱子的颜色相辉映。 主要代码如下:

5、俗话说好事成双。在同一个层次中,我再绘制了同样的柱子和柱台,使画面呈现对称美。 6、柱子是空心的,得给它加个“盖子”。为了统一柱子的结构,此处依然用三角形拼接柱子的尖顶,尖顶作为柱子的下一个层次。如图:

计算机图形学上机实验报告

计算机图形学实验报告 姓名: 学号: 班级:

目录 实验一OpenGL程序结构练习 (3) 实验二基本图形生成 (6) 实验三交互式控制 (9) 实验四图形基本变换 (12) 实验五三维图形生成及显示 (15) 实验六三维图形生成及显示 (19)

实验一OpenGL程序结构练习 【实验目的】 1.熟悉C语言环境下OpenGL的使用方法; 2.了解OpenGL程序的基本结构。 【实验原理】 绝大多数OpenGL程序具有类似的结构,包含下述函数 main(): 定义回调函数,打开一个或多个具有指定属性的窗口,进入事件循环(最后一条可执行语句) init(): 设置状态变量、视图、属性、回调、显示函数、输入和窗口函数#include // glut.h includes gl.h and glu.h void display() { ……} void init() { ……} int main( intargc, char **argv) { ……}

【实验内容】 1.了解程序中各个结构的功能; 2.用OpenGL生成三角形。 【实验步骤及结果】 1.导入OpenGL的glut3 2.lib和glut.h文件:将.lib文件存放到C 语言程序文件夹的Library下,.h文件放到Include下;导入应用程序扩展文件glut32.dll,存放到system文件夹下。 2.打开VC 6.0,新建工程,并命名为text1,如图1. 图 1 3.在工程text1下新建源文件,并命名为text1.cpp。 4.编写代码并编译链接,如图2所示。

计算机图形学作业-Display-答案分析

计算机图形学作业I 一.判断题 1.齐次坐标提供了坐标系变换的有效方法,但仍然无法表示无穷远的点;(×) 2.若要对某点进行比例、旋转变换,首先需要将坐标原点平移至该点,在新的坐标系下做比例或旋转变换,然后在将原点平移回去;(√) 3. 相似变换是刚体变换加上等比缩放变换;(√) 4. 保距变换是刚体变换加上镜面反射;(√) 5. 射影变换保持直线性,但不保持平行性。(√) 二、填空题 1.透视投影的视见体为截头四棱锥形状;平行投影的视见体为长方体形状。 2.字符的图形表示可以分为矢量表示和点阵表示两种形式。 3.仿射变换保持直线的平行性 4.刚体变换保持长度 5.保角变换保持向量的角度 三、单项选择题 1. 分辨率为1024×1024的显示器各需要多少字节位平面数为24的帧缓存?( D) A. 512KB; B. 1MB; C. 2MB; D. 3MB ; 2. 在透视投影中,主灭点的最多个数是( C ) A 1; B 2; C 3; D 4 3. 以下关于图形变换的论述不正确的是( B ) A. 平移变换不改变图形大小和形状,只改变图形位置; B. 拓扑关系不变的几何变换不改变图形的连接关系和平行关系; C.旋转变换后各图形部分间的线性关系和角度关系不变,变换后直线的长度不变 D.错切变换虽然可引起图形角度的改变,但不会发生图形畸变; 4. 使用下列二维图形变换矩阵:将产生变换的结果为( D ) A. 图形放大2倍; B. 图形放大2倍,同时沿X、Y1个绘图单位; C.沿X坐标轴方向各移动2个绘图单位; D.沿X坐标轴方向放大2倍,同时沿X、Y坐标轴方向各平移1个绘图单位。 5. 下列有关投影的叙述语句中,正确的论述为(B ) A. 透视投影具有近小远大的特点; B. 平行投影的投影中心到投影面距离是无限的; C. 透视投影变换中,一组平行于投影面的线的投影产生一个灭点; T =

计算机图形学实验报告 (2)

中南大学信息科学与工程学院 实验报告实验名称 实验地点科技楼四楼 实验日期2014年6月 指导教师 学生班级 学生姓名 学生学号 提交日期2014年6月

实验一Window图形编程基础 一、实验类型:验证型实验 二、实验目的 1、熟练使用实验主要开发平台VC6.0; 2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序; 3、掌握Window图形编程的基本方法; 4、学会使用基本绘图函数和Window GDI对象; 三、实验内容 创建基于MFC的Single Document应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求: 1、用户可以通过菜单选择绘图颜色; 2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形; 四、实验要求与指导 1、建立名为“颜色”的菜单,该菜单下有四个菜单项:红、绿、蓝、黄。用户通过点击不同的菜单项,可以选择不同的颜色进行绘图。 2、建立名为“绘图”的菜单,该菜单下有三个菜单项:直线、曲线、矩形 其中“曲线”项有级联菜单,包括:圆、椭圆。 3、用户通过点击“绘图”中不同的菜单项,弹出对话框,让用户输入绘图位置,在指定位置进行绘图。

五、实验结果: 六、实验主要代码 1、画直线:CClientDC *m_pDC;再在OnDraw函数里给变量初始化m_pDC=new CClientDC(this); 在OnDraw函数中添加: m_pDC=new CClientDC(this); m_pDC->MoveTo(10,10); m_pDC->LineTo(100,100); m_pDC->SetPixel(100,200,RGB(0,0,0)); m_pDC->TextOut(100,100); 2、画圆: void CMyCG::LineDDA2(int xa, int ya, int xb, int yb, CDC *pDC) { int dx = xb - xa; int dy = yb - ya; int Steps, k; float xIncrement,yIncrement; float x = xa,y= ya; if(abs(dx)>abs(dy))

《数字图像处理》复习大作业及答案

2014年上学期《数字图像处理》复习大作业及参考答案 ===================================================== 一、选择题(共20题) 1、采用幂次变换进行灰度变换时,当幂次取大于1时,该变换是针对如下哪一类图像进行增 强。(B) A 图像整体偏暗 B 图像整体偏亮 C图像细节淹没在暗背景中D图像同时存在过亮和过暗背景 2、图像灰度方差说明了图像哪一个属性。(B ) A 平均灰度 B 图像对比度 C 图像整体亮度D图像细节 3、计算机显示器主要采用哪一种彩色模型( A ) A、RGB B、CMY或CMYK C、HSI D、HSV 4、采用模板[-1 1]T主要检测( A )方向的边缘。 A.水平 B.45? C.垂直 D.135? 5、下列算法中属于图象锐化处理的是:( C ) A.低通滤波 B.加权平均法 C.高通滤波 D. 中值滤波 6、维纳滤波器通常用于( C ) A、去噪 B、减小图像动态范围 C、复原图像 D、平滑图像 7、彩色图像增强时, C 处理可以采用RGB彩色模型。 A. 直方图均衡化 B. 同态滤波 C. 加权均值滤波 D. 中值滤波 8、__B__滤波器在对图像复原过程中需要计算噪声功率谱和图像功率谱。 A. 逆滤波 B. 维纳滤波 C. 约束最小二乘滤波 D. 同态滤波 9、高通滤波后的图像通常较暗,为改善这种情况,将高通滤波器的转移函数加上一常数量以 便引入一些低频分量。这样的滤波器叫B。 A. 巴特沃斯高通滤波器 B. 高频提升滤波器 C. 高频加强滤波器 D. 理想高通滤波器 10、图象与灰度直方图间的对应关系是 B __ A.一一对应 B.多对一 C.一对多 D.都不 11、下列算法中属于图象锐化处理的是:C A.低通滤波 B.加权平均法 C.高通滤 D. 中值滤波 12、一幅256*256的图像,若灰度级数为16,则存储它所需的比特数是:( A ) A、256K B、512K C、1M C、2M 13、噪声有以下某一种特性( D ) A、只含有高频分量 B、其频率总覆盖整个频谱 C、等宽的频率间隔内有相同的能量 D、总有一定的随机性 14. 利用直方图取单阈值方法进行图像分割时:(B) a.图像中应仅有一个目标 b.图像直方图应有两个峰 c.图像中目标和背景应一样大 d. 图像中目标灰度应比背景大 15. 在单变量变换增强中,最容易让人感到图像内容发生变化的是( C )

计算机图形学作业-Display-答案

计算机图形学作业 I 一.判断题 1.齐次坐标提供了坐标系变换的有效方法,但仍然无法表示无穷远的点;(×) 2.若要对某点进行比例、旋转变换,首先需要将坐标原点平移至该点,在新的坐标系下做比例或旋转变换,然后在将原点平移回去;(√) 3. 相似变换是刚体变换加上等比缩放变换;(√) 4. 保距变换是刚体变换加上镜面反射;(√) 5. 射影变换保持直线性,但不保持平行性。(√) 二、填空题 1.透视投影的视见体为截头四棱锥形状;平行投影的视见体为长方体形状。 2.字符的图形表示可以分为矢量表示和点阵表示两种形式。 3.仿射变换保持直线的平行性 4.刚体变换保持长度 5.保角变换保持向量的角度 三、单项选择题 1. 分辨率为1024×1024的显示器各需要多少字节位平面数为24的帧缓存?( D) A. 512KB; B. 1MB; C. 2MB; D. 3MB ; 2. 在透视投影中,主灭点的最多个数是( C ) A 1; B 2; C 3; D 4 3. 以下关于图形变换的论述不正确的是( B ) A. 平移变换不改变图形大小和形状,只改变图形位置; B. 拓扑关系不变的几何变换不改变图形的连接关系和平行关系; C.旋转变换后各图形部分间的线性关系和角度关系不变,变换后直线的长度不变 D.错切变换虽然可引起图形角度的改变,但不会发生图形畸变; 4. 使用下列二维图形变换矩阵:将产生变换的结果为( D ) A. 图形放大2倍; B. 图形放大2倍,同时沿X、Y1个绘图单位; C.沿X坐标轴方向各移动2个绘图单位; D.沿X坐标轴方向放大2倍,同时沿X、Y坐标轴方向各平移1个绘图单位。 5. 下列有关投影的叙述语句中,正确的论述为(B ) A. 透视投影具有近小远大的特点; B. 平行投影的投影中心到投影面距离是无限的; C. 透视投影变换中,一组平行于投影面的线的投影产生一个灭点; T =

计算机图形学实验报告

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握DDA直线扫描转换算法。 3.深入了解直线扫描转换的编程思想。 二、【实验内容】 1.利用DDA的算法原理,编程实现对直线的扫描转换。 2.加强对DDA算法的理解和掌握。 三、【测试数据及其结果】 四、【实验源代码】 #include

#include #include #include GLsizei winWidth=500; GLsizei winHeight=500; 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 DDALine(int x0,int y0,int x1,int y1) { glColor3f(1.0,0.0,0.0); int dx,dy,epsl,k; float x,y,xIncre,yIncre; 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++) { glPointSize(3); glBegin(GL_POINTS); glV ertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre; y+=yIncre; } } void Display(void) { glClear(GL_COLOR_BUFFER_BIT); DDALine(100,100,200,180); glFlush(); }

计算机图形学期末编程大作业

完成下列程序的设计、调试与及设计说明书: 一、实现直线、圆的生成 要求:(1)算法不限;(2)直线的端点、圆的圆心、半径由用户实时输入;(3)用所实现的直线、圆的生成程序实现一个任意图形的绘制。 二、实现区域填充(多边形区域)或影线填充 要求:(1)区域自行指定,至少应有一个内环(2)算法:计算机相关专业的要求实现图案填充,机械相关专业的要求实现影线填充。 三、直线段裁剪算法的实现 要求:完成对一个指定图形(见图)的裁剪,先在图形 区显示原始图形及窗口位置,然后将裁剪后图形的显示在图 形区的另一侧。 四、凸多面体消隐的实现(外法线法) 要求:立体数据自定。 五、样条曲线的实现 要求:实现B样条曲线,并能通过交互输入点的形式完成曲 线绘制。 注意:要反求控制点 六、平时成绩(30分) 要求: 1、语言不限,可以是所熟悉的如何一种语言。 2、须提交的内容包括:源程序(电子版)、可执行程序,设计说明书(电子版及打印版)。 3、程序须经教师运行测试通过。 4、设计说明书B5页面打印,内容包括:算法与数据结构,程序流程说明及变量,程序运行情况分析及结果截图,程序使用说明。

题目一:实现直线、圆的生成 要求:(1)算法不限;(2)直线的端点、圆的圆心、半径由用户实时输入;(3)用所实现的直线、圆的生成程序实现一个任意图形的绘制。 1.程序使用说明. 1)概述 该程序以Visual C++6.0作为编程开发工具,利用其中的MFC(Microsoft Foundation Classes)库作为应用程序的框架,进行图形的编程绘制,有良好的用户操作界面和简洁的操作方法。 执行该程序,界面如下图。 图1-1 程序运行界面 图形绘制功能的实现,主要是通过点选菜单栏中的对应菜单项来实现。主要功能有:图形颜色的选择、绘制直线、绘制圆。 2)具体操作说明: a.颜色的选择. 鼠标左键单击菜单项,便会弹出颜色编辑对话框,如图2。

计算机图形学实验

实验1 直线的绘制 实验目的 1、通过实验,进一步理解和掌握DDA和Bresenham算法; 2、掌握以上算法生成直线段的基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。实验环境 计算机、Turbo C或其他C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include

void DDALine(int x0,int y0,int x1,int y1,int color) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; 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++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ;

计算机图形学作业题

计算机图形学作业题 1. 计算机中由图形的形状参数(方程或分析表达式的系数,线段的端点坐标等)加属性参数(颜色、线型等)来表示图形称图形的参数表示;枚举出图形中所有的点称图形的点阵表示,简称为图像(数字图像) 2. 什么是计算机图形学?计算机图形学有哪些研究内容? 3. 计算机图形学有哪些应用领域? 4. 计算机图形学有哪些相关学科分支?它们的相互关系是怎样的? 5. 图形系统的软件系统由哪些软件组成?举例说明。 6. 了解计算机图形系统的硬件。 7. 什么是显示器的分辨率、纵横比、刷新率? 8. 什么是像素、分辨率、颜色数?分辨率、颜色数与显存的关系? 分辨率M ?N 、颜色个数K 与显存大小V 的关系: 例:分辨率为1024像素/行?768行/ 帧,每像素24位(bit )颜色(224种颜色)的显示器,所需的显存为:1024?768?24位(bit )=1024?768?24/8=2359296字节(byte )。或:每像素16777216种颜色(24位真彩色),1024?768的分辨率,所需显存为:1024?768?log 216777216位显存=2359296字节显存。 9. 什么是图元的生成?分别列举两种直线和圆扫描转换算法。 10. OpenGL 由核心库GL(Graphics Library)和实用函数库GLU(Graphics Library Utilities)两个库组成。 11. 区域填充算法要求区域是连通的,因为只有在连通区域中,才可能将种子点的颜色扩展到区域内的其它点。 区域可分为 向连通区域和 向连通区域。区域填充算法有 填充算法和 填充算法。 12. 字符生成有哪两种方式? 点阵式(bitmap fonts 点阵字——raster 光栅方法):采用逐位映射的方式得到字符的点阵和编码——字模位点阵。 笔画式(outline fonts 笔画字——stroke 方法):将字符笔画分解为线段,以线段端点坐标为字符字模的编码。 13. 图形信息包含图形的 和 。 14. 什么是图形变换?图形变换只改变图形的 不改变图形的 。图形变换包括 和 ( )。 15. 熟练掌握二维图形的齐次坐标表示、平移、比例、旋转、对称变换以及复合变换的方法和原则。 16. 图形的几何变换包括 、 、 、 、 ;图形连续作一次以上的几何变换称 变换。 17. 试写出图示多边形绕点A(xo,yo)旋转的变换矩阵。要求写出求解过程及结果。 18. 试写出针对固定参考点、任意方向的比例变换矩阵。 19. 试写出对任意直线y=mx+b 的对称变换矩阵。 20. 什么是窗口?什么是视区?什么是观察变换? 21. 简述二维观察变换的流程。 22. 试述窗口到视区的变换步骤,并推出变换矩阵。 ??—(位) —K N M V 2log ??≥

东南大学自动化学院计算机图形学大作业

计算机图形学大作业 ——程序设计 用简单光照模型显示一系列小球在不同参数情况下的镜面反射效果 学号:08009223 姓名:贺国睿 专业:自动化日期:2012.5.26

1 设计目标和要求 ?用简单光照模型显示一系列小球在不同参数情况下的镜面反射效果; 2 算法原理介绍 2.1光源分析 在现实生活中的物体,要有光照存在才可以被看到。物体通过自身发光以及反射光进入人眼,物体才能在人眼中成像。如果没有任何的光,人眼将观察不到任何东西,一片漆黑。 在光照中首先是光源,要有光源才能产生光线,才有以后的一系列反射、折射、散射等效果。不同的物体的表面物理属性不同,所以相同的光线照射到不同表面属性的物体表面会产生不同的效果,发生漫反射,镜面反射的比例各不相同,有的属于半透明的物体还有折射效果。这些不同的物体表面物理属性属于材质的范畴。 除了材质以外,物体表面还有各种图案效果,这就是纹理。光线在空中穿行的时候,还会有更多复杂的效果。 在现实中,光源的类型很多,而且有的光源不能简单的用一种模型来描述,而是具有多种不同类型光源特点。几种基本的光源类型是:点光源、无穷远光源、方向光源和环境光。 点光源:光线从光源点向四面八方发散,发光的恒星(如太阳)、发光的灯泡一般使用该光源模型模拟,是最简单的光源。 无穷远光源:所有的光线都平行的从一个方向过来,当发光体(如太阳)离渲染的场景很远可以认为是无穷远时,一般使用该光源模型进行模拟。 方向光源:光线沿着一个方向在特定角度范围内逐渐发散开。现实世界中的车灯,手电筒一般使用该光源模型进行模拟。 环境光源:光线从各个地方以各个角度投射到场景中所有物体表面,找不到光源的确切位置。现实世界中不存在这样的光源,一般使用该光源模型来模拟点光源、无穷远光源、方向光源在物体表面经过许多次反射后的情况,环境光源照亮所有物体的所有面。 这四种基本的光源模型,只能近似的描述光源,不可能做到非常逼真。在现实中,一束光线照射到物体表面发生反射后,再照射到另外的物体的表面,如此循环反复这才是环境光的真正情况。这个过程是个无限次反射的过程,计算机无法处理无限的问题,所以采取了简单的近似处理。而且环境光源在反射过程中,上一次反射所带的颜色会影响下次反射所照物体的颜色,并且无限的重复。光线追踪算法是一种好得多的近似描述,但也仅仅是近似描述,只是近似效果比用环境光源模型要好。 OpenGL还提供了让物体自发光让自己可以被看见的方式。这就是物体自发光。物体自发光对于光源十分的重要,比如电灯泡可以看作是一个点光源,我们把点光源的位置设置到灯泡的中央,这样灯泡周围的物体将被照亮,但是灯泡的外表面由于相对光源来说是背面,将不能被照亮。这与实际情况不符合,灯泡照亮其它物体,而自身却不亮,所以需要通过物体自发光让灯泡的外表面也发亮。 光源的一般属性包括:镜面反射光线颜色、漫反射光颜色、环境光线颜色、光源位置。镜面反射光颜色:在物体表面将发生镜面反射的光线的颜色。漫反射光颜色:在物体表面将发生漫反射的光线的颜色。环境光线颜色:照亮所有物体所有表面的光线的颜色。光源位置就是光源在场景中所在的位置。 光线的衰减:光源发出的光线的强度会随着传播距离越来越大而变弱(无穷远光源除外)。光线强度会乘以一个衰减因子。 衰减因子=1/(K1 + K2 * d + k3 *d^2) 其中d为光源距离(无穷远光源的衰减因子为1)方向光源发出的光线会随着偏移中心方向的角度增大而减弱。

计算机图形学作业题

1、已知一直线段起点(0,0),终点(8,6),利用Bresenham算法生成此直线段,写出 生成过程中坐标点及决策变量d的变化情况,并在二维坐标系中,标出直线上各点。 2、试用中点画圆算法原理推导第一象限中y=0到x=y半径为R的圆弧段的扫描转换算法。(要求写清原理、误差函数和递推公式,并进行优化) 3、如下图所示多边形,若采用扫描线算法进行填充,试写出该多边形的ET表和当扫描线Y=3时的有效边表(AET表)。 4、试按左下右上顺序用四向算法,分析当S1为种子时,下图区域的填充过程。 5、将下图中的多边形ABCD先关于点C(3,4)整体放大2倍,再绕点D(5,3)顺时针旋转90 ,试推导其变换矩阵、计算变换后的图形各顶点的坐标,并画出变换后的图形。

6、已知三角形ABC 各顶点的坐标A(3,2)、B(5,5)、C(4,5),相对直线P 1P 2(线段的坐标分别为:P 1 (-3,-2) 、P 2 (8,3) )做对称变换后到达A ’、B ’、C ’。 试计算A ’、B ’、C ’的坐标值。(要求用齐次坐标进行变换,列出变换矩阵,列出计算式子,不要求计算结果) 7、试作出下图中三维形体ABCDE 的三视图。要求写清变换过程,并画出生成的三视图。 x 8、试采用Sutherland –Cohen 裁剪算法,叙述裁剪如下图所示的直线AB 和CD 的步骤: ① 写出端点A 、B 、C 、D 的编码; ② 写出裁剪原理和直线AB 、CD 的裁剪过程。 A B C D 9 、用梁友栋算法裁减如下图线段AB ,A 、B 点的坐标分别为(3,3)、(-2,-1) 裁剪窗口为wxl=0,wxr=2,wyb=0,wyt=2。

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号:20112497 班级:计算机科学与技术11-2班实验地点:逸夫楼507 实验时间:2014.03

实验1直线的生成 1实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析 实验数据的能力; 编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的 直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记 录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编 制成表格,并绘制折线图比较两种算法的性能。 2实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One(自制平台)。 本实验提供名为 Experiment_Frame_One的平台,该平台提供基本 绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham 算法,并进行分析。 ?平台界面:如错误!未找到引用源。所示 ?设置:通过view->setting菜单进入,如错误!未找到引 用源。所示 ?输入:通过view->input…菜单进入.如错误!未找到引用 源。所示 ?实现算法: ◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

3实验结果 3.1程序流程图 1)DDA算法流程图:开始 定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增 量xIncre,y增量yIncre ↓ 输入两点坐标x1,y1,x0,y0 ↓ dx=x1-x0,dy=y1-y0; _________↓_________ ↓↓ 若|dx|>|dy| 反之 epsl=|dx| epsl=|dy| ↓________...________↓ ↓ xIncre=dx/epsl; yIncre=dy/epsl ↓ 填充(强制整形)(x+0.5,y+0.5); ↓←←←← 横坐标x+xIncre; 纵坐标y+yIncre; ↓↑ 若k<=epsl →→→k++ ↓ 结束 2)Mid_Bresenham算法流程图开始 ↓ 定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y ↓ 输入x0,y0,x1,y1 ______↓______ ↓↓ 若x0>x1 反之 x=x1;x1=x0;x0=x; x=x0;

武汉理工大学《计算机图形学》大作业

《计算机图形学基础》大作业 课程名称计算机图形学基础开课学院计算机科学与技术学院指导教师姓名佘名高 学生姓名杨峻 学生专业班级软件工程1102 2013-2014 学年第一学期

一、命题计划 题目:C语言图形编程 (以下题目文档要求:①基本论述②算法③程序源代码④界面图) 二、内容与要求 (1)撰写内容 1.根据Bresenham直线绘制算法,实现直线的绘制。 2.用C语言编写:画y=sin(x)的图形(要求画出[-2π,2π]的图形及笛卡尔坐标)3.用C语言编写一个小圆沿着大圆运动的程序。 4.对图1中的零件图形,如何根据它所标注的尺 寸,按照适当的顺序有步聚地画出该图形。 提示:首先要分析此零件图形的几何关系,了解 构成这个图形各线段的性质,才能顺利地绘出此图形。 线段(直线或圆弧)在零件图形中分为三类,即已知线 段、中间线段和连接线段。以圆弧为例,按几何原理, 已知圆心的两个位置尺寸与半径尺寸便可画出圆。因 此图形中,已知这三个尺寸的圆弧称为已知圆弧,画 图时应该最先画出。凡已知其中二个尺寸的圆弧称为 中间圆弧。凡只已知一个尺寸(一般是圆弧半径)的圆 弧称为连接圆弧。中间圆弧和连接圆弧都缺省圆心的位置尺寸,它的几何位置是根据相切的条件来确定的。因此画圆弧的顺序为:先画已知圆弧,再画中间圆弧,最后画连接圆弧。 本零件图形是对称图形,三个小圆均匀分布在圆周中心线上,φ10,φ25,φ50和R10都是已知圆弧,R8为连接圆弧,φ50是已知圆弧的端点和R10已知圆弧的端点与连接圆弧的端点相切,从而构成整个图形。 (2)撰写要求 1.基本论述 2.算法 3.程序源代码 4.程序运行截图 5.小结

计算机图形学上机实验4_实现Bezier曲线和Bezier曲面的绘制

昆明理工大学理学院 信息与计算科学专业操作性实验报告 年级: 10级姓名:刘陈学号: 201011101128 指导教师: 胡杰 实验课程名称:计算机图形学程序设计开课实验室:理学院机房216 实验内容: 1.实验/作业题目:用计算机高级语言VC++6.0实现计算机的基本图元绘制2.实验/作业课时:2学时 3.实验过程(包括实验环境、实验内容的描述、完成实验要求的知识或技能):实验环境:(1)硬件:每人一台PC机 (2)软件:windows OS,VC++6.0或以上版本。 试验内容及步骤: (1)在VC++环境下创建MFC应用程序工程(单文档) (2)编辑菜单资源 (3)添加菜单命令消息处理函数 (4)添加成员函数 (5)编写函数内容 试验要求: (1)掌握Bezier曲线、Bezier曲面、及另一个曲面的算法。 (2)实现对Bezier曲线、Bezier曲面、及另一个曲面。 (3)试验中调试、完善所编程序,能正确运行出设计要求结果。 (4)书写试验报告上交。 4.程序结构(程序中的函数调用关系图)

5.算法描述、流程图或操作步骤: 在lab4iew.cpp文件中添加如下头文件及变量 int flag_2=0; int n_change; #define M 30 #define PI 3.14159 //圆周率 #include "math.h" //数学头文件 在lab4iew.h文件中的public内添加变量: int move; int graflag; void Tiso(float p0[3],float x0, float y0, float p[3]); void OnBezierface(); 在lab4iew.h文件中的protected内添加变量: int n;//控制点数 const int N;//控制点数的上限 CPoint* a;//控制点存放的数组 double result[4][2]; 在lab4iew.cpp文件中的函数Clab4iew::OnDraw(CDC* pDC)下添加如下代码: int i,j; for(i=0;iFillSolidRect(a[i].x-2,a[i].y-2,4,4,RGB(255,55,255)); } pDC->MoveTo(a[0]);

16秋西交《计算机图形学》在线作业

奥鹏17春16秋西交《计算机图形学》在线作业 一、单选(共30 道,共60 分。) 1. 在三维造型中,不可以使用垂直扫掠造型方法构造的有( )。 A. 园柱 B. 长方体 C. 三棱锥 D. 正十二面体 标准解: 2. 在直线段的参数方程表示方法中,参数t的取值范围为( )。 A. 【0,1】 B. 【0,∞】 C. 【-1,1】 D. 【-1,0】 标准解: 3. 如果希望在CorelDRAW中创建的多个页面具有相同的图形元素,可以执行下面的哪一项操作( ) A. 先创建多个页面,然后分别在各个页面中绘制相同的图形元素 B. 创建一个页面并在此页面绘制需要的图形元素,然后再将此页面复制多个 C. 选择“Layout-Page Setup”命令,在弹出的对话框中进行设置 D. 在Master Page中创建一个图层,在此图层中绘制希望出现在各个页面中的图形元素,则此各个页面将具有相同的图形元素 标准解: 4. 下列有关平面几何投影的叙述,错误的是( )。 A. 透视投影又可分为一点透视、二点透视、三点透视 B. 斜投影又可分为等轴测、斜二测 C. 正轴测又可分为等轴测、正二测、正三测 D. 正视图又可分为主视图、侧视图、俯视图 标准解: 5. 要快速以递增的方式增大字体大小,可以利用“文本”工具选择特定的字符后,执行以下哪步操作( ) A. 按CTRL + "+"键 B. 双击“缩放”工具 C. 按CTRL + 数字小键盘上的"8" D. 按CTRL + 数字小键盘上的"2" 标准解: 6. 有M个控制顶点Pi(i=1,…k)所决定的n次B样曲线,由()段n次B样曲线段光滑连接而成。

计算机图形学作业

1?什么是图形?在计算机中,图形是如何表示的?计算机图形学的主要研究内容是什么? 答:从广义上说,能够在人的视觉系统中形成的视觉印象的客观对象都称为图形。在计算机图形学中,图形是对客观对象的一种抽象表示,它带有形状和颜色信息。在计算机中,图形通过用点陈法和参数法来表示图形。计算机图形学的主要研究内容是图形的输入,图形的处理,图形的生成和输出。 2?试举例说明计算机图形学的应用。 答:图形用户界面,计算机辅助设计,科学计算可视化,科技、教育、商业领域中的交互式绘图,计算机艺术,地理信息系统,计算机动画、广告及娱乐,多媒体系统,虚拟现实系统。 3.试列举出你所知道的图形输入与输出设备。 答:图形输入设备:鼠标,图形输入板,跟踪球,光笔,触摸屏,操纵杆,空间球,数据手套。 图形输出设备:阴极射线管显示器,液晶显示器,等离子显示器,绘图仪。 4.你用过哪些图形软件包?把它们列举出来。 答:OpenGL DirectX。 5.阴极射线管有哪几个部分组成?它们的功能分别是什么? 答:阴极射线管有五部分组成:电子枪,聚焦系统,加速电极,偏转系统,荧光屏。 电子枪的功能:电流通过灯丝产生热量,对阴极加热使其发出电子束,控制电子束的强弱和数量。 聚焦系统的功能:聚焦系统通过电场或磁场控制电子束,使电子束“变细”,保证轰击荧光屏时产生的亮点足够小,提高显示系统的分辨率。 加速电极的功能:加速电极加有正的高电压,使经过聚焦的电子束高速运动。 偏转系统的功能:控制电子束的水平方向上和竖直方向上的偏转。 荧光屏的功能:显示图形。 6.什么叫刷新?刷新频率与荧光物质的持续发光时间的关系如何? 答:在画线显示器中,电子束在荧光屏上产生的亮点只能持续极短的时间,为了产生静态的不闪烁的图形,电子束必须周期性地反复扫描所要绘制的图形,这种扫描

计算机图形学大作业

程序大作业选题内容 用VC++或者OpenGL上机编程实现如下算法,选择OpenGL编程者可以将文献综述报告选为对OpenGL图形标准和相关库函数的介绍。 程序设计报告要求用A4纸打印,要求报告要求有以下内容: 1设计目标和要求 2算法原理介绍 3程序源代码 4程序运行结果抓图 5参考文献 6 学习体会 1.NURBS曲线的生成与显示。 要求能够演示出w权因子的变化对曲线形状的影响,以及控制顶点的变化对曲线形状的影响,有良好的程序界面,交互式地控制w因子的变化和控制顶点的变化,以示可以通过控制点和权因子来灵活地改变形状。 2.参数多项式曲面的生成与显示 包括双线性曲面、单线性曲面、双三次参数曲面片、孔斯(Coons)曲面。 3.双三次Bezier曲面的生成与显示 要求用不同颜色显示双三次Bezier曲面和曲面的控制网格,并且可以取消曲面控制网格的显示,允许交互式地改变控制网格的顶点位置,以观看Bezier曲面性状的改变。 4.双三次B样条曲面的生成与显示 要求用不同颜色显示双三次B样条曲面和曲面的控制网格,并且可以取消曲面控制网格的显示,允许交互式地改变控制网格的顶点位置,以观看B样条曲面性状的改变。 5.扫描曲面的生成与显示 通过任意指定被运动的基体、以及基体运动的路径,显示生成的扫描曲面。 6.生成并显示Julia集和Madelbrot集的逐级放大图。 如下图所示:

7.实现分形图像压缩算法。 要求能够实现图像的打开、显示和保存功能,并同时显示压缩前和压缩后的图像。 8.用随机插值模型生成并显示山的模型 9.绘制Sierpinski金字塔(需要考虑多边形绘制的顺序,并使用消隐算法,才能显示正确的结果) 10.绘制Sierpinski海绵(需要考虑多边形绘制的顺序,并使用消隐算法,才能显示正确的结果) 11.用粒子系统模拟自然景物,例如跳动的火焰、烟雾、下雨、行云、随风摇曳的草丛等(任选其一)。12.任意选择一种消隐算法,实现曲面物体的消隐(例如一个圆环中间放置一个球)。 13.用简单光照模型显示一个简单场景的漫反射效果。 14.用简单光照模型显示一个简单场景的镜面反射效果。 例如:

相关主题
文本预览
相关文档 最新文档