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

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

完成下列程序的设计、调试与及设计说明书:

一、实现直线、圆的生成

要求:(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-2 颜色编辑对话框

可以通过鼠标左键点选对话框中的颜色实例,或者是自行编辑颜色值,来确定用户想要生成图形的颜色。下面的绘图过程,我们以黑色为例。

b.直线的绘制

图1-3 直线参数对话框

鼠标左键点选菜单栏中的菜单,会弹出下拉菜单,其中提供2种直线绘制的经典算

法,包括DDA算法和Bresenham算法。我们可随意选择一种,例如Bresenham算法。

说表左键单击选定后,便会弹出参数输入对话框,如图3。

注意:由于在计算机的图形显示时,屏幕坐标默认以屏幕左上角点为(0,0)点,X轴方向水平指向右侧,Y轴方向竖直指向下侧。与我们实际中熟悉的坐标系不同,输入点坐标时要注意。例如直线的起止点坐标分别为(0,0)、(100,100),绘制结果如图5。

图1-5 绘制结果

如果输入的坐标值超出了设定的范围,将弹出提示对话框,如下图所示:

c.圆的绘制

鼠标左键点选菜单栏中的菜单,会弹出下拉菜单,Bresenham算法。

则弹出对话框如图5。

图1-5 圆参数输入界面

根据对话框的要求,填入元的基本参数值:圆心坐标值和半径值。

注意:界面上对输入的数值的要求。程序的默认窗体中,图形显示空间为宽度大小为700个像素值,高为428个像素值。全屏条件下,图形显示空间为宽度大小为1024个像素值,高为644个像素值。

我们选择圆心在(350,220)的位置,半径取200像素值。图形效果如下图6。

图1-6 圆形的绘制

2.程序算法说明.

1) 直线的绘制

a.数值微分法DDA(Digital Differential Analyzer简称DDA)

对任何沿直线给定的x的增量△x,可以从下式中计算出y的增量△y:

同样,可以得出对应于指定的△y的x增量△x:

对斜率绝对值|k|<1的线段,即与水平夹角小于45°时,让x从起点到终点变化,每步递增(或递减)1:令△x=±1,则△y=±k。若前一次的直线上像素点坐标为(x i,y i),这一次的直线上像素点坐标为(x i+1,y i+1),则x i+l=x i±1,y i+1=y i±k随后输出该像素的颜色值即可。

对于斜率绝对值|k|>1的线段,让y从起点到终点变化,每步递增(或递减)1,计算对应的x增量,△x=±1/k。若前一次的直线上像素点坐标为(x i,y i),这一次的直线上像素点坐标为(x i+1,y i+1),则x i+1=x i±1/k,y i+l=y i±1随后输出该像素的颜色值即可。

b. Bresenham算法

1965年,Bresenham提出了一种更好的直线生成算法,称为Bresenham算法。此算法的一个主要思想是借助于一个决策变量dk,来确定下一个该点亮的像素点。对于直线斜率k在0~1之间的情况,从给定线段的左端点(x1,y1)开始,逐步处理每个后续列(x位置),并在扫描线y 值最接近线段的像素上绘出一点。

2) Bresenham画圆算法

Bresenham画法与中点画法一样,也考虑从(0,R)到(R/2,R/2)的八分之一圆周。取(0,R)为起点,按顺时针方向生成圆。从这段圆弧的任意一点出发,按顺时针方向生成圆时,为了最佳逼近该圆,下一像素的取法只有三种可能的选择:正右方像素,右下方像素和正下方像素。这三个像素中,与理想圆弧最近者为所求像素。

3.主要程序段

/**********DDA直线算法*************/

void CA View::OnDDALine()

{ // TODO: Add your command handler code here

CClientDC dc(this); CDlg_LinePoint dlgDDAline; int Xs=1; double dx; double e;

int Ys=1; double dy; int Xe=1; double x; int Ye=1; double y;

if(dlgDDAline.DoModal()==IDOK)

{ Xs=dlgDDAline.m_Xs;

Ys=dlgDDAline.m_Ys;

Xe=dlgDDAline.m_Xe;

Ye=dlgDDAline.m_Ye; }

if(Xe>700||Ye>428)

MessageBox("图像超出范围,请在全屏下运行,否则将显示不完全!");

if(Xe>1024||Ye>644)

MessageBox("图像超出范围,将显示不完全!");

dx = Xe - Xs; dy = Ye - Ys; e = (fabs(dx)>fabs(dy)) ? fabs(dx):fabs(dy); dx /= e; dy /= e;

x = Xs; y = Ys;

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

{

dc.SetPixel((int)(x+0.5),(int)(y+0.5),m_clr);

x+=dx;

y+=dy;

}

}

/****************算法结束*********************/

/**********Bresenham直线算法**************/

void CA View::OnBresenhamLine()

{ // TODO: Add your command handler code here

CClientDC dc(this);

CDlg_LinePoint dlgBresenhamline;

int Xs=1; int Ys=1; int Xe=1; int Ye=1; int x,y,p; int dx,dy;

if(dlgBresenhamline.DoModal()==IDOK)

{ Xs=dlgBresenhamline.m_Xs;

Ys=dlgBresenhamline.m_Ys;

Xe=dlgBresenhamline.m_Xe;

Ye=dlgBresenhamline.m_Ye; }

//使传入的端点坐标X值相等

if(Xs==Xe)

{ if(Ys

{ for ( int i=Ys; i<=Ye; i++)

dc.SetPixel(Xs,i,m_clr); }

else

{ for ( int i=Ye; i<=Ys; i++)

{dc.SetPixel(Xs,i,m_clr);} }

return;

}

BOOL m=(fabs(Ye-Ys)<=fabs(Xe-Xs));

//如果Xs大于Xe的值,交换坐标值

if(Xs>Xe)

{ p=Xs;Xs=Xe;Xe=p;

p=Ys;Ys=Ye;Ye=p; }

x=Xs; y=Ys;

dx = Xe - Xs;

dy = Ye - Ys;

if(Xe>700||Ye>428)

MessageBox("图像超出范围,请在全屏下运行,否则将显示不完全!");

if(Xe>1024||Ye>644)

MessageBox("图像超出范围,将显示不完全!");

//斜率绝对值小于等于1

if(m)

{ //情况一:Y递增

if(Ys<=Ye)

{ p=(dy<<1)-dx;

while(x<=Xe)

{ dc.SetPixel(x,y,m_clr);

if(p<0)

{x++;p=p+(dy<<1);}

else

{x++;y++;p=p+((dy-dx)<<1);} }

}

//情况二:Y递减

else

{ p=dx-(dy<<1);

while(x<=Xe)

{ dc.SetPixel(x,y,m_clr);

if(p<0)

{x++;p=p-(dy<<1);}

else

{x++;y--;p=p-((dy=dx)<<1);} }

}

}

//斜率绝对值大于1

else

{ //情况三:Y递增

if(Ys<=Ye)

{ p=(dx<<1)-dy;

while(y<=Ye)

{ dc.SetPixel(x,y,m_clr);

if(p<0)

{y++;p=p+(dx<<1);}

else

{x++;y++;p=p+((dx-dy)<<1);}

}

}

//情况四:Y递减

else

{ p=(dx<<1)+dy;

while(y>=Ye)

{ dc.SetPixel(x,y,m_clr);

if(p<0)

{y--;p=p+(dx<<1);}

else

{x++;y--;p=p+((dx+dy)<<1);} }

}

}

}

/*************算法结束*****************/

/**************Bresenham画法*************/

void CA View::OnBresenhamCircle()

{ // TODO: Add your command handler code here

int X0=1;

int Y0=1;

int R=1;

int x,y,p;

CClientDC dc(this);

CDlg_SetCircle dlgMidPointcircle;

if(dlgMidPointcircle.DoModal()==IDOK)

{ X0=dlgMidPointcircle.m_X0;

Y0=dlgMidPointcircle.m_Y0;

R=dlgMidPointcircle.m_R ;}

if(X0+R>700||Y0+R>428||X0-R<0||Y0-R<0)

MessageBox("图像超出范围,请在全屏下运行,否则将显示不完全!");

if(X0+R>1024||Y0+R>644||X0-R<0||Y0-R<0)

MessageBox("图像超出范围,将显示不完全!");

x=0;y=R; p=3-(R<<1);

for(;x<=y;x++)

{ dc.SetPixel( x+X0, y+Y0, m_clr);

dc.SetPixel(-x+X0, y+Y0, m_clr);

dc.SetPixel( x+X0,-y+Y0, m_clr);

dc.SetPixel(-x+X0,-y+Y0, m_clr);

dc.SetPixel( y+X0, x+Y0, m_clr);

dc.SetPixel(-y+X0, x+Y0, m_clr);

dc.SetPixel( y+X0,-x+Y0, m_clr);

dc.SetPixel(-y+X0,-x+Y0, m_clr);

if(p<0)

p+=((x<<2)+6);

else

{ p+=(((x-y)<<2)+10);

y--; }

}

}

/**************算法结束*****************/

题目二:实现区域填充(多边形区域)或影线填充

要求:(1)区域自行指定,至少应有一个内环(2)算法:计算机相关专业的要求实现图案填充,机械相关专业的要求实现影线填充。

1.程序使用说明.

1)概述

同样利用VC++6.0的MFC来进行程序编写。与之前所编写的程序所用的方式相同。有绘制直线、矩形和椭圆等单独功能。

按下鼠标左键拖动,我们可以绘制由直线、矩形、椭圆构成的任意复杂图形。默认所绘出的图形边线颜色为黑色。

选择填充方式和颜色:

图2-3 填充方式选择

图2-4 选择填充颜色

填充时,要注意利用鼠标右键点选一个封闭的区域。填充过程中,也可以更换不同的填充颜色。如果点在开放部分或者是不封闭的图形处,程序可能会发生溢出。

图2-5 填充结果

2.程序算法说明.

本程序利用种子填充算法,以像素为基础,依据区域内的连通性进行图形的填充。从指定的填充点(称为种子)出发,遍历光栅像素网格,找出从种子出发可以达到而又不穿过边界的所有像素。

3.主要程序段[仅附阴影线画法

void CTianChongView::ScanlineSeedshadow(CDC *pDC, int x, int y, COLORREF boundaryvalue, COLORREF newvalue)

{ int x0,x1,xr,y0; int flag, xnextspan,xid; CDlg_FillType dlg;

stack s; //定义堆栈CPoint p;

s.push(CPoint(x,y)); //将第一个种子入栈

while(!s.empty()) //如果堆栈不为空

{ p=s.top(); //取栈顶元素并弹出

s.pop();

pDC->SetPixel(p.x,p.y,newvalue);//绘制像素点为指定颜色

x=p.x; y=p.y; x0= x+1;

while(pDC->GetPixel(x0,y)!=boundaryvalue) //填充右方的像素

{ if(x0%m_ndensity==y%m_ndensity)

{pDC->SetPixel(x0,y,newvalue);}

x0=x0+1; }

xr = x0-1; x0= x-1;

while(pDC->GetPixel(x0,y)!=boundaryvalue) //填充左方像素

{ if(x0%m_ndensity==y%m_ndensity)

{pDC->SetPixel(x0,y,newvalue);}

x0=x0-1; }

x1=x0+1; //最左侧的像素值

//检查上一条和下一条扫描线,若存在是边界且未填充的像素

//则选区代表个连续区域的种子像素入栈

y0=y;

for (int i=1; i>=-1;i-=2)

{ x0=xr;

y=y0+i;

while (x0>=x1)

{ flag = 0;

while ((pDC->GetPixel(x0,y)!=boundaryvalue)

&&(pDC->GetPixel(x0,y)!=newvalue)

&&(x0>x1))

{ if(x0%m_ndensity==y%m_ndensity)/**按指定宽度绘制阴影线**/ {if(flag==0)

{ flag=1;

xid=x0; }}

x0=x0--; }

if(flag==1)

{ s.push(CPoint(xid,y)); //新种子入栈

flag=0; }

xnextspan=x0;

while((pDC->GetPixel(x0,y)==boundaryvalue)

||(pDC->GetPixel(x0,y)==newvalue)

&&(x0>=x1))

x0=x0--;

if(xnextspan==x0)

x0=x0--; }

}

}

}

题目三:直线段裁剪算法的实现

要求:完成对一个指定图形(见右图)的裁剪,先在图形区显示原始图形及窗口位置,然后将裁剪后图形的显示在图形区的另一侧。

1. 程序使用说明.

1)概述

同样利用VC++中的MFC编制程序。窗口左侧显示此案件窗口和待裁剪图形,窗口右侧显示此案件结果。

图3-1 指定图形

2)具体操作说明

点选菜单上的剪裁按钮,弹出Cohn-Sutherland算法项,点击确认。按下鼠标左键拖动即可绘制出裁剪窗口,利用鼠标右键绘制指定图形在窗口附近便自动完成剪裁,在右窗口输出。

图3-2 程序界面

图3-3 绘出裁剪窗口

图3-4 裁剪结果

3. 主要程序段

/***********对区域进行编码判断***********/

void CCutOutView::Makecode(CPoint Point, int &Code)

{ int x = Point.x; int y = Point.y; Code = 0;

/***********区域编码判断**********/

//若端点在裁剪窗口左侧,则设置Code区域编码为0001

if(x

Code = 1;

//若端点在裁剪窗口右侧,则设置Code区域编码为0010

else if (x > m_RBPoint.x)

Code = 2;

//若端点在裁剪窗口下侧,则设置Code区域编码为0100

if(y

Code += 4;

//若端点在裁剪窗口上侧,则设置Code区域编码为1000

else if (y>m_LTPoint.y)

Code += 8;}

/*****************Cohen_Sutherland剪裁程序**********************/

void CCutOutView::Cohen_Sutherland(CPoint &BPoint, CPoint &EPoint)

{ CPoint bPoint = BPoint; CPoint ePoint = EPoint; int c, cb, ce; int x,y;

Makecode(bPoint,cb); Makecode(ePoint,ce);

while(cb!=0||ce!=0)

{ if((cb & ce)!=0)

{ BPoint = EPoint ;

return; }

c = cb; /***B、E在四边的同侧***/

if(c==0) c=ce;

/**************逐边进行裁剪并计算交点****************/

/***起点在窗口左侧***/

if(c & 1)

{ y=bPoint.y + (ePoint.y - bPoint.y) * (m_LTPoint.x - bPoint.x)/(ePoint.x - bPoint.x);

x = m_LTPoint.x; }

/***裁剪后的起点若在窗口右侧***/

else if(c & 2)

{ y=bPoint.y+(ePoint.y-bPoint.y) * (m_RBPoint.x - bPoint.x)/(ePoint.x - bPoint.x);

x = m_RBPoint.x; }

/***裁剪后的起点若在窗口上侧***/

else if(c & 4)

{

x=bPoint.x + (ePoint.x - bPoint.x) * (m_RBPoint.y - bPoint.y)/(ePoint.y - bPoint.y);

y = m_RBPoint.y;

}

/***裁剪后的起点若在窗口下侧***/

else if(c & 8)

{

x=bPoint.x + (ePoint.x - bPoint.x) * (m_LTPoint.y - bPoint.y)/(ePoint.y - bPoint.y);

y = m_LTPoint.y;

}

if(c == cb)

{

bPoint = CPoint(x,y);

Makecode(bPoint,cb);

}

else

{ ePoint = CPoint(x,y);

Makecode(ePoint,ce); }

} BPoint = bPoint;

EPoint = ePoint;

}/*******************程序段完毕***********************/

题目四:凸多面体消隐的实现(外法线法)

要求:立体数据自定。

1.程序使用说明

利用MFC编程。运行界面如右图。按照界面上的操作要求即可实现对四方台边线的消隐,视觉上实现四方台的旋转。利用键盘上的“↑”、“↓”、“←”、“→”四个方向键,可以调整视角的位置,从不同角度观察四方台。

图4-1程序界面

图4-2程序运行的效果图

2.外法线法

外法线法的主要思想就是利用立体图形各个面的外法线向量与观察点的坐标向量的夹角做比较,对于简单的凸多面体,如果面得外法线向量与观察点的视向量夹角大于180度,则判定该表面背向观察点,做消隐处理,如果外法线向量与视向量夹角小于180度,则判定该表面可以被看到,显示出来。

3. 主要代码段

void CFirstView::DrawFace(CDC*pDC,int nIndex)

{ int p[4];

for(int k=0;k<4;k++)

{p[k]=Face[nIndex][k]; }

pDC->MoveTo(tmpPt[p[0]][0],tmpPt[p[0]][1]);

pDC->LineTo(tmpPt[p[1]][0],tmpPt[p[1]][1]);

pDC->LineTo(tmpPt[p[2]][0],tmpPt[p[2]][1]);

pDC->LineTo(tmpPt[p[3]][0],tmpPt[p[3]][1]);

pDC->LineTo(tmpPt[p[0]][0],tmpPt[p[0]][1]);

}

void CFirstView::DrawHideCube()

{/*四方台8个顶点坐标值*/

Pt[1][0]=100; Pt[1][1]=100; Pt[1][2]=100;

Pt[2][0]=200; Pt[2][1]=100; Pt[2][2]=100;

Pt[3][0]=180; Pt[3][1]=120; Pt[3][2]=200;

Pt[4][0]=120; Pt[4][1]=120; Pt[4][2]=200;

Pt[5][0]=100; Pt[5][1]=200; Pt[5][2]=100;

Pt[6][0]=200; Pt[6][1]=200; Pt[6][2]=100;

Pt[7][0]=180; Pt[7][1]=180; Pt[7][2]=200;

Pt[8][0]=120; Pt[8][1]=180; Pt[8][2]=200;

int nNumberFaces=6;

/**********定义面表**************/

Face[1][0]=1; Face[1][1]=2; Face[1][2]=3; Face[1][3]=4;

Face[2][0]=2; Face[2][1]=6; Face[2][2]=7; Face[2][3]=3;

Face[3][0]=6; Face[3][1]=2; Face[3][2]=1; Face[3][3]=5;

Face[4][0]=1; Face[4][1]=4; Face[4][2]=8; Face[4][3]=5;

Face[5][0]=5; Face[5][1]=8; Face[5][2]=7; Face[5][3]=6;

Face[6][0]=3; Face[6][1]=7; Face[6][2]=8; Face[6][3]=4;

double alpha= alpha1*PI/180.0;//绕Z轴旋转的角度

double beta = beta1*PI/180.0;//绕X轴旋转的角度

//计算投影变换后的坐标

int tx, ty, tz;

tx=ty=tz=200;

/***将立方体八顶点进行平移变换***/

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

{

Pt[i][0] -= tx;

Pt[i][1] -= ty;

Pt[i][2] -= tz;

}

for(i=1;i<9;i++)

{

tmpPt[i][0] = Pt[i][0]*cos(alpha) - Pt[i][1]*sin(alpha)+tx;

tmpPt[i][1] = Pt[i][0]*sin(alpha) * cos(beta) + Pt[i][1] * cos(alpha) * cos(beta) - Pt[i][2] * sin(beta) + ty;

tmpPt[i][2] = Pt[i][0]*sin(alpha) * sin(beta) + Pt[i][1] * cos(alpha) * sin(beta) - Pt[i][2] * cos(beta) + tz;

}

int p[4];

double xn,yn,zn,vn;//定义法线矢量

CDC *pDC = this->GetDC();

CPen pen1(PS_SOLID, 5, m_clr);//对于可见面,线宽设定为5个像素

CPen pen2(PS_DOT, 1,m_clr); //对不可见面,线宽设定为1个像素

CPen *pOldPen = pDC->SelectObject(&pen1);

for(i=1;i

{

for(int k=0; k<4; k++)

{

p[k]=Face[i][k];

}

double x1 =tmpPt[p[0]][0];

double y1 =tmpPt[p[0]][1];

double z1 =tmpPt[p[0]][2];

double x2 =tmpPt[p[1]][0];

double y2 =tmpPt[p[1]][1];

double z2 =tmpPt[p[1]][2];

double x3 =tmpPt[p[2]][0];

double y3 =tmpPt[p[2]][1];

double z3 =tmpPt[p[2]][2];

/**计算外法线矢量****/

/* | i j k |

| x2-x1 y2-y1 z2-z1 |

| x3-x2 y3-y2 z3-z2 | */

xn = (y2-y1)*(z3-z2) - (y3-y2)*(z2-z1);

yn = -(x2-x1)*(z3-z2) + (x3-x2)*(z2-z1);

zn = (x2-x1)*(y3-y2) - (x3-x2)*(y2-y1);

vn = sqrt(xn*xn + yn*yn + zn* zn);

xn=xn/vn; yn=yn/vn; zn=zn/vn;//

/****设置视点位置在Z轴无穷远处,此处近似取(0,0,1000)********/ /*当法向矢量Z轴方向的分量大于0且与视线方向的夹角小于90度时,可见*/ if(zn>=0.0)

{

pDC->SelectObject(&pen1);

DrawFace(pDC,i);

}

pDC->SelectObject(pOldPen);

}

this->ReleaseDC(pDC);

}

题目五:样条曲线的实现

计算机图形学作业

计算机图形学第一次作业 计算机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为增量方向计算

计算机图形学试题附答案完整版

名词解释 将图形描述转换成用像素矩阵表示的过程称为扫描转换。 1.图形 2.像素图 3.参数图 4.扫描线 5.构造实体几何表示法 6.投影 7.参数向量方程 8.自由曲线 9.曲线拟合 10.曲线插值 11.区域填充 12.扫描转换 三、填空 1.图形软件的建立方法包括提供图形程序包、和采用专用高级语言。 2.直线的属性包括线型、和颜色。 3.颜色通常用红、绿和蓝三原色的含量来表示。对于不具有彩色功能的显示系统,颜色显示为。 4.平面图形在内存中有两种表示方法,即和矢量表示法。 5.字符作为图形有和矢量字符之分。 6.区域的表示有和边界表示两种形式。 7.区域的内点表示法枚举区域内的所有像素,通过来实现内点表示。 8.区域的边界表示法枚举区域边界上的所有像素,通过给赋予同一属性值来实现边界表示。 9.区域填充有和扫描转换填充。 10.区域填充属性包括填充式样、和填充图案。 11.对于图形,通常是以点变换为基础,把图形的一系列顶点作几何变换后,

连接新的顶点序列即可产生新的变换后的图形。 12.裁剪的基本目的是判断图形元素是否部分或全部落在之内。 13.字符裁剪方法包括、单个字符裁剪和字符串裁剪。 14.图形变换是指将图形的几何信息经过产生新的图形。 15.从平面上点的齐次坐标,经齐次坐标变换,最后转换为平面上点的坐标,这一变换过程称为。 16.实体的表面具有、有界性、非自交性和闭合性。 17.集合的内点是集合中的点,在该点的内的所有点都是集合中的元素。 18.空间一点的任意邻域内既有集合中的点,又有集合外的点,则称该点为集合的。 19.内点组成的集合称为集合的。 20.边界点组成的集合称为集合的。 21.任意一个实体可以表示为的并集。 22.集合与它的边界的并集称集合的。 23.取集合的内部,再取内部的闭包,所得的集合称为原集合的。 24.如果曲面上任意一点都存在一个充分小的邻域,该邻域与平面上的(开)圆盘同构,即邻域与圆盘之间存在连续的1-1映射,则称该曲面为。 25.对于一个占据有限空间的正则(点)集,如果其表面是,则该正则集为一个实体(有效物体)。 26.通过实体的边界来表示一个实体的方法称为。 27.表面由平面多边形构成的空间三维体称为。 28.扫描表示法的两个关键要素是和扫描轨迹。 29.标量:一个标量表示。 30.向量:一个向量是由若干个标量组成的,其中每个标量称为向量的一个分量。 四、简答题 1. 什么是图像的分辨率?

计算机图形学期末大作业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、柱子是空心的,得给它加个“盖子”。为了统一柱子的结构,此处依然用三角形拼接柱子的尖顶,尖顶作为柱子的下一个层次。如图:

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 1.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++。 2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。 3.实现生成直线的DDA算法、中点算法和Bresenham算法。 4.实现圆弧生成的中点算法。 5.实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。 6.实现一般连通区域的基于扫描线的种子填充算法。 7.将生成算法以菜单或按钮形式集成到用户界面上。 8.直线与圆的坐标参数可以用鼠标或键盘输入。 6. 可以实现任何情形的直线和圆的生成。 实验报告 1.用户界面的设计思想和框图。 2.各种实现算法的算法思想。 3.算法验证例子。 4.上交源程序。 直线生成程序设计的步骤如下: 为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。 图1-1 基本图形生成的程序运行界面 2.创建工程名称为“基本图形的生成”单文档应用程序框架 (1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。 (2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。 (3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。 (4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。

计算机图形学作业-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 =

计算机图形学5套模拟题

组卷规则:每套模拟题5个问答或者计算或者证明题,每题20分。 《计算机图形学基础》模拟试题(1) 1、简述Cohen-Sutherland 裁剪方法的思想,并指出与之相比,中点裁剪方法的改进之处,及这种改进的理由。 答:Cohen-Sutherland 裁剪算法的思想是:对于每条线段分为三种情况处理。(1)若完全在窗口内,则显示该线段简称“取”之。(2)若明显在窗口外,则丢弃该 线段,简称“弃”之。(3)若线段既不满足“取”的条件,也不满足“弃”的条件,则求线段与窗口交点,在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。中点分割算法的大意是,与Cohen-Sutherland 算法一样首先对线段端点进行编码,并把线段与窗口的关系分为三种情况: 全在、完全不在和线段和窗口有交。对前两种情况, 进行同样的处理。对于第三种情况,用中点分割的方法求出线段与窗口的交点。即从点出发找出距最近的可见点A和从点出发找出距最近的可见点B,两个可见点之间的连线即为线段的可见部分。从出发找最近可见点采用中点分割方法:先求出的中点,若不是显然不可见的,并且在窗口中有可见部分,则距最近的可见点一定落在上,所以用代替;否则取代替。再对新的求中点。重复上述过程,直到长度小于给定的控制常数为止,此时收敛于交点。 改进之处在于,对第三种情况,不直接解方程组求交,而是采用二分法收搜索交点。这种改进的理由是:计算机屏幕的象素通常为1024×1024,最多十次二分搜索即可倒象素级,必然找到交点。而且中点法的主要计算过程只用到加法和除2运算,效率高,也适合硬件实现。 2、在Phong 模型 中,三项分别表示何含义?公式中的各个符号的含义指什么? 答:三项分别代表环境光、漫反射光和镜面反射光。为环境光的反射光强,为理想漫反射光强,为物体对环境光的反射系数,为漫反射系数,为镜面反射系数,为高光指数,L 为光线方向,N 为法线方向,V 为视线方向,R 为光线的反射方向。

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

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 )

计算机图形学实验内容汇总

计算机图形学实验 肖加清

实验一图形学实验基础 一、实验目的 (1)掌握VC++绘图的一般步骤; (2)掌握OpenGL软件包的安装方法; (3)掌握OpenGL绘图的一般步骤; (4)掌握OpenGL的主要功能与基本语法。 二、实验内容 1、VC++绘图实验 (1)实验内容:以下是绘制金刚石图案。已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。 N=3 N=4

N=5 N=10 N=30

N=50 (2)参考程序 //自定义的一个类 //此代码可以放在视图类的实现文件(.cpp) 里class CP2 { public: CP2(); virtual ~CP2(); CP2(double,double); double x; double y; }; CP2::CP2() { this->x=0.0; this->y=0.0; } CP2::~CP2() { } CP2::CP2(double x0,double y0) { this->x=x0; this->y=y0; }

//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。 //在视图类的头文件(.h)里定义此函数 void Diamond(); //在视图类的实现文件(.cpp)里实现此函数 void CTestView::Diamond() { CP2 *P; int N; double R; R=300; N=10; P=new CP2[N]; CClientDC dc(this); CRect Rect; GetClientRect(&Rect); double theta; theta=2*PI/N; for(int i=0;i #include #include #include //定义输出窗口的大小 #define WINDOW_HEIGHT 300

计算机图形学作业-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 =

图形学模拟试题 (含答案)

计算机图形学课程模拟试卷(参考答案含评分标准) 2010—2011学年第二学期 年级专业学号姓名得分 一、简要回答题(每题7分,共7题,共49分) 1.被誉为“图形学之父”的伊万?萨瑟兰(Ivan Sutherland)对计算机图形学理论和 应用的主要贡献有哪些? 答:(1)(3分)萨瑟兰在MIT攻读博士学位时,在著名的林肯实验室完成基于光笔的交互式图形系统:Sketchpad。这一系统中许多交互式图形设计的创意是革命性的,它的影响一直延续到今天。 (2)(4分)用于显示立体和彩色图像的“Lorgnette”技术和一系列图形图像算法,如分区编码的直线段裁剪算法、多边形裁剪算法、曲面的表示和消除隐藏线算法等等。 2.有人认为图形学算法主要依赖于点和向量的数学运算,你是否认同这一观点?给出 同意或反对的理由,并举例说明。 答:这一观点是正确的(2分),主要理由和举例如下(5分): (1)图形学的很多算法属于几何算法,点(从三维、二维到一维)是最基本的几何要素,也是统一基本几何的计算机表示形式。例如,在观察流水线上的主要图形学算法,无 论是表示和生成(显示)、建模(造型)、变换(包括投影、观察、消隐)都可以统 一到建立基于点的几何模型;(可以以典型的光栅图形学的算法如基本图形的生成和 变换、三维观察、Z-Buffer算法为例说明) (2)向量几何是图形学的重要数学基础、建立了以“方向性”概念的基本理论、思想方法、几何结构、几何算法与复杂性分析的几何计算理论体系。例如,借助向量几何可以将 二维布尔运算降为一维向量计算、将三维布尔运算下降为二维布尔运算、将三维消隐 算法最终归结为一维交集算法等等,从而使几何计算的复杂性大为简化。(可以以比 较典型的Liang-Barsky裁剪算法、三维实体造型CSG树生成,隐藏线消除算法等为例 说明)。 『评分说明』若认为这一观点是错误的或持有含糊的态度,且给出的例子是片面的、主观的,则本题不得分。其他错误情况者,如未举例说明,酌情扣2分左右。 3.针对多面体模型,直接用简单光照模型绘制会有什么问题?简述两种增量式光照明 模型(多边形绘制)的基本思想,并指出两个算法的主要区别。 答: (1)(3分)针对多面体模型,使用简单光照模型绘制会在多边形与多边形之交界处产生明暗的不连续变化,影响了曲面的显示效果,即马赫带效应。如果增加多边形个数,减小每个多边形的

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

完成下列程序的设计、调试与及设计说明书: 一、实现直线、圆的生成 要求:(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. 计算机中由图形的形状参数(方程或分析表达式的系数,线段的端点坐标等)加属性参数(颜色、线型等)来表示图形称图形的参数表示;枚举出图形中所有的点称图形的点阵表示,简称为图像(数字图像) 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 ??≥

计算机图形学_陆枫_模拟试题1

一、填空(1×20=20分) 1. 一个交互性的计算机图形系统应具 有、、、、输入等五方面的功能。 2. 阴极射线管从结构上可以分 为、和。 3. 常用的图形绘制设备 有和,其中支持矢量格式。 5. 通常可以采用和处理线宽。 6. 齐次坐标表示就是用维向量表示n维向量。 7. 平行投影根据可以分 为和投影。 二、名词解释(3×5=15分) 1. 图像 2. 走样 3. 段 4. 4连通区域 5. 主灭点

三、简答与计算(6×5=30分) 1.图形包括哪两个方面的要素在计算机中如何表示它们 2.简述荫罩式彩色阴极射线管的结构和工作原理 3.在交互输入过程中,常用的管理设备的方式有哪些试分别说明。 4.举例说明奇偶规则和非零环绕树规则进行内外测试时有何不同 5.什么是观察坐标系为什么要建立观察坐标系 四、推导与计算题 (要 1. 试用中点Bresenham算法原理推导斜率大于1的直线段的扫描转换算法。求写清原理、误差函数和递推公式,并进行优化)(15分) 2. 已知直线,求相对于该直线作对称变换的变换矩阵。(10分) 3.试作出下图中三维形体ABCDE的三视图(平移矢量均为1)。要求写清变换过程,并画出生成的三视图。(10分) 一、填空

1. 计算;存储;交互(对话);输入。 2. 电子枪;偏转系统;荧光屏。 3. 打印机;绘图仪;笔式绘图仪。 4. 数值设备;字符串设备;选择设备;拾取设备。 5. 线刷子;方刷子。 6. n+1。 7. 投影方向与投影面是否垂直;正;斜。 二、名词解释 1. 图像:在计算机中用点阵法描述的图形叫做图像。 2. 走样:用离散量表示连续量引起的失真。 3. 段:段是指具有逻辑意义的有限个图素(或体素)及其附加属性的集合,也称为图段(二维空间中)、结构和对象。 4. 4连通区域:从区域上的一点出发,通过访问已知点的4-邻接点,在不越出区域的前提下,遍历区域内的所有像素点。 5. 主灭点:透视投影中,与坐标轴方向平行的平行线的投影会汇聚到一点,这个点称为主灭点。 三、简答与计算 1. 答:构成图形的要素可以分为刻画形状的点、线、面、体等的几何要素和反映物体表面属性或材质的明暗、灰度、色彩(颜色信息)等的非几何要素。

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

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

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

计算机图形学实验三报告

计算机科学与通信工程学院 实验报告 课程计算机图形学 实验题目二维图形变换 学生姓名 学号 专业班级 指导教师 日期

成绩评定表

二维图形变换 1. 实验内容 完成对北极星图案的缩放、平移、旋转、对称等二维变换。 提示:首先要建好图示的北极星图案的数据模型(顶点表、边表)。另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。 2. 实验环境 软硬件运行环境:Windows XP 开发工具:visual studio 2008 3. 问题分析

4. 算法设计 程序框架: //DiamondView.h class CDiamondView : public CView { …… public: //参数输入和提示对话框 void Polaris();//北极星 …… }; //DiamondView.cpp void CDiamondView::OnMenuDiamond() { IsCutting = FALSE; if(dlgDiamond.DoModal()==IDOK) DrawDiamond(dlgDiamond.m_nVertex,dlgDiamond.

m_nRadius,100);//调用绘制金刚石的函数 } //北极星 void CDiamondView::Polaris() {......} 5. 源代码 //北极星 void hzbjx(CDC* pDC,long x[18],long y[18]) { CPen newPen1,*oldPen; newPen1.CreatePen(PS_SOLID,2,RGB(255,0,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex1[11]={{x[1],y[1]},{x[2],y[2]},{x[3],y[3]},{x[4],y[4]},{x[5],y[5]},{x[3],y[3]},{x[1],y[1]}, {x[6],y[6]},{x[3],y[3]},{x[7],y[7]},{x[5],y[5]}}; pDC->Polyline(vertex1, 11); newPen1.DeleteObject(); newPen1.CreatePen(PS_SOLID, 2, RGB(0,255,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex2[5]={{x[6],y[6]},{x[8],y[8]},{x[9],y[9]},{x[3],y[3]},{x[8],y[8]}}; pDC->Polyline(vertex2, 5); POINT vertex3[5]={{x[4],y[4]},{x[10],y[10]},{x[11],y[11]},{x[3],y[3]},{x[10],y[10]}}; pDC->Polyline(vertex3, 5);

计算机图形学作业题

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。

《计算机图形学》练习试题及参考答案(二)

《计算机图形学》练习试题及参考答案 二、选择题(每题2分) B 1、计算机图形学与计算几何之间的关系是( )。 A)学术上的同义词B)计算机图形学以计算几何为理论基础 C)计算几何是计算机图形学的前身D).两门毫不相干的学科 B 2、计算机图形学与计算机图象学的关系是( )。 A)计算机图形学是基础,计算机图象学是其发展 B)不同的学科,研究对象和数学基础都不同,但它们之间也有可转换部分 C)同一学科在不同场合的不同称呼而已 D)完全不同的学科,两者毫不相干 C 3、触摸屏是( )设备。 A)输入B)输出C)输入输出D)既不是输入也不是输出 B 4.计算机绘图设备一般使用什么颜色模型?( ) A)RGB;B)CMY;C)HSV ;D)HLS A 5. 计算机图形显示器一般使用什么颜色模型?( ) A)RGB;B)CMY;C)HSV ;D)HLS C 6.分辨率为1024×1024的显示器各需要多少字节位平面数为24的帧缓存?( ) A)512KB;B)1MB;C)2MB ;D)3MB

D 7.哪一个不是国际标准化组织(ISO)批准的图形标准?( ) A)GKS;B)PHIGS;C)CGM ;D)DXF C8.下述绕坐标原点逆时针方向旋转a角的坐标变换矩阵中哪一项是错误的? ( ) | A B | | C D | A) cos a; B) sin a; C) sin a; D) cos a A 9、在多边形的逐边裁剪法中,对于某条多边形的边(方向为从端点S 到端点P)与某条裁剪线(窗口的某一边)的比较结果共有以下四种情况,分别需输出一些顶点.请问哪种情况下输出的顶点是错误的? ( ) A)S和P均在可见的一侧,则输出S和P. B)S和P均在不可见的一侧,则输出0个顶点. C)S在可见一侧,P在不可见一侧,则输出线段SP与裁剪线的交点. D)S在不可见的一侧,P在可见的一侧,则输出线段SP与裁剪线的交点和P. C 10、在物体的定义中对边的哪条限制不存在? ( ) A) 边的长度可度量且是有限的 B) 一条边有且只有两个相邻的面

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

《计算机图形学基础》大作业 课程名称计算机图形学基础开课学院计算机科学与技术学院指导教师姓名佘名高 学生姓名杨峻 学生专业班级软件工程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.小结

计算机图形学实验

实验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 ;

相关文档
最新文档