计算几何学习笔记

0 - 前置

0.1 rad

把长度等于半径长的弧所对的圆心角称为 1 弧度的角,用符号 rad 表示。

由此,360 的角的弧度为 Cr=2π接下来便有:k rad=π180n

称一个角 α 将其终边旋转若干周,得到的角的集合,称为终边位置集合 ={β|β=α+2kπ,kZ}

0.1.1 π 的计算

使用 acos(-1) 得到的 π 值最精确。

当然我会背,3.14159265358979323846264388,平时取十几位就够了。

0.2 - 坐标系

0.2.1 - 平面直角坐标系

初中常用,不详细讲了,注意到坐标系两维的单位长度可以调整。直角坐标记为有序数对 (a,b)

0.2.2 - 平面极坐标系

初中数学书上提到过,就是一维为长度,有正方向 x,另一维为角度。极坐标记为 A(L,θ)L=|OA|,θ=xOA

注意到,(L,θ)(L,θ+2kπ)(kZ) 表示的是同一个点,由此可知,原点 O(0,θ)(θR)

平面直角坐标系与平面极坐标系的转换

画图易证。

A(L,θ),则 A 的直角坐标 (x,y)(Lsinθ,Lcosθ)

A(x,y),则 A 的直角坐标 (L,θ) 表示为 L=x2+y2,tanθ=yx。但注意到,同一个 tanθ,有两个可能的 θ 取值,但在具体实现中,cmath 库提供了函数 atan2(y,x) 可以通过分类讨论解决这个问题。

0.3 - vector

0.3.1 - definition

记为 aa,后文都记为 a

有向线段: 带有方向的线段,AB=(A,θ,L)(起点,方向,长度),通常用来表示向量,显然终点是唯一确定的,为 B

模: 有向线段的长度,记为 |AB|=L

对于二维向量(下简记为②):

    double length(){
        return x*x+y*y;
    }
    double mod(){
        return sqrt(length());
    }

零向量,单位向量: 记为 0,e,零向量方向任意,|0|=0,|e|=1

平行: 两向量平行 abθa=θb/θa=θb(a,b0),它们可以平移到同一直线上,方便进行运算。

②,对于两向量 a=(xa,ya),b=(xb,yb)

    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);
    }

向量夹角: 两非零向量 a,b夹角,记为 θ=<a,b>=AOB(θ[0,π]),特别的,θ=π/2ab

向量不能比较大小,但能比较模长和判断相等。

0.3.2 - calculation

加法

类比物理中的力的合成以及位移知识,可以知道:AB+BC=AC

三角形法则: 若要求和的向量首尾顺次相连,那么这些向量的和为第一个向量的起点指向最后一个向量的终点;

平行四边形法则: 若要求和的两个向量 共起点,那么它们的和向量为以这两个向量为邻边的平行四边形的对角线,起点为两个向量共有的起点,方向沿平行四边形对角线方向。

由图易知,加法满足交换律结合律。

②,对于两向量 a=(xa,ya),b=(xb,yb)

    vec_2 friend operator+(const vec_2 a,const vec_2 b){
        return vec_2(a.x+b.x,a.y+b.y);
    }

减法

注意到 ab=a+(b),即把减法转化成加法。

②,对于两向量 a=(xa,ya),b=(xb,yb)

    vec_2 friend operator-(const vec_2 a,const vec_2 b){
        vec_2 c=vec_2(-b.x,-b.y);
        return a+c;
    }

乘法

向量的乘法有两种,一是点积(数量积),二是叉积(向量积)。结果类型不同。

点积定义为 ab 上的投影乘以 b 的模,即:

ab=|a||b|cosθ

有一些性质如下:

  • ab=0ab
  • ab=|a||b|a,b 共线
  • cosθ=ab|a||b|

②,对于两向量 a=(xa,ya),b=(xb,yb),有 ab=xaxb+yayb(对于更高维度,加上额外维度的坐标积即可):

    double friend dot(vec_2 a,vec_2 b){
        return a.x*b.x+a.y*b.y;
    }

叉积比较特殊,它只能定义在三维和七维空间里。
现在只讨论三维的叉积。

三维空间内两向量 a,b,其叉积的模为 |a||b|sin<a,b>(类比平行四边形面积公式:S=absinθ,其几何意义就是以 a,b 为邻边的平行四边形面积),方向垂直于 a,b 所确定的平面(符合右手定则)。

右手定则是一个利用右手的拇指、食指和中指来判断三个相互垂直的向量的方向的方法。 具体来说,当我们将右手的食指指向第一个向量的方向,中指指向第二个向量的方向时,拇指所指的方向就是这两个向量叉乘的方向。 这个定则非常直观,易于操作,是物理学和工程学中判断向量叉乘方向的常用方法。

③,对于两向量 a=(xa,ya,za),b=(xb,yb,zb),可以通过行列式求其叉积(默认三个方向的单位长度(i,j,k)都为 1):

c=a×b=[ijkxayazaxbybzb]=(iyazbizayb,jxazbjzaxb,kxaybkyaxb)=(yazbzayb,xazbzaxb,xaybyaxb)

posted @   view3937  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
Title
点击右上角即可分享
微信分享提示