又是麻烦得要死的计算几何题,这才发现我对计算几何太不熟练了,考试时想到算法没编完,相当郁闷
题目大意:
按顺序给你一个多边形(可能为复杂多边形),要你求这个多边形的边界,这所谓的边界,就是包含原多边形覆盖到的面积,顺着边界走,多边形内部在你的左手边,而且每个边界上的点(不一定为原多边形的顶点)可以出现多次,边界可以有公共点,但不自交,按顺序输出边界上的点
分析:
这个边界的定义还算好理解吧,那么我们就顺着定义来看,它要求顺着边界走时,多边形内部在你的左边,换句话说,就是对于每条边界上的边a->b,这条向量右边再找不到与a相连的点了。有了这个好用的性质,我们就可以解决问题了,每次要新加一条边作为边界,就从上一条边的“末”端点所相连出的边中找到一个最靠右的,就可以了,直到把整个多边形封闭起来
算法:
(我编的有点蠢,还真的把每个点相连的点用邻接表存了下来,后来发现应该可以不用,直接导致考试时漏连不少边,最后也没过几个点,甚至其实连样例都过不了-_-!,但还是拿来晒晒) 扫描每条原多边形上的边i,j,若相交,则把他们的交点当成个新点,相应连边,再把每条边上产生的新点两两连边,然后确定最左下角的点(别的也可以,只要能确定一定在边界上)为起始点,为了方便,不妨虚拟一个起始边,就是起始点向下发出的即可,每次从上次选的点连到的点中,以上一条边为基准,选一个逆时针方向离自己最近的点加入边界,直到绕一圈回来。整个算法的复杂度大概是O(n2)的样子,也就是O了个边数,时间上是完全没问题的
这个题编起来好麻烦,有不少特判要加,比方说找那个逆时针方向离自己最近的点,如果不幸找的那个点就在上一条边上,就要分前后特殊处理,至于具体怎么比,我也是用的很蠢的方法,我是用叉积的正负号为第一关键字,新边与旧边的夹角cos值为第二关键字,要判的点到出发点的距离为第三关键字,由于角<180度时,余弦单调递减,而>180度时单调递增,我就用叉积求出来的正负号乘上cos值作为第二关键字就可以了,最后程序有大概110行,写的人都蠢了,不过总算是过了(其实还错了一个点,实在不想调了)
就像道长说的,计算几何算法都不麻烦,但编起来就完全不是那么一回事了。多做点题,熟悉熟悉题型,积累一些小技巧,考试才能不怕这个计算几何