计算几何[计算机数学专题(4)]

                                                                                     《目录》

  • 介绍
  • 解析几何
  • 历史
  • 坐标系
  •          点
  • 直线
  • 多边形
  • 椭圆
  • 存储问题
  • 精度问题     
  • 矢量

介绍

          计算机擅长计算,某些几何问题中可能需要经过几个坐标系的共同计算才能得出答案

          所以这件事情交给了计算机,我们把这类繁琐的几何问题称为 "计算几何"。

          计算几何问题的输入,通常是一组几何物体的描述,输出是关于物体位置关系的回答。

          计算几何是计算机科学一个分支,在计算机图形、计算机辅助设计等应用广泛。       


解析几何

         在学习计算几何之前需要一些解析几何基础。

         解析几何:借助平面直角坐标系用代数的方法研究几何对象之间的关系、性质的几何分支。

         由平面解析几何和立体解析几何组成。

         解析几何使变量和运动进入数学,是初等数学向高等数学发展的转折点,为函数论和微积分等现代主流数学创立了基础。


历史

         解析几何是 17世纪由笛卡尔(1596-1650)、费马(1601-1665)等数学家创立,也叫坐标几何。

         恩格斯曾经把 "微积分"、"对数"、"解析几何" 当做 17 世纪 3 大数学发明。

         笛卡尔认为欧几里得几何学过分强调证明技巧和过分依赖图形像少儿"看图说话",不利于几何学进步;

         代数又完全手纸于法则和公式,过于抽象,缺乏直观性,因此 笛卡尔主张俩者联合,形成数学分支的联合优势。


坐标系

计算几何[计算机数学专题(4)]_第1张图片 平面直角坐标系

        平面的基本性质:

                公理 1 :如果一条直线上的俩点在一个平面内,那这条直线在此平面内。

                公理 2 :如果俩个不重合的平面有一个公共点,那有且只有一条过该点的公共直线。

                公理 3 :过不在一条直线上的三点,有且只有一个平面。

                根据公理 3 的推论:

                                   (1) 经过一条直线和这条直线外一点有且只有一个平面。

                                   (2) 经过俩条相交直线有且只有一个平面。

                                   (3) 经过俩条平行直线有且只有一个平面。

 

空间直角坐标系

        空间直角坐标系计算俩点之间的距离方程:\left | P1P2 \right | = \sqrt{(x_{1}-x_{2})^{2} + (y_{1}-y_{2})^{2} + (z_{1}-z_{2})^{2}}

        P1(x_{1}, y_{1}, z_{1})P2(x_{2}, y_{2}, z_{2})


       在平面之间坐标系中的点通常记为 P(x, y)。

       计算 原点O 到 任一点P(x, y)的距离:\left | OP \right | = \sqrt{(x^{2}+y^{2})}

       计算 任意俩点之间的距离,记俩点为 P_{1}, P_{2}

       俩点的坐标即 P_{1}(x_{1}, y_{1})P_{2}(x_{2}, y_{2}),由勾股定理(可证明)可得俩点之间的距离: \left | P1P2 \right | = \sqrt{(x_{2}-x_{1})^{2}+(y_{2}-y_{1})^{2}}

计算几何[计算机数学专题(4)]_第2张图片 俩点间距离公式的证明图示.gif

直线

        从解析几何角度看平面的直线就是平面直角坐标系中的二元一次方程(一般式方程):Ax + By + C = 0 (a、b不能同时为 0),若 B 不为 0,直线的斜率 -\frac{A}{B}

        当 A = 0,直线平行于 x 轴,B = 0 直线平行于 y 轴。

        直线的倾斜角:假设有一条直线 l,当 l 与 坐标系 x 轴相交时,以 x 正半轴为基准 与 l 向上方向间的角\alpha 是 l 的倾斜角在 [0º, 180º )。

        倘若直线 l 与 x 轴重合或平行,倾斜角 = 0º 。

        直线的斜率 k = tan(\alpha) =  \frac{y_{2}-y_{1}}{x_{2}-x_{1}}, P_{1}(x_{1}, y_{1})P_{2}(x_{2}, y_{2}) 是经过直线的俩点。

        若俩条直线相互平行,则TA们的斜率相等;若俩条直线相互垂直,则TA们的斜率乘积等于 - 1。

        P(x, y) 点到直线ax + by + c = 0 的距离:d = \frac{\left | Ax+By+C \right |}{\sqrt{(A^{2}+B^{2})}},可构造直角三角形证明。

点到直线距离公式的证明图示.gif

       直线的点斜式方程:y - y_{0} = k(x - x_{0})

点斜式方程的推导图示.gif

       直线的斜截式方程:y = kx + b。

斜截式方程推导图示.gif

       直线的俩点式方程:\frac{y-y_{1}}{y_{2}-y_{1}} = \frac{x-x_{1}}{x_{2}-x_{1}}

俩点式方程推导图示.gif

       直线的截距式方程:\frac{x}{a} + \frac{y}{b} = 1

截距式方程推导图示.gif

           直线的交点:以下图为例。

计算几何[计算机数学专题(4)]_第3张图片

           先使用叉积(矢量的内容)求出 ABC 和 ABD 的面积,得到 OC 和 OD 的比值,就得到 O 点的坐标

求解交点图示.gif

多边形

           《几何原本》定义为 4 边以上的线段首尾顺序连接所组成的封闭图形叫做多边形。

            多边形:正多边形和非正多边形、凸(平面)多边形和凹(空间)多边形等。

            多边形的内角和定理:n 边形的内角和等于 (n - 2) * 180º。

计算几何[计算机数学专题(4)]_第4张图片

             简单多边形面积:假设我们已按照逆时钟顺序存储了多边形的顶点(P1、P2、P3、... Pn),面积为: 

             简单多边形即被点包围如 "凹", 复杂多边形即没被点包围如 "五角星⭐️"。

多边形面积

             

多边形举例图示.gif

 

 


        圆心坐标 : A(a, b),半径为 r。

        圆的标准方程(x-a)^{2}+(y-b)^{2}=r^{2}

圆标准方程推导图示.gif

        点与圆的关系

  1.       若 (x-a)^{2}+(y-b)^{2}=r^{2} ,则 点刚好在圆上。
  2.       若 (x-a)^{2}+(y-b)^{2} > r^{2} ,则 点在圆外。
  3.       若 (x-a)^{2} + (y-b)^{2} < r^{2} ,则 点在圆内。

        一般方程:x^{2}+y^{2}+Dx+Ey+F=0

        D^{2}+E^{2}-4F>0,圆的方程圆心:(-\frac{D}{2}, -\frac{E}{2}),半径:\frac{1}{2}\sqrt{D^{2}+E^{2}-4F}


椭圆

        

         椭圆的定义:平面内与俩定点 F1、F2 的距离的和等于常数 2a 的动点 M 的轨迹,2a > |F1F2|,|F1F2| = 2c,2a > 2c。

                               |MF1| + |MF2| = 2a,F1\F2 叫椭圆的焦点,M 为椭圆的动点。

         离心率e = \frac{c}{a}

         椭圆的长轴是 2a,短轴是 2b。

         当焦点 F1、F2 在 x 轴时,椭圆的标准方程:\frac{x^{2}}{a^{2}}+\frac{y^{2}}{b^{2}} = 1 ~~~(a>b>0)。         

计算几何[计算机数学专题(4)]_第5张图片 焦点在 x 轴

          当焦点 F1、F2 在 y 轴时,椭圆的标准方程:\frac{y^{2}}{a^{2}}+\frac{x^{2}}{b^{2}} = 1~~~(a>b>0)

计算几何[计算机数学专题(4)]_第6张图片 焦点在 y 轴

        其中 a^{2}-c^{2}=b^{2}


存储问题

           上述的几何对象如何在计算机中存储 ?

  •           点:需要存储坐标 (x,y);
  •           直线:俩个线上的点、或直线解析式 y = kx + b(解析几何方法);
  •           线段:俩个端点;
  •           射线:一个端点以及另一个在此射线上方向的点;
  •           圆:圆心和半径;
  •           多边形:按照顺时针(逆时针)存储所有顶点;
  •           矢量:起点平移到原点,记录终点的坐标,记录形式如点(x,y);
  •           矢量的缩放:以存储点的形式(x,y) 乘以缩放系数 k,(kx,ky);   

精度问题     

                 计算几何不仅计算量较大,参与运算的通常是实数,会产生一定的浮点误差。

                 我们一般采用绝对精度判断,还有相对精度和绝对精度+相对精度的判断方法。

                 绝对精度:设定一个值 eps,范围一般: 10^{-6} - 10^{-8}

                 要满足的条件,换而言之达不到这些条件采用绝对精度判断会失效,

  •            运算过程中俩个不相等的变量的精确值的差应该远大于 eps;
  •            还有、还有,eps 必须远大于浮点数的误差;

                 判断 a, b 相等: fabs(a - b) < eps;

                 判断 a, b 不相等: fabs(a - b) > eps;

                 判断 a < b: a + eps < b;

                 判断 a >= b: a < b + eps;

                 fabs: C库函数,返回值为实数的绝对值。  


矢量

计算几何[计算机数学专题(4)]_第7张图片 矢量的正负

         矢量:有方向的线段,也叫向量,线段的俩个端点 P1 和 P2,从P1到P2的距离称为模(如同取绝对值保证距离为正)。

         矢量是高等数学的分支,力学分析应用广泛,在计算几何中使用矢量代替三角函数等会让程序变得简洁高效。 

         矢量的斜率 k 有正负之分。

         矢量的完整介绍:https://baike.baidu.com/item/平面向量/448934

         点积:俩个矢量(a、b)的模相乘再乘以TA们夹角的余弦(cos),

计算几何[计算机数学专题(4)]_第8张图片 矢量点积图示.gif

        

         

 

 

 

 

 

 

 

 

 

 

 

 

 

 

                 分析点积满足的性质,大概 6 条但这里只说 分配律。

                 分配律:a · (b + c)  =  a · b + a · c,p.s. " · " 不是乘法,而是矢量的点积。

                 

           若图中的 矢量b 与 矢量 a 反向,那就是 a - b。

           做向量的题目,一般只需要考虑坐标上的单位矢量转向哪里就能得到正确结果。

           旋转向量:旋转某个向量 a(x, y),旋转 \theta 的弧度:

旋转向量的证明图示.gif

           

 

 

 

 

 

 

 

 

 

 

 

 

 

 

              利用三角函数的和角公式换简,得出的式子:(x*cos\theta-y*sin\theta, x*sin\theta+y*cos\theta)

计算几何[计算机数学专题(4)]_第9张图片

             叉积:用叉积可判断从一个矢量到另一个矢量的旋转分方向,也求同时垂直于俩个矢量的矢量方向、计算多边形面积。

                        叉积图示理解:https://blog.csdn.net/dcrmg/article/details/52416832             


     基本算法                   

  1.                   判断点是否在线段 ?
  2.                   判断点是否在三角形 ?
  3.                   判断点是否在圆内 ?
  4.                   判断点是否在多边形 ?
  5.                   判断俩线段是否相交 ? 
  6.                   实现生成圆 ?
  7.                   实现生成椭圆 ?
  8.                   求任意多边形面积 ?   

     凸包

                  (平面)凸包的定义:包围平面上 n 个点的最小凸多边形。

                  一图胜千言:

          选定一点(最左/右/上下)其余过程如图枚举出边,这样的枚举一条边的时间复杂度是 O(n),凸包就是最后的形状。

          这叫 "Jarvis 算法" ,时间复杂度是 O(mn),m 是枚举的边数伪代码如下。

P;    // 第一个点,一般选最左边即横坐标 x 最小

i = 0;
while(Finshed, i == 最后一个点)
     P[i] = P;
     init = S[0];    // 初始化一个候选解
     for(j = 1; j < S; j ++)
        if(S[j] 在 P[i] 至 init 的向量的左侧)
            init = S[j]    // 候选解更新为更左的

i ++;

          所以,通常我们先对点集的元素排序,排序方法有 极角序(采用 Graham 扫描) 或 水平序(Andrew 算法)。

          水平序:

  1.                      把所有点集的元素以 横坐标 为第一关键字,纵坐标 为第二关键字升序排列;
  2.                      按顺序枚举每个点,若该点在当前凸包前进方向的左侧该点入栈,否则不断退栈直到满足前面的条件;
  3.                      枚举完所有点后得到下凸包,倒序枚举所有点得到上凸包。

           推荐资料:https://www.docin.com/p-886199697.html


       更多的计算几何知识推荐《算法的乐趣》。

计算几何[计算机数学专题(4)]_第10张图片

         需要 pdf 可以找我,另外推荐资料:https://wjyyy.blog.luogu.org/geometry1 ~

你可能感兴趣的:(计算数学)