热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数学之美计算机图形学算法(转贴)

“假如我要打算学习计算机图形学的话我应该学习那些数学科目?”这大概是关于计算机图形学的问题里面学生最经常问我的一个问题,这个问题的答案取决于你打算研究计算机图形学有多深入。如果你打

“假如我要打算学习计算机图形学的话我应该学习那些数学科目?”这大概是关于计算机图形学的问题里面学生最经常问我的一个问题,这个问题的答案取决于你打算研究计算机图形学有多深入。如果你打算仅仅使用现成的图形软件那么这个问题的答案大概就是你根本不需要懂太多的数学。假如你要学习一些入门的计算机图形学,那么我建议你首先学习代数学,三角和线性代数。如果你希望有一天成为一个计算机图形学方面的研究者,那么你一辈子都得不间断地学习数学直到你翘辫子。

如果你不太关心数学,那么还有机会在这个领域里工作吗?有,计算机图形中的少数几个领域不需要太多的数学思想。你不应该放弃计算机图形学仅仅因为你不是数学巫师。无论如何,如果你肯积极地学习最近的数学成就的话你就会有更多的***去选择你要研究的题目。
关于什么数学在计算机图形学里面是最重要的这个问题没有绝对的答案。图形学里面不同的研究领域和题目需要不同的数学技术,同时你自己的兴趣也会带着你走向某些领域和远离某些科目。下面是一些我自己认为在图形学里面有用的数学科目。但是不要认为为了成为一个图形学专家你就需要成为所有这些数学领域的专家!因为我在下面尽量给出一个比较全面的数学在计算机图形中的应用的描述,但是大部分研究者,可能永远也用不到其中的一些数学工具。

代数和三角

对于图形学入门来讲,高中级别的代数和三角可能是最重要的数学工具。几乎每天我都需要通过一些等式解算一个或多个未知量,通过某些图形的已知边的长度和角度算出未知边的长度。代数和三角几乎是你每天都要使用的工具。
那么你在高中学习的几何学呢?他几乎在图形学研究中很少用上。奇怪吧?其实你在高中学习的几何主要的目的在于学习如何进行数学证明。当然数学证明是一个很有价值的东西,但它在工程领域很少用得上。
假如你有了较好的代数和三角的底子你就可以准备好阅读图形学的入门书籍了。大部分的图形学入门书籍包含一些线性代数的简单介绍。而线性代数正是下一个关于图形学的重要的数学工具。
建议阅读:
Computer Graphics: Principles and Practice
James Foley, Andries van Dam, Steven Feiner, John Hughes
Addison-Wesley
[一本大部头的书,但至今还是我的最爱]

线性代数

线性代数的思想在整个图形学领域都可以用得到。数值化地表示几何模型需要用到x,y,z坐标,这个x,y,z坐标常常会集合在一起表示为一个向量,向量和相关的数学对象,一个叫做矩阵(matrix)的东西,在图形学中每时每刻都要用到。向量和矩阵是最最文雅,端庄的用来表示一个对象的平移,旋转,和缩放的语言。任何人,想要研究图形学的话,必须要在这个领域打好坚实的基础。大部分的图形学教科书都会对线性代数做一些入门的介绍,一般足够你做图形学的入门用。
建议阅读: Linear Algebra and Its Applications

微积分

对于高级的图形学领域而言微积分是很重要的工具, 如果你打算投身于图形学的研究,我强烈地建议你打好微积分的基础。 这不光是因为微积分有这个领域常常要用的的工具,还因为大部分的研究人员使用微积分的语言描述他们的问题和解决的方法。 另外,许多的数学领域需要微积分作为预备知识。学好微积分它能替你打开许多图形学和数学领域的大门。

微分几何

这个数学领域研究曲线和曲面的方程,如果你想要得到一个光滑曲面上某个点的法线,那么你需要用到微分几何。如果你要让某个点沿着某条曲线以某个精确的速度做运动,那么你也需要用到微分几何。如果你要让某个光滑曲面看来很粗糙(就是传说中的“bumpping”),这个效果也会招来微分几何。
如果你打算研究使用曲线和曲面建立造型(传说中的“modeling”),那么你至少需要用到基本的微分几何。多元函数微积分是这个领域的预备知识。
建议阅读:
Elementary Differential Geometry

数值方法(或科学计算)

几乎每次我们在计算机内表示和计算数值我们都使用一个近似值替代精确值,所以经常会有错误悄悄混进来的可能性。此外,常常会有好几种方法去解决一个数值计算问题,有的方法比较快,有的比较节省内存,有的和其他的比起来又比较精确。数值计算就是研究这里问题的科学。这是一个非常广阔的领域,好几种我将要提到的数学领域,可以看作是处于数值方法这个保护伞保护下的子领域,他们包括:采样理论, matrix equations, 微分方程的数值解,优选法(Optimization)
建议阅读:
Numerical Recipes in C: The Art of Scientific Coomputing
[这是一本非常有价值的参考书但是一般不会用来作为教科书]

采样理论和信号处理

在计算机图形学中,某些对象的表达方式譬如图像,或者曲面,是一系列储存在两维阵列里面的一组离散的数值。无论如何我们做类似的事情的时候我们是在建立一个对象的“采样”表示。对采样理论的良好了解对于使用和控制使用这样的表达方式的对象的品质是非常重要的。

矩阵方程(Matrix Equations)
物理
微分方程的数值解
(优选法)Optimization
概率和统计
Computational Geometry
Computational Geometry是研究如何在计算机内有效地描述和操纵几何模型的学科。比如测试两个对象是否碰撞,决定如何把多边形拆解为
三角面等等,这个领域结合了算法,数据结构和数学。在图形学领域研究建模这一块的人特别需要研究这门学问。
Book recommendations:
Computational Geometry in C
Joseph O\'Rourke
Cambridge University Press
[undergraduate text]
Computational Geometry: An Introduction
Franco Preparata and Michael Shamos
Springer-Verlag
[the classic text, somewhat dated]
 

推荐阅读
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
author-avatar
郝ristaino_937
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有