请教一个加速算法的思路

feng32tc 2014-07-04 09:55:29
问题是这样的:

在XOY平面上有一个凸多边形,其各顶点坐标均已知。在凸多边形内部有一个点P,从P引出一条射线,该射线与凸多边形的某一条边相交。设计一个算法,对于给定的凸多边形(坐标固定)和任意的的点P、射线角度theta(P的坐标、角度theta均未知),快速判断射线与多边形的哪条边相交。可以使用预处理方法,预处理的时间不算在判断时间里。内存要求:4G内存、32位系统下能够正常运行即可。

最简单的线性算法就是不进行预处理,每拿到一根射线(P, theta),逐个判断射线与凸多边形的各条边(线段)是否相交,当然这肯定是最慢的。LZ也想了一些加速算法,但是感觉都不太理想。求各位大神给点思路。
...全文
410 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
feng32tc 2014-07-07
  • 打赏
  • 举报
回复
引用 5 楼 FancyMouse 的回复:
先nlogn预处理把凸包做出来。然后对于每一个射线询问可以logn二分出来。
能实现log(N)算法加速比确实已经很高了,最大求交次数从600次降到了10次,但是能否降到1~2次呢?我之前花了点时间实现了自己想到的暴力方法,发现平均求交次数已经在2次以下了,但是就是感觉空间利用率太低,用了这么多内存感觉有些浪费。
FancyMouse 2014-07-07
  • 打赏
  • 举报
回复
先nlogn预处理把凸包做出来。然后对于每一个射线询问可以logn二分出来。
青松2 2014-07-05
  • 打赏
  • 举报
回复
得出射线(直线)的方程式,如果多边形的边和直线相交,则两个端点代入直线方式后一正一负。 我觉得这样运算量也很小啊
feng32tc 2014-07-05
  • 打赏
  • 举报
回复
引用 3 楼 lhfslhfs 的回复:
我觉得可以借用二分查找的思路
我之前想到的是一个更暴力的方法:把凸多边形所在的区域划分成一个网格,比如说100x100的 网格,再对射线角度进行划分,比说说每一度划分一格,这样就得到了一个100x100x360 的映射表。计算映射表中的每一项到底和哪条边相交。但是由于位置和角度只是近似的,所以会有误差,有的时候计算会发生错误。为了处理这种情况,映射表中存的不是一个id值,而是一个id列表,列表的长度就是多边形边的个数,其中的元素按照相交的可性性进行排序。与映射表中的那一项代表的射线相交的线段排在最前面,其它的线段,“偏差”越大就排在越后面。这样就得到了一个100x100x360x600 的超大表格(假设多边形是600边形) 这个就是我最初想到的方案,理论上速度会很快,但是太耗空间了。
青松2 2014-07-05
  • 打赏
  • 举报
回复
我觉得可以借用二分查找的思路: (1)设置起始边为p(s,1)=(p(1,1) ,p(2,2)=p(1,2),,结束边端点为p( e,1)=(p(N/2,1) ,p(e,2)=p(N/2,2), (2)判断起始边两个端点带入直线方程式的符号,如果相同,步骤(3) (3)判断结束边两个端点的符号,如果相同则步骤(4) (4)如果结束边和起始边端点符号相反, 之后就是二分查找的思路了 我没仔细思考,也不知道对不对,欢迎大家探讨
feng32tc 2014-07-05
  • 打赏
  • 举报
回复
引用 1 楼 lhfslhfs 的回复:
得出射线(直线)的方程式,如果多边形的边和直线相交,则两个端点代入直线方式后一正一负。 我觉得这样运算量也很小啊
比如说如果多边形有600条边,那就要判断600次,这样时间开销就是 O(N)。由于查询操作非常频繁,这个步骤有必要进行优化

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧