计算几何学习笔记

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())&&parallel(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=|\vec a| |\vec b|\cos\theta \]

有一些性质如下:

  • \(\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\)):

\[\vec c=\vec a\times \vec b=\begin{bmatrix} i & j & k\\ x_a & y_a & z_a\\ x_b & y_b & z_b \end{bmatrix}=(iy_a z_b-iz_a y_b,jx_a z_b-jz_a x_b,k x_a y_b-k y_a x_b)=(y_a z_b-z_a y_b,x_a z_b-z_a x_b,x_a y_b-y_a x_b)\]

posted @ 2024-07-18 20:54  view3937  阅读(44)  评论(0)    收藏  举报
Title