计算机图形学学习心得 篇一
计算机图形学是利用计算机研究图形的表示、生成、处理和显示的科学。简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看,图形主要分为两类,一类是基于线条信息表示的,如工程图、等高线地图、曲面的线框图等,另一类是明暗图,也就是通常所说的真实感图形。经过30多年的发展,计算机图形学已成为计算机科学中最为活跃的分支之一,并得到广泛的应用。
在科技高度发展的今天,计算机在人们之中的作用越来越突出。而C语言作为一种计算机的语言,我们学习它,有助于我们更好的了解计算机,更好的学习计算机图形学。因此,C语言对我们计算机图形学的学习尤其重要,而我们也需要一定的C语言基础知识。
在这个学期里,我们班级的学生在计算机图形学老师何老师的带领下进行了计算机图形学的上机实践学习。在这之前,我们已经对C语言这门课程学习了一个学期,对其有了一定的了解和掌握,这对我们计算机图形的学习打下了良好的基础。但是,万事开头难,在计算机图形学的上机实践的过程中还是遇到了一些问题。
上机实验是学习计算机图形学必不可少的实践环节,上课学习到的知识都需要通过C语言编程做出程序来真正掌握它。对于计算机图形学的学习目的,可以概括为图形的表示、图形的生成、图形的处理和显示,这些都必须通过充分的实际上机操作才能完成。我们上机实验总共包括七个, 每个实验之前老师都会给我们做详细的介绍,具体的操作步骤老师也给了一个参考书,这样的话,我们在上机过程中也省去了很多麻烦,节约了很多时间。因此,我们才有了充裕的时间来理解实验原理,并结合自己的想象力,编写出属于自己的程序。
学习计算机图形学除了课堂讲授以外,必须保证有不少于课堂讲授学时的上机时间。因为学时所限,课程安排在周四晚上统一上机实验,所以我们需要有效地利用上机实验的机会,尽快掌握理解计算机图形学的基础知识,为今后的继续学习打下一个良好的基础。课程上机实验的目的,不仅仅是验证教材和讲课的内
容、检查自己所编的程序是否正确,课程安排的上机实验的目的可以概括为如下几个方面:
加深对课堂讲授内容的理解
课堂上要讲授许多关于计算机图形学的知识和原理,听起来十分枯燥无味,也不容易记住,死记硬背是不可取的。然而要使用C程序这个工具解决实际学习中的问题,通过多次上机练习,,在理解的基础上就会自然而然地掌握计算机图形学图形生成的算法和处理方式。对于一些内容自己认为在课堂上听懂了,但上机实践中会发现原来理解的偏差,编写出来的程序无法运行,这是由于大部分学生C语言基础只是不够牢固的原因。
学习计算机图形学不能停留在学习它的程序语言,而是利用学到的知识编写C语言程序来验证自己的想法,深入理解图形生成的原理,解决实际问题。即把C语言作为工具,描述解决实际问题的步骤,由计算机帮助我们解题。只有通过上机才能检验自己是否掌握C语言、自己编写的程序是否能够正确运行、对计算机的理解是否到位。
通过上机实验来验证自己编制的程序是否正确,恐怕是大多数同学在完成老师作业时的心态。但是在程序设计领域里这是一定要克服的传统的、错误的想法。因为在这种思想支配下,可能你会想办法去"掩盖"程序中的错误,而不是尽可能多地发现程序中存在的问题。而且计算机图形学上机实验是依附在C语言编程基础之上的,我们对图形生成算法的理解要通过C程序才能体现出来。
通过这次为数不多的几天计算机实践学习,我们巩固了一些关于C语言的知识,理解了我们计算机图形学的理论知识,这对我们将来到社会工作将会有莫大的帮助。同时它让我知道计算机图形的强大和瑰丽之处,虽然我们学的都是基本的生成算法,但是通过老师展示的几个计算机图形学高级程序,我们才了解到计算机图形学可以做出非常华丽的视觉效果,而且只要你努力,任何东西都不会太难。
最后,还是很庆幸能学到计算机图形学这样的一门课程,在学习本课程的同时,已经涉及了很多的学科,让我们更有能力成为全方位、多特色的新世纪人才。编程能力、思维能力都获得了提高,真是一举多得。
计算机图形学学习心得 篇二
一、实验目的
了解梁友栋算法和编码裁剪算法并利用该算法思想实现某一图形或直线段的裁剪,加深对梁友栋算法和编码裁剪算法的理解。
二、实验内容
利用梁友栋算法(参数化线段裁剪算法)或编码裁剪算法变成实现对直线段或者任一图形的裁剪。
三、实验原理
梁友栋算法简介如下:
设线段两端点坐标分别为P1(x1,y1)和P2(x2,y2),则其参数化直线方程可写成下列形式:
0≤u≤1
当u=0时,得点P1,当u=1时,得点P2。线段的裁剪条件可以由下面的不等式表示: Wxl≤x1﹢uΔx≤Wxr;Wyb≤y1﹢uΔy≤Wyt
这四个不等式可以表示为:upk≤qk k=1,2,3,4
其中,参数p,q定义为:
p1﹦-Δx, q1﹦x1﹣Wxl
p2﹦Δx, q2﹦Wxr﹣x1
p3﹦-Δy, q3﹦y1﹣Wyb
p4﹦Δy, q4﹦Wyt﹣y1
下标k=1,2,3,4分别对应裁剪窗口的左、右、下、上四条边界线。如果线段平行于裁剪窗口的某两边界,则必有相应的pk﹦0,如果还满足qk<0,则线段的端点位于窗口外部,即线段在窗口外,应该舍弃。如果qk≥0,线段在窗口内。当pk<0时,直线是从裁剪窗口第k条边界线的外部延伸到内部。当pk>0时,直线是从裁剪窗口第k条边界线的内部延伸到外部。当pk不等于零时,可以计算出线段与第k条裁剪窗口边界线的交点参数: 根据定义,对于每条线段,pk中必有两个小于零,而另两个大于零。对于小于零的pk,直线同第k条裁剪窗口边线是从外到内相遇的,此时如果线段同第k条裁剪窗口边界线有交点的话,是参数u从0变大时遇到的,这时计算出相应的rk值,取0和各个rk值之中的最大值记为u1。与此相反,对于大于零的pk,计算出相应的rk值,取1和各个rk值之中的最小值记为u2。两个参数u1和u2定义了在裁剪窗口内的线段部分。如果u1>u2,则线段完全落在裁剪窗口之外,应被舍弃。否则被裁剪线段可见部分的端点由参数u1和u2计算出来。
四、实验环境
Windows XP VisualC++6.0
五、实验步骤
进入VisualC++6.0环境,在菜单中选择“FileàNewàProjects”,然后选择“MFCAppWizard(exe)”新建一个工程文件单击“OK”,在弹出的对话框中选择“Single document”,单击“Finish”,在VisualC++6.0编程界面中选择CMyView单击右键,选择“Add Member Function”,在弹出的对话框中添写“void”和函数名。
// 图形裁减View.cpp : implementation of the CMyView class
//
#include "stdafx.h"
#include "图形裁减。h"
#include "图形裁减Doc.h"
#include "图形裁减View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyView
IMPLEMENT_DYNCREATE(CMyView, CView)
BEGIN_MESSAGE_MAP(CMyView, CView)
//{{AFX_MSG_MAP(CMyView)
// NOTE – the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP
/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction
CMyView::CMyView
{
// TODO: add construction code here
}
CMyView::~CMyView
{
}
BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMyView drawing
void CMyView::OnDraw(CDC* pDC)
{
CMyDoc* pDoc = GetDocument;
ASSERT_VALID(pDoc);
LINECLIP;
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CMyView printing
BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics
#ifdef _DEBUG
void CMyView::AssertValid const
{
CView::AssertValid;
}
void CMyView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMyDoc* CMyView::GetDocument // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers
void CMyView::LINECLIP
{
//使用梁友栋-Basky直线裁剪算法
CDC* pDC=GetDC;//取得绘图设备环境上下文指针
//设置不同颜色画笔
CPen newpen1(PS_SOLID,0,RGB(183,198,0));//窗口颜色
CPen newpen2(PS_SOLID,0,RGB(0,0,1));//待裁剪线段颜色
CPen newpen3(PS_SOL→www.huzhidao.com←ID,0,RGB(160,1,255));//裁剪后可见线段颜色
//辅助变量
float p[4],q[4],u[4];
float u1,u2,r[4];
int x1,y1,x2,y2,x0,y0,x3,y3;
int dx,dy,k;
int wxl=300,wxr=450,wyb=100,wyt=400;
//绘制裁剪窗口
pDC->SelectObject(&newpen1);
pDC->Rectangle(wxl,wyt,wxr,wyb);
x1=100;
y1=200;
x2=600;
y2=400;
//绘制被裁剪线段
pDC->SelectObject(&newpen2);
pDC->MoveTo(x1,y1);
pDC->LineTo(x2,y2);
//计算
dx=x2-x1;
dy=y2-y1;
p[0]=(float)-dx;
p[1]=(float)dx;
p[2]=(float)-dy;
p[3]=(float)(dy);
q[0]=(float)(x1-wxl);
q[1]=(float)(wxr-x1);
q[2]=(float)(y1-wyb);
q[3]=(float)(wyt-y1);
for(k=0;k<4;k++)
{
if ((p[k]==0))//垂直或水平线段,由不为0的另外两个参数确定可见部分
{
u[k]=1000;
}
else
{
r[k]=q[k]/p[k];
if(p[k]<0)
u[k]=(0>r[k])?0:r[k];//取用0与r[k]中的大值
else
u[k]=(r[k]<1)?r[k]:1;//取用1与r[k]中的小值
}
}
//参数在0-1之间变化,超出为无效参数
u1=0.0;
u2=1.0;
for(k=0;k<4;k++)
{
if(p[k]<0)
u1=(u[k]>u1)?u[k]:u1;//取用0与u[k]中的大值
else
u2=(u[k]
}
//满足条件为可见部分线段
if(u1<=u2)
{
//计算可见部分线段
x0=(int)(x1+u1*dx);
y0=(int)(y1+u1*dy);
x3=(int)(x1+u2*dx);
y3=(int)(y1+u2*dy);
//绘制窗口内可见线段
pDC->SelectObject(&newpen3);
pDC->MoveTo(x0,y0);
pDC->LineTo(x3,y3);
}
}
六、实验结果与分析
本图中矩形内紫色线段为裁剪之后可见线段,外部的黑色线段部分为带裁剪部分。
七、实验中遇到的问题及解决方法
1.对于VisualC++6.0的工程文件即:MFC的环境不熟悉,开始时编写视图View下的程序在步骤上尚有困难,不知道该怎样使用该环境,再参考了一些相关书籍和求教于其他人之后,这个问题得到了解决。
2.最初只是在后面添加了自编程序,并没有在“OnDraw”里面加入该程序的调用,程序编译没有错误,但运行后只是一个窗口,并没有图像,后来在同学的帮助下发现了这个错误,改正后程序顺利运行。
3.程序编写过程中的语法不再是问题,偶尔有疏忽的时候,编译时一般就能改正了。
4.在程序编写时对于点的坐标值不是很注意,随意定义了一些点,造成直线画到了图形的外面。
计算机图形学学习心得 篇三
计算机图形学是20世纪60年代以后,随着计算机技术(包括计算机硬件技术和软件技术)的发展和完善而形成的一门新兴学科。至今,计算机图形学已在建筑,机械,电子,造船,航空,汽车,轻工,广告,艺术等领域得到了广泛的应用。可以说,它几乎影响了所有涉及领域,冲击和改变着传统的设计模式。一打开计算机,人们首先接触到的就是计算机图形学的内容,因为计算机的用户界面已广泛使用了计算机图形技术。事实上,计算机图形技术已深入到各个领域。计算机图形的生成一般包括两种方法:程序绘图和交互绘图。所谓程序绘图,就是先用计算机语言(例如C语言)编好绘图程序,然后运行该程序并绘出图形。而交互绘图则是应用交互式图形软件,通过交互命令(键盘命令,菜单命令等)由计算机生成图形。程序绘图是交互式绘图的基础。
简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。图形通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成。从处理技术上来看,图形主要分为两类,一类是基于线条信息表示的,如工程图、等高线地图、曲面的线框图等,另一类是明暗图,也就是通常所说的真实感图形。 计算机图形学一个主要的目的就是要利用计算机产生令人赏心悦目的真实感图形。为此,必须建立图形所描述的场景的几何表示,再用某种光照模型,计算在假想的光源、纹理、材质属性下的光照明效果。所以计算机图形学与另一门学科计算机辅助几何设计有着密切的关系。事实上,图形学也把可以表示几何场景的曲线曲面造型技术和实体造型技术作为其主要的研究内容。同时,真实感图形计算的结果是以数字图像的方式提供的,计算机图形学也就和图像处理有着密切的关系。
这学期我们主要学习了MFC图形编程,学习了《 VC++图形程序设计基础》。从中学习了如何建立MFC项目和简单的输入与输出。
三视图即主视图、俯视图、侧视图是分别将三维立体对正面、水平面和侧面作正投影得到的三个基本视图。
用计算机绘制立体图的三视图的具体步骤:
建立三维空间坐标系,这里定义一个右手直角坐标系,即z轴正向朝上。在这个定义的坐标系下,确定三维立体上各点的位置坐标,同时引入 齐次坐标。 求出所作变换相应的四阶变换矩阵,一般根据变换前后图形上点的几何关系或由已知的变换矩阵求得。
将所作变换写出矩阵表示式,通过运算求得三维立体上各点(x, y, z)竟变换后的相应点(x’ , y’)或(y’ , z’)或(x’ , z’),一般是二维点的齐次坐标。
有变换后的所有二维点绘出三维立体投影后的平面图形,即为主视图、俯视图或侧视图。
在右手直角坐标系中,将三维立体向xOz面(正面V)作正投影,得到主视图。由投影变换前后三维立体上点到主视图上点的关系,可知此投影变换的变换矩阵为:
⎡1⎢0
Tv=⎢⎢0 ⎢⎣0 000000100⎤0⎥⎥0⎥⎥1⎦
Tv:主视图的投影变换矩阵,简称投影矩阵。
若已知三维立体上 n 个点(xi , yi , zi),则各点的齐次坐标可写成 n⨯4 阶矩阵,主视图的投影变换矩阵表示式为:
⎡x1y1z11⎤⎡1000⎤⎡x10z11⎤⎢⎥⎢x0z1⎥ ⎢x2y2z21⎥⎢2⎥⎢2⎥0000⎥=⎢⋅⋅⋅⋅⎥ ⎢⋅⋅⋅⋅⎥⋅⎢
⎥⎢0010⎥⎢⎥ ⎢⋅⋅⋅⋅⋅⋅⋅⋅⎢⎥⎢⎥⎢⎥ ⎢xyz1⎥⎣0001⎦⎢x0z1⎥nnn⎣n⎦⎣n⎦
在绘图时,只要取x=xi , y=zi (i=1,2,…,n),,就可在屏幕上绘出三维立体的主视图
三维立体向xOy面(水平面H)作正投影得到俯视图。
其投影变换矩阵: ⎡1000⎤ ⎢0100⎥' ⎥T=⎢⎢0000⎥ ⎢⎥ 0001⎣⎦
为了使俯视图与主视图也画在一个平面内,就要使H面绕x轴负方向转90o,此旋转变换矩阵为:
⎡1000⎤⎢00-10⎥ ⎥Tx=⎢ ⎢0100⎥ ⎢⎥0001⎦⎣
为了使俯视图与主视图间有一定的间距,还要使H面沿负z方向平移一段距离z0。其变换矩阵为: ⎡1000⎤ ⎢0100⎥ ⎥T=⎢⎢0010⎥ ⎢⎥ ⎣00-z01⎦
因此俯视图的投影变换矩阵为上面三个变换矩阵的连乘积,即:
⎡1000⎤⎡1000⎤⎡1000⎤ ⎥⎢⎥⎢⎥⎢ T=T'⋅T⋅T=⎢0100⎥ ⋅ ⎢00-10⎥⋅⎢0100⎥Hx⎢0000⎥⎢0100⎥⎢0010⎥ ⎥⎢⎥⎢⎥⎢ 00-z100010001⎣⎦⎣⎦⎣0⎦ ⎡1000⎤ ⎢00-10⎥⎥ =⎢⎢0000⎥ ⎢⎥00-z1 0⎣⎦
俯视图的投影变换矩阵表示为:
⎡x1y1z11⎤⎡x10(-y1-z0)1⎤⎢xyz1⎥⎡1000⎤⎢x0(-y-z)1⎥ 2220⎢2⎥⎢00-10⎥⎢2⎥ ⎥=⎢⋅⋅⎢⋅⋅⋅⋅⎥⋅⎢⋅⋅⎥⎢⎥0000 ⎢⎥⎢⎥⋅⋅⋅⋅⋅⋅⋅⋅⎢⎥⎢⎥00-z1⎢⎥ 0⎣⎦⎢⎢⎣xnynzn1⎥⎦⎣xn0(-yn-z0)1⎥⎦
由此得到三维立体的俯视图上n个点(xi , -yi-z0) (i=1,2,…,n),取x=xi , y=-yi-z0(i=1,2,…,n),便可绘出三维立体的俯视图。
将三维立体向yOz面(侧面W)作正投影得到俯视图。
其投影变换矩阵: ⎡0000⎤ ⎢0100⎥' ⎥T=⎢⎢0010⎥ ⎢⎥ 0001⎣⎦为了使俯视图与主视图都画在一个平面内,就要使W面绕z轴转90o,此旋转变换矩阵为:
⎡0100⎤⎢-1000⎥⎥Tz=⎢⎢0010⎥⎢⎥0001⎣⎦
第3 / 4页
为了使侧视图与主视图间有一定的间距,还要使W面沿负x方向平移一段距离x0。其变换矩阵为:
⎡1000⎤⎢0100⎥ ⎥T=⎢ ⎢0010⎥ ⎢⎥-x0001⎦⎣
因此侧视图的投影变换矩阵为上面三个变换矩阵的连乘积,即:
⎡0000⎤⎡0100⎤⎡1000⎤⎢0100⎥⎢-1000⎥⎢0100⎥ ⎥⎥ ⋅ ⎢⎥⋅⎢Tw=⎢ ⎢0010⎥⎢0010⎥⎢0010⎥ ⎥⎢⎥⎢⎥⎢0001⎦⎣0001⎦⎣-x0001⎦⎣
⎡0000⎤ ⎢-1000⎥ ⎥ =⎢ ⎢0010⎥⎢⎥ -x0010⎣⎦ ⎡x1y1z11⎤⎡(-y1-x0)0z11⎤ 0000⎡⎤⎢xyz1⎥⎢(-y-x)0z1⎥
2222 ⎢⎥⎢-1000⎥⎢20⎥⎢⎥⎢⋅=⎢⋅⋅⋅⋅⎥⋅⋅⋅⋅⎥ ⎢⎥0010⎢⎥⎢⎥ ⋅⋅⋅⋅⋅⋅⋅⋅⎢⎥⎢-x001⎥⎢⎥0⎣⎦ ⎢⎢⎣xnynzn1⎥⎦⎣(-yn-x0)0zn1⎥⎦
由此得到三维立体的侧视图上n个点(-yi-x0 , zi) (i=1,2,…,n),取x= -yi-x0, y=-zi(i=1,2,…,n),便可绘出三维立体的侧视图。
先让三维立体作投影面,然后旋转投影面得到平摊在同一个平面上的三个视图。也可以先把三维立体作旋转,然后再向投影面作正投影得到同样的三视图。
通过这这们课的学习,让我对计算机的应用有了更新的认识,对于图形学中基本图形的生成算法有了一定的了解,图形学是计算机科学与技术学科的活跃前沿学科,被广泛的应用到生物学、物理学、化学、天文学、地球物理学、材料科学等领域。我深深感到这门学科涉及的领域之广是惊人的,可以说博大精深。在这个计算机的时代什么都要用到计算机技术,图形也是我们生活中重要的部分,好学好图形学为我以后的就业课成学习及新兴科学技术的运用打下了坚实基础。更为我以后的就业打下了坚实的良好基础,使我对未来充满了信心。感谢向华萍老师对我们的认真指导。
上面内容就是我为您整理出来的3篇《计算机图形学学习心得》,希望可以对您的写作有一定的参考作用。
本文由用户indos分享,如有侵权请联系。如若转载,请注明出处:http://www.yunpanclub.com/24196.html