首页 > 编程语言 >算法学习笔记(26): 计算几何

算法学习笔记(26): 计算几何

时间:2023-07-22 09:23:14浏览次数:38  
标签:26 Point 笔记 外积 算法 vec otimes alpha 向量

计算几何

向量

高一知识,略讲。

向量外积

若 \(\vec x = (x_1, y_1), \vec y = (x_2, y_2)\),则有 \(\vec x \times \vec y = x_1 y_2 - y_1 x_2\)。

或者表示为 \(|\vec x||\vec y| \sin \theta\),其中 \(\theta\) 表示向量间的夹角。

几何意义:两个向量构成的平行四边形的面积(可以为负数)。

性质

  • 若 \(\vec x \times \vec y \gt 0\),则 \(\vec y\) 在 \(\vec x\) 的逆时针方向,反之亦然。

向量旋转

将一个向量顺时针旋转 \(\alpha\),可以利用矩阵的性质。

对于向量 \(\vec x = (x, y)^T\),旋转公式为:

\[(x, y) \begin{pmatrix} \cos \alpha & -\sin \alpha \\ \sin \alpha & \cos \alpha \end{pmatrix} \]

逆时针旋转的矩阵为其转置矩阵:

\[(x, y) \begin{pmatrix} \cos \alpha & \sin \alpha \\ -\sin \alpha & \cos \alpha \end{pmatrix} \]

矩阵可以不好理解,可以通过极坐标推导。这里不展开。

向量的极角

定义为向量与 \(x\) 轴正半轴的夹角,一般用 \(atan2(y, x)\) 实现。

\(atan(y, x)\) 的取值范围为 \([-\pi, \pi]\)。

利用一个向量 \(\vec x\) 表示其坐标。

这个向量等价于原点到目标点的向量。

线

可以用多种方法表示,视情况而定:

  • 一般式表达:\(Ax+By + C = 0\)。方便表示一条直线,或者无向的线段。

  • 两个点表达:\((x_1, y_1) \to (x_2, y_2)\),可以方便表示有向的线段或者射线。

  • 点与向量:\((x,y) + k \vec d\),可以方便的表示射线。

补充

两个点求解一般式,有 \(A = y_2 - y_1, B = x_1 - x_2, C = x_2y_1 - x_1 y_2\)。

判断两个一般式直线平行,用:\(A_1B_2 = A_2B_1\)。本质是求斜率。

求一般式的交点,将式子变为:

\[A_1 A_2 x + B_1 A_2 y + C_1 A_2 = 0 \\ A_2 A_1 x + B_2 A_1 y + C_2 A_1 = 0 \\ \]

相减可得:

\[y = (C_1 A_2 - C_2 A_1) / (A_1 B_2 - A_2 B_1) \]

同理可得:

\[x = (C_2 B_1 - C_1 B_2) / (A_1 B_2 - A_2 B_1) \]

需要保证两条直线不平行!

线线交点

首先排除平行与重合的情况,判断是否相交,利用向量外积即可。

判断有无交点:若 \(\vec {AC} \otimes \vec {AD}\) 和 \(\vec{AC} \otimes \vec {AB}\) 异号,以及 \(\vec {BD} \otimes \vec {BA}\) 和 \(\vec {BD} \otimes {BC}\) 异号,则有交点。

然后可以利用面积法求交点。

用向量外积求出 \(S_{ABCD}\),以及 \(S_{ABD}\)。

那么 \(AO : AC = S_{ABD} : S_{ABCD}\),然后就可以找出 \(O\) 的坐标了。


点在线上

线上去两点 \(S, T\),对于点 \(P\),若 \(P\) 在线段 \(ST\) 上,则 \(\vec{SP} \otimes \vec {PT} = 0\)。

反之不一定成立,需要再判断坐标范围。

点关于直线对称

先找到垂线长度,可以利用向量外积达成。

在直线上任取两个点,利用向量外积求出所构成的三角形的面积,进而求出垂线长度。

利用这两个点,找到在直线方向上的单位向量,旋转 \(\frac \pi 2\),乘上垂线长的二倍,与原坐标相加即可。

Point flip(Point p, Point st, Point ed) {
    double h = (st - p) * (ed - p) / abs(ed - st);
    Point I = (ed - st) / abs(ed - st);
    return p + ((Point){I.y, -I.x}) * 2 * h;
}

其中 abs(...) 表示其模长。

可能需要注意方向!


多边形

一般按照顺时针或者逆时针的方向一一列出所有的顶点。

判断顺时针或者逆时针

钦定一个起点,编号为 \(1\)。

枚举 \(i\) 利用 \(\vec{1i}\) 和 \(\vec{1(i+1)}\) 的叉乘,可以算出整个多边形的面积(的两倍)。

但是考虑到叉乘的正负性,如果结果为正,则所给的顺序为逆时针(因为 \(\vec{1i}\) 在 \(\vec{1(i+1)}\) 的顺时针方向)。

判断凸多边形

判断折线段拐向是否相同:

对于折线 \(A \to B \to C\),若 \((B - A) \otimes (C - B) \lt 0\),则为顺时针,反之为逆时针。

判断点在多边形内

有很多方法,这里说两种常用的。

  • 通用射线法:从该点做一条射线,如果该射线与多边形的交点数为奇数,则在内部,反之在外部。

  • 凸多边形二分法:略


闵可夫斯基和

略……QwQ


凸包算法

Graham 算法

首先极角排序,然后单调栈做一遍,好写不易错!

不过需要注意的是,在极角相同的情况下,要按照距离 原点 排序。

记录


标签:26,Point,笔记,外积,算法,vec,otimes,alpha,向量
From: https://www.cnblogs.com/jeefy/p/17572843.html

相关文章

  • JavaScript学习笔记
    之所以学习JS是想更清楚的了解这门语言,记得上学那会就感觉j真难学,工作了几年了一直从事后端,但偶尔也会用前端开发,这时候就会手忙脚乱, 好多东西都是默默糊糊,还有就是,我想知道这门语言真的很难学吗?抱着好奇的心态开始了一个月的学习历程,下面整理一下一个月的学习笔记.跟着......
  • 线性基学习笔记
    线性基的定义在一个高维空间中一组极大的线性无关的向量组成为一组线性基,更严谨的定义参考线性代数相关内容。但是在OI中我们常用的是异或线性基,它维护了给定若干个数能够通过异或计算出的所有的数,具体来说可以实现以下几个功能:求min/max异或和求k大异或和求异或和数......
  • 十大排序算法 Java版
    packagealgorithm;importjava.util.Collections;importjava.util.Vector;publicclassSort{//冒泡排序publicvoidBubbleSort(int[]a){booleanflag=true;for(inti=0;i<a.length;i++){flag=false;//用于判断上......
  • Django学习笔记:第二章django的安装和创建应用
    1.安装Django终端运行pipinstalldjango查看django是否安装成功python-mdjango--version1.1安装虚拟环境在控制台运行pipinstallvirtualenv1.1.2创建虚拟环境在特定文件夹内打开终端运行virtualenv-pD:\program_condition\python\python.exeenv_djvir......
  • 概率期望学习笔记总结
    一.OSU!题目背景原《产品排序》参见P2577题目描述osu是一款群众喜闻乐见的休闲软件。我们可以把osu的规则简化与改编成以下的样子:一共有\(n\)次操作,每次操作只有成功与失败之分,成功对应\(1\),失败对应\(0\),\(n\)次操作对应为\(1\)个长度为\(n\)的01串。在......
  • 文心一言 VS 讯飞星火 VS chatgpt (64)-- 算法导论6.5 3题
    文心一言VS讯飞星火VSchatgpt(64)--算法导论6.53题三、要求用最小堆实现最小优先队列,请写出HEAP-MINIMUM、HEAP-EXTRACT-MIN、HEAPDECREASE-KEY和MIN-HEAP-INSERT的伪代码。文心一言:以下是使用最小堆实现最小优先队列的HEAP-MINIMUM、HEAP-EXTRACT-MIN、HEAP-DECREA......
  • 「学习笔记」AC 自动机
    AC自动机是 以Trie的结构为基础,结合 KMP的思想 建立的自动机,用于解决多模式匹配等任务。Trie的构建这里需要仔细解释一下Trie的结点的含义,Trie中的结点表示的是某个模式串的前缀。我们在后文也将其称作状态。一个结点表示一个状态,Trie的边就是状态的转移。形式化地......
  • 树上启发式合并学习笔记
    树上启发式合并\((dsu\on\tree)\)适用条件:可以在一个子树内统计的问题,并且不带修改。暴力复杂度一般为\(O(n^2)\)。例题:CF600ELomsatgelral解法考虑一个问题,给你一棵树,每个节点有一个颜色,如果一种颜色在以\(x\)为根的子树内出现次数最多,则称\(col_i\)占主要色。......
  • 【学习笔记】【数学】概率与期望
    前言如果不小心发表出去了那么大概率是我手滑点错了,没有更新完那就是我也在学,有问题请@我。另外有同学告诉我概率期望其实是动态规划?基础知识:互斥事件:事件\(A\)和\(B\)的交集为空,\(A\)与\(B\)就是互斥事件,也叫互不相容事件。也可叙述为:不可能同时发生的事件。如\(A......
  • 7.20 图论笔记
    T1题目•在\(N\)个点\(P\)条边的加权无向图上求出一条从\(1\)号结点到\(N\)号结点的路径,使路径上第\(K+1\)大的边权尽量小。•\(0≤K<N≤1000\),\(1≤P≤2000\)。Solution•一道自己做出来的蓝。•二分第\(K+1\)大边权为\(mid\),每次把边权......