【test0724】求复杂多边形的边界

又是麻烦得要死的计算几何题,这才发现我对计算几何太不熟练了,考试时想到算法没编完,相当郁闷

题目大意:

      按顺序给你一个多边形(可能为复杂多边形),要你求这个多边形的边界,这所谓的边界,就是包含原多边形覆盖到的面积,顺着边界走,多边形内部在你的左手边,而且每个边界上的点(不一定为原多边形的顶点)可以出现多次,边界可以有公共点,但不自交,按顺序输出边界上的点

分析:

      这个边界的定义还算好理解吧,那么我们就顺着定义来看,它要求顺着边界走时,多边形内部在你的左边,换句话说,就是对于每条边界上的边a->b,这条向量右边再找不到与a相连的点了。有了这个好用的性质,我们就可以解决问题了,每次要新加一条边作为边界,就从上一条边的“末”端点所相连出的边中找到一个最靠右的,就可以了,直到把整个多边形封闭起来

算法:

      (我编的有点蠢,还真的把每个点相连的点用邻接表存了下来,后来发现应该可以不用,直接导致考试时漏连不少边,最后也没过几个点,甚至其实连样例都过不了-_-!,但还是拿来晒晒) 扫描每条原多边形上的边i,j,若相交,则把他们的交点当成个新点,相应连边,再把每条边上产生的新点两两连边,然后确定最左下角的点(别的也可以,只要能确定一定在边界上)为起始点,为了方便,不妨虚拟一个起始边,就是起始点向下发出的即可,每次从上次选的点连到的点中,以上一条边为基准,选一个逆时针方向离自己最近的点加入边界,直到绕一圈回来。整个算法的复杂度大概是O(n2)的样子,也就是O了个边数,时间上是完全没问题的

 

这个题编起来好麻烦,有不少特判要加,比方说找那个逆时针方向离自己最近的点,如果不幸找的那个点就在上一条边上,就要分前后特殊处理,至于具体怎么比,我也是用的很蠢的方法,我是用叉积的正负号为第一关键字,新边与旧边的夹角cos值为第二关键字,要判的点到出发点的距离为第三关键字,由于角<180度时,余弦单调递减,而>180度时单调递增,我就用叉积求出来的正负号乘上cos值作为第二关键字就可以了,最后程序有大概110行,写的人都蠢了,不过总算是过了(其实还错了一个点,实在不想调了)

就像道长说的,计算几何算法都不麻烦,但编起来就完全不是那么一回事了。多做点题,熟悉熟悉题型,积累一些小技巧,考试才能不怕这个计算几何

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值