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

                                                                                     《目录》


介绍

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

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

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

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


解析几何

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

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

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

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


历史

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

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

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

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


坐标系

平面直角坐标系

        平面的基本性质:

                公理 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}}

俩点间距离公式的证明图示.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

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

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

求解交点图示.gif

多边形

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

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

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

             简单多边形面积:假设我们已按照逆时钟顺序存储了多边形的顶点(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)。         

焦点在 x 轴

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

焦点在 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库函数,返回值为实数的绝对值。  


矢量

矢量的正负

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

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

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

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

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

矢量点积图示.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)

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

                        叉积图示理解: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


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

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

目录 ㈠ 点的基本运算 1. 平面上两点之间距离 1 2. 判断两点是否重合 1 3. 矢量叉乘 1 4. 矢量点乘 2 5. 判断点是否在线段上 2 6. 求一点饶某点旋转后的坐标 2 7. 求矢量夹角 2 ㈡ 线段及直线的基本运算 1. 点与线段的关系 3 2. 求点到线段所在直线垂线的垂足 4 3. 点到线段的最近点 4 4. 点到线段所在直线的距离 4 5. 点到折线集的最近距离 4 6. 判断圆是否在多边形内 5 7. 求矢量夹角余弦 5 8. 求线段之间的夹角 5 9. 判断线段是否相交 6 10.判断线段是否相交但不交在端点处 6 11.求线段所在直线的方程 6 12.求直线的斜率 7 13.求直线的倾斜角 7 14.求点关于某直线的对称点 7 15.判断两条直线是否相交及求直线交点 7 16.判断线段是否相交,如果相交返回交点 7 ㈢ 多边形常用算法模块 1. 判断多边形是否简单多边形 8 2. 检查多边形顶点的凸凹性 9 3. 判断多边形是否凸多边形 9 4. 求多边形面积 9 5. 判断多边形顶点的排列方向,方法一 10 6. 判断多边形顶点的排列方向,方法二 10 7. 射线法判断点是否在多边形内 10 8. 判断点是否在凸多边形内 11 9. 寻找点集的graham算法 12 10.寻找点集凸包的卷包裹法 13 11.判断线段是否在多边形内 14 12.求简单多边形的重心 15 13.求凸多边形的重心 17 14.求肯定在给定多边形内的一个点 17 15.求从多边形外一点出发到该多边形的切线 18 16.判断多边形的核是否存在 19 ㈣ 圆的基本运算 1 .点是否在圆内 20 2 .求不共线的三点所确定的圆 21 ㈤ 矩形的基本运算 1.已知矩形三点坐标,求第4点坐标 22 ㈥ 常用算法的描述 22 ㈦ 补充 1.两圆关系: 24 2.判断圆是否在矩形内: 24 3.点到平面的距离: 25 4.点是否在直线同侧: 25 5.镜面反射线: 25 6.矩形包含: 26 7.两圆交点: 27 8.两圆公共面积: 28 9. 圆和直线关系: 29 10. 内切圆: 30 11. 求切点: 31 12. 线段的左右旋: 31 13.公式: 32
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值