最小包围圆,很简单的呀

qiaoyu2k 2001-06-19 08:45:00
平面上有个n点
1。求一包围所有点的圆,使其面积最小。
2。求一包围所有点的凸多边形,使其面积最小。
不知道是否已经有了成熟的算法.
...全文
867 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
starfish 2001-06-20
  • 打赏
  • 举报
回复
sorry,写错了,上面倒数第二句话应该是:

S1耗时O(nlogn),S2耗时O(n),S3耗时O(nlogn),S4耗时O(n),因此复杂度是O(nlogn)
starfish 2001-06-20
  • 打赏
  • 举报
回复
第一个问题很简单,是最小覆盖问题MINC的一个简单特例,一个简单的算法是过S的每三点作一个圆,并检验其余的点是否在圆内,这个算法的复杂度是O(n^4),Elzinga和Hearn提出的算法将此界限改进到了O(n^2),这个算法的主要思想是减少需要验证的三元组的数目。另外,Shamos还设计一个O(nlogn)的算法,该算法利用了这个特性:包围所有S点的最小圆是唯一的,且该圆或者通过3个S中的点或者2个S中的点,并且这两个S中的点恰是该园直径的两个端点。
算法:
S1。计算点集S的凸壳CH(S);
S2。计算CH(S)的直径,设为(pi,pj),以(pi,pj)为直径作圆C,如果S点都在C内,则C就是所求最小园;否则转S3;
S3。计算点集S的最远点意义下的Voronoi圆,即Vor(n-1,S);
S4。设点v时Vor(n-1,S)中的一个Voronoi点,以v为圆心,v至S点集中3个最远点的距离为半径作圆,该园就是所求。
S1耗时O(nlogn),S2耗时O(n),S3耗时O(nlogn),S4耗时O(n),因此复杂度是O(logn)


第二个问题就是求凸包,有很多经典算法。
Michael_yu 2001-06-20
  • 打赏
  • 举报
回复
问题一:
1)求包围所有点的距形;
for(int i =0;i<pointNumber;i++)
{
Rect.left = min(Rect.left,pt[i].x);
Rect.right = max(Rect.right,pt[i].x);
Rect.top = min(Rect.top,pt[i].y);
Rect.bottom = max(Rect.bottom,pt[i].y);
}
2)做距形的外切圆。

问题二
1)把平面的点分成两个集合A(n),B(0);
2)从A(n)任意取三点到B(0) =》A(n-3),B(3);
在B中就形成了一个多边形(三角形).
3)从A中任意取pt[i]一点到B;
a)如果pt[i]在B.Region内,不用调整B.Region;
b)如果pt[i]在B.Region外,调整B.Region;
4)重复3)直到取光;
5)B.Region应该是最小的多边形。
但不知道是凸多边形还是凹多边形。
tangdaqu 2001-06-20
  • 打赏
  • 举报
回复
我觉得应该这样:
找不在同一直线上的三点,三点可确定一个圆,即外接圆。然后判断其它点是否在在圆内即可
若在完成,若不在在继续循环!

同理,找多边形时,先确定一个三角形。然后判断,开始循环,一个点若在多边形内则通过,不在则把这个点扩展到这个多边形里,即作为多边形的一个顶点,继续循环,直到没有点在多边形内。

我这仅是算法思想,若你还需要具体算法,请在说一声!
ruor 2001-06-19
  • 打赏
  • 举报
回复
顺便问问:对我的这个问题有什么看法?http://www.csdn.net/expert/topic/153/153902.shtm
ruor 2001-06-19
  • 打赏
  • 举报
回复
问题二应该就是求平面点集的凸壳吧?采用分治法O(nlogn).问题一等于求平面点集的直径,求出凸壳先,然后比较各对角线O(n^2);或者对凸壳采用夹角序列法O(n)求出直径.参考周培德著<计算几何>ISBN 7-302-03801-5
qiaoyu2k 2001-06-19
  • 打赏
  • 举报
回复
因该很简单的呀

33,006

社区成员

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

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