出处:http://blog.csdn.net/acmaker/article/details/3561131
凸多边形矢量和
给定平面上两个凸多边形 P 和 Q , P 和 Q 的矢量和, 记为 P + Q 定义如下:多边形矢量和在 motion planning 中也称为 Minkowski 总数。
考虑上述的定义, 许多问题可以通过询问集合 P + Q 的组成, 他拥有的性质等等。 下属结果帮助我们描述多边形矢量和。
- P + Q 是一个凸多边形。
- 顶点集 P + Q 是顶点集 P 和 Q 的和。
- 顶点集 P + Q 是 P 和 Q 间的并踵点对集。
- 给定分别有 m 和 n 个顶点的 P 和 Q , P + Q 有不多于 m + n 个顶点。
最后, 下属结论不仅仅描述了这个问题, 同时也提供了一个一个个顶点的增量式计算矢量和的计算方法。
给定 P + Q 集合的第 k 个向量 z(k), 满足 z(k) = p(i) + q(j)。 构造在 p(i) 和 q(j) 处构造两条平行切线, 使得多边形同时位于各自线的右侧。 两条线分别在 p(i) 和 q(j) 处确定了角 theta(i) 和 phi(j) (如下图所示)
因此下一个向量 z(k+1) 等于:
- p(i+1) + q(j) 若 theta(i) < phi(j)
- p(i) + q(j+1) 若 theta(i) > phi(j)
- p(i+1) + q(j+1) 若 theta(i) = phi(j)
下述的多边形和他们的矢量和作为一个例子。
两个凸多边形。 第一个多边形的边用红色标记, 第二个用蓝色。
上述多边形的矢量和。 其边的颜色与原多边形的一致。
用上述的结果, 我们十分容易的就能构造出一个算法来计算矢量和。 第一个向量可以是在给定方向上边界向量的和(如 y 轴负方向)。 切线构造后, 在计算角度时候更新, 下一个点就很明确了。 我们需要做的只是同时旋转两条线到新的位置来确定新的角度。
算法的正确性来自主要的结论; 他是线性时间复杂度的, 因为每一步只有一个所要求的向量和集合中的向量被确定, 并且他们只有 m + n 个, 因此总运行时间是 m + n 。