Unverified Commit ff8e1f9d authored by wjy-yy's avatar wjy-yy Committed by GitHub
Browse files

更新了半平面交

parent cee0b082
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@

在计算几何中用向量表示,整个题统一以向量的左侧或右侧为半平面。

![半平面](http://www.wjyyy.top/wp-content/uploads/2019/02/201902132142.png)
![半平面](./images/hpi1.PNG)

### 半平面交

@@ -17,6 +17,7 @@
这就很像普通的线性规划问题了,得到的半平面交就是线性规划中的可行域。一般情况下半平面交是有限的,经常考察面积等问题的解决。

它可以理解为向量集中每一个向量的右侧的交,或者是下面方程组的解。

$$
\left\{\begin{matrix}
A_1x+B_1y+C\ge 0\\ 
@@ -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}$。

直接以向量为自变量,调用这个函数,以返回值为关键字排序,得到新的边(向量)集。

@@ -49,7 +50,7 @@ C 语言有一个库函数叫做 `atan2(double y,double x)`,可以返回 $\the

对于当前向量,如果上一个交点在这条向量表示的半平面交的**异侧**,那么上一条边就没有意义了。

![单调队列](http://www.wjyyy.top/wp-content/uploads/2019/02/201902140707.png)
![单调队列](./images/hpi2.PNG)

如上图,假设取向量左侧半平面。极角排序后,遍历顺序应该是 $\vec a\to\vec b\to\vec c$。当 $\vec a$ 和 $\vec b$ 入队时,在交点数组里会产生一个点 $D$ (交点数组保存队列中相同下标的向量与前一向量的交点)。

@@ -57,9 +58,9 @@ C 语言有一个库函数叫做 `atan2(double y,double x)`,可以返回 $\the

还有一种可能的情况是快结束的时候,新加入的向量会从队首开始造成影响。

![队首影响](http://www.wjyyy.top/wp-content/uploads/2019/02/2019021407479.png)
![队首影响](./images/hpi3.PNG)

仍然假设取向量左侧半平面。加入向量 $\vec e$ 之后,第一个交点 $G$ 就在 $\vec e$ 的右侧,我们把上面的判断标准逆过来看,就知道此时应该删除向量 $ \vec a$,也即**队首**的向量。
仍然假设取向量左侧半平面。加入向量 $\vec e$ 之后,第一个交点 $G$ 就在 $\vec e$ 的右侧,我们把上面的判断标准逆过来看,就知道此时应该删除向量 $ \vec a$,也即**队首**的向量。

最后用队首的向量排除一下队尾多余的向量。因为队首的向量会被后面的约束,而队尾的向量不会。此时它们围成了一个环,因此队首的向量就可以约束队尾的向量。