搜档网
当前位置:搜档网 › 计算机图形学实验报告

计算机图形学实验报告

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

实验报告

课程名称:计算机图形学

学院:信息科学与工程学院

专业:数字媒体技术班级:2013级姓名:李义学号:201301052015

2015年12月19日

山东科技大学教务处制

目录:

实验一:环境设置 (3)

实验二:直线的生成算法 (4)

实验三:圆的生成算法 (6)

实验四:扫描填充算法 (7)

实验五:裁剪算法 (11)

实验六:Bezier曲线 (14)

实验一:环境设置

一、实验目的和要求:

1、了解和使用TurboC提供的基本图形函数

2、像素点的生成

3、掌握Turbo C 进行图形程序设计的基本方法;.

4熟悉Visual C++实验环境

二、实验内容:

1.Turbo C集程序编辑、编译、连接、调试为一体具有速度快、效率高、功能

强等优点。Turbo C是基于DOS平台的C编译系统,占用系统资源少,提供的界面直观、易用。程序的编译、连接、调试、运行、环境设置等工作都在同一界面上进行,从而用户使用非常方便。用户在使用Turbo C之前,必须将Turbo C系统安装在用户的磁盘上,建立一个Turbo C的使用环境。运行Turbo C有两种方式:1)由DOS平台进入Turbo C,2) 由Windows平台进入Turbo C.

一个新建立的文件,也可以是一个已存在的文件。编辑好源文件存盘后,下面的工作就是对源文件(可以是单个文件,也可是多个文件)进行编译、连接和运行。在Turbo C中,对源程序进行编译、连接和运行可以分三步单独进行,也可以将编译和连接同时进行,然后运行;或者将编译、连接和运行一次完成。

说明:

(1)在操作完成后应选Project下的Clear Project,清空当前有效的项目文件(用Project name 指定的),否则系统在以后的编译中仍编译该项目文件,而不是当前编辑屏幕中的源程序。

(2)多文件编译中因出错停止编译的方式用户需要用Project的子菜单Break make on进行设置(图14)。

Errors 表示编译完一个文件后,有“错误”信息就停止编译。

Warnings 表示编译完一个文件后,有“警告”以上信息就停止编

译。

Fatal errors 表示编译完所有文件后,停止编译。

Link 进行连接之前停止编译。

图14

当程序在编译、连接中没有错误,但运行结果不正确的情况下,我们通常用以下两种方法调试程序。1)跟踪进入方法,2) 设置断点方法。设置Turbo C 环境参数是指出包含文件和库文件存放的位置以及输出文件(.OBJ和.EXE)准备存放的位置。设置Turbo C 环境参数通过主菜单Options中的选项完成,如图21。

图21

2熟悉Visual C++实验环境

(1)启动Developer Studio,了解初始化界面由哪些部分组成

查看各菜单项,看看都有哪些子菜单和命令

(2) 将鼠标放置于各工具条图标上,系统会自动显示该图标代表的命令含义,了解一下都有哪些命令。

(3) 在任意工具条上单击鼠标右键,弹出式菜单上将显示所有可用的工具条,选择其中没有对号(√)的项,看看有什么效果,再选择有对号的项看有什么效果。

(4) 将鼠标移动到任意工具条上,将鼠标放到图标间隙,按下鼠标左键不放,移动鼠标到屏幕中间,看有什么现象发生,再将它拖回到原来位置观察有什么现象发生。

(5) 将鼠标移动到下边的输出窗口,按鼠标右键,弹出一个菜单,选择其中的菜单项”Hide”,选择菜单View|Output,重新显示该窗口,看窗口是不是又显示出来了。(6) 学习使用帮助系统。在Visual C++5.0中,在工作区窗口的InfoView中选择内容,双击它,在文档区显示具体的帮助信息。在Visual C++6.0,选择菜单Help|Contents,启动MSDN联机帮助系统,学习使用该帮助系统。

选File|Exit退出Developer Studio。

(2)像素是组成图形的最小单位,像素的大小可以通过设置不同的显示方式来改变。该实验实现了简单圆的生成

(3)基于Turbo C的开发环境实现人造卫星运动动画。

实验二:直线的生成算法

一、实验目的

1、通过用中点画线法绘制直线,加深对算法原理的理解。

2、对程序以及函数的细节有更深入的把握。

二、实验要求

实现一个直线的中点生成算法的程序

三、实验原理

当前像素点为(x p,y p),下一个像素点有两个可选择点P1(x p+1,y p+1)或P2(x p+1,y p+1)。若M=(xp+1,yp+0.5)为P1与P2之中点,Q为理想直线x=x p+1垂线的交点。当M在Q的下方时,则P2应为下一个象素点;M在Q的上方,应取P1为下一点。

构造判别式:

d=F(M)=F(x p+1,y p+0.5) =a(x p+1)+b(y p+0.5)+c

其中a=y0-y1, b=x1-x0, c=x0y1-x1y0。

当d<0,M在L(Q点)下方,取右上方P2为下一个象素;

当d>0,M在L(Q点)上方,取右方P1为下一个象素;

当d=0,选P1或P2均可,约定取P1为下一个象素;

若当前象素处于d>=0情况,则取正右方象素P1 (xp+1, yp), 要判下一个象素位置,应计算

d1 = F(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a;增量为a

若d<0时,则取右上方象素P2 (xp+1, yp+1)。要判断再下一象素,则要计算d2 = F(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b ;增量为a+b

1、画线从(x0, y0)开始,d的初值

d0 = F(x0+1, y0+0.5)=F(x0, y0)+a+0.5b =a+0.5b。

可以用2d代替d来摆脱小数,提高效率。

四、主要代码

v oid Midpoint_Line(CDC *pdc,int x0,int y0,int x1,int y1,int color)

{

int a,b,d,d1,d2,x,y;

a=y0-y1,b=x1-x0,d=2*a+b;

d1=2*a,d2=2*(a+b);

x=x0,y=y0;

pdc->SetPixel(x,y,color);

while(x

{

if(d<0)

{

x++;

y++;

d+=d1;

}

else

{

x++;

d+=d2;

}

pdc->SetPixel(x,y,color);

}

}

void CMy2View::On1()

{

// TODO: Add your command handler code here

int x0,x1,y0,y1,color;

x0=111;

y0=111;

x1=138;

y1=138;

color=RGB(255,0,0);

CClientDC dc(this);

Midpoint_Line(&dc,x0,y0,x1,y1,color);

}

五、实验心得

写代码时一定要细心,不能漏写、写错,另外,要注意分号的使用。

实验三:圆的生成算法

一、实验目的

1、通过用中点画圆法绘制圆,加深对算法原理的理解。

2、对程序以及函数的细节有更深入的把握。

二、实验要求

实现一个圆的中点生成算法的程序

三、实验原理

如果我们构造函数F(x,y)=x2+y2-R2,则对于圆上的点有F(x,y)=0,对于圆外的点有F(x,y)>0,对于圆内的点F(x,y)<0 。与中点画线法一样,构造判别式:d=F(M)=F(x p+1,y p-0.5)=(x p+1)2+(y p-0.5)2-R2

若d<0,则应取P1为下一象素,而且再下一象素的判别式为:

d=F(x p+2,y p-0.5)=(x p+2)2+(y p-0.5)2-R2=d+2x p+3

若d≥0,则应取P2为下一象素,而且下一象素的判别式为

d=F(x p+2,y p-1.5)=(x p+2)2+(y p-1.5)2-R2=d+2(x p-y p)+5

我们这里讨论的第一个象素是(0,R),判别式d的初始值为:

d0=F(1,R-0.5)=1.25-R

四、主要代码

v oid CDrawCircleView::OnMidPoint()

{

CDC *pDC=GetDC();

int xc=200,yc=300,r=50,c=0;

int x,y; float d;

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

pDC->SetPixel((xc+x),(yc+y),c);

pDC->SetPixel((xc-x),(yc+y),c);

pDC->SetPixel((xc+x),(yc-y),c);

pDC->SetPixel((xc-x),(yc-y),c);

pDC->SetPixel((xc+y),(yc+x),c);

pDC->SetPixel((xc-y),(yc+x),c);

pDC->SetPixel((xc+y),(yc-x),c);

pDC->SetPixel((xc-y),(yc-x),c);

while(x<=y)

{

if(d<0)

d+=2*x+3;

else

{

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

y--;

}

x++;

pDC->SetPixel((xc+x),(yc+y),c);

pDC->SetPixel((xc-x),(yc+y),c);

pDC->SetPixel((xc+x),(yc-y),c);

pDC->SetPixel((xc-x),(yc-y),c);

pDC->SetPixel((xc+y),(yc+x),c);

pDC->SetPixel((xc-y),(yc+x),c);

pDC->SetPixel((xc+y),(yc-x),c);

pDC->SetPixel((xc-y),(yc-x),c);

Sleep(1);

}

ReleaseDC(pDC);

}

五、实验心得

在程序调试中有很多错误,最后发现是没有弄清函数的主调关系,最后查阅了资料,调试好了程序。

实验四:扫描填充算法

一、实验目的

1、掌握多边形扫描填充算法的思路

2、对程序以及函数的细节有更深入的把握。

二、实验要求

用VC编程实现扫描线填充算法

三、实验原理

对于给定的一个多变形,用一组水平的扫描线进行扫描,对每一条扫描线均可求出与多边形边的交点,这些交点将扫描线分割成落在多边形内部的线段和落在多边形外部的线段,并且两者相间排列,将落在多边形内部的线段上的所有像素点赋以给定的填充色彩。这样不需要检验每一个像素点,而只考虑与多边形相交的交点分割后的扫描线段。

首先将有效多边形边界存储在一个有序边表中:有序边表每一个元素对应一

条扫描线并按照扫描线从低到高排列;多边形的每条边,按照较低端点的y1值,存储在边表y1扫描线对应元素指向的链表中,链表中的节点记录了边的高端y2值、低端的x1值和1/m,这样就可以知道扫描线有没有和这条边相交(是否在y1和y2之间),初始交点(y1,x1),中间交点(y1+k,x1+k/m)。另外,所谓有效边是指去掉水平边、和为了解决交点计数问题而缩短了的多边形边。

然后从多边形底部到顶部处理扫描线,对每条当前的扫描线,建立活化边表(和当前扫描线有交点的多边形边):活化边表可以是一个链表,其中的节点按照和扫描线交点从左到右排列。初始的活化边表可以直接从有序边表的对应扫描线链表中生成(需要排序),以后每次扫描线向上移动可以经过以下几个步骤更新活化边表:

(1)检查活化边表每个节点的上端y值,如果小于扫描线的y值,说明这条边已经扫描完毕,应该从活化边表中删除;否则,更新节点对

应边和扫描线交点的x坐标值,这只要执行x+=1/m就可以了。

(2)加入新和扫描线相交的多边形边,即把有序边表中和新扫描线对应的链表中的节点加入到活化边表中来。

(3)根据节点的x值重新排序活化边表中的节点。

最后根据扫描线连贯性,填充扫描线在多边形内线段的像素,即根据活化边表中节点的顺序和x值,确定需要染色的点。

四、主要代码

void CFillView::Bubble(int n){

for(int i = 0; i < n-1; i++)

for(int j = 0; j < n-1-i; j++){

if(((BubblePoints[j].py==BubblePoints[j+1].py)&&(BubblePoints[j].px > BubblePoints[j+1].px))||(BubblePoints[j].py > BubblePoints[j+1].py)){

Point tmp = BubblePoints[j];

BubblePoints[j] = BubblePoints[j+1];

BubblePoints[j+1] = tmp;

}

}

}

int CFillView::Table(int n){

int i,j,ym,l,r;

ym = BubblePoints[0].py;

int k = 0,g = 0;

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

if(BubblePoints[i].py != ym){

DDD[k] = g;

k++;

g = 0;

}

if(BubblePoints[i].id == 0){

l = n - 1;

r = 1;

}

else if(BubblePoints[i].id == n-1){

l = n - 2;

r = 0;

}

else{

l = BubblePoints[i].id - 1;

r = BubblePoints[i].id + 1;

}

if(inputPoints[l].py > BubblePoints[i].py){

Array[k][g].dx = (double)(inputPoints[l].px - BubblePoints[i].px) / (inputPoints[l].py - BubblePoints[i].py);

Array[k][g].x_ = BubblePoints[i].px;

Array[k][g].ymax = inputPoints[l].py;

Array[k][g].ypre = BubblePoints[i].py;

g++;

}

if(inputPoints[r].py > BubblePoints[i].py){

Array[k][g].dx = (double)(inputPoints[r].px - BubblePoints[i].px) (inputPoints[r].py - BubblePoints[i].py);

Array[k][g].x_ = BubblePoints[i].px;

Array[k][g].ymax = inputPoints[r].py;

Array[k][g].ypre = BubblePoints[i].py;

g++;

}

}

return k;

}

void CFillView::bubble(int n,double arr[10]){

for(int i = 0; i < n-1; i++)

for(int j = 0; j < n-1-i;j++)

if(arr[j] > arr[j+1]){

double tmp = arr[j];

arr[j] = arr[j+1];

arr[j+1] = tmp;

}

}

void CFillView::OnDraw(CDC* pDC)

{

CFillDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

int n = 7;

double arr[10];

Input(n);

Bubble(n);

int a = Table(n);

int i,j,k,p = 0;

int ymin = BubblePoints[0].py;

int ymax = BubblePoints[n-1].py;

for(i = ymin; i < ymax; i++){

p = 0;

for(j = 0; j < a ; j++){

for(k = 0; k < DDD[j]; k++){

if(i > Array[j][k].ypre && i < Array[j][k].ymax){

Array[j][k].x_ += Array[j][k].dx;

arr[p++] = Array[j][k].x_ ;

}

}

}

bubble(p,arr);

bool canDraw = true;

k = 0;

int j = (int)arr[k];

while(j

if(canDraw){

pDC->SetPixel(j++,i,RGB(255,0,0));

if(j > arr[k+1]){

canDraw = !canDraw;

k++;

}

}

else{

j++;

if(j > arr[k+1]){

canDraw = !canDraw;

k++;

}

}

}

}

}

五、实验心得

在算法实现过程中遇到了一些困难,有些问题考虑的不太全面,花费了很时间去调试,另一个就是在细节方面处理得不够好。

实验五:裁剪算法

一、实验目的

1、掌握Cohen-Sutherland裁剪算法与中点分割裁剪算法

2、对程序以及函数的细节有更深入的把握。

二、实验要求

用VC编程实现Cohen-Sutherland或中点分割裁剪算法

三、实验原理

1、Cohen-Sutherland裁剪算法

对于每条线段P1P2分为三种情况处理:

(1)若P1P2完全在窗口内,则显示该线段P1P2。

(2)若P1P2明显在窗口外,则丢弃该线段。

(3)若线段不满足(1)或(2)的条件,则在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。

为快速判断,采用如下编码方法:

将窗口边线两边沿长,得到九个区域,每一个区域都用一个四位二进制数标识,直线的端点都按其所处区域赋予相应的区域码,用来标识出端点相对于裁剪矩形边界的位置。

将区域码的各位从右到左编号,则坐标区

域与各位的关系为:

上下右左

X X X X

任何位赋值为1,代表端点落在相应的位置上,否则该位为0。若端点在剪取矩形内,区域码为0000。如果端点落在矩形的左下角,则区域码为0101。

若P1P2完全在窗口内code1=0,且code2=0,则“取”;若P1P2明显在窗口外code1&code2≠0,则“弃”;在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。

3、中点分割裁剪算法

从P0点出发找出离P0最近的可见点,和从P1点出发找出离P1最近的可见点。这两个可见点的连线就是原线段的可见部分。与Cohen-Sutherland算法一样首先对线段端点进行编码,并把线段与窗口的关系分为三种情况,对前两种情况,进行一样的处理;对于第三种情况,用中点分割的方法求出线段与窗口的交点。A、B分别为距P0、P1最近的可见点,Pm为P0P1中点。

从P0出发找距离P0最近可见点采用中点分割方法

先求出P0P1的中点Pm,若P0Pm不是显然不可见的,并且P0P1在窗口中有可见部分,则距P0最近的可见点一定落在P0Pm上,所以用P0Pm代替P0P1;否则取PmP1代替P0P1。再对新的P0P1求中点Pm。重复上述过程,直到PmP1长度小于给定的控制常数为止,此时Pm收敛于交点。从P1出发找距离P1最近

可见点采用上面类似方法。

四、主要代码

void Encode (int x,int y,int *code,int XL,int XR,int YB,int YT) {

//请将此程序补充完整

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(POINT &p1,POINT &p2,int XL,int XR,int YB,int YT) {

//请将此程序补充完整

int x1,x2,y1,y2,x,y,code1,code2,code;

x1=p1.x; x2=p2.x; y1=p1.y; y2=p2.y;

Encode(x1,y1,&code1,XL,XR,YB,YT);

Encode(x2,y2,&code2,XL,XR,YB,YT);

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

if((BOTTOM&code)!=0)

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

else if((TOP&code)!=0)

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

if(code==code1)

{x1=x;y1=y;Encode(x,y,&code1,XL,XR,YB,YT);}

else

{x2=x;y2=y;Encode(x,y,&code2,XL,XR,YB,YT);}

}

p1.x=x1;p1.y=y1;p2.x=x2;p2.y=y2;

}

int IsInArea(POINT point,int XL,int XR,int YB,int YT)

{

//请将此程序补充完整

if(point.x>=XL && point.x<=XR && point.y>YB && point.y

else return 0;

}

int NotIntersect(POINT begin,POINT end,int XL,int XR,int YB,int YT) {

//请将此程序补充完整

int maxx,maxy,minx,miny;

maxx=(begin.x>end.x)?begin.x:end.x;

minx=(begin.x

maxy=(begin.y>end.y)?begin.y:end.y;

miny=(begin.y

if(maxxXR||maxyYT) return 1;

else return 0;

}

//中点裁剪算法:

POINT ClipMid(POINT begin,POINT end,int XL,int XR,int YB,int YT)

{

//请将此程序补充完整

POINT mid,temp;

if(IsInArea(begin,XL,XR,YB,YT)) temp=begin;

else if(NotIntersect(begin,end,XL,XR,YB,YT)) temp=begin;

else

{

mid.x=(begin.x+end.x)/2;mid.y=(begin.y+end.y)/2;

if(abs(mid.x-end.x)<=1&& abs(mid.y-end.y)<=1) temp=mid;

else

{

if(NotIntersect(begin,mid,XL,XR,YB,YT))

temp=ClipMid(mid,end,XL,XR,YB,YT);

else

temp=ClipMid(begin,mid,XL,XR,YB,YT);

}

}

return temp;

}

五、实验心得

通过这次试验使我了解到如何运用计算机程序对窗口进行剪裁,了解到编码剪裁算法直观方便,速度较快,中点分割剪裁算法不用进行乘除运算,剪裁效率高。

实验六:Bezier 曲线

一、实验目的

掌握Bezier 曲线的求值、升阶算法及Bezier 曲线绘制方法。

二、实验要求

用VC 编程绘制Bezier 曲线。

三、实验原理

Bezier 曲线是一种广泛应用于外形设计的参数曲线,它通过对一些特定点的控制来控制曲线的形状,我们称这些点为控制顶点。现在我们来给出Bezier 曲线的数学表达式。

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

其中:P i 构成该Bezier 曲线的特征多边形,B i,n (t )是n 次Bernstein 基函数:

四、主要代码

void CBezierView::RatioPoint(double t, double x1, double y1, double x2, double y2, double &xx, double &yy){

xx = x1 + (x2 - x1) * t;

yy = y1 + (y2 - y1) * t;

void CBezierView::Init_Put(){

arr_Points[0].px = 100.0;

arr_Points[0].py = 100.0;

arr_Points[1].px = 200.0;

arr_Points[1].py = 200.0;

arr_Points[2].px = 300.0;

arr_Points[2].py = 200.0;

arr_Points[3].px = 400.0;

arr_Points[3].py = 500.0;

}

void CBezierView::OnDraw(CDC* pDC)

{

CBezierDoc* pDoc = GetDocument();

ASSERT_V ALID(pDoc);

//输入需要的点

Init_Put();

//画出多边形

pDC->MoveTo(arr_Points[0].px,arr_Points[0].py);

pDC->LineTo(arr_Points[1].px,arr_Points[1].py);

]1,0[),()(,0

∈=∑=t t B P t P n i i n i ),,1,0( )1()!(!!)1()(,n i t t i n i n t t C t B i

n i i n i i n n i ???=-?-=-=--

pDC->MoveTo(arr_Points[1].px,arr_Points[1].py);

pDC->LineTo(arr_Points[2].px,arr_Points[2].py);

pDC->MoveTo(arr_Points[2].px,arr_Points[2].py);

pDC->LineTo(arr_Points[3].px,arr_Points[3].py);

double xx1,yy1;

for(double t = 0;t <= 1;t+=0.001){

int len = N;

for(int i = 0; i < N; i++){

tmp[i].px = arr_Points[i].px;

tmp[i].py = arr_Points[i].py;

}

while(len!=1){

len--;

for(int i = 0; i < len; i++){

RatioPoint(t, tmp[i].px , tmp[i].py , tmp[i+1].px , tmp[i+1].py , xx1, yy1);

tmp[i].px = xx1;

tmp[i].py = yy1;

}

}

pDC->SetPixel(tmp[0].px,tmp[0].py,RGB(255,0,0));

}

}

五、实验心得

Bezier曲线理解起来有点难,写算法的时候也有点费劲。

计算机图形学作业

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

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

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

计算机图形学实验报告,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; }

计算机图形学实验报告

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

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

计算机图形学实验二

实验报告 课程名称:计算机图形学 实验项目:区域填充算法 实验仪器:计算机 系别:计算机学院 专业:计算机科学与技术 班级姓名:计科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;

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

佛山科学技术学院计算机图形学实验指导书 李晓东编 电信学院计算机系 2011年11月

实验1 直线段的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1.通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法及 bresenham算法的基本原理; 2.掌握以上算法生成直线段的基本过程; 3.通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及 bresenham算法对任意直线段的扫描转换。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。 实验步骤: 1、复习有关算法的基本原理,明确实验目的和要求; 2、依据算法思想,绘制程序流程图; 3、设计程序界面,要求操作方便; 4、用C/C++语言编写源程序并调试、执行; 5、分析实验结果 6、对程序设计过程中出现的问题进行分析与总结; 7、打印源程序或把源程序以文件的形式提交; 8、按格式要求完成实验报告。 实验报告要求: 1、各种算法的基本原理; 2、各算法的流程图 3、实验结果及分析(比较三种算法的特点,界面插图并注明实验条件) 4、实验总结(含问题分析及解决方法)

实验2 圆的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1、通过实验,进一步理解和掌握中点bresenham画圆算法的基本原理; 2、掌握以上算法生成圆和圆弧的基本过程; 3、掌握在C/C++环境下完成用中点bresenham算法圆或圆弧的绘制方法。实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用中点(Besenham)算法实现圆或圆弧的绘制。 实验步骤 1.复习有关圆的生成算法,明确实验目的和要求; 2.依据算法思想,绘制程序流程图(注意圆弧生成时的输入条件); 3.设计程序界面,要求操作方便; 4.用C/C++语言编写源程序并调试、执行; 5.分析实验结果 6.对程序设计过程中出现的问题进行分析与总结; 7.打印源程序或把源程序以文件的形式提交; 8.按格式要求完成实验报告。 实验报告要求: 1.分析算法的工作原理; 2.画出算法的流程图 3.实验结果及分析(比较圆与圆弧生成算法的不同) 4.实验总结(含问题分析及解决方法)

计算机图形学作业题

计算机图形学作业题 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 Kenneth R. Castleman, “Digital Image Processing”, Prentice-Hall International,Inc, 1996 [2] James Sharman. The Marching Cubes Algorithm[EB]. https://www.sodocs.net/doc/a92495488.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.sodocs.net/doc/a92495488.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.sodocs.net/doc/a92495488.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、已知一直线段起点(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。

一种基于计算几何方法的最小包容圆求解算法.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)

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

计算机图形学上机实验指导 指导教师:张加万老师 助教:张怡 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

计算机图形学实验报告

目录

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

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

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

计算机图形学实验报告

计算机图形学 实验报告 学号: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编程函数绘制简单的图

计算机图形学实验报告

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

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

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

相关主题