计算几何学习笔记
0 - 前置
0.1 rad
把长度等于半径长的弧所对的圆心角称为 \(1\) 弧度的角,用符号 \(\text{rad}\) 表示。
由此,\(360^{\circ}\) 的角的弧度为 \(\frac{C}{r}=2\pi\)接下来便有:\(k \text{ rad}=\frac{\pi}{180^{\circ}}n^{\circ}\)。
称一个角 \(\alpha\) 将其终边旋转若干周,得到的角的集合,称为终边位置集合 \(=\{\beta|\beta=\alpha+2k\pi,k\in \mathbf Z\}\)。
0.1.1 \(\pi\) 的计算
使用 acos(-1) 得到的 \(\pi\) 值最精确。
当然我会背,3.14159265358979323846264388,平时取十几位就够了。
0.2 - 坐标系
0.2.1 - 平面直角坐标系
初中常用,不详细讲了,注意到坐标系两维的单位长度可以调整。直角坐标记为有序数对 \((a,b)\)。
0.2.2 - 平面极坐标系
初中数学书上提到过,就是一维为长度,有正方向 \(x\),另一维为角度。极坐标记为 \(A(L,\theta)\),\(L=|OA|,\theta=\angle xOA\)。
注意到,\((L,\theta)\) 与 \((L,\theta+2k\pi)(k\in \mathbf Z)\) 表示的是同一个点,由此可知,原点 \(O(0,\theta)(\theta\in \mathbf R)\)。
平面直角坐标系与平面极坐标系的转换
画图易证。
设 \(A(L,\theta)\),则 \(A\) 的直角坐标 \((x,y)\) 为 \((L\sin\theta,L\cos\theta)\)。
设 \(A(x,y)\),则 \(A\) 的直角坐标 \((L,\theta)\) 表示为 \(L=\sqrt{x^2+y^2},\tan\theta=\frac yx\)。但注意到,同一个 \(\tan{\theta}\),有两个可能的 \(\theta\) 取值,但在具体实现中,cmath 库提供了函数 atan2(y,x) 可以通过分类讨论解决这个问题。
0.3 - vector
0.3.1 - definition
记为 \(\vec{a}\) 或 \(\mathbf a\),后文都记为 \(\vec{a}\)。
有向线段: 带有方向的线段,\(\vec{AB}=(A,\theta,L)\)(起点,方向,长度),通常用来表示向量,显然终点是唯一确定的,为 \(B\)。
模: 有向线段的长度,记为 \(|\vec{AB}|=L\)。
对于二维向量(下简记为②):
    double length(){
        return x*x+y*y;
    }
    double mod(){
        return sqrt(length());
    }
零向量,单位向量: 记为 \(\vec{0},\vec{e}\),零向量方向任意,\(|\vec{0}|=0,|\vec{e}|=1\)。
平行: 两向量平行 \(\vec{a}\parallel \vec{b}\Leftrightarrow \theta_{\vec{a}}=\theta_{\vec{b}}/\theta_{\vec{a}}=-\theta_{\vec{b}}(\vec{a},\vec{b}\neq\vec{0})\),它们可以平移到同一直线上,方便进行运算。
②,对于两向量 \(\vec a=(x_a,y_a),\vec b=(x_b,y_b)\):
    bool friend parallel(vec_2 a,vec_2 b){
        if(!a.x&&!b.x) return 1;
        if(!a.x||!b.x) return 0;
        double k1=a.y/a.x,k2=b.y/b.x;
        return k1==k2;
    }
相等/相反向量: 模相等,方向相同/反的向量。
②:
    bool friend operator==(vec_2 a,vec_2 b){
        return equal(a.mod(),b.mod())&¶llel(a,b);
    }
向量夹角: 两非零向量 \(\vec{a},\vec{b}\)夹角,记为 \(\theta=<\vec a,\vec b>=\angle AOB(\theta\in[0,\pi])\),特别的,\(\theta=\pi/2\) 时 \(\vec a\bot\vec b\)。
向量不能比较大小,但能比较模长和判断相等。
0.3.2 - calculation
加法
类比物理中的力的合成以及位移知识,可以知道:\(\vec{AB}+\vec{BC}=\vec{AC}\)
三角形法则: 若要求和的向量首尾顺次相连,那么这些向量的和为第一个向量的起点指向最后一个向量的终点;
平行四边形法则: 若要求和的两个向量 共起点,那么它们的和向量为以这两个向量为邻边的平行四边形的对角线,起点为两个向量共有的起点,方向沿平行四边形对角线方向。
由图易知,加法满足交换律结合律。
②,对于两向量 \(\vec a=(x_a,y_a),\vec b=(x_b,y_b)\):
    vec_2 friend operator+(const vec_2 a,const vec_2 b){
        return vec_2(a.x+b.x,a.y+b.y);
    }
减法
注意到 \(\vec a-\vec b=\vec a+(-\vec b)\),即把减法转化成加法。
②,对于两向量 \(\vec a=(x_a,y_a),\vec b=(x_b,y_b)\):
    vec_2 friend operator-(const vec_2 a,const vec_2 b){
        vec_2 c=vec_2(-b.x,-b.y);
        return a+c;
    }
乘法
向量的乘法有两种,一是点积(数量积),二是叉积(向量积)。结果类型不同。
点积定义为 \(\vec a\) 在 \(\vec b\) 上的投影乘以 \(\vec b\) 的模,即:
有一些性质如下:
- \(\vec a\cdot\vec b=0\Leftrightarrow \vec a\bot\vec b\)
- \(\vec a\cdot\vec b=|\vec a| |\vec b|\Leftrightarrow \vec a,\vec b\) 共线
- \(\cos\theta=\frac{\vec a\cdot\vec b}{|\vec a| |\vec b|}\)
②,对于两向量 \(\vec a=(x_a,y_a),\vec b=(x_b,y_b)\),有 \(\vec a\cdot\vec b=x_a x_b+y_a y_b\)(对于更高维度,加上额外维度的坐标积即可):
    double friend dot(vec_2 a,vec_2 b){
        return a.x*b.x+a.y*b.y;
    }
叉积比较特殊,它只能定义在三维和七维空间里。
现在只讨论三维的叉积。
三维空间内两向量 \(\vec a,\vec b\),其叉积的模为 \(|\vec a| |\vec b|\sin<\vec a,\vec b>\)(类比平行四边形面积公式:\(S=ab\sin\theta\),其几何意义就是以 \(\vec a,\vec b\) 为邻边的平行四边形面积),方向垂直于 \(\vec a,\vec b\) 所确定的平面(符合右手定则)。
右手定则是一个利用右手的拇指、食指和中指来判断三个相互垂直的向量的方向的方法。 具体来说,当我们将右手的食指指向第一个向量的方向,中指指向第二个向量的方向时,拇指所指的方向就是这两个向量叉乘的方向。 这个定则非常直观,易于操作,是物理学和工程学中判断向量叉乘方向的常用方法。
③,对于两向量 \(\vec a=(x_a,y_a,z_a),\vec b=(x_b,y_b,z_b)\),可以通过行列式求其叉积(默认三个方向的单位长度(\(i,j,k\))都为 \(1\)):

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号