Lesson0423

ABS计算几何科普讲座

讲个笑话,ABS又来科普简单知识了
%%% STO szO ABS Orz OTZ %%%
之前完全没有接触过计算几何啊...ABS聚聚给我们从最简单的部分讲起,听得还是很爽的,学到了不少东西虽然最后十分钟基本梦游
主要做一个笔记作用吧,梳理一下今天学的东西顺便记录下来哪些没学好的东西明天还有机会问。
本文是将ABS大佬的课件作为大纲写下的,如有雷同,纯属有意。引用了一些课件里的原话...


0. 右手定则

如何告诉外星人哪只手套是左手的?
平面镜为什么只会翻转左右?

其实感觉ABS没解释上面两个问题
主要是作为引子吧这部分。先让我们探讨平面镜中的“我”和真实的“我”是不是一样的。用了一个这样的例子解释。
假设现在镜子前面的人是灭霸,右手戴着他的无尽手套。注意,无尽手套显然不能向手的外侧翻转,所以手套是分左右的。
镜子中的灭霸也戴着手套,但是手套是戴在“他”的左手的,两个手套不一样,可以推广到人本身,镜中人不能通过简单的旋转而与真人完全相同除非他不仅有两叶肺还有两个心脏其它器官还完全对称肺也不是对称的呢
所以,我们需要为旋转定义方向论这个“所以”的逻辑?

1. 向量基础知识

走进向量的世界
The introduction of numbers as coordinates is an act of violence.

向量是一个既有量又有数的概念。方向可以是N维的,在计算几何中主要是2维向量的相关计算。

  • 向量的夹角:
    参照任意角的定义,注意右手定则(大拇指指向自己手指弯曲的方向为正)。
  • 向量的加减:

    [vec a=(x_a,y_a,...) \ vec b=(x_b,y_b,...) \ vec apmvec b=(x_apm x_b,y_apm y_b,...) ]

  • 向量点积:

    [vec a·vec b=x_ax_b+y_ay_b+...=|vec a|·|vec b|·cos<vec a,vec b> ]

    几何意义:(vec a)(vec b)上投影长度与(vec b)的长度的乘积。
    满足交换律,结合率,分配率
  • 二维意义下的向量叉积

    [vec a imes vec b=x_ay_b-y_ax_b=|vec a|·|vec b|·sin<vec a,vec b> ]

    几何意义:求一个与两个向量都垂直的向量(满足右手定则),在二维情况下,叉积的值为两向量所成平行四边形的有向面积。
    满足交换取反,结合律,分配率
  • 向量的正交分解
    为了量化一个向量,我们一般在直角坐标系内表示向量。
    将向量分解为若干平行于坐标轴的向量的和就是正交分解。
  • 向量的模长、夹角

[|vec a|=sqrt {x^2+y^2} \ cos<vec a,vec b>=frac{vec a·vec b}{|vec a||vec b|} ]

  • 向量的旋转和放缩
    法一:可以利用合角公式算出原向量的夹角(alpha)和旋转角度( heta)之和的正切值然后反三角函数求出角度,或者直接利用正切值计算降低精度损失
    法二:先将向量正交分解再分别旋转最后相加
    显然法二较优秀
  • 向量的投影

    投影长度可以利用点积的定义求,(vec a)(vec b)投影得出的向量表示为(vec project(a,b)=frac{vec b(vec a·vec b)}{|vec b|^2})

2. 向量基础运用

用向量描述二维世界

  • 直线
    我们一般用直线上一点和直线的方向向量描述直线。
    对于一条方程为(Ax+By+C=0)的直线(l),其点向式表示为:

    [vec p=(x_0,y_0),vec v=(B,-A) ]

    直线上任意一点可以表示为(vec p+tvec v)
  • 直线相交
    求交点:
    法一:直接设未知数解方程
    法二:求直线(l_1:(vec p_1,vec v_1),l_2:(vec p_2,vec v_2))的交点。
    由于交点在(l_1)上,设交点(O)表示为(vec O=vec p_1+tvec v_1)
    接下来只需要改变(t)并判定(O)是否在(l_2)上。当(vec O -vec p_2)(vec v_2)共线时这个点在(l_2)上。
    平行或重合的两个向量的叉积为零
    所以((vec p_1+tvec v_1 -vec p_2) imes vec v_2=0)时判定在(l_2)
    解得:(vec O=frac{(vec p_1+tvec v_1-vec p_2)}{vec v_1 imes vec v_2}vec v_1+vec p_1)
    显然法二优秀
  • 线段求交
    设两线段两端点分别为((vec A_1,vec B_1),(vec A_2,vec B_2))
    求出(vec B_1-vec A_1)(vec A_2-vec A_1),(vec B_2-vec A_1)的叉积,如果是一正一负表示线段((vec A_1,vec B_1))所在直线穿过了另一条线段。
    此时同理再求出(vec B_2-vec A_2)(vec A_1-vec A_2),(vec B_1-vec A_2)的叉积即可
  • 垂足
    过直线外一点,做该直线的垂线,求垂足
    设垂足为(vec p+tvec v),点为Q其对应的向量为(vec q)
    ((vec q-(vec p+tvec v))·vec v=0)
    (t=frac{(vec q-vec p)·vec v}{|vec v|^2})
    代回得垂足对应的向量
  • 点到直线距离
    法一:求垂足再求距离
    法二:利用叉乘
    设直线的方向向量(vec v),该点对应向量为(vec p)
    在直线上任取一点p1,求(vec p-vec p1),与(vec v)作叉乘,用叉积除以(vec v)的模长
    即为(frac{|(vec p-vec p1) imes vec v|}{|vec v_1|})
  • 角平分线
    法一:在(∠O)两射线上分别取点(p1,p2)使得(|vec {Op1}|=|vec {Op2}|)
    利用等腰三角形的性质,取中点(p)即可求出角平分线
    由于多次舍精度,此方法在(∠O)弧度接近(pi)时误差极大
    法二:直接旋转
    效果极为优秀
  • 平面反射
    已知平面法向量,求一条射线关于平面的反射射线
    法向量:垂直于平面的向量,在二维中即为垂直于直线的向量
    这个方法比较多
    最好的方法还是直接求角度旋转xixi
  • 多边形三角剖分
    有向三角形剖分:任选一个起点(O),将多边形剖分为若干有向三角形(想想我们是怎么求多边形面积的)
  • 多边形面积
    将多边形三角剖分后求出各个三角形的有向面积相加就好了,容易证明正确性。
  • 多边形重心
    将多边形有向三角剖分,逐个求出三角形重心再合成出原多边形重心。
  • 判断点是否在多边形内(任意多边形)
    法一(射线法):从点引出一条射线算出其和多边形的边相交次数,奇数在内,偶数在外
    这种方法需要避免射线直接经过点的情况,会带来特判的麻烦。
    法二(环路法):以这个点为原点,有向三角剖分后每个三角形原点对应的角度之和。如果和为(0)则在三角形内,反之不在
    显然这种方法得到的和只能是(0)(pm2pi)
    形象的说,把一个小人放在这个点上,小人盯着一个在多边形上的点遍历多边形一遍,如果小人的头扭了(360°)显然就在多边形内,反之不在。
  • 圆点切线

    偷懒了偷懒了。感觉直接看课件会比较简单易懂
  • 圆线交点
  • 圆圆交点
  • 三点定圆
    法一:求两个中垂线求交点再求半径
    法二:直接暴力解方程

先就写到这里吧,以后讲了或者有新理解再来改。打了我三节半晚自习呢害
本人弱鸡一枚理解不到位欢迎挑刺

原文地址:https://www.cnblogs.com/RainMorning/p/12763433.html