搜档网
当前位置:搜档网 › (完整word版)计算机图形学实验报告

(完整word版)计算机图形学实验报告

(完整word版)计算机图形学实验报告
(完整word版)计算机图形学实验报告

一、实验目的

1、掌握中点Bresenham直线扫描转换算法的思想。

2掌握边标志算法或有效边表算法进行多边形填充的基本设计思想。

3掌握透视投影变换的数学原理和三维坐标系中几何图形到二维图形的观察流程。

4掌握三维形体在计算机中的构造及表示方法

二、实验环境

Windows系统, VC6.0。

三、实验步骤

1、给定两个点的坐标P0(x0,y0),P1(x1,y1),使用中点Bresenham直线扫描转换算法画出连接两点的直线。

实验基本步骤

首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。

其次、使用中点Bresenham直线扫描转换算法实现自己的画线函数,函数原型可表示如下:

void DrawLine(CDC *pDC, int p0x, int p0y, int p1x, int p1y);

在函数中,可通过调用CDC成员函数SetPixel来画出扫描转换过程中的每个点。

COLORREF SetPixel(int x, int y, COLORREF crColor );

再次、找到文档视图程序框架视图类的OnDraw成员函数,调用DrawLine 函数画出不同斜率情况的直线,如下图:

最后、调试程序直至正确画出直线。

2、给定多边形的顶点的坐标P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3),P4(x4,y4)…使用边标志算法或有效边表算法进行多边形填充。

实验基本步骤

首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。

其次、实现边标志算法或有效边表算法函数,如下:

void FillPolygon(CDC *pDC, int px[], int py[], int ptnumb);

px:该数组用来表示每个顶点的x坐标

py :该数组用来表示每个顶点的y坐标

ptnumb:表示顶点个数

注意实现函数FillPolygon可以直接通过窗口的DC(设备描述符)来进行多边形填充,不需要使用帧缓冲存储。(边标志算法)首先用画线函数勾画出多边形,再针对每条扫描线,从左至右依次判断当前像素的颜色是否勾画的边界色,是就开始填充后面的像素直至再碰到边界像素。注意对顶点要做特殊处理。

通过调用GDI画点函数SetPixel来画出填充过程中的每个点。需要画线可以使用CDC的画线函数MoveTo和LineTo进行绘制,也可以使用实验一实现的画直线函数。

CPoint MoveTo(int x, int y );

BOOL LineTo(int x, int y );

实现边标志算法算法需要获取某个点的当前颜色值,可以使用CDC的成员函数

COLORREF GetPixel(int x, int y );

再次、找到文档视图程序框架视图类的OnDraw成员函数,调用FillPolygon 函数画出填充的多边形,如下:

void CTestView::OnDraw(CDC* pDC)

{

CTestcoodtransDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

//绘制之前先把整个窗口涂上背景色(白色)以便于下面的填充

RECT Rt;

GetClientRect(&Rt);

pDC->FillSolidRect(&Rt, RGB(255,255,255));

int ptx[] = {10, 100, 200, 150, 80};

int pty[] = {10, 50, 80, 120, 70};

FillPolygon(pDC, ptx, pty, 5);

}

截图如下

3.在世界坐标系中定义一个立方体(由6个面组成),并给定观察点在世界坐标系中的位置(a,b,c)以及观察坐标系的方位角θ,俯仰角φ和姿态角α,另外再给定投影面离观察点的距离D,在屏幕上画出立方体的透视投影图形。

实验基本步骤

首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。

其次、由给定观察点在世界坐标系中的位置(a,b,c)以及观察坐标系的方位角θ,俯仰角φ和姿态角α求出观察变换矩阵Tv.

再次、将立方体的每一个面的顶点坐标与变换矩阵Tv相乘得到观察坐标系中的坐标,再由式(1)求得二维投影坐标。并用直线连接这些二维投影坐标点形成每一个面在投影面的图形,依次将立方体的6个面画出即可。

核心代码如下:

void CTestView::OnDraw(CDC* pDC)

{

CTestDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

// TODO: add draw code for native data here

CRect Rect;

GetClientRect(&Rect);

int MaxX=Rect.right;

int MaxY=Rect.bottom;

pDC->SetMapMode(MM_ANISOTROPIC);

pDC->SetWindowExt(1, 1);

pDC->SetViewportExt(1, -1);

pDC->SetViewportOrg(MaxX/2, MaxY/2);//设置视点原点在屏幕中心DrawObject(pDC);

}

void CTestView::ReadPoint()//读入8个顶点坐标

{

//每一行代表正方体每个顶点的x,y,z坐标

int a=200;//正方体边长

P[1][1]=-a/2;P[1][2]=-a/2;P[1][3]=-a/2;

P[2][1]=-a/2;P[2][2]=a/2;P[2][3]=-a/2;

P[3][1]=-a/2;P[3][2]=a/2;P[3][3]=a/2;

P[4][1]=-a/2;P[4][2]=-a/2;P[4][3]=a/2;

P[5][1]=a/2;P[5][2]=-a/2;P[5][3]=-a/2;

P[6][1]=a/2;P[6][2]=a/2;P[6][3]=-a/2;

P[7][1]=a/2;P[7][2]=a/2;P[7][3]=a/2;

P[8][1]=a/2;P[8][2]=-a/2;P[8][3]=a/2;

}

void CTestView::ReadFace()//读入6个面坐标

{

//第一列为每个面的边数;其余列为面的顶点编号

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

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

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

F[4][0]=4;F[4][1]=6;F[4][2]=2;F[4][3]=3;F[4][4]=7;

F[5][0]=4;F[5][1]=8;F[5][2]=7;F[5][3]=3;F[5][4]=4;

F[6][0]=4;F[6][1]=5;F[6][2]=6;F[6][3]=2;F[6][4]=1; }

void CTestView::DrawObject(CDC *pDC)//绘制立方体{

int TotalEdge,PointNumber;

int xt,yt,zt,x,y,z;//边的点坐标

CPen MyPen,* OldPen;

double x2d,y2d;//屏幕坐标系的二维坐标点

MyPen.CreatePen(PS_SOLID,3,RGB(0,0,0));

OldPen=pDC->SelectObject(&MyPen);

for(face=1;face<=6;face++)

{

TotalEdge=F[face][0];//面的总边数

for(int edge=1;edge<=TotalEdge;edge++)//边循环

{

PointNumber=F[face][edge];//面的顶点号

x=P[PointNumber][1];//每个顶点的x,y,z坐标

y=P[PointNumber][2];

z=P[PointNumber][3];

Project(x2d, y2d, x,y,z);

if(edge==1)//保存起点用于闭合

{

pDC->MoveTo(ROUND(x2d),ROUND(y2d));

xt=x;yt=y;zt=z;

}

else

{

pDC->LineTo(ROUND(x2d),ROUND(y2d));

}

}

Project(x2d, y2d, xt,yt,zt);

pDC->LineTo(ROUND(x2d),ROUND(y2d));//封闭边

}

pDC->SelectObject(OldPen);

MyPen.DeleteObject();

}

void CTestView::Project(double &x2d, double &y2d, int x,int y,int z)//透视变换{

double x0,y0,z0;

//用户坐标变换为观察坐标系三维坐标,即用户坐标系坐标乘观察坐标变换矩阵(x,y,z,1)*Tv

x0 = x*Proj[0][0]+y*Proj[1][0]+z*Proj[2][0]+Proj[3][0];

y0 = x*Proj[0][1]+y*Proj[1][1]+z*Proj[2][1]+Proj[3][1];

z0 = x*Proj[0][2]+y*Proj[1][2]+z*Proj[2][2]+Proj[3][2];

//观察坐标系三维坐标透视变换为屏幕坐标系二维坐标,即(xv,yv,zv,1)*Ts,再转化为非其次坐标

x2d=D*x0/z0;

y2d=D*y0/z0;

}

void CTestView::InitParameter()//初始化观察坐标变换矩阵

{

double cosTheta = cos(PI*Theta/180);

double sinTheta = sin(PI*Theta/180);

double cosPhi = cos(PI*Phi/180);

double sinPhi = sin(PI*Phi/180);

double cosAlpha = cos(PI*Alpha/180);

double sinAlpha = sin(PI*Alpha/180);

Proj[0][0] = cosTheta*cosAlpha+sinTheta*cosPhi*sinAlpha;

Proj[0][1] = cosTheta*sinAlpha - cosPhi*sinTheta*cosAlpha;

Proj[0][2] = -sinPhi*sinTheta;

Proj[0][3] = 0;

Proj[1][0] = -sinPhi*sinAlpha;

Proj[1][1] = sinPhi*cosAlpha;

Proj[1][2] = -cosPhi;

Proj[1][3] = 0;

Proj[2][0] = -sinTheta*cosAlpha+cosTheta*cosPhi*sinAlpha;

Proj[2][1] = -sinTheta*sinAlpha-cosPhi*cosTheta*cosAlpha;

Proj[2][2] = -sinPhi*cosTheta;

Proj[2][3] = 0;

Proj[3][0] =

-(a*cosTheta-c*sinTheta)*cosAlpha-(-b*sinPhi+(a*sinTheta+c*cosTheta)*cosPhi)*si nAlpha;

Proj[3][1] = -(a*cosTheta-c*sinTheta)*sinAlpha+(-b*sinPhi+(a*sinTheta+c*cosTheta)*cosPhi)*c osAlpha;

Proj[3][2] = b*cosPhi+(a*sinTheta+c*cosTheta)*sinPhi;

Proj[3][3] = 1;

}

void CTestView::OnCustom()

{

// TODO: Add your command handler code here

AfxGetMainWnd()->SetWindowText("透视变换-任意观察坐标系透视");

//任意设定观察点

a = 200;

b = 0;

c = 500;

//观察角度

Theta=20;

Phi=90;

Alpha = 10;

//视距

D = 800;

InitParameter();

ReadPoint();

ReadFace();

RedrawWindow();

}

void CTestView::OnMENUOne() //一点透视

{

// TODO: Add your command handler code here

AfxGetMainWnd()->SetWindowText("透视变换-一点透视");

Theta=0;

Phi=90;

Alpha = 0;

//采用球面坐标设定观察点

double R= 700.0;

a = R*sin(PI*Phi/180)*sin(PI*Theta/180);

b = R*cos(PI*Phi/180);

c = R*sin(PI*Phi/180)*cos(PI*Theta/180);

D = 1000;//视距

InitParameter();

ReadPoint();

ReadFace();

RedrawWindow();

}

void CTestView::OnMENUTwo()//二点透视

{

// TODO: Add your command handler code here

AfxGetMainWnd()->SetWindowText("透视变换-二点透视");

Theta=30;

Phi=90;

Alpha =0;

//采用球面坐标设定观察点

double R= 700.0;

a = R*sin(PI*Phi/180)*sin(PI*Theta/180);

b = R*cos(PI*Phi/180);

c = R*sin(PI*Phi/180)*cos(PI*Theta/180);

D = 1000;//视距

InitParameter();

ReadPoint();

ReadFace();

RedrawWindow();

}

void CTestView::OnMENUThree() //三点透视

{

// TODO: Add your command handler code here

AfxGetMainWnd()->SetWindowText("透视变换-三点透视");

Theta=45;

Phi=45;

Alpha=0;

//采用球面坐标设定观察点

double R= 700.0;

a = R*sin(PI*Phi/180)*sin(PI*Theta/180);

b = R*cos(PI*Phi/180);

c = R*sin(PI*Phi/180)*cos(PI*Theta/180);

D = 1000;//视距

InitParameter();

ReadPoint();

ReadFace();

RedrawWindow();

}

实验截图

4、迭代剖分法生成球面。

首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。

其次、初始化生成正八面体的顶点表,和面表。

再次、对面表里的每一个三角形进行剖分,一个三角形变成四个三角形。将产生的新的顶点加入到顶点表,同时将产生的新三角形加入到面表里,并从面表里删除原来的三角形。迭代多次后即得一个逼近于球面的多面体。

最后、对面表里的每一个三角形进行透视投影,在屏幕上画出透视投影图,调试程序直至正确。

实验核心代码如下:

void CTestView::GenerateSphereFace()//生成球面表

{

//首先生成一个正八面体

int a=200;

P[0][0]=0; P[0][1]=a; P[0][2]=0;

P[1][0]=0; P[1][1]=-a; P[1][2]=0;

P[2][0]=a; P[2][1]=0; P[2][2]=0;

P[3][0]=0; P[3][1]=0; P[3][2]=-a;

P[4][0]=-a; P[4][1]=0; P[4][2]=0;

P[5][0]=0; P[5][1]=0; P[5][2]=a;

int ptNum = 6;

faceNum = 8;

F[0][0]=3;F[0][1]=0;F[0][2]=4;F[0][3]=5;

F[1][0]=3;F[1][1]=0;F[1][2]=5;F[1][3]=2;

F[2][0]=3;F[2][1]=0;F[2][2]=2;F[2][3]=3;

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

F[4][0]=3;F[4][1]=1;F[4][2]=5;F[4][3]=4;

F[5][0]=3;F[5][1]=1;F[5][2]=2;F[5][3]=5;

F[6][0]=3;F[6][1]=1;F[6][2]=3;F[6][3]=2;

F[7][0]=3;F[7][1]=1;F[7][2]=4;F[7][3]=3;

//分割迭代

for(int times = 0; times < 3; times++)

{

int i, iNum = faceNum;

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

{//一个三角形分割为四个三角形

// * *

// => * *

// * * * * *

//先求中点坐标,并添加到点表

int pt1 = F[i][1];

int pt2 = F[i][2];

int pt3 = F[i][3];

int mid12 = ptNum++;

double mx = (P[pt1][0] + P[pt2][0])/2;

double my = (P[pt1][1] + P[pt2][1])/2;

double mz = (P[pt1][2] + P[pt2][2])/2;

P[mid12][0] = a/sqrt(mx*mx+my*my+mz*mz)*mx;//坐标规范化

P[mid12][1] = a/sqrt(mx*mx+my*my+mz*mz)*my;

P[mid12][2] = a/sqrt(mx*mx+my*my+mz*mz)*mz;

int mid23 = ptNum++;

mx = (P[pt3][0] + P[pt2][0])/2;

my = (P[pt3][1] + P[pt2][1])/2;

mz = (P[pt3][2] + P[pt2][2])/2;

P[mid23][0] = a/sqrt(mx*mx+my*my+mz*mz)*mx;

P[mid23][1] = a/sqrt(mx*mx+my*my+mz*mz)*my;

P[mid23][2] = a/sqrt(mx*mx+my*my+mz*mz)*mz;

int mid13 = ptNum++;

mx = (P[pt1][0] + P[pt3][0])/2;

my = (P[pt1][1] + P[pt3][1])/2;

mz = (P[pt1][2] + P[pt3][2])/2;

P[mid13][0] = a/sqrt(mx*mx+my*my+mz*mz)*mx;

P[mid13][1] = a/sqrt(mx*mx+my*my+mz*mz)*my;

P[mid13][2] = a/sqrt(mx*mx+my*my+mz*mz)*mz;

//被分割的三角形改为其中一个小的三角形,新建另外三个小的三角形

F[i][2] = mid12;

F[i][3] = mid13;

F[faceNum][0] = 3;

F[faceNum][1] = mid12;

F[faceNum][2] = pt2;

F[faceNum][3] = mid23;

faceNum++;

F[faceNum][0] = 3;

F[faceNum][1] = mid13;

F[faceNum][2] = mid23;

F[faceNum][3] = pt3;

faceNum++;

F[faceNum][0] = 3;

F[faceNum][1] = mid12;

F[faceNum][2] = mid23;

F[faceNum][3] = mid13;

faceNum++;

}

}

}

void CTestView::GenerateEllipsoidFace()//生成椭球面表

{

int a = 200, b = 100, c = 100;

P[0][0]=0; P[0][1]=b; P[0][2]=0;

P[1][0]=0; P[1][1]=-b; P[1][2]=0;

P[2][0]=a; P[2][1]=0; P[2][2]=0;

P[3][0]=0; P[3][1]=0; P[3][2]=-c;

P[4][0]=-a; P[4][1]=0; P[4][2]=0;

P[5][0]=0; P[5][1]=0; P[5][2]=c;

int ptNum = 6;

faceNum = 8;

F[0][0]=3;F[0][1]=0;F[0][2]=4;F[0][3]=5;

F[1][0]=3;F[1][1]=0;F[1][2]=5;F[1][3]=2;

F[2][0]=3;F[2][1]=0;F[2][2]=2;F[2][3]=3;

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

F[4][0]=3;F[4][1]=1;F[4][2]=5;F[4][3]=4;

F[5][0]=3;F[5][1]=1;F[5][2]=2;F[5][3]=5;

F[6][0]=3;F[6][1]=1;F[6][2]=3;F[6][3]=2;

F[7][0]=3;F[7][1]=1;F[7][2]=4;F[7][3]=3;

//分割迭代

for(int times = 0; times < 3; times++)

{

int i, iNum = faceNum;

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

{//一个三角形分割为四个三角形

// * *

// => * *

// * * * * *

//先求中点坐标,并添加到点表

int pt1 = F[i][1];

int pt2 = F[i][2];

int pt3 = F[i][3];

int mid12 = ptNum++;

double mx = (P[pt1][0] + P[pt2][0])/2;

double my = (P[pt1][1] + P[pt2][1])/2;

double mz = (P[pt1][2] + P[pt2][2])/2;

double scale = 1.0/sqrt(mx*mx/(a*a)+my*my/(b*b)+mz*mz/(c*c));

P[mid12][0] = scale*mx;//坐标规范化

P[mid12][1] = scale*my;

P[mid12][2] = scale*mz;

int mid23 = ptNum++;

mx = (P[pt3][0] + P[pt2][0])/2;

my = (P[pt3][1] + P[pt2][1])/2;

mz = (P[pt3][2] + P[pt2][2])/2;

scale = 1.0/sqrt(mx*mx/(a*a)+my*my/(b*b)+mz*mz/(c*c));

P[mid23][0] = scale*mx;

P[mid23][1] = scale*my;

P[mid23][2] = scale*mz;

int mid13 = ptNum++;

mx = (P[pt1][0] + P[pt3][0])/2;

my = (P[pt1][1] + P[pt3][1])/2;

mz = (P[pt1][2] + P[pt3][2])/2;

scale = 1.0/sqrt(mx*mx/(a*a)+my*my/(b*b)+mz*mz/(c*c));

P[mid13][0] = scale*mx;

P[mid13][1] = scale*my;

P[mid13][2] = scale*mz;

//被分割的三角形改为其中一个小的三角形,新建另外三个小的三角形

F[i][2] = mid12;

F[i][3] = mid13;

F[faceNum][0] = 3;

F[faceNum][1] = mid12;

F[faceNum][2] = pt2;

F[faceNum][3] = mid23;

faceNum++;

F[faceNum][0] = 3;

F[faceNum][1] = mid13;

F[faceNum][2] = mid23;

F[faceNum][3] = pt3;

faceNum++;

F[faceNum][0] = 3;

F[faceNum][1] = mid12;

F[faceNum][2] = mid23;

F[faceNum][3] = mid13;

faceNum++;

}

}

}

void CTestView::DrawObject(CDC *pDC)//绘制

{

int TotalEdge,pt;

int xt,yt,zt,x,y,z;//边的点坐标

double x2d,y2d;//屏幕坐标系的二维坐标点

for(int face=0;face

{

TotalEdge=F[face][0];//面的总边数

if(!IsFaceVisible(F[face]))//判定从视线方向看过去,该面是否可见

continue;

for(int edge=1;edge<=TotalEdge;edge++)//边循环

{

pt=F[face][edge];//面的顶点号

x=P[pt][0];//每个顶点的x,y,z坐标

y=P[pt][1];

z=P[pt][2];

Project(x2d, y2d, x,y,z);

if(edge==1)//保存起点用于闭合

{

pDC->MoveTo(ROUND(x2d),ROUND(y2d));

xt=x;yt=y;zt=z;

}

else

{

pDC->LineTo(ROUND(x2d),ROUND(y2d));

}

}

Project(x2d, y2d, xt,yt,zt);

pDC->LineTo(ROUND(x2d),ROUND(y2d));//封闭边

}

}

void CTestView::Project(double &x2d, double &y2d, int x,int y,int z)//透视变换{

double x0,y0,z0;

//用户坐标变换为观察坐标系三维坐标,即用户坐标系坐标乘观察坐标变换矩阵(x,y,z,1)*Tv

x0 = x*Proj[0][0]+y*Proj[1][0]+z*Proj[2][0]+Proj[3][0];

y0 = x*Proj[0][1]+y*Proj[1][1]+z*Proj[2][1]+Proj[3][1];

z0 = x*Proj[0][2]+y*Proj[1][2]+z*Proj[2][2]+Proj[3][2];

//观察坐标系三维坐标透视变换为屏幕坐标系二维坐标,即(xv,yv,zv,1)*Ts,再转化为非其次坐标

x2d=D*x0/z0;

y2d=D*y0/z0;

}

void CTestView::InitParameter()//初始化观察坐标变换矩阵

{

double cosTheta = cos(PI*Theta/180);

double sinTheta = sin(PI*Theta/180);

double cosPhi = cos(PI*Phi/180);

double sinPhi = sin(PI*Phi/180);

double cosAlpha = cos(PI*Alpha/180);

double sinAlpha = sin(PI*Alpha/180);

Proj[0][0] = cosTheta*cosAlpha+sinTheta*cosPhi*sinAlpha;

Proj[0][1] = cosTheta*sinAlpha - cosPhi*sinTheta*cosAlpha;

Proj[0][2] = -sinPhi*sinTheta;

Proj[0][3] = 0;

Proj[1][0] = -sinPhi*sinAlpha;

Proj[1][1] = sinPhi*cosAlpha;

Proj[1][2] = -cosPhi;

Proj[1][3] = 0;

Proj[2][0] = -sinTheta*cosAlpha+cosTheta*cosPhi*sinAlpha;

Proj[2][1] = -sinTheta*sinAlpha-cosPhi*cosTheta*cosAlpha;

Proj[2][2] = -sinPhi*cosTheta;

Proj[2][3] = 0;

Proj[3][0] = -(a*cosTheta-c*sinTheta)*cosAlpha-(-b*sinPhi+(a*sinTheta+c*cosTheta)*cosPhi)*si nAlpha;

Proj[3][1] = -(a*cosTheta-c*sinTheta)*sinAlpha+(-b*sinPhi+(a*sinTheta+c*cosTheta)*cosPhi)*c osAlpha;

Proj[3][2] = b*cosPhi+(a*sinTheta+c*cosTheta)*sinPhi;

Proj[3][3] = 1;

}

BOOL CTestView::IsFaceVisible(int Face[5])

{

//求视矢量

int pt0 = Face[1];

int pt1 = Face[2];

int pt2 = Face[3];

//视点坐标减面的某个顶点的坐标(这里取第一个顶点),即得视矢量int Vx=a-P[pt0][0];

int Vy=b-P[pt0][1];

int Vz=c-P[pt0][2];

//求法矢量

//先求第一条边的分量

int Fx1=P[pt1][0]-P[pt0][0];

int Fy1=P[pt1][1]-P[pt0][1];

int Fz1=P[pt1][2]-P[pt0][2];

//先求第二条边的分量

int Fx2=P[pt2][0]-P[pt0][0];

int Fy2=P[pt2][1]-P[pt0][1];

int Fz2=P[pt2][2]-P[pt0][2];

//法矢量为第一和第二个矢量的叉积

int Nx=Fy1*Fz2-Fy2*Fz1;

int Ny=Fz1*Fx2-Fz2*Fx1;

int Nz=Fx1*Fy2-Fx2*Fy1;

//法矢量与视矢量点积>0表示夹角小于90

return Vx*Nx+Vy*Ny+Vz*Nz > 0;

}

void CTestView::OnCustom()

{

// TODO: Add your command handler code here

AfxGetMainWnd()->SetWindowText("球");

Theta=45;

Phi=90;

Alpha = 0;

//采用球面坐标设定观察点

double R= 700.0;

a = R*sin(PI*Phi/180)*sin(PI*Theta/180);

b = R*cos(PI*Phi/180);

c = R*sin(PI*Phi/180)*cos(PI*Theta/180);

D = 800;//视距

InitParameter();

GenerateSphereFace();

RedrawWindow();

}

void CTestView::OnMENUOne()

{

// TODO: Add your command handler code here

AfxGetMainWnd()->SetWindowText("椭球");

Theta=0;

Phi=90;

Alpha = 0;

//采用球面坐标设定观察点

double R= 700.0;

a = R*sin(PI*Phi/180)*sin(PI*Theta/180);

b = R*cos(PI*Phi/180);

c = R*sin(PI*Phi/180)*cos(PI*Theta/180);

D = 800;//视距

InitParameter();

GenerateEllipsoidFace();

RedrawWindow();

}

实验截图

实验总结:

这次试验在指导书的引导下,将每个环节逐步完成,最终顺利完成实验。通过该实验,总的来说,还有不少收获,比如进一步熟悉了Bresenham直线扫描转换算法的思想,同时,在实验中也培养了自己的耐心,总归,有不少收获。

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号: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; }

秋双学位计算机图形学

2006年秋双学位计算机图形学作业题目 教材计算机图形学(第二版) 第一次P105 3.17 利用中点算法并考虑对称性,推导在区间-10<=x<=10上,对下列曲线进行扫描转换的有效算法:y=(1/12)*x3 3.20 考虑对称性,建立中点算法对形式为y=ax2-b的任意抛物线进行扫描转换,参数a,b及x的范围从输入值获得。 第二次P106 3.34 利用circle函数,编写一个程序,显示具有合适标记的饼图。程序的输入包括:在某些区间上给定数据分布的数据组,饼图的名称和区间的名称。每部分的标记将是显示在饼图边界外靠近对应饼图部分的地方。 第三次10.7 P139 4.20 编写一个程序,使用指定的图案对给定的椭圆内部进行填充。 第四次10.14 P168 5.12 确定对于任何直线y=mx+b的反射变换矩阵的形式。 第四次10.22 比较若干条相对于裁剪窗口的不同方向的线段的Cohen-Sutherland和梁友栋-Barsky裁剪算法的算术运算次数。 第五次10.29 6.18 将梁友栋-Barsky算法改称多边形裁剪算法。 第六次11.4 8.13 设计一个程序,该程序允许用户使用一个笔画设备交互式地画图。 第七次11.11 10.9 建立一个将给定的球、椭球或圆柱体变成多边形网格的一个算法。 第八次11.18 10.20 给出d=5的均匀周期性B-样条曲线的混合函数。 第九次11.25 11.13 设计关于任选平面反射的例程。 第十次 12.8 编写一个将透视投影棱台变换到规则平行六面体的程序。 上机 1.实现Cohen-Sutherland多边形裁剪算法,要求显示多边形被每一条窗口边裁剪后的结果。 2.编写一个程序,允许用户通过一个基本形状菜单并使用一个拾取设备,将每一个选取的 形状拖曳到指定位置,并提供保存和载入的功能。 3.. 写一篇综述性的调研报告,要求不少于3000字,独立完成。内容可以是计算机图形学理论或算法的研究。如:曲线、曲面拟合算法;几何造型方法的研究。如:分形树、分形山、树木、花草、云、瀑布、粒子系统等等。或任何你感兴趣的领域。 4.2006年秋双学位计算机图形学作业参考答案 P105 3.17 利用中点算法并考虑对称性,推导在区间-10<=x<=10上,对下列曲线进行扫描转换的有效算法:y=(1/12)*x3 解答:第一象限和第三象限中心对称

计算机图形学实验报告 (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))

WORD实验报告

word基本操作实验报告 一、实验目的与要求 1.掌握word的基本操作; 2.掌握字符格式、段落格式和页面格式等排版技术; 3.掌握图文混排、表格处理和邮件合并技术; 4.熟悉个人名片或毕业论文的设计与制作; 5.学会自己提出问题,并得出解决问题的方法。 二、实验内容与方法 1.word的基本操作,通过上机摸索,并查阅书籍网络了解。 2.word的字符格式,段落格式和页面格式等排版技术,通过上机摸索,并查阅书籍网络了解。 3.word的图文混排、表格处理和邮件合并技术,通过上机摸索,并查阅书籍网络了解。 4. 通过word进行个人名片或毕业论文的设计与制作,通过上机摸索,并查阅书籍网络了解。 三、实验步骤与过程 1.word的基本操作:①启动word软件 (1) 启动“开始”菜单中的microsoft word程序 (2) 双击资源管理器或“我的电脑”中的c:\program files\microsoft office\office11\winword.exe程序 (3) 双击word 文档文件(*.doc) (4) 双击桌面上的word图标 (5)开始-运行-输入“winword”②认识word2003窗口(1)标题栏位于屏幕最顶端的是标题栏,由控制菜单图标、文件名、最小化按钮、最大化(还原)按钮、关闭按钮组成。(2)菜单栏 菜单栏位于标题栏下面。使用菜单栏可以执行word的许多命令。菜单栏共有九个菜单:文件、编辑、视图、插入、格式、工具、表格、窗口、帮助。当鼠标指针移到菜单标题上时,菜单标题就会凸起,单击后弹出下拉菜单。在下拉菜单中移动鼠标指针时,被选中的菜单项就会高亮显示,再单击,就会执行该菜单所代表的命令。如“文件”—“打开”,就会弹出“打开”文件对话框。(3)工具栏 标题栏下面的是工具栏,使用它们可以很方便地进行工作。通常情况下,word会显示【常用】和【格式】两个工具栏。 “常用”工具栏:新建、打开、复制、粘贴、打印、撤消、恢复等“格式”工具栏:字体、字号、下划线、边框、对齐方式等 如果想了解工具栏上按钮的简单功能,只需将鼠标指针移到该按钮上,过一会儿旁边会出现一个小框,显示出按钮的名称或功能。 word窗口中可以有许多工具栏,可以根据需要在“视图”—“工具栏”中增加或减少工具栏。每一个工 具栏都可以用鼠标拖动到屏幕的任意位置,所以又称为浮动工具栏。工具栏内图标按钮体现了“菜单栏”中的一些主要功能。我们可以利用这些按钮进行相应操作。如我要打开一个文件,除了可以使用菜单栏外,还可以使用工具栏上的按钮。 (4)编辑窗口 再往下的空白区域就是word的编辑窗口,输入的文字就显示在这里。文档中闪烁的竖线称为光标,代表文字的当前输入位置。(5)标尺 在编辑窗口的上面和左面有一个标尺,分别为水平标尺和垂直标尺,用来查看正文的高度和宽度,以及图片、文本框、表格的宽度,还可以用来排版正文。( 6)滚动条在编辑窗口的右面和下面有滚动条,分别为垂直滚动条和水平滚动条,用来滚动文档,显示在屏幕中看不到的内容。可以单击滚动条中的按钮或者拖动滚动框来浏览文档。(7)显示方式按钮

计算机图形学第二版课后习题答案

第一章绪论 概念:计算机图形学、图形、图像、点阵法、参数法、 图形的几何要素、非几何要素、数字图像处理; 计算机图形学和计算机视觉的概念及三者之间的关系; 计算机图形系统的功能、计算机图形系统的总体结构。 第二章图形设备 图形输入设备:有哪些。 图形显示设备:CRT的结构、原理和工作方式。 彩色CRT:结构、原理。 随机扫描和光栅扫描的图形显示器的结构和工作原理。 图形显示子系统:分辨率、像素与帧缓存、颜色查找表等基本概念,分辨率的计算 第三章交互式技术 什么是输入模式的问题,有哪几种输入模式。 第四章图形的表示与数据结构 自学,建议至少阅读一遍 第五章基本图形生成算法 概念:点阵字符和矢量字符; 直线和圆的扫描转换算法; 多边形的扫描转换:有效边表算法; 区域填充:4/8连通的边界/泛填充算法;

内外测试:奇偶规则,非零环绕数规则; 反走样:反走样和走样的概念,过取样和区域取样。 5.1.2 中点 Bresenham 算法(P109) 5.1.2 改进 Bresenham 算法(P112) 习题答案

习题5(P144) 5.3 试用中点Bresenham算法画直线段的原理推导斜率为负且大于1的直线段绘制过程(要求写清原理、误差函数、递推公式及最终画图过程)。(P111) 解: k<=-1 |△y|/|△x|>=1 y为最大位移方向 故有 构造判别式: 推导d各种情况的方法(设理想直线与y=yi+1的交点为Q): 所以有: y Q-kx Q-b=0 且y M=y Q d=f(x M-kx M-b-(y Q-kx Q-b)=k(x Q-x M) 所以,当k<0, d>0时,M点在Q点右侧(Q在M左),取左点 P l(x i-1,y i+1)。 d<0时,M点在Q点左侧(Q在M右),取右点 Pr(x i,y i+1)。 d=0时,M点与Q点重合(Q在M点),约定取右点 Pr(x i,y i+1) 。 所以有 递推公式的推导: d2=f(x i-1.5,y i+2) 当d>0时, d2=y i+2-k(x i-1.5)-b 增量为1+k =d1+1+k

计算机图形学实验报告

目录

实验一直线的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(); }

完整word版标准实验报告模板.docx

实验报告 实验名称 课程名称 ___电子技术基础实验 院系部:专业班级:学生姓名:学号 :同组人:实验台号 :指导教师:成绩:实验日期 : 华北电力大学

实验报告要求: 一、实验目的及要求 二、仪器用具 仪器名称规格/型号数量备注 实验箱1 示波器1 数字万用表1 交流毫伏表1 信号放生器1 三、实验原理 四、实验步骤(包括原理图、实验结果与数据处理) 五、讨论与结论(对实验现象、实验故障及处理方法、实验中 存在的问题等进行分析和讨论,对实验的进一步想法或改进意见。) 六、实验原始数据

一、实验目的及要求: 1.学会放大器静态工作点的调试方法,分析静态工作点对放大器性能的影响。 2.掌握放大器电压放大倍数和最大不失真输出电压的测试方法。 3.悉常用电子仪器及模拟电路实验设备的使用。 二、仪器用具:略 三、实验原理 图 1.2.1为电阻分压式工作点稳定单管放大器实验电路图。 图 1.2.1共射极单管放大器实验电路 在图 1.2.1电路中,当流过偏置电阻R B1和 R B2的电流远大于晶体管VT 的基极电流I B时(一般 5~ 10 倍),则它的静态工作点可用下式估算: R B1U CC I E U U I C CE=U CC-I C(R C+R F1+ R E) U B R B2B U BE R B1R E R F1 电压放大倍数: A Vβ R C //R L 其中 r be= 200+26 (1+β)/I E r be(1)R F 1 输入电阻: R i= R B1 // R B2 // [r be+(1+β)R F1 ] 输出电阻: R O≈ R C 四、实验方法与步骤: 1.调试静态工作点 接通+ 12V 电源、调节R W,使 U E= 2.0V ,测量 U B、 U E、U C、 R B2值。记入表 1.2.1 。 表 1.2.1U= 2.0V E 测量值计算值U B( V)U E( V)U C( V)R B2(KΩ) U BE( V) U CE( V) I C( mA) 2.665 2.07.8530.865 5.2 2.0 根据表格测量数据,计算得到: U=U -U E =0.665V,U = U - U E =5.8V,I ≈ I = U /R =2/(1.1)=1.82mA BE B CE C CE EE 实验数据显示,Q点的值满足放大电路的静态工作点要求,BJT 处于放大区。 2.测量不同负载下的电压放大倍数

计算机图形学基础教程习题课1(第二版)(孙家广-胡事民编著)

1.列举计算机图形学的主要研究内容。 计算机中图形的表示方法、图形的计算、图形的处理和图形的显示。 图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。 2.常用的图形输出设备是什么? 显示器(CRT、LCD、等离子)、打印机、绘图仪等。 2.常用的图形输入设备是什么? 键盘、鼠标、跟踪球、空间球、数据手套、光笔、触摸屏、扫描仪等。 3.列出3种图形软件工具。 AutoCAD、SolidWorks、UG、ProEngineer、CorelDraw、Photoshop、PaintShop、Visio、3DMAX、MAYA、Alias、Softimage等。 错误:CAD 4.写出|k|>1的直线Bresenham画线算法。 d d d d 设直线方程为:y=kx+b,即x=(y-b)/k,有x i+1=x i+(y i+1-y i)/k=x i+1/k,其中k=dy/dx。因为直线的起始点在象素中心,所以误差项d的初值d0=0。y下标每增加1,d的值相应递增1/k,即d=d+1/k。一旦d≥1,就把它减去1,这样保证d在0、1之间。 ●当d≥0.5时,最接近于当前象素的右上方象素(xi+1,y i+1),x方向加1,d减 去1; ●而当d<0.5时,更接近于上方象素(x i,yi+1)。

为方便计算,令e=d-0.5,e的初值为-0.5,增量为1/k。 ●当e≥0时,取当前象素(x i,y i)的右上方象素(xi+1,y i+1),e减小1; ●而当e<0时,更接近于上方象素(xi,yi+1)。 voidBresenhamline (int x0,int y0,intx1, inty1,int color) { int x,y,dx,dy; float k,e; dx= x1-x0, dy = y1-y0,k=dy/dx; e=-0.5, x=x0, y=y0; for (i=0; i≤dy; i++) {drawpixel(x, y,color); y=y+1,e=e+1/k; if (e≥0) { x++, e=e-1;} } } 4.写出|k|>1的直线中点画线算法。 构造判别式:d=F(M)=F(xp+0.5,y p+1)=a(x p+0.5)+b(yp+1)+c ●当d<0,M在Q点左侧,取右上方P2为下一个象素; ●当d>0,M在Q点右侧,取上方P1为下一个象素; ●当d=0,选P1或P2均可,约定取P1为下一个象素;

WORD实验报告模板

广东商学院华商学院 实验报告 课程名称计算机应用基础 实验项目名称Word综合练习 班级 实验室名称(或课室) 专业 任课教师黄晓兰 学号: 姓名: 实验日期:年月日

姓名实验报告成绩 评语: 指导教师(签名) 年月日说明:指导教师评分后,实验报告交院(系)办公室保存。

实验报告 一、实验目的 运用Word 2003的整个章节中各知识,综合对文档进行编辑排版。 二、实验原理 (实验教程P41,使用那些功能) 三、实验设备和软件 (1)硬件要求: P4微型计算机,内部组成局域网。 (2)软件要求: 操作系统:中文Windows XP、中文Office Word2003。 四、实验步骤 (自己根据你的完成过程,列出步骤,参照实验教程P42四) 五、实验结果 (另附一页) 六、实验总结 (通过这次实验你学到什么)

实验报告要求: ●实验报告可参照如下内容格式写作:实验目的、实验原理、实验设备、 实验步骤、实验结果。 ●题材自定,但要求内容健康向上。要求内容要有一定主题,体现一定 风格。可参考实验结果内容。

专访:访美国华人金融协会理事、芝加哥机构资本副高海 华网芝加哥3月29日电 (记者 朱诸 张保平) 国华人金融协会理事、芝加哥机构资本副总裁高海29日在接受新华社记者专访时表示,这次日本大地震对日本经济更多的是一种短期的干扰,不会对日本经济的长期走势产生重大影响;同时,由于日本对目前世界经济增量的贡献有限,因此也不会对全球经济的发展产生太大影响。 高海说,由于地震会造成当地厂房的破坏,因此可能会使得日本某些制造行业——如汽车和汽车零配件、半 导体及芯片等——短期压力加剧。 但历史经验表明,这些行业通常会在地震发生之后的两至三个季度内出现下滑,之后又会迎来一轮强劲反弹,因为日本制造业的需求主体主要分布在世界其他国家,这些需求并没有太大变化,因此在厂房检修或者重建之后,那些被滞后的需求还会回来,所以短期之内会呈现明显的“V”型反弹。 高海说,具体来看,在这些受到影响的行业中,日本核电行业受到的冲击最大,因为这次核危机给日本以及 全球发展核电的国家敲响了警钟。目前日本电力供应有约30%依赖于核电,此外,作为一个以出口为主的经济,日本的制造业对电能的依赖也比较大,如果三分之一的供电受到影响,那么短期内对这些制造业的冲击也是很严重的。 另外,对于一些替换性较高的行业,如重型机械制造业,如果调整的周期过长,导致客户需求转移,也会对这些行业造成冲击。“比如日立和小松,如果耽误的时间太长,而国外的客户又急需使用,因此只能转向其他国家的生产商购买,而且这些产品均伴随相关配套产品和服务,如维修保养,一旦转移,就很难改变,”高海说。 “长远来看,”长期投资亚洲金融市场的高海说,“对日本经济影响最大的两个因素,一个是人口增长,一个是生产力,而这两方面现在都在朝着不利于经济的方向发展。首先是日本的人口数量一直在下降,同时日本的生产力也在上世纪80年代达到顶峰之后开始走下坡路,而且正在被其他国家赶超。”高海说,改变不了的,因此,日本经济长期来看还会维持向下走的趋势。 另外,这次地震也对世界其他国家的一些行业造成了一定影响。据报道,美国通用汽车公司已经关闭了路易斯安那的一家卡车制造工厂,者削减产量。 对此,高海说方面出现问题,可能会影响到美国今年的汽车生产和销售。” “但是这种供应方面的短缺都不会是大问题,只要需求方面保持稳定,高海说。 全球GDP 增量里,日本占的比重并不是很高,也不会产生太大影响。 同时,高海还说,由于日本外债比例不高,大部分债券被本国企业和居民持有,所以即使地震重建需要从国外借债,也不会对日本的主权信用产生实质性的影响,所以不会引发类似欧洲的债务危机。 美

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号: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;

word实验报告

word实验报告 课程实验报告 计算机应用基课程名称班级日期 2011.6.2 础教程 姓名学号实验成绩 计算机Word文档的创建与排版实验名称 实验目的:掌握创建文档的方法,全面认识排版的功能,熟练掌握修饰文字和实验的段落的基本方法和技巧。掌握插入剪切画和外部图片的方法并在文档中实现图 文混排的效果,掌握页面设置与设置页眉页脚的方法,学会使用打印预览来调目的和整文档。 要求 中文版Windows XP 实中文版Word 验 环 境 任务一:创建 Word新文档及常规任务二:插入外部编辑对象 任务三:修饰文字实 验 内 容 步骤1:操规

算法作新建Word文档的方法:?双击桌面;?通过开始菜单程序启动Office中的Word;?点击鼠标右键也可以新建Word文档。描述步骤2:文本输入练习:?在输入文本时,字符总是位于光标所在的位置,随着字符的输入光标不断右移。?Enter 键可以开始一个新的段落。?及实 Backspace键删除插入前面的字符;Delete删除后面的一个字符。?可以用“替换与查找”调整已经输入过的文本。验步步骤3:学会用快捷键或工具栏进行“复制”“剪切”与“粘贴” 步骤4:文档保存:执行“文件|保存”命令,打开“另存为”对话框,设置骤 文件保存信息,再单击“保存”完成新文档的保存操作。 任务二:插入外部编辑对象 步骤1:插入外部文档:?将光标定位在文档起始处。?执行“插入|文件”的命令,打开插入文件的对话框。?再“查找范围”中选定素材存放的位置,然后单击“插入”按钮。 步骤2:插入剪切画:?将光标停放在合适位置。?执行“插入|图片|剪切画”命令,打开“剪切画”任务窗格找到所需的剪切画?单击图片右侧的小三角按钮,打开一个快捷菜单,单击“插入”,然后再关闭即完成剪切画的插入。 步骤3:插入外部图片:?光标停在要插入图片的位置。?选择“插入|图片|来自文件”命令,打开“插入图片”对话框,插入自己所要的图片。 步骤4:保存文件:输入文件名和选择正确的文件类型,保存到合适的位置 任务三:修饰文字 步骤1字符格式化:可以通过工具栏或文字设置选项设置文字的字体、字号、大小写、粗体、斜体、上标、下标、字体颜色等。 步骤2:字符位置与间距调整:?利用“字体”对话框中的“字符间距”选项来调整字符间的间距和字符的垂直位置。?使用“字体”对话框中的“文字效果”选项

word20XX的实验报告

竭诚为您提供优质文档/双击可除word20XX的实验报告 篇一:word实验报告 实验报告 课程名称计算机应用基础实验项目名称word综合练习班级与班级代码12级新闻1班实验室名称(或课室)ss1-201专业新闻学任课教师刘松学号:12251204102姓名:蔡晓童实验日期:20XX-04-11 广东商学院教务处制 姓名实验报告成绩 评语: 指导教师(签名)年月日 说明:指导教师评分后,实验报告交院(系)办公室保存。 一、实验目的 1、2、 掌握常用的word编辑方法 综合运用word桌面排版功能(字符排版、段落排版、

页面排版、图文混排、艺术字等)进行实际文档的处理。 二、实验设备 1、2、 计算机word20XX软件 三、实验步骤 1、新建一个word文档,输入文章。 2、选择“插入”→“图片”→“艺术字”,选择艺术字样式→在对话框中设置字体、字号。 3、选择“插入”→“图片”→“来自文件”,选择所要插入的图片,在合适的位置插入相应的图片,并对图片的格式进行定义。 4、选中要分栏的段落,选择“格式”→“分栏”命令,显示“分栏”对话框,在预设类型中选择一种类型,单击“确定”按钮。 5、将第一段的“潮”字首字下沉,点击【格式】→【首字下沉】→【下沉】,单击“确定”。 6、选择“编辑”→“查找”,输入要查找的内容,然后选择“你”,再进行字体变换。 7、进行字符格式设置,如改变字型,大小,颜色等。8、进行页眉(学号和姓名)和页脚(页码)格式设置。 四、实验结果 如下页所示

五、实验分析与体会 通过本次实验,我了解了word字符格式、段落格式和 页面格式等排版技术和图文混排等技术的使用,今后可以更好的运用word在生活中工作中制作文档。而且通过这次试验,我觉得自己动手排版非常有趣。因为我对word文档的 操作的不熟悉,所以,我的速度一直很慢,而且,还不可以更具自己想要的效果自由的进行操作,但是在经过一边查书,一边操作的过程中,经过自己的努力,终于完成了我的文档。我越来越熟悉它的操作,并且能够运用其中大部分的工具,来完善自己的文档。而且我也明白了,word文档的操作是很基础的计算机运用,也是使用范围非常广泛的程序。因此,学习这一门课程是非常重要和必要的。 广□播站潮州市高级中学云里之音○ 作为校园文化的传媒机构,以丰富学生的校园生活,传播校园资讯为目的,以"努只为把声音传得更远"为口号,力,陪伴高级 走过了许多风风雨雨。在高级中学团中学 学生会的管理下,委会、广播站一如既往地坚持发扬广播不怕苦,不怕累的精神,努力唱响青春,唱响热情。 mondaysunshineAfternoon:品味生活点滴享受午后阳光;为你带来新鲜的生活资讯,介绍生活小常识。Tuesdaywindow:ListeningListeningwindow,

计算机图形学实验报告

计算机图形学 实验报告 学号:20072115 姓名: 班级:计算机 2班 指导老师:何太军 2010.6.19

实验一、Windows 图形程序设计基础 1、实验目的 1)学习理解Win32 应用程序设计的基本知识(SDK 编程); 2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。 4)学习MFC 类库的概念与结构; 5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框); 6)学习使用MFC 的图形编程。 2、实验内容 1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。(可选任务) 2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,This is my first SDI Application"。(必选任务) 3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。 3、实验过程

1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档; 2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,This is my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制; 3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。 4、实验结果 正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。成功地完成了实验。 结果截图: 5、实验体会 通过实验一,了解了如用使用基本的SDI编程函数绘制简单的图

计算机图形学实验报告

计算机图形学(computer graphics)的基本含义是使用计算机通过算法和程序在显示设备上构造图形。图形是人们通过计算机设计和构造出来的,不是通过摄像机、扫描仪等设备输入的图像。这里的图形可以是现实中存在的图形,也可以是完全虚拟构造的图形。以矢量图的形式呈现,更强调场景的几何表示,记录图形的形状参数与属性参数。例如,工程图纸(drawing),其最基本的图形单元是点、线、圆/弧等,其信息包含图元的几何信息与属性信息(颜色、线型、线宽等显式属性和层次等隐式属性)。 图像处理(image processing)则是研究图像的分析处理过程,图像处理研究的是图像增加、模式识别、景物分析等,研究对象一般为二维图像。图像以点阵图形式呈现,并记录每个点的灰度或色彩。例如,照片、扫描图片和由计算机产生的真实感和非真实感图·形等,最基本的图像单元(pels,picture elements)是点—像素(pixel),其信息实际上是点与它的属性信息(颜色、灰度、亮度等)。 计算机视觉(computer vision)包括获取、处理、分析和理解图像或者更一般意义的真实世界的高维数据方法,它的目的是产生决策形式的数字或者符号信息。

计算机图形学和计算机视觉是同一过程的两个方向。计算机图形学将抽象的语义信息转化成图形,计算机视觉则从图形中提取抽象的语义信息,图像处理研究的则是一个图像或一组图像之间的相互转化和关系,与语义信息无关。下表从输入和输出的角度对三者的区别进行辨析: 表2 图像处理&计算机视觉&计算机图形学对比 计算机图形学,输入的是对虚拟场景的描述,通常为多边形数组,而每个多边形由三个顶点组成,每个顶点包括三维坐标、贴图坐标、RGB 颜色等。输出的是图像,即二维像素数组。 计算机视觉,输入的是图像或图像序列,通常来自相机、摄像头或视频文件。输出的是对于图像序列对应的真实世界的理解,比如检测人脸、识别车牌。图像处理,输入的是图像,输出的也是图像。

(完整word版)计算机图形学实验报告

一、实验目的 1、掌握中点Bresenham直线扫描转换算法的思想。 2掌握边标志算法或有效边表算法进行多边形填充的基本设计思想。 3掌握透视投影变换的数学原理和三维坐标系中几何图形到二维图形的观察流程。 4掌握三维形体在计算机中的构造及表示方法 二、实验环境 Windows系统, VC6.0。 三、实验步骤 1、给定两个点的坐标P0(x0,y0),P1(x1,y1),使用中点Bresenham直线扫描转换算法画出连接两点的直线。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、使用中点Bresenham直线扫描转换算法实现自己的画线函数,函数原型可表示如下: void DrawLine(CDC *pDC, int p0x, int p0y, int p1x, int p1y); 在函数中,可通过调用CDC成员函数SetPixel来画出扫描转换过程中的每个点。 COLORREF SetPixel(int x, int y, COLORREF crColor ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用DrawLine 函数画出不同斜率情况的直线,如下图:

最后、调试程序直至正确画出直线。 2、给定多边形的顶点的坐标P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3),P4(x4,y4)…使用边标志算法或有效边表算法进行多边形填充。 实验基本步骤 首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架。 其次、实现边标志算法或有效边表算法函数,如下: void FillPolygon(CDC *pDC, int px[], int py[], int ptnumb); px:该数组用来表示每个顶点的x坐标 py :该数组用来表示每个顶点的y坐标 ptnumb:表示顶点个数 注意实现函数FillPolygon可以直接通过窗口的DC(设备描述符)来进行多边形填充,不需要使用帧缓冲存储。(边标志算法)首先用画线函数勾画出多边形,再针对每条扫描线,从左至右依次判断当前像素的颜色是否勾画的边界色,是就开始填充后面的像素直至再碰到边界像素。注意对顶点要做特殊处理。 通过调用GDI画点函数SetPixel来画出填充过程中的每个点。需要画线可以使用CDC的画线函数MoveTo和LineTo进行绘制,也可以使用实验一实现的画直线函数。 CPoint MoveTo(int x, int y ); BOOL LineTo(int x, int y ); 实现边标志算法算法需要获取某个点的当前颜色值,可以使用CDC的成员函数 COLORREF GetPixel(int x, int y ); 再次、找到文档视图程序框架视图类的OnDraw成员函数,调用FillPolygon 函数画出填充的多边形,如下: void CTestView::OnDraw(CDC* pDC) { CTestcoodtransDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);

word实验报告格式

word实验报告格式 篇一:实验报告模板——word格式 实验2 一元线性回归模型 一、实验内容:利用一元线性回归模型研究我国经济水平对消费的影响 1、实验目的:掌握一元线性回归方程的建立和基本的经济检验和统计检验 2、实验要求: (1)对原始指标变量数据作价格因子的剔除处理;(2)对回归模型做出经济上的解释;(3)独立完成实验建模和实验报告。 二、实验报告 ----中国1978-XX年人均消费与经济水平之间的关系 1、问题的提出 居民的消费在社会经济发展中具有重要的作用,合理适度的消费可以有利的促进经济的平稳健康的增长。要充分发挥消费对经济的拉动作用,关键问题是如何保证居民的消费水平。根据宏观经济学理论,一国的GDP扣除掉折旧和税收就是居民的可支配的收入了,而居民的收入主要用于两个方面:一是储蓄,二是消费。如果人均GDP增加,那么居民的可支配收入也会增加,这样居民用于消费的应该也会增加。本次实验通过运用中国1978-XX年人均消费与经济水平(用

人均GDP这个指标来表示)数据,建立模型研究人均消费和经济水平之间的关系。 西方消费经济学者们认为,收入是影响消费者消费的主要因素,消费是需求的函数。消费经济学有关收入与消费的关系即消费函数理论有:(1)凯恩斯的绝对收入理论。该理论认为消费主要取决于消费者的净收入,边际消费倾向小于平均消费倾向。并且进一步假定,人们的现期消费,取决于他们现期收入的绝对量。(2)杜森贝利的相对收入消费理论。该理论认为消费者会受自己过去的消费习惯以及周围消费水准来决定消费,从而消费是相对的决定的。这些理论都强调了收入对消费的影响。 除此之外,还有其他一些因素也会对消费行为产生影响。(1)利率。一般情况下,提高利率会刺激储蓄,从而减少消费。但在现实中利率对储蓄的影响要视其对储蓄的替代效应和 收入效应而定,具体问题具体分析。(2)价格指数。价格的变动可以使得实际收入发生变化,从而改变消费。(3)生活环境,生活理念。有些人受传统消费观念的影响,对现在流行的超前消费很不赞同,习惯于把钱存入银行,这样势必会影响一个地区的消费水平。(4)人口结构。不同年龄段的人的消费率不同,青少年和老年人的消费率一般较高。一

《计算机图形学》习题

《计算机图形学》习题(中文) 一、填空题: 1.计算机图形学是指使用计算机通过()在显示设备上构造出图形来。答案:算法和程序 2.图象的分辨率指的是在水平和垂直方向上每单位长度所包含的()数目。 答案:象素点 3.计算机图形系统由硬件设备及相应的()两部分组成。 答案:程序系统(软件) 4.阴极射线管主要由3部分组成:电子枪、()和荧光屏。 答案:偏转系统 5.直线的属性包括:()、()和线色。 答案:线型线宽 6.有些情况下屏幕的左上角象素点被认为是屏幕坐标系的原点。当把这个系统下的象素坐标(x,y)转换到以屏幕的左下角点为原点的坐标系下时,假定垂直方向象素点数目为m,则该点的坐标变为( ). 答案: (x,m-y-1) 7.Hermite 曲线是给定曲线段的两个端点坐标以及两端点处的()来描述曲线的。 答案:切线矢量 8.Bezier曲线通过特征多边形的()。 答案:起点和终点 9.交互式图形系统的基本交互任务包括()、()、数值输入及文字输入。 答案:定位选择 10.衡量CRT的重要性能指标分别是分辨率和纵横比。 11.如果屏幕的分辨率是640×480,则如果是一个只能显示黑白图形的显示器,则需要VRAM的大小为:(640×480)/8=38400 bytes≈3.8Kb 12.常用的输入设备:键盘、鼠标。 13.写出颜色分别为红、绿、蓝的RGB值_(255,0,0)、(0,255,0)、(0,0,255)。 14.种子填充算法中内部定义的或边界定义的区域可以分为4连接和 8连接两种连通方式。 15.二维图形旋转变换中,逆时针为正方向顺时针为负方向 二、选择题: 1.经国际标准化组织批准的第一个图形标准是 ( )。 A. 3D CORE B.GKS C. PHIGS D. CKS

相关主题