20世纪70年代末,计算几何从算法设计与分析中孕育而生.今天,它不仅拥有自己的学术刊物和学术会议,而且形成了一个由众多活跃的研究人员组成的学术群体,因此已经成长为一个被广泛认同的学科.该领域作为一个研究学科之所以会取得成功,一方面是由于其涉及的问题及其解答本身所具有的美感,另一方面,也是由于在众多的应用领域(诸如计算机图形学、地理信息系统和机器人学等)中,几何算法都发挥了重要的作用.
解决许多几何问题的早期算法,要么速度很慢,要么难以理解与实现.随着近年来一些新的算法技术的发展,此前的很多方法都得到了改进与简化.在这本教材中,我们力图使这些现代的算法能够被更广泛的读者理解和接受.本书既是面向计算几何课程的一本教材,同时也可用于自学.
本书的结构.除“导言”外,每一章都从来自应用领域的某一实际问题入手,这个问题将被转化为一个纯粹的几何问题,并通过计算几何所提供的方法得到解决.每一章所讨论的,实质上就是对应的几何问题,以及解决该问题所需要的概念与方法.我们根据所希望覆盖的计算几何专题,来选取有关的应用;而就具体的应用领域而言,这些介绍还远远不够全面.引入这些应用的目的,只是为了激发读者的兴趣;而各章本身的目的,并不在于为这些问题提供现成可用的解决方法.虽然如此,我们还是认为,为了有效地解决应用中的几何问题,计算几何方面的知识是非常重要的.我们希望本书不仅能够吸引从事算法研究的学者,而且对应用领域的读者也同样有所帮助.
同一几何问题,可能有多种不同的解决方法,不过,在论述大多数几何问题时,我们将只给出其中一种.我们通常所选取的,都是最易于理解与实现的方法.我们也十分注意,尽力使本书能够涵盖更多的方法,比如分治策略、平面扫描以及随机算法等.对每个问题可能的种种变型,我们也不打算面面俱到;我们觉得,更重要的是首先对计算几何中的各个主要问题作一介绍,而不是过于深入地去探究少数专题的细枝末节.
某些章的若干节标有星号.这些节的内容涉及解法的改进与扩展,或者解释了不同问题之间的相互关联.就对后续章节的理解而言,它们并不十分重要.
每一章的最后,都由名为“注释及评论”的一节进行概括总结.这些节会给出对应各章所介绍结果的来龙去脉,概述其他的解决方法、一般化处理方法及改进,并给出参考文献.虽然这些节可以跳过去,但是对于那些希望就某一章的专题作进一步了解的读者来说,其中的材料都是非常有用的.
每一章的后面,都附有一定数量的习题.其中有些题目旨在检查读者对内容的理解程度,也有些题目是对书中内容的推广,需要精心解答.高难度的问题以及对应于标有星号各节的问题,也被标上星号.
课程大纲.尽管在很大程度上,本书各章之间是相互独立的,但是在进行介绍时,最好还是不要随意打乱其次序.例如,第2章介绍了平面扫描算法,故在阅读采用了这一方法的其他各章之前,最好首先了解该章的内容.出于同样的考虑,在进入有关随机算法的各章之前,也应该首先阅读第4章.
如果是作为计算几何的第一门课程,我们建议教师按照书中的次序来讲授前10章.根据我们的经验,这10章覆盖了任何一门计算几何课程都必须介绍的概念和方法.如果还有可能顾及更多的内容,可以在后面6章中进行挑选.
先修要求.作为教材,本书既适用于高年级本科生的课程,也适用于低年级研究生的课程,具体安排视课程的其他要求而定.读者应该具备算法设计与分析、数据结构的基本知识:他们必须熟知大O记号,以及诸如排序、二分查找和平衡查找树等基本的算法技术.读者不需要对这里所涉及的应用领域有所了解,也几乎不需要什么几何的知识.在对随机算法进行分析时,会用到一些非常基本的概率理论.
实现.本书中的算法都是以伪代码的形式给出,虽略显概括笼统,但也算详尽,实现起来相对容易.值得一提的是,我们还尝试着介绍了处理退化情况的方法,在具体实现过程中如不能解决好这一问题,往往会使整个计划落空.
我们认为,动手实现其中一个或多个算法将十分有益;这可以令你获得对算法复杂度的实际感受.每一章都可以当成一个编程训练的课程项目.根据可利用时间的多少,你既可以只实现算法本身,也可以连同应用系统一起完成.
为了实现一个几何算法,若干基本的数据类型(点、直线和多边形等)以及对其实施操作的一些基本例程都是必需的.实现这些基本例程并使之具有稳健性,绝非易事,为此需要投入大量的时间.自己动手这样做一次不无裨益,然而如果能够找到一个提供基本数据类型及其操作例程的现成的软件库,将很有帮助.在我们的万维网页上,可以找到指向这类软件库的链接.
万维网站.本书还附有一个万维网站,该网站提供了大量的附加材料,例如本书的勘误补遗、指向几何软件的链接、指向一个包含近1万篇计算几何论文的在线文献库的链接,以及指向提供有关计算几何信息的其他一些网站的链接.我们的地址是:http://www.cs.uu.nl/geobook/
如果您发现了书中的错误,或是对本书有什么建议,也可以通过该页面与我们联系.
关于第2版.第2版与第1版在大部分内容上都是相同的;不同之处主要在于针对一些缺陷进行了修正.原则上,选课的学生依然可以使用第1版.不过那样的话,应该注意到以下的变动:首先,我们对所有的习题作了仔细的检查,原先的一些习题已被重新表述或者删去,同时增添了一些新的习题.其次,第4章和第7章的改动较大——前者对无界线性规划问题的论述与初版不同,后者有关算法的若干细节也有所改动.
致谢.编写教材是一项耗时的工作,即便有四位作者共同合作,也不例外.在过去几年中我们得到了很多人的帮助:关于本书应该包括、不应该包括哪些内容,有些人提供了有益的建议;有些人在阅读初稿后对如何修改提出了建议;另一些人则找出并更正了书中的错误.特别地,我们要感谢Pankaj Agarwal、Helmut Alt、Marshall Bern、Jit Bose、Hazel Everett、Gerald Farin、Steve Fortune、GeertJan Giezeman、Mordecai Golin、Dan Halperin、Richard Karp、Matthew Katz、Klara Kedem、Nelson Max、Rene van Oostrum、Henry Shapiro、Sven Skyum、Jack Snoeyink、Gert Vegter、Peter Widmayer、Chee Yap和Gunther Ziegler.本书的初稿,曾经在我们系和其他系开设的课程中试用.我们要感谢所有的学生,虽然那个版本的不完整性以及其中的错误给他们造成了很大的麻烦,但正是在他们的帮助下,本书才能历经磨砺,善果终成.我们也要感谢SpringerVerlag出版社,在本书最终完成的阶段,它为我们提供了支持.
最后,我们还要感谢荷兰科学研究组织(Netherlands Organization for Scientific Research,N. W. O.)