图形学简答题和代码题.整理

 

简答题

1

计算机图形系统的组成

计算机系统是计算机硬件、图形输入输出设备、计算机系统软件和图形软件的集合。计算机图形系统由计算机硬件系统(图形计算机平台和图形设备)和软件系统(图形支撑软件、图形应用软件和图形应用数据结构)两部分组成。严格说来,使用系统的人也是这个系统的组成部分。

 

2计算机图形系统的功能

计算功能、存储功能、对话功能、输入功能、输出功能。

 

3图形学的应用(课程研究内容)

1)图形用户界面2)计算机辅助设计与制造3)事务和商务数据的图形显示4)地形地貌和自然资源的图形显示5)过程控制及系统环境模拟6)电子出版及办公自动化7)计算机动画及广告8)计算机艺术9)科学计算的可视化10)工业模拟11)计算机辅助教学。

 

4.坐标系统

为了描述、分析、度量几何物体的大小、形状、位置、方向以及相互之间的各种关系使用 的参考框架叫做坐标系统。

 

5.观察坐标系:

观察坐标系通常是以视点的位置为原点,通过用户指定的一个向上的观察向量来定义整 个坐标系统,缺省为左手坐标系,观察坐标系主要用于从观察者的角度对整个世界坐标系内的对象进行重 新定位和描述,从而简化几何物体在投影面的成像的数学推导和计算。

 

6.计算机图形学:

用计算机建立、存储、处理某个对象的模型,并根据模型产生该对象图形输出的有关 理论、方法与技术,称为计算机图形学。

 

7.计算机图形标准:

计算机图形标准是指图形系统及其相关应用程序中各界面之间进行数据传送通信的接口标准。

 

8.几何变换:

几何变换的基本方法是把变换矩阵作为一个算子,作用到图形一系列顶点的位置矢量,从 而得到这些顶点在几何变换后的新的顶点序列,连接新的顶点序列即可得到变换后的图形。

 


代码题

 

 

1、圆中点法

Void MidpointCircle(int r, int color)

{    int x,y;float d;

      x=0; y=r; d=1-r;

      while(x<y)

      {    drawpixel(x,y,color);

           if(d<0){ d+ = 2*x+3; x++ };

          else{d+ = 2*(x-y) + 5; x++;y--;

} }}

 

2Bresenham

circle (xc, yc, radius, c)

int xc, yc, radius, c;

{   int x, y, p;

    x=0; y=radius; p=3-2*radius;

    while (x<y)

    {    plot_circle_points(xc, yc, x, y, c);

             if (p<0) {p=p+4*x+6;}

             else{   p=p+4*(x-y)+10;y-=1;}

             x+=1;                 }

     if (x= =y)    plot_circle_points(xc, yc, x, y, c);

}

 

3椭圆的算法(Bresenham法)

viod  MidpointEllipe(a,b, color) {

int a,b,color;

int x,y;  float d1,d2;

x = 0; y = b;d1 = b*b +a*a*(-b+0.25);

  ellipesputpixel(x,y,color);

while( b*b*(x+1) < a*a*(y-0.5))  //生成上半部分椭圆

{   if (d1<0){d1 +=b*b*(2*x+3); x++;  }

  else  {  d1 +=(b*b*(2*x+3)+a*a*(-2*y+2))

x++;  y--;}

ellipesputpixel(x,y,color);}//上部分

 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--; }

  ellipesputpixel(x,y,color);

}

 

 

 

 

 

4DDA的直线算法

(1)DDA法生成直线的基本原理是什么?p105

yi=kxi+b;

Yi+1=kxi+1+b=yi+k△x;

△x=1Yi+1=yi+k

|K|1

|K|>1时,xy互换位置

(2) 直线算法

Void DDALine(int x0,int y0,int x1,int y1,int color){

int x, y,dx,dx,dy,k;

x=x0,y=y0;

dx = x1-x0;dy=x1-x0;

while(x<x1){

x++;

Drawpixle(x,(int)(y+0.5),c);

y=y+K;

}

}

5微分数值法

void DDALine(int x0,int y0,int x1,int yt1,int color)

{    int i,dx,dy; float xt,yt,a;

dx = x1-x0; dy=y1-y0;

if(abs(dx)>abs(dy))a=abs(dx);

else a=abs(dy);  

xt=(float)dx/a; Yt=(float)dy/a;   

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

     {drawpixel (int(x+0.5), int(y+0.5), color);x+=xt;y+=yt;}}

 

6、直线中点法

void Midpoint Line (int x0,int y0,int xt, int yt,int color)

{    int dx,dy,x,y,d;

dx=xt-x0;dy=yt-y0;x=x0;y=y0;

d=2*dx-2*dy;

while(x<=xt)

{  draw(x,y,color); x++;

   if(d<0){y++; d+=dx-2*dy}

   else  {d+=-2*dy}}}

 

7、直线Bresenham,试写出能获得整数Bresenham画线算法的c++程序(提示:①假定直线的斜率在01之间)

Bresenhamline(int x0,int y0,int x1,int y1)

{ int x,y,dx,dy,e;

Dx=x1-x0;

Dy=y1-y0;

e=-dx;x=x0;y=y0;

while (x<=x1)

{ putpixel(x,y);

x++;

e=e+2*dy;

If (e>0)

y++;

   e=e-2*dx;

}

}

}

8写出一个点的二维图形的旋转变换程序(c++

#define PI=3.14

void XuanZhuan(){

float d=30.0*PI/180.0(这里假设旋转30);

int x=100,y=200;

x=x*cos(d)-y*sin(d);

y=x*sin(d)+y*cos(d);

}

 

8种子填充算法

void FloodFill4(int x,int y,int oldColor,int newColor)

{  if(GetPixel(x,y) == oldColor)

  { PutPixel(x,y,newColor);

    FloodFill4(x,y+1,oldColor,newColor);

    FloodFill4(x,y-1,oldColor,newColor);

    FloodFill4(x-1,y,oldColor,newColor);

   FloodFill4(x+1,y,oldColor,newColor);

   }

}

 

9平移

void CDialog_Translate::OnOK()

{UpdateData(true);

glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glTranslatef(m_delta_x, m_delta_y, m_delta_z);

CDialog::OnOK();}

 

10比例

void CDialog_Scale::OnOK()

{   UpdateData(true);

glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

glScalef(m_scale_x, m_scale_y, m_scale_z);

CDialog::OnOK();

}

        关于y=x轴对称  

        关于y=-x轴对称

 

        对称于XOY平面

 

 

 

 

请我吃辣条吧!