当前位置:文档之家› 计算机图形学实验指导

计算机图形学实验指导

计算机图形学实验指导
计算机图形学实验指导

《计算机图形学实验指导书》

实验课程教学目的与要求:

掌握计算机图形的生成技术和生成各种平面图形和简单立体图形的基本算法,掌握图形填充、裁剪、图形变换及图形消隐等计算机图形处理的基本方法,初步掌握用C语言编写基本图形生成和处理程序的方法,为后续的课程奠定良好的基础。

实验1:Bresenham算法的应用

一、所需主要仪器及环境:

每人微机一台,安装Turbo c 2.0 或者VC++

二、实验目的和要求:

通过本次实验要求学生掌握DDA算法和Bresenham算法的基本原理和算法设计,并初步熟悉C/C++进行图形编程的方法。

三、实验主要内容:

实现绘制各种情况直线的Bresenham算法,并将实现的算法应用于任意多边形的绘制,要求多边形的顶点由键盘输入或鼠标拾取,绘制的多边形顶点要准确,图形应该封闭。

要求画出算法实现的程序流程图,使用C或者VC++实现算法,并演示。

四、参考实验步骤:

1)分析各种情况下直线绘制的方法,确定直线绘制的算法流程

2)实现任意情况下的直线绘制算法,并测试该算法

3)上述算法测试成功后,考虑使用上述算法按次序连接多边形的顶点来绘制多边形。

实例程序(这里只给出绘制个方向直线的中点Bresenham算法的参考代码,此代码为VC环境下使用,若要在C环境下使用,则需将程序中使用pDC->SetPixel()绘制点的函数调用改为putpixel(),注意大小写)

void Bresenhamline(int x1, int y1, int x2, int y2)

{ //对于所有直线均按照从左至右的方向绘制

if(x1>x2){

int tempx,tempy;

tempx=x1;x1=x2;x2=tempx;

tempy=y1;y1=y2;y2=tempy;

}

//根据斜率的情况不同而绘制

if(y1==y2){//斜率为0的情况

for(x=x1;x<=x2;x++)

pDC->SetPixel(x,y1,2);

}

else if(x1==x2){//直线为垂直的情况

if(y1>y2){ //使直线按从下往上画

int tempy=y1;

y1=y2;y2=tempy;

}

for(y=y1;y<=y2;y++)

pDC->SetPixel(x1,y,2);

}

else{

dy=y2-y1;

dx=x2-x1;

if(abs(dy)==abs(dx)){////斜率为1或-1时

x=x1;y=y1;

if(dy<0){//斜率为1

for(;y>=y2;y--){

x++;

pDC->SetPixel(x,y,2);

}//斜率为1

else{//斜率为-1

for(;y<=y2;y++){

x++;

pDC->SetPixel(x,y,2);

}

}//斜率为-1

}

else if(abs(dy)0&&dx>0){//斜率为正时

right=-2*dy;

rightleft=2*dx-2*dy;

d=dx-2*dy;

x=x1;y=y1;

while(x<=x2){

pDC->SetPixel(x,y,2);

x++;

if(d<0){

y++;

d=d+rightleft;

}else{

d=d+right;

}

}

}//斜率为正时

else {//斜率为负时

right=2*dy;

rightleft=2*dy-2*dx;

d=2*dy-dx;

x=x1;y=y1;

while(x<=x2){

pDC->SetPixel(x,y,2);

x++;

if(d<0){

y++;

d=d+rightleft;

}else{

d=d+right;

}

}

}//斜率为负时

}//斜率的绝对值小于1时

else{ //斜率的绝对值大于1时

if(dy>0&&dx>0){ //斜率为正时

right=2*dx;

rightleft=2*dx-2*dy;

d=2*dx-dy;

x=x1;y=y1;

while(y<=y2){

pDC->SetPixel(x,y,2);

y++;

if(d>=0){

x++;

d=d+rightleft;

}else{

d=d+right;

}

}

}//斜率为正时

else{//斜率为负时

right=-2*dx;

rightleft=-2*dx-2*dy;

d=-2*dx-dy;

x=x1;y=y1;

while(y>=y2){

pDC->SetPixel(x,y,2);

if(d<0){

x++;

d=d+rightleft;

}else{

d=d+right;

}

}

}//斜率为负时

}//斜率的绝对值大于1时

}//斜率的所有情况

}

实验2:多边形区域扫描线填充

一、所需主要仪器及环境:每人微机一台,安装Turbo c 2.0 或者VC++

二、实验目的和要求:

通过本次实验要求学生掌握多边形区域扫描线填充的有序边表算法的基本原理和算法设计。要求画出算法实现的程序流程图,使用C或者VC++实现算法,并演示。

三、实验主要内容:

实现多边形区域扫描线填充的有序边表算法,设计相关的数据结构(如链表结构、结点结构等),并将实现的算法应用于任意多边形的填充,注意多边形的顶点应由键盘输入或鼠标拾取,填充要准确,不能多填也不能少填。

四、参考实验步骤:

1)分析多边形区域扫描线填充算法的原理,确定算法流程

①初始化:构造边表,AET表置空

②将第一个不空的ET表中的边插入AET表

③由AET表取出交点进行配对(奇偶)获得填充区间,依次对这些填充区间着色

④y=y i+1时,根据x=x i+1/k修改AET表所有结点中交点的x坐标。同时如果相应的

ET表不空,则将其中的结点插入AET表,形成新的AET表

⑤AET表不空,则转(3),否则结束。

2)编程实现

①首先确定多边形顶点和ET/AET表中结点的结构

②编写链表相关操作(如链表结点插入、删除和排序等)

③根据1)中的算法结合上述已有的链表操作函数实现多边形区域扫描线填充的主体

功能

④编写主函数,测试该算法

参考程序

typedef struct dePt{

int x;

int y;

}dePt;

typedef struct Edge{

int yUpper;

float xIntersect, dxPerScan;

struct Edge *next;

}Edge;

void insertEdge(Edge *list, Edge *edge)

{

Edge *p,*q=list;

p=q->next;

while(p!=NULL)

{

if(edge->xIntersectxIntersect)

p=NULL;

else{

p=p->next;

}

}

edge->next=q->next;

q->next=edge;

}

int yNext(int k, int cnt, dePt*pts)

{

int j;

if((k+1)>(cnt-1))

j=0;

else

j=k+1;

while(pts[k].y==pts[j].y)

if((j+1)>(cnt-1))

j=0;

else j++;

return (pts[j].y);

}

void makeEdgeRec(dePt lower, dePt upper,int yComp,Edge *edge,Edge *edges[]) {

edge->dxPerScan=(float)(upper.x-lower.x)/(upper.y-lower.y);

edge->xIntersect=lower.x;

if(upper.y

edge->yUpper=upper.y-1;

else

edge->yUpper=upper.y;

insertEdge(edges[lower.y],edge);

}

void buildEdgeList(int cnt,dePt *pts,Edge *edges[])

{

Edge *edge;

dePt v1,v2;

int i,yPrev=pts[cnt-2].y;

v1.x=pts[cnt-1].x;v1.y=pts[cnt-1].y;

for(i=0;i

{

v2=pts[i];

if(v1.y!=v2.y)

{

edge=(Edge *)malloc(sizeof(Edge));

if(v1.y

makeEdgeRec(v1,v2,yNext(i,cnt,pts),edge,edges);

else

makeEdgeRec(v2,v1,yPrev,edge,edges);

}

yPrev=v1.y;

v1=v2;

}

}

void buildActiveList(int scan,Edge *active,Edge *edges[])

{

Edge *p,*q;

p=edges[scan]->next;

while(p)

{

q=p->next;

insertEdge(active,p);

p=q;

}

}

void fillScan(int scan,Edge *active)

{

Edge *p1,*p2;

int i;

p1=active->next;

while(p1)

{

for(i=p1->xIntersect;ixIntersect;i++)

putpixel((int)i,scan,3);

p1=p2->next;

}

}

void deleteAfter(Edge *q)

{

Edge *p=q->next;

q->next=p->next;

free(p);

}

void updateActiveList(int scan,Edge *active)

{

Edge *q=active, *p=active->next;

while(p)

if(scan>=p->yUpper)

{

p=p->next;

deleteAfter(q);

}

else

{

p->xIntersect=p->xIntersect+p->dxPerScan;

q=p;

p=p->next;

}

}

void resortActiveList(Edge *active)

{

Edge *q,*p=active->next;

active->next=NULL;

while(p)

{

q=p->next;

insertEdge(active,p);

p=q;

}

}

void scanFill(int cnt,dePt *pts)

{

Edge *edges[1024],*active;

int i,scan;

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

{

edges[i]=(Edge *)malloc(sizeof(Edge));

edges[i]->next=NULL;

}

buildEdgeList(cnt,pts,edges);

active=(Edge *)malloc(sizeof(Edge));

active->next=NULL;

for(scan=0;scan<1024;scan++)

{

buildActiveList(scan,active,edges);

if(active->next)

{

fillScan(scan,active);

updateActiveList(scan,active);

resortActiveList(active);

}

}

}

实验3:关于任意直线的图形对称变换

一、所需主要仪器及环境:每人微机一台,安装Turbo c 2.0 或者VC++

二、实验目的和要求:

变换以解决实际应用问题。

三、实验主要内容:

实验要求输入的直线是任意直线,直线的端点只能由键盘输入或者鼠标拾取,要做对称变换的图形也是一个任意图形(至少应是一个任意多边形)。实验要求掌握算法的基本原理和算法设计,画出算法实现的程序流程图,使用C或者VC++实现算法,并演示。

四、参考实验步骤:

实现对称变换,分析如何使用一系列简单变换来构造题目要求的复合变换。本题要实现的变换可以用如下一组变换组合来实现:

①将直线任一点移至与坐标原点重合

②将平移后的直线绕原点旋转至与某一坐标轴重合

③将题目要求的对称变换转为实现已知图形关于上述坐标轴的对称变换

④按逆序求上述①、②变换的逆变换

⑤将上述矩阵依次相乘得到最终的复合变换矩阵

则某一多边形关于任意直线的对称变换就转变为将该多边形的各顶点与上述求得的复合变换进行矩阵乘法,求得变换后的新多边形的各个顶点坐标。

1)根据上述流程,编程实现,并测试程序功能。

实例程序(对称变换最终转换为矩阵乘法来实现,可参考C语言的有关例程。这里只给出Cohen-Sutherland编码裁剪算法实现的参考程序,其中的直线和窗口的绘制请参考实验1种的直线绘制算法)

#define LEFT 1

#define RIGHT 2

#define BOTTOM 4

#define TOP 8

void encode(float x, float y, int *code)

{

int c=0;

if(x

else if(x>XR) c=c|RIGHT;

if(y

else if(y>YT) c=c|TOP;

*code=c;

}

void C_S_Line_Clip(x1,y1,x2,y2,XL,XR,YB,YT)

float x1,y1,x2,y2,XL,XR,YB,YT;

{ int code1,code2,code;

float x=0,y=0;

encode(x1,y1,&code1);

encode(x2,y2,&code2);

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

{

if((code1&code2)!=0) return;

code=code1;

if(code1==0) 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);

}

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

}

if(code==code1)

{ x1=x; y1=y; encode(x,y,&code1);}

else{x2=x; y2=y; encode(x,y,&code2);}

}

Bresenhamline(x1,y1,x2,y2); //实验一中实现的直线绘制程序

}

实验4:实现直线和多边形裁剪

一、所需主要仪器及环境:每人微机一台,安装Turbo c 2.0 或者VC++

二、实验目的和要求:

通过本实验要求学生熟悉Cohen-Sutherland二维编码裁剪算法的基本原理和工作流程,并设计算法程序以加深对算法的理解。

本实验要求实现标准矩形窗口的裁剪,窗口由键盘输入确定,直线/多边形都是任意的。裁剪后的图形要准确,不能多或者少点。

三、实验主要内容:

实验要求输入的直线是任意直线,直线的端点只能由键盘输入或者鼠标拾取,要做对称变换的图形也是一个任意图形(至少应是一个任意多边形)。本实验要求掌握算法的基本原理和算法设计,画出算法实现的程序流程图,使用C或者VC++实现算法,并演示。

四、参考实验步骤:

分析直线裁减算法原理,设计算法流程。以Cohen-Sutherland编码裁剪为例,算法的流程如下:

实验5:Beizer曲线与B样条曲线的生成(选做)

一、所需主要仪器及现有套数:

每人微机一台,安装Turbo c 2.0 或者VC++

二、实验目的和要求:

用熟悉的计算机语言绘制一条曲线。

三、实验主要内容:

完成Beizer曲线、B样条曲线的生成显示。给出Beizer曲线的全局控制性的演示图。

四、参考实验步骤:

1)利用Beizer曲线的定义来实现

P(u) = ∑Pi·Bi,n(u)

Bi,n(u) = C(n,i) ·u i·(1-u) n-i

C(n,i) = n!/(i! ·(n-i)!)

2)根据上述定义,编程实现,并测试程序功能。

实例参考程序

double powi(double v,int k)

{ double temp=1.0;

if(k==0)||(v==0) return 1;

else { for ( int i=1;i

return temp;

}

long fac (int m)

{ int i; long temp=1;

if (m==0) return 1;

else { for (i=2;i

return temp;

}

void Beizer (POINT *p,int n)

{ int x,y,I,j,k=100;

double t=1.0/k,t1,u,v;

double temp,temp1,temp2,bi;

moveto (p[0].x,p[0].y);

for (j=1;j

{ t1=j*t;u=t1;v=1-u;

x=0;y=0;

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

{ temp=double(fac(n)/fac(i)/fac(n-i);

temp1=powi(u,i);temp2=powi(v,n-i);

bi=temp*temp1*temp2;

x=x+bi*p[i].x;

y=y+bi*p[i].y;

}

lineto(x,y);

}

lineto(p[n].x,p[n].y);

}

3)根据B次样条曲线的定义,利用插值法绘制。

4)根据上述定义,编程实现,并测试程序功能。

实例参考程序

void Cardinalspline(POINT *p,int n, float tension)

int x,y,i,j,k=1000;

double t,t1,t2,t3,a,b,c,d,s;

t=1.0/k;s=(1.0-tension)/2.0;

p[n].x=2*p[n-1].x-p[n-2].x;p[n].y=2*p[n-1].y-p[n-2].y;

moveto(p[1].x;p[1].y);

for(i=1;i

for(j=1;j<=k;j++)

{t1=j*t;t2=t1*t1;t3=t2*t1;

a=-s*t3+2*s*t2-s*t1;

b=(2-s)*t3+(s-3)*t2+1;

c=(s-2)*t3+(3-2*s)t2+s*t1;

d=s*t3-s*t2;

x=(int)(a*p[i-1].x+b*p[i].x+c*p[i+1].x+d*p[i+2].x);

y=(int)(a*p[i-1].y+b*p[i].y+c*p[i+1].y+d*p[i+2].y);

lineto(x,y);

}

}

void main()

{ int n=5,gdriver=DETECT,gmode;

POINT ps[4];ps[0].x=50;ps[0].y=300;

ps[1].x=50; ps[1].y=300; ps[2].x=150; ps[2].y=50;

ps[3].x=250; ps[3].y=300; ps[4].x=350; ps[4].y=50;

initgraph(&gdriver,&gmode,“”);

Cardinalspline(ps,n,0.5);

getch();closegraph();

}

实验6:设计一个简单的图形系统(选做)

一、所需主要仪器及现有套数:

每人微机一台,安装Turbo c 2.0 或者VC++

二、实验目的和要求:

应用所学图形学知识开发简单图形系统,以加深对所学算法的理解及其在实际环境中的应用。本实验对学生要求较高,学生至少应该能够明确程序的流程,并能将前面几次实验的成果融合到本系统中。

三、实验主要内容及要求:

可以使用MFC类库编程实现,或者将前述几次实验的算法封装成类再结合MFC编程实现。要求该图形系统要能绘制简单的图形(直线、圆、多边形等),并能实现图形的拖放,缩放,简单的图形变换以及简单的交互式绘图。

四、参考实验步骤:

1)确定系统功能,划分功能模块

2)确定各主要功能模块的算法,如果使用前几次实验的结果,则需考虑如何修改前几次实验的算法,并对他们进行封装(封装成类)

3)确定系统的布局(工作区、工具栏、菜单等),设计工具栏及菜单

4)确定消息响应机制,确定菜单中绘图命令及工具栏的响应函数,同时确定各函数的内部算法

参考书籍:

[1]陈传波,陆枫主编,《计算机图形学基础》,电子工业出版社,2002年3月;[2]孙家广等编,《计算机图形学》(第三版),清华大学出版社,1998年9月;[3]孙立镌编著,《计算机图形学》,哈尔滨工业大学出版社,2000年5月;[4]唐荣锡等编,《计算机图形学教程》,科学出版社,2000年

[5]潘云鹤编,《计算机图形学》,高等教育出版社,2000年

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

计算机图形学实验 肖加清

实验一图形学实验基础 一、实验目的 (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

研究生计算机图形学课程室内场景OpenGL--实验报告Word版

《高级计算机图形学》实验报告 姓名:学号:班级: 【实验报告要求】 实验名称:高级计算机图形学室内场景 实验目的:掌握使用OpenGL生成真实感复杂对象的方法,进一步熟练掌握构造实体几何表示法、扫描表示法、八叉树法、BSP树法等建模方法。 实验要求:要求利用OpenGL生成一个真实感的复杂对象及其周围场景,并显示观测点变化时的几何变换,要具备在一个纹理复杂的场景中漫游功能。要求使用到光线跟踪算法、 纹理映射技术以及实时绘制技术。 一、实验效果图 图1:正面效果图

图2:背面效果图 图4:背面效果图

图4:室内场景细节效果图 图5:场景角度转换效果图

二、源文件数据代码: 共6个文件,其实现代码如下: 1、DlgAbout.cpp #include "StdAfx.h" #include "DlgAbout.h" CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() 2、FormCommandView.cpp #include "stdafx.h" #include "Tool.h" #include "MainFrm.h" #include "FormCommandView.h" #include "ToolDoc.h" #include "RenderView.h" // Download by https://www.doczj.com/doc/4613693945.html, #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // CFormCommandView IMPLEMENT_DYNCREATE(CFormCommandView, CFormView) CFormCommandView::CFormCommandView() : CFormView(CFormCommandView::IDD) { //{{AFX_DATA_INIT(CFormCommandView)

计算机图形学实验

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

计算机图形学实验报告

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

计算机图形学教程课后习题参考答案.

第一章 1、试述计算机图形学研究的基本内容? 答:见课本P5-6页的1.1.4节。 2、计算机图形学、图形处理与模式识别本质区别是什么?请各举一例说明。 答:计算机图形学是研究根据给定的描述,用计算机生成相应的图形、图像,且所生成的图形、图像可以显示屏幕上、硬拷贝输出或作为数据集存在计算机中的学科。计算机图形学研究的是从数据描述到图形生成的过程。例如计算机动画制作。 图形处理是利用计算机对原来存在物体的映像进行分析处理,然后再现图像。例如工业中的射线探伤。 模式识别是指计算机对图形信息进行识别和分析描述,是从图形(图像)到描述的表达过程。例如邮件分捡设备扫描信件上手写的邮政编码,并将编码用图像复原成数字。 3、计算机图形学与CAD、CAM技术关系如何? 答:见课本P4-5页的1.1.3节。 4、举3个例子说明计算机图形学的应用。 答:①事务管理中的交互绘图 应用图形学最多的领域之一是绘制事务管理中的各种图形。通过从简明的形式呈现出数据的模型和趋势以增加对复杂现象的理解,并促使决策的制定。 ②地理信息系统 地理信息系统是建立在地理图形基础上的信息管理系统。利用计算机图形生成技术可以绘制地理的、地质的以及其它自然现象的高精度勘探、测量图形。 ③计算机动画 用图形学的方法产生动画片,其形象逼真、生动,轻而易举地解决了人工绘图时难以解决的问题,大大提高了工作效率。 5、计算机绘图有哪些特点? 答:见课本P8页的1.3.1节。 6、计算机生成图形的方法有哪些? 答:计算机生成图形的方法有两种:矢量法和描点法。 ①矢量法:在显示屏上先给定一系列坐标点,然后控制电子束在屏幕上按一定的顺序扫描,逐个“点亮”临近两点间的短矢量,从而得到一条近似的曲线。尽管显示器产生的只是一些短直线的线段,但当直线段很短时,连成的曲线看起来还是光滑的。 ②描点法:把显示屏幕分成有限个可发亮的离散点,每个离散点叫做一个像素,屏幕上由像素点组成的阵列称为光栅,曲线的绘制过程就是将该曲线在光栅上经过的那些像素点串接起来,使它们发亮,所显示的每一曲线都是由一定大小的像素点组成的。当像素点具有多种颜色或多种灰度等级时,就可以显示彩色图形或具有不同灰度的图形。 7、当前计算机图形学研究的课题有哪些? 答:见课本P10-11页的1.4节。

计算机图形学实验报告

目录

实验一直线的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); glVertex2i(int(x+0.5),(int)(y+0.5)); glEnd(); x+=xIncre;

计算机图形学实验二

实验报告 课程名称:计算机图形学 实验项目:区域填充算法 实验仪器:计算机 系别:计算机学院 专业:计算机科学与技术 班级姓名:计科1602/ 学号:2016011 日期:2018-12-8 成绩: 指导教师:

一.实验目的(Objects) 1.实现多边形的扫描线填充算法。 二.实验内容 (Contents) 实现多边形的扫描线填充算法,通过鼠标,交互的画出一个多边形,然后利用种子填充算法,填充指定的区域。不能使用任何自带的填充区域函数,只能使用画点、画线函数或是直接对图像的某个像素进行赋值操作;

三.实验内容 (Your steps or codes, Results) //widget.cpp //2016CYY Cprogramming #include"widget.h" #include #include #include using namespace std; #define H 1080 #define W 1920 int click = 0; //端点数量 QPoint temp; QPoint first; int result = 1; //判断有没有结束 int sign = 1; //2为画线 int length = 5; struct edge { int ymax; float x; float dx; edge *next; }; edge edge_; QVector edges[H]; QVector points;//填充用 bool fin = false; QPoint *Queue = (QPoint *)malloc(length * sizeof(QPoint)); //存放端点的数组 Widget::Widget(QWidget *parent) : QWidget(parent) { } Widget::~Widget() { } void Widget::mouseMoveEvent(QMouseEvent *event) { setMouseTracking(true); if (click > 0 && result != 0) { startPt = temp; endPt =event->pos(); sign = 2; update(); } } void Widget::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { } else if (event->button() == Qt::RightButton) { sign = 2;

计算机图形学实验报告,DOC

欢迎共阅

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握 3. 1.利用 2.加强对 四 { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } voidDDALine(intx0,inty0,intx1,inty1) { glColor3f(1.0,0.0,0.0); intdx,dy,epsl,k; floatx,y,xIncre,yIncre; dx=x1-x0;dy=y1-y0;

x=x0;y=y0; if(abs(dx)>abs(dy))epsl=abs(dx); elseepsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glEnd(); } } { } { } { glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return0; }

《计算机图形学实验报告》

一、实验目的 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);

计算机图形学课程参考文献

《计算机图形学》课程参考文献 [1 Kenneth R. Castleman, “Digital Image Processing”, Prentice-Hall International,Inc, 1996 [2] James Sharman. The Marching Cubes Algorithm[EB]. https://www.doczj.com/doc/4613693945.html,/. [3] William E. Lorensen, Harvey E. Cline. Marching Cubes: A High Resolution 3D Surface Construction Algrorithm[J].Computer Graphics, 1987, 21(4). [4] Jan Horn. Metaballs程序[CP]. http://www.sulaco.co.za. [5] 唐泽圣,等.三维数据场可视化[M].北京:清华大学出版社,1999.177-179. [6] 白燕斌,史惠康,等.OpenGL三维图形库编程指南[M].北京:机械工业出版社,1998. [7] 费广正,芦丽丹,陈立新.可视化OpenGL程序设计[M].北京:清华大学出版社,2001. [8] 田捷,包尚联,周明全.医学影像处理与分析[M].北京:电子工业出版社,2003. [9] 三维表面模型的重构、化简、压缩及其在计算机骨科手术模拟中的应用[R]. https://www.doczj.com/doc/4613693945.html,/~yike/uthesis.pdf ; [10] 首套中国数字化可视人体二维图像[DB]. http://www.chinesevisiblehuman. com/ pic/pictype.asp [11] 季雪岗,王晓辉,张宏林,等.Delphi编程疑难详解[M].北京:人民邮电出版社,2000. [12] 郑启华.PASCAL程序设计(第二版)[M].北京:清华大学出版社,1996. [13] 涂晓斌,谢平,陈海雷,蒋先刚.实用微机工程绘图实验教程[M].西南交通大学出版社,2004,4. [14] David F.Rogers.计算机图形学算法基础[M].北京:电子工业出版社,2002. [15] 李信真,车刚明,欧阳洁,封建湖.计算方法[M].西安:西北工业大学出版社,2000. [16] Paul Bourke Polygonising a scalar field [CP]. http://astronomy. https://www.doczj.com/doc/4613693945.html,.au/ ~pbourke/ modelling/polygonise/ [17] 刘骏.Delphi数字图像处理及高级应用[M].北京:科学出版社,2003. [18] 李弼程,彭天强,彭波,等.智能图像处理技术[M].北京:电子工业出版社,2004. [19] Kenneth R.Castleman著,朱志刚,石定机,等译.数字图像处理[M].北京:电子工业出版社,2002. [20] Milan Sonka, Vaclav Hlavac, Roger Boyle.Image Processing, Analysis, and Machine Vision [M].北京:人民邮电出版社,2003. [21] 阮秋奇.数字图像处理学[M]. 北京:电子工业出版社, 2001. [22] 刘宏昆,等.Delphi应用技巧与常见问题[M]. 北京:机械工业出版社, 2003. [23] 张增强,李鲲程,等.专家门诊—Delphi开发答疑300问[M].北京:人民邮电出版社,2003.6.

《计算机图形学》 课程实验指导(1)

《计算机图形学》课程实验指导 一.实验总体方案 1.教学目标与基本要求 (1)掌握教材所介绍的图形算法的原理; (2)掌握通过具体的平台实现图形算法的方法,培养相应能力; (3)通过实验培养具有开发一个基本图形软件包的能力。 2. 实验平台与考核 实验主要结合OpenGL设计程序实现各种课堂教学中讲过的图形算法为主。程序设计语言主要以C/C++语言为主,开发平台为Visual C++。 每次实验前完成实验报告的实验目的、实验内容、实验原理、实验代码四部分并接受抽查,实验完成后完成实验结果、实验体会两部分,本次实验课结束前提交。 3. 实验步骤 (1) 预习教材与实验指导相关的算法理论及原理; (2) 仿照教材与实验指导提供的算法,利用VC+OpenGL进行实现; (3) 调试、编译、运行程序,运行通过后,可考虑对程序进行修改或改进。 二. 实验具体方案 实验预备知识 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1)与C语言紧密结合: OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL 作图甚至比TC更加简单; 2)强大的可移植性: 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统。而OpenGL 不仅用于 Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关; 3) 高性能的图形渲染: OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个非常优秀的图形软件接口。OpenGL官方网站(英文)https://www.doczj.com/doc/4613693945.html, 下面将对Windows下的OpenGL编程进行简单介绍。如下是学习OpenGL前的准备工作:1.选择一个编译环境 现在Windows系统的主流编译环境有Visual C++,C++ Builder,Dev-C++等,它们都是支持OpenGL的。但这里我们选择Visual C++ 作为学习OpenGL的实验环境。 2.安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。Windows环境下的GLUT下载地址:(大小约为150k) https://www.doczj.com/doc/4613693945.html,/resources/libraries/glut/glutdlls37beta.zip Windows环境下安装GLUT的步骤: 1)将下载的压缩包解开,将得到5个文件 2)在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则

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

计算机图形学实验C++代码

一、bresenham算法画直线 #include #include #include void draw_pixel(int ix,int iy) { glBegin(GL_POINTS); glVertex2i(ix,iy); glEnd(); } void Bresenham(int x1,int y1,int xEnd,int yEnd) { int dx=abs(xEnd-x1),dy=abs(yEnd-y1); int p=2*dy-dx; int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx; int x,y; if (x1>xEnd) { x=xEnd;y=yEnd; xEnd=x1; } else { x=x1; y=y1; } draw_pixel(x,y); while(x

} void myinit() { glClearColor(0.8,1.0,1.0,1.0); glColor3f(0.0,0.0,1.0); glPointSize(1.0); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,500.0,0.0,500.0); } void main(int argc,char **argv ) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(500,500); glutInitWindowPosition(200.0,200.0); glutCreateWindow("CG_test_Bresenham_Line example"); glutDisplayFunc(display); myinit(); glutMainLoop(); } 二、中点法绘制椭圆 #include #include #include inline int round(const float a){return int (a+0.5);} void setPixel(GLint xCoord,GLint yCoord) { glBegin(GL_POINTS); glVertex2i(xCoord,yCoord); glEnd(); } void ellipseMidpoint(int xCenter,int yCenter,int Rx,int Ry) { int Rx2=Rx*Rx; int Ry2=Ry*Ry; int twoRx2=2*Rx2; int twoRy2=2*Ry2; int p; int x=0; int y=Ry; int px=0; int py=twoRx2*y; void ellipsePlotPoints(int,int,int,int);

一种基于计算几何方法的最小包容圆求解算法.kdh

2007年 工 程 图 学 学 报2007 第3期 JOURNAL OF ENGINEERING GRAPHICS No.3一种基于计算几何方法的最小包容圆求解算法 张 勇, 陈 强 (清华大学机械工程系先进成形制造重点实验室,北京 100084) 摘要:为实现点集最小包容圆(最小外接圆)的求解,将计算几何中的α-壳的概 念应用到最小包容圆的计算过程,提出了一种精确有效的最小包容圆求解算法。根据α-壳定 义及最小包容圆性质,证明当1/α等于最小包容圆半径时点集的α-壳顶点共圆,1/α小于最小 包容圆半径时α-壳不存在,1/α大于最小包容圆半径时随着1/α减小α-壳顶点数逐渐减小的规 律。将α-壳顶点数目作为搜索最小包容圆半径的依据,实现了最小包容圆半径的搜索和最小包容圆的求解。 关键词:计算机应用;优化算法;计算几何;最小包容圆;α-壳 中图分类号:TP 391 文献标识码:A 文章编号:1003-0158(2007)03-0097-05 Algorithm for Minimum Circumscribed Circle Detection Based on Computational Geometry Technique ZHANG Yong, CHEN Qiang ( Key Laboratory for Advanced Manufacturing by Materials Processing Technology, Department of Mechanical Engineering, Tsinghua University, Beijing 100084, China ) Abstract: α-hulls are applied to calculate the minimum circumscribed circle (MCC) of point set and an accurate and effective method for MCC detection is established through finding the least squares circle of the point set and iteratively approaching the MCC with recursive subdivision. Several theorems concerning the properties of α-hulls are presented. If 1/α is equal to the radius of points’ MCC, all vertices of the α-hull will be on the same circle. When 1/α is larger than the MCC’s radius, the number of vertices of α-hulls will decrease with decreasing of 1/α, and the number of vertices’ number will reach zero when 1/α is smaller than MCC’s radius. From the above rules, an algorithm for detecting MCC is developed, and experimental results show this algorithm is reliable. Key words: computer application; optimized algorithm; computational geometry; minimum circumscribed circle; α-hull 收稿日期:2005-12-20 基金项目:国家自然科学基金资助项目(50275083);高校博士点基金资助项目(20020003053)

计算机图形学实验报告

.

目录

实验一直线的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(第二版)(孙家广-胡事民编著)

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为下一个象素;

计算机图形学上机实验指导

计算机图形学上机实验指导 指导教师:张加万老师 助教:张怡 2009-10-10

目录 1.计算机图形学实验(一) – OPENGL基础 ..................................... - 1 - 1.1综述 (1) 1.2在VC中新建项目 (1) 1.3一个O PEN GL的例子及说明 (1) 2.计算机图形学实验(二) – OPENGL变换 ..................................... - 5 - 2.1变换 (5) 3.计算机图形学实验(三) - 画线、画圆算法的实现....................... - 9 - 3.1MFC简介 (9) 3.2VC6的界面 (10) 3.3示例的说明 (11) 4.计算机图形学实验(四)- 高级OPENGL实验...................... - 14 - 4.1光照效果 (14) 4.2雾化处理 (16) 5.计算机图形学实验(五)- 高级OPENGL实验........................ - 20 - 5.1纹理映射 (20) 5.2反走样 (24) 6.计算机图形学实验(六) – OPENGL IN MS-WINDOWS .......... - 27 - 6.1 实验目标: (27) 6.2分形 (28)

1.计算机图形学实验(一) – OpenGL基础 1.1综述 这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。 OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。 本次实验不涉及面向对象编程,不涉及MFC。 1.2在VC中新建项目 1.2.1新建一个项目 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里。 1.2.2为项目添加文件 为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:\program files\microsoft visual studio\vc98\lib目录中。 选中菜单Project->Add To Project->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。 点击工具条中New Text File按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。 1.3一个OpenGL的例子及说明 1.3.1源程序 请将下面的程序写入源文件Test.c,这个程序很简单,只是在屏幕上画两根线。 #include

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