计算几何系列 ——— 一切的开始

        本系列文章力求以简洁易懂的文字介绍计算几何中的基本概念,使读者快速入门,故不追求难度和深度,仅起到抛砖引玉的作用。

1. 认识计算几何

1.1 定义:

计算几何(Computational geometry),可定义为“针对处理几何对象的算法及数据结构的系统化研究”。

简单来说就是用算法解决各类几何问题。

乍听起来似乎是更偏向几何的学科,因为有了数学界的各种定理公式,只要用代码实现就好了,但事实并非如此,几何和计算几何至少有以下不同:

  • 数学上的概念是完美的,点可以精确表达,而现实世界中很难做到真正的精准。比如计算机领域的浮点数精度总是有限的,一个float占32bit,顶天也就能表达 232 个不同的值,而坐标轴上任意区间内就有无数个有理数,所以精确表达是不可能的,这会引入许多新问题。
  • 算法不仅重视问题能否解决,也同样重视解决的效率。实际应用中的数据的量级可能是成千上万的, O(n^2)和O(n*logn)的差距也会急剧放大,一个低效的算法在工程实践中可能根本无法落地。因此对算法来说,能求解但低效 ≈ 不能求解。

因此,计算几何更侧重于计算,而非几何。换句话说,计算几何更像是算法的一个分支,而非几何学的分支。

下面的应用范围仅仅参考一下,不用太过于关注哦~

1.2 应用范围:
计算几何的应用广泛,包括但不限于以下领域:

(1)游戏。游戏开发岗位也分很多方向,客户端、游戏引擎、服务器等等,其中相关性较大的是游戏引擎。游戏大作极其复杂,直接调底层接口显然是不可能的,需要借助某种东西降低开发成本,这就是游戏引擎的意义所在。所有的游戏都有共性,多半免不了几何算法、图形、动画、渲染、UI等等,把这些通用的东西打包起来就形成了游戏引擎,如Unity3D、UE、Cocos等,游戏公司借助它们的力量便可以简化工作,从而专注于游戏内容制作。

(2)CAD/CAE/CAM。这三兄弟传统工科应该都很熟悉,或多或少都用得上。

CAD (Computer Aided Design)    计算机辅助设计
CAE (Computer Aided Engineering)    计算机辅助工程
CAM (Computer Aided Manufacturing)    计算机辅助制造


有些人误以为CAD就等同于AutoCAD,但其实这三个概念涵盖的范围非常广,具体到每个专业领域可能都有几十款功能侧重点不同的软件。这些软件中涉及到几何建模、布尔运算、网格剖分等操作都离不开计算几何,以土木机械两大护法的典型设计流程为例:

土木:在结构设计阶段需要建模布置墙柱梁等构件(三维CAD),再进行结构计算,有时还涉及时程分析、墙板构件的有限元分析等(CAE),最后出平面施工图(二维CAD)。
机械:先进行零件和装配设计(三维CAD),再进行仿真分析并改进(CAE),然后是出工程图(二维CAD),最后是车床加工,需要设定加工参数以及模拟验证加工方案(CAM)。
近年来国内工业软件行业也在飞速发展,如中望软件,致力于CAx一体化。

(3)GIS。地理信息系统,应该算是地理和计算机的交叉学科,涉及到地球上的点和区域自然也离不开计算几何。GIS存储多种地理信息从而为许多行业提供价值,比如地图导航、自动驾驶,又或者工程项目中的勘察设计等。

(4)其他。虽然上面的例子貌似都与计算机图形有关,但其应用领域并不仅仅局限于此。其他如机器人学中的寻路算法、分子建模领域的碰撞计算、以及邓俊辉老师课程中讲的“颜料勾兑问题”等等,对于其应用广泛性的总结借用Mark原话——“乍看起来,虽然某些领域似乎与几何风马牛不相及,然而它们同样可以借助几何算法而受益。因为在许多时候,非几何的问题往往都能借助几何的概念,形式化地转换为几何问题”。

那么对于这篇文章的计算几何,其它专业知识咱不讲,因为本蒟蒻也不知道呀,仅仅讲解一下有关ACM的一些必需品~

一切的开始:计算几何误差的修正

上面说了,采用程序进行几何学里的精确表达是不可能的,因此我们需要对程序运算进行加精,尽可能的保证精度,这里我们引入一个高数的经典概念,极小数ε,计算几何称eps,就是学极限的时候讲到的,这是一个很小的常数,在计算几何里我们一般将eps设置成1e-10~1e-5这一范围,接下来给出误差修正的代码:

这些就是计算几何的一些基本操作:包括符号判断,两数比较,乘方,数字修正,角度与弧度相互转换,基本上每道计算几何都需要在开头写好的处理。

这,就是计算几何一切的开始~ (bushi)

那么接下来我们就开启计算几何的系统性学习之旅叭~🤔

        首先呢是我们的二维计算几何,这类计算几何相比于三维计算几何相对具象一点,我们就直接引入其参量:计算几何点类,计算几何线类,计算几何向量等等基本要素。

一般对于点我使用坐标法表示,即point(a,b):

那么在C++中我们就采用非常熟悉的结构体Point来存储我们的点:

当然也在预处理中包含了点相关的运算,计算几何中的点与向量坐标相似:👇O(∩_∩)O 

        这边便于理解给个解释:我们将Point结构体新建一个名称叫做Vector,也就是说Vector这个结构体与Point结构体等价,单纯是为了用向量运算来解释点运算。对于之后的运算,通过英文可以理解是什么样的运算方式(Angle: 两个向量间的夹角,返回的是弧度值;Rotate_Anti:向量的逆时针旋转;ToLeftTest:判断向量是否在另一个向量的左侧~),其中重点要提的是这个Dot和Cross,分别是向量运算中最重要和最基础的运算:点积&叉积(之后的几何学习中用处可大了~~~)

         可以重点理解一下它们的几何意义~🤔 

接下来我们来看一下计算几何线类,那么一般我们之前学过的表示直线的方式有哪些呢?o.O???

        这些直线的表示方式我们耳熟能详,而计算几何中为了将点类与线类联系起来,我们一般采用两点式表示一条直线😄,像这样子~:

        对于直线的运算有如下:

        当然别忘了还有我们熟悉的点到直线的距离公式辣~

        因此对于这些运算,我们用代码写出来:

OK,那到这边我们已经学完了二维计算几何的基础部分,包括了计算几何符号判断和精度修正,计算几何点类(计算几何向量类),计算几何线类,当然别忘了最重要的一种向量运算:叉积~

那么看到这里二维计算几何差不多就入门了,可以发现其实计算几何跟解析几何非常像,尤其是二维计算几何哈~,本人蒟蒻一个,其实更加喜欢做欧式平面几何学的研究,所以学习计算几何不单纯是为了ACM竞赛的知识补充,还有希望能将欧氏几何的巧妙之处融入计算几何创造更加精良的算法。我们此系列的下一篇章重点讲解计算几何三角形,多边形和圆类~。

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值