计算几何, 算法分析

HOVERKSY 2010-04-14 02:08:35
简单多边形 p被称做星形多边形(star-shaped), 如果其中存在某个点q,使得对于该多边形内的任何点P, 线段pq完全落在p内. 给出一个算法,判断任何给定的简单多边形是否为一个星形多边形. 该算法的期望运行时间必须是线性的.
...全文
232 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
liukehua123 2010-04-16
  • 打赏
  • 举报
回复
经典问题,UP……
knate 2010-04-15
  • 打赏
  • 举报
回复

楼上的能不能给我解释一下,
这两个图形,你是怎么划分的,实在看不懂你写的术语
超级大笨狼 2010-04-15
  • 打赏
  • 举报
回复
半平面判断是否和凸包相交,取凸包最靠(左/右)的顶点就可以,不需要判断所有顶点,所以是T(n
超级大笨狼 2010-04-15
  • 打赏
  • 举报
回复
所以才建议你买书啊

http://academic.research.microsoft.com/Paper/271274.aspx?query=star-shaped

这篇文章你可以看看,是把一个空心汉字"至"字分解成星形多边形的.
超级大笨狼 2010-04-15
  • 打赏
  • 举报
回复
三角化,同时可以找到所有耳
找到凸包最左或者最右的点Max,这一切都在 O(n)内完成。

再用m个耳的延长线形成的半平面去检测Max,注意:只有一个Max,循环的是m,所以Q(m)

总体复杂度是O(n)+Q(m) 其中m是耳的 数量,m<=n

所以是线性的
超级大笨狼 2010-04-15
  • 打赏
  • 举报
回复
要对O(n)条线判断是否和凸包相交,是O(n)

因为,你找到凸包最左或者最右的点,需要O(n)时间。

然后循环判断N个射线,都是拿这个点就可以了 。

判断这点是在两条射线区域的左还是右就可以了。需要Q(1)时间忽略不计。
情况1: 。/\
情况2: /。\
情况3: /\。
从点向x轴最大方向引抽象射线,就可以知道这点在线段的左还是右。就知道是否相交,不需要求交点。
GCCFeli 2010-04-15
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 superdullwolf 的回复:]

这个问题其实是求“凸包”和“半平面”是否相交的问题。
首先要明确:“凸包”是“星形”的,而且“核”就是本身。

对于任意“简单多边形”,可以“三角化”去掉“耳”,就是从一点出发,遇到角大于180的就不管,遇到小于180,就去掉这个三角,回到出发点,得到一个凸包。复杂度O(n)

然后,对每个“凸点”的延长线构成的半平面判断是否和凸包相交。

判断“相交”比求“交点”容易多了,只要取……
[/Quote]

大哥,你说的这个“耳”是什么意思呢?而且,你没说从一个点出发是顺时针走还是逆时针走……你说的去“耳”完毕之后得到一个凸包,这个凸包的点数是O(n)的吧,要对O(n)条线判断是否和凸包相交,要O(n^2)吧?怎么是O(n)的呢?
超级大笨狼 2010-04-14
  • 打赏
  • 举报
回复
这个问题其实是求“凸包”和“半平面”是否相交的问题。
首先要明确:“凸包”是“星形”的,而且“核”就是本身。

对于任意“简单多边形”,可以“三角化”去掉“耳”,就是从一点出发,遇到角大于180的就不管,遇到小于180,就去掉这个三角,回到出发点,得到一个凸包。复杂度O(n)

然后,对每个“凸点”的延长线构成的半平面判断是否和凸包相交。

判断“相交”比求“交点”容易多了,只要取凸包的顶点向x轴引射线,有单数个交点就是在里边,偶数就穿出去了。

所以以上总体复杂度是O(n)+T(n)线性的。

建议买本《计算几何》或者也叫《算法几何》看看,北理工周培德老师的不错,就是有点难。
上边所有带引号的,都是计算几何的概念或术语,请自行查找。


jakiejiajia 2010-04-14
  • 打赏
  • 举报
回复
先占个位置,明天再说
sosidami 2010-04-14
  • 打赏
  • 举报
回复
半平面求交的方法可以过,但好像不是线性的吧!
jeromeyu 2010-04-14
  • 打赏
  • 举报
回复
顶一个,高手来解析一下!
GCCFeli 2010-04-14
  • 打赏
  • 举报
回复
我觉得用随机化的半平面交,期望应该是线性的。
GCCFeli 2010-04-14
  • 打赏
  • 举报
回复
这个问题很经典,我有个做法是nlogn的,就是把多边形的每条边看作半平面,求半平面交,如果交出来的面积>0那么就是星形多边形。线性做法我还要想想
yaoweijq 2010-04-14
  • 打赏
  • 举报
回复
判定方法是先将所有边两两求出交点,然后依次判断这些交点是不是中点,只要有一个是,多边形就是星形多边形,否则就不是。因为可以证明,只要是星形多边形,这些交点中至少有一个一定是其中点。

判断P点是否是中点的方法是:所有顶点与P点之间连一条线,若有连线不全在多变形内,则不是中点。这个问题又可以转化为按一定的顺序(顺时针或逆时针)遍历每条边,看P点是否在所有边的同一侧(右侧或左侧),是的话,P就是中点

学习中。。。
HOVERKSY 2010-04-14
  • 打赏
  • 举报
回复
楼上大哥能给出具体算法吗?
超级大笨狼 2010-04-14
  • 打赏
  • 举报
回复
其实就是在里边可以放个灯泡照亮所有角落.

33,027

社区成员

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

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