Loading docs/geometry/half-plane-intersection.md +6 −5 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ 在计算几何中用向量表示,整个题统一以向量的左侧或右侧为半平面。   ### 半平面交 Loading @@ -17,6 +17,7 @@ 这就很像普通的线性规划问题了,得到的半平面交就是线性规划中的可行域。一般情况下半平面交是有限的,经常考察面积等问题的解决。 它可以理解为向量集中每一个向量的右侧的交,或者是下面方程组的解。 $$ \left\{\begin{matrix} A_1x+B_1y+C\ge 0\\ Loading @@ -35,7 +36,7 @@ $$ ### 极角排序 C 语言有一个库函数叫做 `atan2(double y,double x)`,可以返回 $\theta\in (-\pi,\pi]$,$\theta =\arctan \frac{y}{x}$。 C 语言有一个库函数叫做 `atan2(double y,double x)`,可以返回 $\theta\in (-\pi,\pi]$,$\theta =\arctan \frac{y}{x}$。 直接以向量为自变量,调用这个函数,以返回值为关键字排序,得到新的边(向量)集。 Loading @@ -49,7 +50,7 @@ C 语言有一个库函数叫做 `atan2(double y,double x)`,可以返回 $\the 对于当前向量,如果上一个交点在这条向量表示的半平面交的**异侧**,那么上一条边就没有意义了。   如上图,假设取向量左侧半平面。极角排序后,遍历顺序应该是 $\vec a\to\vec b\to\vec c$。当 $\vec a$ 和 $\vec b$ 入队时,在交点数组里会产生一个点 $D$ (交点数组保存队列中相同下标的向量与前一向量的交点)。 Loading @@ -57,9 +58,9 @@ C 语言有一个库函数叫做 `atan2(double y,double x)`,可以返回 $\the 还有一种可能的情况是快结束的时候,新加入的向量会从队首开始造成影响。   仍然假设取向量左侧半平面。加入向量 $\vec e$ 之后,第一个交点 $G$ 就在 $\vec e$ 的右侧,我们把上面的判断标准逆过来看,就知道此时应该删除向量 $ \vec a$,也即**队首**的向量。 仍然假设取向量左侧半平面。加入向量 $\vec e$ 之后,第一个交点 $G$ 就在 $\vec e$ 的右侧,我们把上面的判断标准逆过来看,就知道此时应该删除向量 $ \vec a$,也即**队首**的向量。 最后用队首的向量排除一下队尾多余的向量。因为队首的向量会被后面的约束,而队尾的向量不会。此时它们围成了一个环,因此队首的向量就可以约束队尾的向量。 Loading Loading
docs/geometry/half-plane-intersection.md +6 −5 Original line number Diff line number Diff line Loading @@ -8,7 +8,7 @@ 在计算几何中用向量表示,整个题统一以向量的左侧或右侧为半平面。   ### 半平面交 Loading @@ -17,6 +17,7 @@ 这就很像普通的线性规划问题了,得到的半平面交就是线性规划中的可行域。一般情况下半平面交是有限的,经常考察面积等问题的解决。 它可以理解为向量集中每一个向量的右侧的交,或者是下面方程组的解。 $$ \left\{\begin{matrix} A_1x+B_1y+C\ge 0\\ Loading @@ -35,7 +36,7 @@ $$ ### 极角排序 C 语言有一个库函数叫做 `atan2(double y,double x)`,可以返回 $\theta\in (-\pi,\pi]$,$\theta =\arctan \frac{y}{x}$。 C 语言有一个库函数叫做 `atan2(double y,double x)`,可以返回 $\theta\in (-\pi,\pi]$,$\theta =\arctan \frac{y}{x}$。 直接以向量为自变量,调用这个函数,以返回值为关键字排序,得到新的边(向量)集。 Loading @@ -49,7 +50,7 @@ C 语言有一个库函数叫做 `atan2(double y,double x)`,可以返回 $\the 对于当前向量,如果上一个交点在这条向量表示的半平面交的**异侧**,那么上一条边就没有意义了。   如上图,假设取向量左侧半平面。极角排序后,遍历顺序应该是 $\vec a\to\vec b\to\vec c$。当 $\vec a$ 和 $\vec b$ 入队时,在交点数组里会产生一个点 $D$ (交点数组保存队列中相同下标的向量与前一向量的交点)。 Loading @@ -57,9 +58,9 @@ C 语言有一个库函数叫做 `atan2(double y,double x)`,可以返回 $\the 还有一种可能的情况是快结束的时候,新加入的向量会从队首开始造成影响。   仍然假设取向量左侧半平面。加入向量 $\vec e$ 之后,第一个交点 $G$ 就在 $\vec e$ 的右侧,我们把上面的判断标准逆过来看,就知道此时应该删除向量 $ \vec a$,也即**队首**的向量。 仍然假设取向量左侧半平面。加入向量 $\vec e$ 之后,第一个交点 $G$ 就在 $\vec e$ 的右侧,我们把上面的判断标准逆过来看,就知道此时应该删除向量 $ \vec a$,也即**队首**的向量。 最后用队首的向量排除一下队尾多余的向量。因为队首的向量会被后面的约束,而队尾的向量不会。此时它们围成了一个环,因此队首的向量就可以约束队尾的向量。 Loading