第一篇:计算机图形学 实验六-西南交大
学号:姓名:班级:
计算机图形学
实验报告
2016年6月日
实验名称:三维交互式图形程序设计
一、实验目的:
1)掌握真实感图形生成的基本原理,如消隐、光照、材质等知识; 2)学习使用OpenGL、GLUT等生成基本图形,如球体、正方体、茶壶等;
3)学习使用OpenGL生成各种光源:点光源、平行光、聚光灯等; 4)学习使用OpenGL设置绘制对象的颜色、材质;
5)进一步熟悉OpenGL图形变换技术:几何变换、视图变换、观察变换等:
(1)对模型实现各种几何变换(测试代码保留在程序中),包括对 glLoadMatrix、glMultMatrix、glTranslate、glRotate、glScale 等的使用;
(2)视口变换,测试不同大小的视口 glViewport ;
(3)投影变换,要对对平行投影与透视投影分别测试,使用不同的观察体参数,观察效果
二、实验任务:
1)使用MFC AppWizard 建立一个SDI 程序,根据参考资料2 和3 中的步骤设置OpenGL 图形绘制环境。增加绘制如下表图形(选择其中任意一个,注意模型坐标系的选择和顶点坐标的计算)、球体或茶壶等(使用glut 函数)。环境中创建点光源、平行光、聚光灯(可利用对话框输入参数创建)、设置所绘制对象的材质,呈现出塑料、金属等材质特性。对光源的位置、方向、类型进行控制,改变材质参数,观察效果(测试代码保留在程序中);
三.实验过程: 1.观察参数的设置
glViewport(0.0, 0.0, width, height)//视口大小设置 gluLookAt(0,0,10,0,0,0,0,1,0);//观察点设置,参数分别为观察点位置,向哪点(何处)观察,上方向的定义 2.投影变换
glOrtho(-15.0*aspect, 15.0*aspect,-15.0,15.0,1,100);//平行投影,参数是投影面大小和投影的物体距离范围
gluPerspective(45,aspect, 1, 100.0);//透视投影,参数为视角,长宽比,投影距离范围 3.几何变换
glLoadMatrixf(a);//设置当前矩阵为a glTranslatef(2,0,0);//当前矩阵*偏移矩阵 glRotatef(45, 0.0, 0.0, 0.0);//旋转
glScalef(m_scalX,m_scalY,m_scalZ);//当前矩阵*比例矩阵 4.光源参数的设置
glLightfv(GL_LIGHT0, Type, vlight);//light为float数组 glLightf(GL_LIGHT0, Type, light);//light为float Type=GL_LIGHT0, GL_AMBIENT //环境光 Type=GL_LIGHT0, GL_DIFFUSE
//漫反射 Type=GL_LIGHT0, GL_SPECULAR //镜面光 Type=GL_POSITION
//光源位置 Type=GL_CONSTANT_ATTENUATION //常数衰减因 Type=GL_LINEAR_ATTENUATION //线性衰减因子 Type=GL_QUADRATIC_ATTENUATION //二次衰减因子 Type=GL_SPOT_DIRECTION
//聚光方向矢量 Type=GL_SPOT_EXPONENT
//聚光指数 Type=GL_SPOT_CUTOFF
//聚光截止角 光源类型控制
平行光源::设置AMBIENT,DIFFUSE,SPECULAR,GL_POSITION4个参数。其中GL_POSITION第4个参数为0,表示距离无限远
点光源:平行光源基础上添加常数衰减,因线性衰减因子,二次衰减因,其中GL_POSITION第4个参数为1 表示光源位置为确切位置,聚光灯光源 :在点光源基础上添加聚光方向矢量,聚光截止角,聚光指数
本实验使用了3个光源,分别作为平行光源,点光源和聚光灯光源,通过不同菜单选择在输入参数的同时启用不同的光源,以达到光源控制的效果
四.实验结果
原图:
材质选择:
光源基本参数设置
设置聚光灯光源(位置,方向,聚光指数,聚光截止角,衰减因子)
聚光衰减属性(聚光灯)
五.实验体会
通过此次实验,基本掌握了真实图形生成的基本原理,对于3D图新的材质变换,光源变换等有了更深层次的理解。初步学习并掌握了几何变换、视图变换、观察变换等。对于对话框、组建的设置更是理解的透彻。深入掌握了课堂上的些许知识。但对于之后的图形学设计,还是有很多的不足之处。所以,需要继续努力,掌握更多的图形设计学习。
第二篇:计算机图形学实验
实验三 MFC画直线
最近自己在学习如何在VC 6.0 开发环境下的使用MFC AppWizard(exe)来绘画一条直线,虽然比较简单,通过这样的练习可以帮助你熟悉MFC的开发环境以及其中的消息传递机制,希望对于像我一样初入MFC图形绘制学习的人有帮
助
第一步:构建MFC窗体
打开Visual C++ 6.0编译器 新建→工程→MFC AppWizard(exe),工程名以DrawLine为例,然后确定。为了方便,在MFC应用程序向导—步骤1当中选择“单文档”,其余所有的步骤都为默认值,直接“完成”。这样一个简单的MFC窗体就构建好了,自己不妨Compile—Build—BuildExecute一下。
第二步:编辑菜单项
选择ResourceView视窗展开Menu文件夹,左键双击IDR_DRAWLITYPE,右边就会出现菜单图形编辑界面,为了简化,我们只在添加帮助→DrawLine功能选择项。双击空白会弹出“菜单项目 属性”对话框。ID:ID_DRAW_LINE;标明:
DrawLine(&D),其它的为缺省。
第三步:建立消息命令
如果此时运行该程序,你会发现帮助—DrawLine的功能选项是灰色的,原因就在于我们还没有添加该功能的消息命令相应函数。通过“查看—Message Maps—Project:DrawLine—Class name:CDrawLineView—Object IDs:ID_DRAW_LINE—选定COMMAND—Add Function„”,其它为默认,最后确定完成。现在如果再重新运行该程序的话,会发现原来的灰色已经消除了。
第四步:添加鼠标消息响应
打开ClassView视窗,右键选定CDrawLineView,选择Add Windows Messsage Handler会弹出对话框,完成CDrawLineView类的WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP三个Windows消息事件的新建。
第五步:添加响应代码
首先,在ClassView视窗中双击CDrawLineView会定位到“DrawLineView.h : interface of the CDrawLineView class”的文件,添加CDrawLineView类的成员:protected: int m_Drag;POINT m_pPrev;POINT m_pOrigin;三个成员变量。视窗中展开CDrawLineView类,双击定位OnLBUTTONDOWN()函数。在该函数消息响应
处添加如下代码:
//建立好绘图的设备环境
CClientDC dc(this);OnPrepareDC(&dc);
dc.DPtoLP(&point);
//获取起始点坐标 m_pPrev=point;m_pOrigin=point;
m_Drag=1;
然后,定位于OnMouseMove(),添加如下代码(其中关键用到了橡皮筋技术):
//建立好绘图的设备环境
CClientDC dc(this);
OnPrepareDC(&dc);dc.DPtoLP(&point);
dc.SetROP2(R2_NOT);//橡皮筋绘图技术
//判断是否BUTTONDOWN
if(m_Drag)
{
dc.MoveTo(m_pOrigin);dc.LineTo(m_pPrev);dc.MoveTo(m_pOrigin);dc.LineTo(point);
}
m_pPrev=point;
最后,在OnLBUTTONDOWN()添加代码: m_Drag=0;
程序运行效果图
实验4 实现圆的生成算法
一、实验目的
1.熟悉CDC图形程序库; 2.掌握中点画圆生成算法; 3.掌握Bresenham画圆算法。
二、实验内容
利用VisualC++6.0设计一个简易画圆绘图板,验证圆生成算法。
三、实验指导
1.生成绘图应用程序的框架,如下图所示。具体实现见第二次实验,过程不再详细说明。
2.在应用程序中增加菜单
完成相关菜单的设计,具体的效果如下图所示,并设置好相关菜单消息的映射,具体的实现在前面的实验中介绍过,再此不在详细说明。
3.在绘图函数中添加代码
通过以上步骤,得到了与菜单对应的消息映射,就可以在函数中添加代码绘制图形了。(1)利用中点画圆算法实现圆的生成(算法原理见教材)。void CDraw_CirView::OnMid(){ // TODO: Add your command handler code here CDC*pDC=GetDC();//得到绘图类指针
RedrawWindow();//重绘窗口
int x,y,x0=200,y0=200,r=100;//圆的圆心为(x0,y0),半径为r float d;x=0;y=r;d=1.25-r;
pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0));while(x<=y){
if(d<0)
{
d=d+2*x+3;
x++;
}
else
{
d=d+2*(x-y)+5;
x++;
y--;}
pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));
pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));
pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));
pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));
pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));
pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));
pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));
pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0));} } 由以上代码绘出的图形如下:
(2)利用Bresenham算法生成圆(算法原理见教材)。void CDraw_CirView::OnBre(){ // TODO: Add your command handler code here CDC*pDC=GetDC();//得到绘图类指针
//RedrawWindow();//重绘窗口
int x,y,x0=200,y0=200,r=50;//圆的圆心为(x0,y0),半径为r int delta,delta1,delta2,direction;x=0;y=r;delta=2*(1-r);while(y>=0){
pDC->SetPixel(x+x0,y+y0,RGB(0,0,255));
pDC->SetPixel(x+x0,-y+y0,RGB(0,0,255));
pDC->SetPixel(-x+x0,y+y0,RGB(0,0,255));
pDC->SetPixel(-x+x0,-y+y0,RGB(0,0,255));
if(delta<0)
{
delta1=2*(delta+y)-1;
if(delta<=0)direction=1;
else direction=2;
}
else if(delta>0)
{
delta2=2*(delta-x)-1;
if(delta2<=0)direction=2;
else direction=3;
}
else direction=2;
switch(direction)
{
case 1:x++;
delta+=2*x+1;
break;
case 2:x++;y--;
delta+=2*(x-y+1);
break;
case 3:y--;
delta+=(-2*y+1);
break;
} } }
由以上代码绘出的图形如下:
(3)以上是本次实验的基本部分,利用中点画圆和Bresenham画圆算法实现的基本图形的绘制。能不能利用该算法,完成一些复杂图形的生成,比如利用基本的画圆算法绘制一个奥运五环。甚至根据画圆算法,实现二次曲线的生成,如椭圆的生成等等。请同学们认真考虑,完成这部分的内容,上机调试。
四、思考
1.如何实现圆心为任意位置的圆的绘制; 2.两种画圆算法的比较。
第三篇:西南交大C语言实验十
实验十 指针应用 ●实验目的
掌握指针的概念,会定义和使用指针变量; 学会使用数组的指针和指向数组的指针变量; 学会使用字符串的指针和指向字符串的指针变量; 学会使用指向函数的指针变量;
了解指向指针的指针的概念及其使用方法。●实验步骤
进入编程环境;
按照题目要求编写程序,自行调试使程序可以正确运行,按照实验指导教师的要求检查。●实验内容
1.输入N个英文单词,建立字符串数组,按字典顺序输出这些英文单词。1.要求用指针。自己编写的源程序:
#include“stdafx.h” #include
int main(){
char word[50][50];int num = 0;printf(“请输入单词数量:”);scanf(“%d”, &num);printf(“请输入%d个单词:”, num);for(int i = 0;i < num;i++){ } char temp[50];for(int i = 0;i < num;i++){
} for(int i = 0;i < 5;i++){ } printf(“%s ”, word[i]);for(int j = 0;j < i;j++){
} if(strcmp(word[i], word[j])< 0){
}
strcpy(temp, word[j]);strcpy(word[j], word[i]);strcpy(word[i], temp);scanf(“%s”, word[i]);
} printf(“n”);return 0;
2.输入一个字符串,不另开辟字符串存储空间,实现字符串逆序存储并输出。自己编写的源程序:
#include“stdafx.h” #include
int main(){
} char str[50];printf(“请输入原字符串:”);scanf(“%s”, str);for(int i = strlen(str)11-i] = temp;
3.任意输入5个学生姓名的拼音,然后存入一个2维的字符数组中,按照字符表先后顺序输出这5个同学的姓名。自己编写的源程序:
#include“stdafx.h” #include
int main(){
char name[5][50];printf(“请输入5个姓名的拼音:”);for(int i = 0;i < 5;i++){
} } scanf(“%s”, name[i]);char temp[50];for(int i = 0;i < 5;i++){
} for(int i = 0;i < 5;i++){ } printf(“n”);return 0;printf(“%s ”, name[i]);for(int j = 0;j < i;j++){
} if(strcmp(name[i], name[j])< 0){
}
strcpy(temp, name[j]);strcpy(name[j], name[i]);strcpy(name[i], temp);
4.定义一个实型数组存入一组无序的实数,用一个函数实现对数组所有元素的升序排序,函数的参数和返回值皆为指针,在主函数中输出排序后的数组,考虑如果不使用指针如何解决该问题,哪一种方法更方便。自己编写的源程序:
#include“stdafx.h” #include
double* sort(doublenum[]);
int main(){
double num[5] = { 0 };printf(“请输入5个实数:”);for(int i = 0;i < 5;i++){ } sort(num);printf(“原数组升序排列结果为:”);for(int i = 0;i < 5;i++){ scanf(“%lf”, &num[i]);
} } printf(“%lf ”, num[i]);printf(“n”);return 0;double* sort(doublenum[]){
} for(int i = 0;i < 5;i++){
} returnnum;for(int j = 0;j < i;j++){
} if(num[i] } double temp = num[j];num[j] = num[i];num[i] = temp; 吉林大学 计算机科学与技术学院 《计算机图形学》实验报告 班级: 211923班 学号: 21190928 姓名: 林星宇 2021-2022学年第1学期 实验项目1 边标志算法的实现 实验性质 □演示性实验 验证性实验 □操作性实验 综合性实验 实验地点 计算机楼B212 机器编号 一、实现的功能 编写应用程序,采用鼠标输入顶点的方法确定待填充多边形(多边形最后一点双击);实现边标志算法完成对该多边形的填充,要求 完成使用自己学号的后四位数字对多边形内部进行填充。 二、采用的图形学算法及实现 (算法的实现函数是什么(函数名,参数,返回值,函数功能等)以及采用了哪些数据结构(数组,链表等)) 要求使用边标志算法的原理和实 现方法,所以使用了EdgeMarkFill函数,即边标志算法: void CMFCDrawTestView::EdgeMarkFill(CDC* pDC, CArray pDC为设备环境变量指针,plist为多边形点表,color为传入的RGB()值。 int zima[16][32]为学号后4位二维数组。 X1,x2,y1,y2分别为多边形上的最小最小大,y值 三、采用的交互方式及实现 (采用了哪些交互方式来完成绘制,这些交互方式应用到了哪些系统消息,是如何实现的) 边填充的实现:编写应用程序,采用鼠标输入顶点的方法确定待填充多边形(多边形最后一点双击);实现边标志算法完成对该多边形的填充,要求 完成使用自己学号的后四位数字对多边形内部进行填充。 易知,在画完多边形后,即双击左键(OnLButtonUp)后,使用EdgeMarkFill函数。 Type=2时,在OnLButtonUp中,调用EdgeMarkFill(pDC,&(obj->points), RGB(r, 0, 0)); 四、实验结果 (程序的运行结果) 应用程序运行后,标志算法完成对该多边形的填充的图形结果如下: 五、遇到的问题及解决办法 问题1:(在实现过程中遇到了什么样的问题,及采用了何种解决办法) 在获取下x1,x2,y1,y2时,因为Dos界面x、y大小颠倒的原因,获取时出现了问题。 首先,通过for(int i = 1;i < plist->GetSize();i++){ CPoint p = plist->GetAt(i); if(x1 > p.x)x1 = p.x; if(x2 < p.x)x2 = p.x; if(y1 > p.y)y1 = p.y; if(y2 < p.y)y2 = p.y; } 获取x1,x2,y1,y2.在遍历多边形过程中: int count = plist->GetSize(); for(int i = 0;i < count;i++){ CPoint p1 = plist->GetAt(i); CPoint p2 = plist->GetAt((i + 1)% count); if(p1.y == p2.y) continue; if(p1.y > p2.y) { CPoint p;p = p1;p1 = p2;p2 = p; } xs = p1.x; dxs =(p2.x-p1.x)/(double)(p2.y-p1.y); //dys = abs(p2.y-p1.y)/(p2.y-p1.y); for(ys = p1.y;ys!= p2.y;ys += 1) { Ixs = int(xs + 0.5); MARK[ys][Ixs] =!MARK[ys][Ixs]; xs = xs + dxs; } 黄线处即为处理x1,x2,y1,y2的大小。 问题2:通过数组zima[][]来确定多边形区域填充学号后4位时,zima[y ][x ]未%其字长,即zima[y % 16][x % 32]。后改为: for(y = y1;y <= y2;y++) { bool inside = false; for(x = x1;x <= x2;x++) { if(MARK[y][x]) inside =!inside; if(inside) { if(zima[y % 16][x % 32]) pDC->SetPixel(x, y, RGB(255, 0, 0)); } } } 实验项目2 立方体的比例、平移、旋转变换及投影显示 实验性质 □演示性实验 验证性实验 □操作性实验 综合性实验 实验地点 计算机楼B212 机器编号 一、实现的功能 建立立方体的数据模型;编写应用程序,利用菜单和键盘结合的方式完成对立方体的移动、比例和旋转变换,并显示透视或斜二测投影结果。要求应用程序具有如下功能: 1、通过菜单选择的方式,选择对三维空间中的立方体作斜二测投 影或透视投影; 2、通过键盘按键或鼠标移动的方式,完成对三维空间中的立方体 进行平移变换(上下左右前后),比例变换(放大或缩小)以及 旋转变换(绕 x,y,z 轴),并同时显示变换后的投影结果 3、创建对话框,通过对话框设置透视投影时候的投影中心,以及旋转变换时候的旋转轴(可以设置成分别绕 x 轴,y 轴,z 轴进 行旋转) 二、采用的图形学算法及实现 (算法的实现函数是什么(函数名,参数,返回值,函数功能等)以及采用了哪些数据结构(数组,链表等)) 题目要求实现立方体的移动、比例和旋转变换,并显示透视或斜二测投影结果。 对要求1:在菜单选TY项中选择斜二测投影(斜二=1)或透视投影(透视=1)。然后在OnDraw中调用Draw_Cubic(CDC* pDC)画出立方体。 对要求2:在OnKeyDown中调用函数,即在键盘上按“S”使立方体变小,“B”使立方体变大,“←”“→”“↑”“↓”使立方体左右上下移动。 对要求3:在菜单XYZ中选择旋转的x,y,z轴,即x=1或y=1或z=1,然后在OnKeyDown中调用函数,即按键盘上的“T”或“P”. 三、采用的交互方式及实现 (采用了哪些交互方式来完成绘制,这些交互方式应用到了哪些系统消息,是如何实现的) 由题目要求1,易知需要一个函数Draw_Cubic(CDC* pDC)画出立方体的斜二测投影或透视投影并且建立一个菜单栏TY(投影)。即在菜单选TY项中选择斜二测投影(斜二=1)或透视投影(透视=1)。然后在OnDraw中调用Draw_Cubic(CDC* pDC)画出立方体。 由题目要求2:易知直接在OnKeyDown函数上添加使立方体变大变小,前后左右平移的功能。即即在键盘上按“S”使立方体变小,“B”使立方体变大,“←”“→”“↑”“↓”使立方体左右上下移动。 由题目要求3:建立一个菜单XYZ决定旋转的轴。 四、实验结果 (程序的运行结果) 斜二测投影: 斜二测投影平移到左上角: 斜二测投影平移到右下角: 斜二测投影变大: 斜二测投影变小: 斜二测投影变为透视投影: 斜二测投影绕z轴旋转: 五、遇到的问题及解决办法 (在实现过程中遇到了什么样的问题,及采用了何种解决办法) 问题1:一开始建立立方体时,没有建立边表,导致投影困难。 后来建立了点表和对应的边表。 问题2:一开始Draw_Cubic中x1, y1,z1, x2, y2,z2定义为了int型。 实验项目3 用矩形窗口对多边形进行裁剪 实验性质 □演示性实验 验证性实验 □操作性实验 综合性实验 实验地点 计算机楼B212 机器编号 一、实现的功能 编写应用程序实现多边形裁剪。要求首先采用鼠标确定裁剪区域(矩形区域),然 后用鼠标输入待裁剪的多边形(可分别使用鼠标左键和右键来确定裁剪区域和待裁剪 的多边形)。多边形绘制完毕后进行裁剪,以不同颜色显示被裁剪对象位于窗口内(此 部分应保证多边形的完整性)及外部的部分。 二、采用的图形学算法及实现 (算法的实现函数是什么(函数名,参数,返回值,函数功能等)以及采用了哪些数据结构(数组,链表等)) 因为要编写应用程序实现多边形裁剪。要求首先采用鼠标确定裁剪区域(矩形区域),然 后用鼠标输入待裁剪的多边形(可分别使用鼠标左键和右键来确定裁剪区域和待裁剪 的多边形)。所以要使用多边形裁剪算法,即Cut_Top(),Cut_Bottom(),Cut_Left(),Cut_Right()四个函数。 Cut()函数为用绿色显示被裁剪对象位于窗口内部分。 存在int type的变量; 当type=1时,在OnLButtonUp中画出矩形框。 当type=2时,画出多边形,在左键双击后,在OnLButtonDblClk中调用如下函数:Cut_Top();Cut_Right();Cut_Bottom();Cut_Left();Cut(); 裁剪多边形在,并标出在矩形内部的部分。 三、采用的交互方式及实现 (采用了哪些交互方式来完成绘制,这些交互方式应用到了哪些系统消息,是如何实现的) 编写应用程序实现多边形裁剪。要求首先采用鼠标确定裁剪区域(矩形区域),然 后用鼠标输入待裁剪的多边形(可分别使用鼠标左键和右键来确定裁剪区域和待裁剪 的多边形)。多边形绘制完毕后进行裁剪,以不同颜色显示被裁剪对象位于窗口内(此 部分应保证多边形的完整性)及外部的部分。 根据以上绘制方法,可知需要处理WM_OnLButtonDblClk(左键双击)及WM_LButtonUp(左键抬起)消息,为了绘制橡皮线,还需处理调用WM_MouseMove(鼠标移动)消息。 因为可以用鼠标画出矩形和多边形,所以这么规定,当type=1时画矩形,即: DDALine(pDC,lx,by,lx,ty,RGB(r, g, b)); DDALine(pDC, lx, by, rx, by, RGB(r, g, b)); DDALine(pDC, rx, by, rx, ty, RGB(r, g, b)); DDALine(pDC, lx, ty, rx, ty, RGB(r, g, b)); 当type=2时画多边形,而后裁剪,即: for(int i = 0;i < pointList.GetSize();i++) { p1 = pointList.GetAt(i); p2 = pointList.GetAt((i+1)% count); DDALine(pDC, p1.x, p1.y, p2.x, p2.y, RGB(0,255,0)); } 四、实验结果 (程序的运行结果) 裁剪结果如下图所示,黑色为裁剪窗口,红色为多边形被裁剪的部分,绿色为多边形裁剪后的部分: 五、遇到的问题及解决办法 (在实现过程中遇到了什么样的问题,及采用了何种解决办法) 问题1:我在裁剪使一开始对多边形做上下左右裁剪时,这四个步骤是分别对原图形裁剪,而不是对图形接连进行裁剪。后来在裁剪函数上先除去之前图形,然后把已裁剪多边形重新构建。如下: pointList.RemoveAll(); for(int i = 0;i < m;i++) pointList.Add(CP[i]); 问题2:在多边形被矩形裁剪的部分显现不同颜色花费了挺多时间,后来我直接让裁剪的部分颜色被覆盖就可以了。如下: for(int i = 0;i < pointList.GetSize();i++) { p1 = pointList.GetAt(i); p2 = pointList.GetAt((i+1)% count); DDALine(pDC, p1.x, p1.y, p2.x, p2.y, RGB(0,255,0)); } 工欲善其事,必先利其器 ——浅析计算机图形学及其作用 本学期学校开设了计算机图形学,一开始不知计算机图形学为何物的我不是很理解为什么要有这门课,但是经过一学期的洗礼过后,我对计算机图形学有了一定的理解。我知道了计算机图形学(Computer Graphics,简称CG)是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看,图形主要分为两类,一类是基于线条信息表示的,如工程图、等高线地图、曲面的线框图等,另一类是明暗图,也就是通常所说的真实感图形。计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。对于我们将来从事景观设计的人来说,为了使自己的方案获得更多人的欣赏,必须创建图形所描述的场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图象的方式提供的,计算机图形学也就和图像处理有着密切的关系。 谈到图形和图像时,现如今图形与图像两个概念间的区别越来越模糊,但还是有区别的:图像纯指计算机内以位图形式存在的灰度信息,而图形含有几何属性,或者说更强调场景的几何表示,是由场景的几何模型和景物的物理属性共同组成的。 计算机图形学的研究内容非常广泛,如图形硬件、图形标准、图形交互技术、光栅图形生成算法、曲线曲面造型、实体造型、真实感图形计算与显示算法、非真实感绘制,以及科学计算可视化、计算机动画、自然景物仿真、虚拟现实等。 自1963年,伊凡·苏泽兰(Ivan Sutherland)在麻省理工学院发表了名为《画板》的博士论文,标志着计算机图形学的正式诞生起,至今已有四十多年的历史。此前的计算机主要是符号处理系统,自从有了计算机图形学,计算机可以部分地表现人的右脑功能了,所以计算机图形学的建立具有重要的意义。通过课堂上的学习以及网上的介绍,我发现近年来,计算机图形学在如下几方面有了长足的进展: 在智能CAD方面,就目前流行的大多数CAD软件来看,主要功能是支持产品的后续阶段一一工程图的绘制和输出,产品设计功能相对薄弱,利用AutoCAD 最常用的功能还是交互式绘图,如果要想进行产品设计,最基本的是要其中的AutoLisp语言编写程序,有时还要用其他高级语言协助编写,很不方便。而新一代的智能CAD 系统可以实现从概念设计到结构设计的全过程。 在计算机美术与设计方面,自1952年.美国的Ben·Larose用模拟计算机做了预示着电脑美术的开始得具有历史性意义的波型图《电子抽象画》开始,以微机和工作站为平台的个人计算机图形系统逐渐走向成熟,大批商业性美术设计软件如雨后春笋般纷纷面市; 以苹果公司的MAC 机和图形化系统软件为代表的桌面创意系统被广泛接受,CAD成为美术设计领域的重要组成部分。而计算机设计学包括三个方面:即环境设计(建筑、汽车)、视觉传达设计(包装)、产品设计。CAD对艺术的介入,分三个应用层次:(1)计算机图形作为系统设计手段的一种强化和替代; 效果是这个层次的核心(高精度、高速度、高存储)。(2)计算机图形作为新的表现形式和新的形象资源。 (3)计算机图形作为一种设计方法和观念。 同时,计算机图形学、计算机绘画、计算机音乐、计算机辅助设计、电影技术、电视技术、计算机软件和硬件技术等众多学科的最新成果都对计算机动画技术的研究和发展起着十分重要的推动作用。计算机动画的一个重要应用就是制作电影特技 可以说电影特技的发展和计算机动画的发展是相互促进的。比如广受欢迎的终结者系列中便大量运用了电脑特技,而在影片《阿凡达 》中几乎成为了电影特效的天下,电影特技的运用丰富了人们的视觉效果,是电影卖座的重要保证。我国的计算机动画技术起步较晚。1990年的第11届亚洲运动会上,首次采用了计算机三维动画技术来制作有关的电视节目片头。从那时起,计算机动画技术在国内影视制作方面得到了讯速的发展,继而以3D Studio 为代表的三维动画微机软什和以Photoshop等为代表的微机二维平面设计软件的普及,对我国计算机动画技术的应用起到了推波助谰的作用。计算机动画的应用领域十分宽广 除了用来制作影视作品外,在科学研究、视觉模拟、电子游戏、工业设计、教学训练、写真仿真、过程控制、平面绘画、建筑设计等许多方面都有重要应用。 科学计算的可视化是发达国家八十年代后期提出并发展起来的一门新兴技术,它将科学计算过程中及计算结果的数据转换为几何图形及图象信息在屏幕上显示出来并进行交互处理,成为发现和理解科学计算过程中各种现象的有力工具。它涉及到下列相互独立的几个领域:计算机图形学、图象处理、计算机视觉、计算机辅助设计及交互技术等。科学计算可视按其实现的功能来分,可以分为三个档次:(1)结果数据的后处理;(2)结果数据的实时跟踪处理及显示;(3)结果数据的实时显示及交互处理。 “虚拟现实”(Virtual Reality)一词是由美国喷气推动实验室(VPL)的创始人拉尼尔(Baron Lanier)首先提出的 在克鲁格(Algren Krueger)70年 代中早期实验里.被称为 人工现实”(Artificial reality);而在吉布森(William Gibson)l984 年出版的科幻小说Necromancer里,又被称为“可控空间”(Cyberspace)。虚拟现实是美国国家航空和航天局及军事部门为模拟而开发的一门高新技术 它利用计算机图形产生器,位置跟踪器,多功能传感器和控制器等有效地模拟实际场景和情形,从而能够使观察者产生一种真实的身临其境的感觉。虚拟环境由硬件和软件组成,硬件部分主要包括:传感器(Sensors)、印象器(Effecter)和连接侍感器与印象器产生模拟物理环境的特殊硬件。利用虚拟现实技术产生虚拟现实环境的软件需完成以下三个功能:建立作用器(Actors)以及物体的外形和动力学模型:建立物体之间以及周围环境之间接照牛顿运动定律所决定的相互作用;描述周围环境的内容特性。 在工程设计方面,计算机图形学的作用主要表现在(1)建筑设计,包括方案设计、三维造型、建筑渲染图设计、平面布景、建筑 构造设计、小区规划、日照分析、室内装潢等各类CAD应用软件。 (2)结构设计,包括有限元分析、结构平面设计、框/排架结构计算和分析、高层结构分析、地基及基础设计、钢结构设计与加工等。 (3)设备设计,包括水、电、暖各种设备及管道设计。 (4)城市规划、城市交通设计,如城市道路、高架、轻轨、地铁等市政工程设 计。 (5)市政管线设计,如自来水、污水排放、煤气、电力、暖气、通信(包括电 话、有线电视、数据通信等)各类市政管道线路设计。 (6)交通工程设计,如公路、桥梁、铁路、航空、机场、港口、码头等。 (7)水利工程设计,如大坝、水渠、河海工程等。 (8)其他工程设计和管理,如房地产开发及物业管理、工程概预算、施工过程 控制与管理、旅游景点设计与布置、智能大厦设计等。 那么如何学好计算机图形学呢? 除了计算机图形学的基础知识以外,我们还需要相关知识,懂得越多,才能学的越好。 英语,如果要学好计算机图形学的话,我认为需要阅读大量的英文书籍和资料,毕竟国外相关研究更加深入,好的英文功底有助于紧跟国际潮流。 数学,计算机图形学里面经常会遇到数学方面的知识,比如高等数学中的数值分析,微分几何,拓扑,差值概论以及微分方程等。 物理,如果要进行基于物理的建模,一些物理理论是要学习的。如力学,光学,有限元„„ 编程语言,C语言或C++是计算机图形学中通用的语言。 数据结构,当需要用数据结构来描述图形形象时,除了通用的链表、树等数据结构外,图形学还有自己特殊的数据结构。 所以说,一门学科可能会和许多学科发生穿插,不能希望只通过一本教科书就能学好一门学科,一定要在掌握教科书内容的基础上与其他学科融会贯通才能获得更大的收获。这就是我学习计算机图形学的心得,可能不够成熟,希望在以后的进一步学习中获得更多的经验,为自己未来的职业生涯打下坚实的基础。第四篇:《计算机图形学》实验报告
第五篇:计算机图形学论文