pku3502 多边形扩展 + 点在多边形内
评论23次阅读2008.09.09 22:00; 作者:Felicia
amath
这个题的做法是二分答案`r`,然后把每个多边形往外扩展r距离,看看扩展后的所有多边形能不能覆盖题目给的路径。注意,扩展后的“多边形”已经不是一般的多边形了,它的顶角可能是圆的,我们称之为圆角多边形。
直接存储圆角多边形结构非常麻烦,可以将其等价为原多边形+每条边往外扩展的矩形+每个顶点往外扩展的圆。这些形状虽然可能互相重叠,但是不影响答案,而且这些基本形状都比较便于处理。
于是问题归约为判断一条线段是否被多边形和圆覆盖。我们先求出每个形状(多边形或圆)在这条线段上截出的区间(归一化到`[0, 1]`内),然后对所有区间求并。如果区间并的长度等于1,线段就算被覆盖了。
怎样取得多边形在线段上截出的区间呢?可以先求出多边形和线段的所有交点,将其排序,然后判断相邻两点的中点是否在多边形内部,若是,这两点就构成了一个区间。
取得圆在线段上截出的区间更简单些,因为最多只有两个交点。
这个算法中,判断点是否在多边形内部是非常底层的运算,需要把常数优化的非常好。推荐射线法。
endamath
发表回复

- 评论 (0)
- 引用通告 (0)
发表评论 引用通告暂无评论.
暂无引用通告