Loading docs/geometry/2d.md +23 −19 Original line number Diff line number Diff line Loading @@ -99,9 +99,9 @@ $$ > 某同学:我能看出来! 我们有直线上的一点 $P$ 的直线的方向向量 $\vec v$ ,想知道某个点 $Q$ 在直线的哪边。 我们有直线上的一点 $P$ 的直线的方向向量 $\mathbf v$ ,想知道某个点 $Q$ 在直线的哪边。 我们利用向量积的性质,算出 $\overrightarrow {PQ}\times \vec v$ 。如果向量积为负,则 $Q$ 在直线上方,如果向量积为 $0$ ,则 $Q$ 在直线上,如果向量积为正,则 $Q$ 在直线下方。 我们利用向量积的性质,算出 $\overrightarrow {PQ}\times \mathbf v$ 。如果向量积为负,则 $Q$ 在直线上方,如果向量积为 $0$ ,则 $Q$ 在直线上,如果向量积为正,则 $Q$ 在直线下方。 可以画一下图,用右手定则感受一下。 Loading Loading @@ -149,7 +149,7 @@ $$ 在计算几何中,这个问题被称为 [PIP 问题](https://en.wikipedia.org/wiki/Point_in_polygon),已经有一些成熟的解决方法,下面依次介绍。 #### 光线投射算法_(Ray casting algorithm)_ #### 光线投射算法 (Ray casting algorithm) 在[这里](https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html)可以看到最原始的思路。 Loading @@ -157,7 +157,7 @@ $$ 还有点在多边形的某一边或某顶点上,这种情况十分容易判断(留作课后作业)。 我们考虑以该点为端点引出一条射线,如果这条射线与多边形有奇数个交点,则该点在多边形内部,否则该点在多边形外部,我们简记为 **奇内偶外** 。这个算法同样被称为奇偶规则_(Even-odd rule)_。 我们考虑以该点为端点引出一条射线,如果这条射线与多边形有奇数个交点,则该点在多边形内部,否则该点在多边形外部,我们简记为 **奇内偶外** 。这个算法同样被称为奇偶规则 (Even-odd rule)。 由于 [Jordan curve theorem](https://en.wikipedia.org/wiki/Jordan_curve_theorem),我们知道,这条射线每次与多边形的一条边相交,就切换一次与多边形的内外关系,所以统计交点数的奇偶即可。 Loading @@ -165,15 +165,15 @@ $$ 在原版代码中,使用的是记录多边形的数组中最后一个点作为射线上一点,这样统计时,如果出现射线过多边形某边或某顶点时,可以规定射线经过的点同在射线一侧,进而做跨立实验即可。 #### 回转数算法_(Winding number algorithm)_ #### 回转数算法 (Winding number algorithm) 回转数是数学上的概念,是平面内闭合曲线逆时针绕过该点的总次数。很容易发现,当回转数等于 $0$ 的时候,点在曲线外部。这个算法同样被称为非零规则_(Nonzero-rule)_。 回转数是数学上的概念,是平面内闭合曲线逆时针绕过该点的总次数。很容易发现,当回转数等于 $0$ 的时候,点在曲线外部。这个算法同样被称为非零规则 (Nonzero-rule)。 如何计算呢?我们把该点与多边形的所有顶点连接起来,计算相邻两边夹角的和。注意这里的夹角是 **有方向的** 。如果夹角和为 $0$ ,则这个点在多边形外,否则在多边形内。 ### 求两条直线的交点 > 某同学:这还不简单联立方程 #%$&^%)(Y(\*&^UIG)) > 某同学:这还不简单联立方程 #%$&^%)(Y(\*&rUIG)) 首先,我们需要确定两条直线相交,只需判断一下两条直线的方向向量是否平行即可。如果方向向量平行,则两条直线平行,交点个数为 $0$ 。进一步地,若两条直线平行且过同一点,则两直线重合。 Loading @@ -185,19 +185,19 @@ $$  由上图可知, $|\vec a\times \vec b|=|\vec a||\vec b|\sin \beta$ , $|\vec u\times \vec b|=|\vec u||\vec b|\sin \theta$ 。 由上图可知, $|\mathbf a\times \mathbf b|=|\mathbf a||\mathbf b|\sin \beta$ , $|\mathbf u\times \mathbf b|=|\mathbf u||\mathbf b|\sin \theta$ 。 作商得: $$ T=\frac{|\vec u\times \vec b|}{|\vec a\times \vec b|}=\frac{|\vec u|\sin \theta}{|\vec a|\sin \beta} T=\frac{|\mathbf u\times \mathbf b|}{|\mathbf a\times \mathbf b|}=\frac{|\mathbf u|\sin \theta}{|\mathbf a|\sin \beta} $$ 可以看出, $|\frac{|\vec u|\sin \theta}{\sin \beta}|=l$ 。若绝对值内部式子取值为正,代表沿 $\vec a$ 方向平移,反之则为反方向。 可以看出, $|\frac{|\mathbf u|\sin \theta}{\sin \beta}|=l$ 。若绝对值内部式子取值为正,代表沿 $\mathbf a$ 方向平移,反之则为反方向。 同时,我们将 $T$ 直接乘上 $\vec a$ ,就自动出现了直线的单位向量,不需要进行其他消去操作了。 同时,我们将 $T$ 直接乘上 $\mathbf a$ ,就自动出现了直线的单位向量,不需要进行其他消去操作了。 于是,只需要将点 $P$ 加上 $T\vec a$ 即可得出交点。 于是,只需要将点 $P$ 加上 $T\mathbf a$ 即可得出交点。 ### 求任意多边形的周长和面积 Loading @@ -209,10 +209,10 @@ $$ 考虑向量积的模的几何意义,我们可以利用向量积完成。 将多边形上的点逆时针标记为 $p_1,p_2,\cdots ,p_n$ ,再任选一个辅助点 $O$ ,记向量 $\vec {v_i}=p_i-O$ ,那么这个多边形面积 $S$ 可以表示为: 将多边形上的点逆时针标记为 $p_1,p_2,\cdots ,p_n$ ,再任选一个辅助点 $O$ ,记向量 $\mathbf v_i=p_i-O$ ,那么这个多边形面积 $S$ 可以表示为: $$ S=\frac{1}{2}\sum_{i=1}^n |\vec {v_i}\times \overrightarrow{v_{i\bmod n+1}}| S=\frac{1}{2}\sum_{i=1}^n |\mathbf v_i\times \mathbf v_{i\bmod n+1}| $$ ### 圆与直线相关 Loading @@ -235,9 +235,13 @@ $$ ### 极角序 !!! 例题[「JOI Spring Camp 2014 Day4」两个人的星座](https://www.ioi-jp.org/camp/2014/2014-sp-tasks/2014-sp-d4.pdf) 一般来说,这类题需要先枚举一个极点,然后计算出其他点的极坐标,在极坐标系下按极角的顺序解决问题。 #### 例题[「JOI Spring Camp 2014 Day4」两个人的星座](https://www.ioi-jp.org/camp/2014/2014-sp-tasks/2014-sp-d4.pdf) 平面内有 $n$ 个点,有三种颜色,每个点的颜色是三种中的一种。求不相交的三色三角形对数。 $6\le n\le 3000$ 。 #### 题解 如果两个三角形不相交,则一定可以做出两条内公切线,如果相交或内含是做不出内公切线的。三角形的公切线可以类比圆的公切线。 先枚举一个原点,记为 $O$ ,以这个点为极点,过这个点且与 $x$ 轴平行的直线作为极轴,建立极坐标系,把剩余点按极角由小到大排序。然后统计出在极轴上方和下方的每种点的个数。 Loading Loading
docs/geometry/2d.md +23 −19 Original line number Diff line number Diff line Loading @@ -99,9 +99,9 @@ $$ > 某同学:我能看出来! 我们有直线上的一点 $P$ 的直线的方向向量 $\vec v$ ,想知道某个点 $Q$ 在直线的哪边。 我们有直线上的一点 $P$ 的直线的方向向量 $\mathbf v$ ,想知道某个点 $Q$ 在直线的哪边。 我们利用向量积的性质,算出 $\overrightarrow {PQ}\times \vec v$ 。如果向量积为负,则 $Q$ 在直线上方,如果向量积为 $0$ ,则 $Q$ 在直线上,如果向量积为正,则 $Q$ 在直线下方。 我们利用向量积的性质,算出 $\overrightarrow {PQ}\times \mathbf v$ 。如果向量积为负,则 $Q$ 在直线上方,如果向量积为 $0$ ,则 $Q$ 在直线上,如果向量积为正,则 $Q$ 在直线下方。 可以画一下图,用右手定则感受一下。 Loading Loading @@ -149,7 +149,7 @@ $$ 在计算几何中,这个问题被称为 [PIP 问题](https://en.wikipedia.org/wiki/Point_in_polygon),已经有一些成熟的解决方法,下面依次介绍。 #### 光线投射算法_(Ray casting algorithm)_ #### 光线投射算法 (Ray casting algorithm) 在[这里](https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html)可以看到最原始的思路。 Loading @@ -157,7 +157,7 @@ $$ 还有点在多边形的某一边或某顶点上,这种情况十分容易判断(留作课后作业)。 我们考虑以该点为端点引出一条射线,如果这条射线与多边形有奇数个交点,则该点在多边形内部,否则该点在多边形外部,我们简记为 **奇内偶外** 。这个算法同样被称为奇偶规则_(Even-odd rule)_。 我们考虑以该点为端点引出一条射线,如果这条射线与多边形有奇数个交点,则该点在多边形内部,否则该点在多边形外部,我们简记为 **奇内偶外** 。这个算法同样被称为奇偶规则 (Even-odd rule)。 由于 [Jordan curve theorem](https://en.wikipedia.org/wiki/Jordan_curve_theorem),我们知道,这条射线每次与多边形的一条边相交,就切换一次与多边形的内外关系,所以统计交点数的奇偶即可。 Loading @@ -165,15 +165,15 @@ $$ 在原版代码中,使用的是记录多边形的数组中最后一个点作为射线上一点,这样统计时,如果出现射线过多边形某边或某顶点时,可以规定射线经过的点同在射线一侧,进而做跨立实验即可。 #### 回转数算法_(Winding number algorithm)_ #### 回转数算法 (Winding number algorithm) 回转数是数学上的概念,是平面内闭合曲线逆时针绕过该点的总次数。很容易发现,当回转数等于 $0$ 的时候,点在曲线外部。这个算法同样被称为非零规则_(Nonzero-rule)_。 回转数是数学上的概念,是平面内闭合曲线逆时针绕过该点的总次数。很容易发现,当回转数等于 $0$ 的时候,点在曲线外部。这个算法同样被称为非零规则 (Nonzero-rule)。 如何计算呢?我们把该点与多边形的所有顶点连接起来,计算相邻两边夹角的和。注意这里的夹角是 **有方向的** 。如果夹角和为 $0$ ,则这个点在多边形外,否则在多边形内。 ### 求两条直线的交点 > 某同学:这还不简单联立方程 #%$&^%)(Y(\*&^UIG)) > 某同学:这还不简单联立方程 #%$&^%)(Y(\*&rUIG)) 首先,我们需要确定两条直线相交,只需判断一下两条直线的方向向量是否平行即可。如果方向向量平行,则两条直线平行,交点个数为 $0$ 。进一步地,若两条直线平行且过同一点,则两直线重合。 Loading @@ -185,19 +185,19 @@ $$  由上图可知, $|\vec a\times \vec b|=|\vec a||\vec b|\sin \beta$ , $|\vec u\times \vec b|=|\vec u||\vec b|\sin \theta$ 。 由上图可知, $|\mathbf a\times \mathbf b|=|\mathbf a||\mathbf b|\sin \beta$ , $|\mathbf u\times \mathbf b|=|\mathbf u||\mathbf b|\sin \theta$ 。 作商得: $$ T=\frac{|\vec u\times \vec b|}{|\vec a\times \vec b|}=\frac{|\vec u|\sin \theta}{|\vec a|\sin \beta} T=\frac{|\mathbf u\times \mathbf b|}{|\mathbf a\times \mathbf b|}=\frac{|\mathbf u|\sin \theta}{|\mathbf a|\sin \beta} $$ 可以看出, $|\frac{|\vec u|\sin \theta}{\sin \beta}|=l$ 。若绝对值内部式子取值为正,代表沿 $\vec a$ 方向平移,反之则为反方向。 可以看出, $|\frac{|\mathbf u|\sin \theta}{\sin \beta}|=l$ 。若绝对值内部式子取值为正,代表沿 $\mathbf a$ 方向平移,反之则为反方向。 同时,我们将 $T$ 直接乘上 $\vec a$ ,就自动出现了直线的单位向量,不需要进行其他消去操作了。 同时,我们将 $T$ 直接乘上 $\mathbf a$ ,就自动出现了直线的单位向量,不需要进行其他消去操作了。 于是,只需要将点 $P$ 加上 $T\vec a$ 即可得出交点。 于是,只需要将点 $P$ 加上 $T\mathbf a$ 即可得出交点。 ### 求任意多边形的周长和面积 Loading @@ -209,10 +209,10 @@ $$ 考虑向量积的模的几何意义,我们可以利用向量积完成。 将多边形上的点逆时针标记为 $p_1,p_2,\cdots ,p_n$ ,再任选一个辅助点 $O$ ,记向量 $\vec {v_i}=p_i-O$ ,那么这个多边形面积 $S$ 可以表示为: 将多边形上的点逆时针标记为 $p_1,p_2,\cdots ,p_n$ ,再任选一个辅助点 $O$ ,记向量 $\mathbf v_i=p_i-O$ ,那么这个多边形面积 $S$ 可以表示为: $$ S=\frac{1}{2}\sum_{i=1}^n |\vec {v_i}\times \overrightarrow{v_{i\bmod n+1}}| S=\frac{1}{2}\sum_{i=1}^n |\mathbf v_i\times \mathbf v_{i\bmod n+1}| $$ ### 圆与直线相关 Loading @@ -235,9 +235,13 @@ $$ ### 极角序 !!! 例题[「JOI Spring Camp 2014 Day4」两个人的星座](https://www.ioi-jp.org/camp/2014/2014-sp-tasks/2014-sp-d4.pdf) 一般来说,这类题需要先枚举一个极点,然后计算出其他点的极坐标,在极坐标系下按极角的顺序解决问题。 #### 例题[「JOI Spring Camp 2014 Day4」两个人的星座](https://www.ioi-jp.org/camp/2014/2014-sp-tasks/2014-sp-d4.pdf) 平面内有 $n$ 个点,有三种颜色,每个点的颜色是三种中的一种。求不相交的三色三角形对数。 $6\le n\le 3000$ 。 #### 题解 如果两个三角形不相交,则一定可以做出两条内公切线,如果相交或内含是做不出内公切线的。三角形的公切线可以类比圆的公切线。 先枚举一个原点,记为 $O$ ,以这个点为极点,过这个点且与 $x$ 轴平行的直线作为极轴,建立极坐标系,把剩余点按极角由小到大排序。然后统计出在极轴上方和下方的每种点的个数。 Loading