求助:一些点的最小外接圆

wxw0827 2010-08-11 10:05:58
我有一些点的坐标,想用一个圆把这些点包起来,,


当然了,这个圆要最小的,,

我该怎么做呢?

那位高人能把程序给一下,,谢谢,,


vc6.0编程
...全文
589 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxw0827 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jennyvenus 的回复:]
那么多点是比较难了,简单算法时间太长,以前写了个穷举算法,贴在了blog上,不知道得罪谁了,老有个人匿名去骂,一生气删了。
[/Quote]
你还有没有原稿啊,,

能不能在贴一下,,谢谢,,
wxw0827 2010-08-13
  • 打赏
  • 举报
回复
下周二结贴,,各位在等等。。。

谢谢,,
用户 昵称 2010-08-12
  • 打赏
  • 举报
回复
那么多点是比较难了,简单算法时间太长,以前写了个穷举算法,贴在了blog上,不知道得罪谁了,老有个人匿名去骂,一生气删了。
shexinwei 2010-08-12
  • 打赏
  • 举报
回复
1.将所有点的横坐标排序,找出最大值,最小值,并求出差值。
2.将所有点的纵坐标排序,找出最大值,最小值,并求出差值。
3.取两者中差值较大者的值作为直径的值,并据此确立圆心坐标,即可。
Eleven 2010-08-12
  • 打赏
  • 举报
回复
从这些点中先要得到最小矩形(左上角的点<最左边的点,最上面的点>,右下角的点<最右边的点,最下面的点>),矩形得到了CRect::CenterPoint()就得到中心点,半径应该很容易吧,圆就出来了
sunlin7 2010-08-12
  • 打赏
  • 举报
回复
不好意思,上面的证错了~~
sunlin7 2010-08-12
  • 打赏
  • 举报
回复
我觉得直接找两个距离最大的点所确定的线段作为圆的直径即可。

即:计算这些点两两之间的距离,找到距离最大的两个点。这个点作为一个圆的直径两个端点,这样就可以确定一个最小的且包含所有点的圆。

简证:(反证法)已知A1,A2是{An}中距离最大的两个点。假设A3不在A1,A2确定的圆内,设d(x,y)表示点x,y之间的距离,则d0=max{d(A1,A3), d(A2,A3)},必有 d0 > d(A1,A2), 这与d(A1, A2)是{An}中距离最大的两个点矛盾!这样的A3不存在,得证。

实际计算的时候,可以利用2ab <= a^2+b^2 <= (a+b)^2来进行粗略比较。
wxw0827 2010-08-12
  • 打赏
  • 举报
回复
谢谢楼上的回答,,我的点有1000多个吧,,

看看有没有好的算法,,

理论基础,,,
xjtuzhw 2010-08-12
  • 打赏
  • 举报
回复
先用矢量直线连接点,使得所有点都在矢量直线的左边(或右边),成为一个封闭的图形,然后求这个封闭图形的最小外接圆
jyh_baoding 2010-08-12
  • 打赏
  • 举报
回复
求任意两点间距离啊,最大的作为直径做圆,不知行不行
acdbxzyw 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jcily 的回复:]

以下引用网上网友的回答

第一个问题很简单,是最小覆盖问题MINC的一个简单特例,一个简单的算法是过S的每三点作一个圆,并检验其余的点是否在圆内,这个算法的复杂度是O(n^4),Elzinga和Hearn提出的算法将此界限改进到了O(n^2),这个算法的主要思想是减少需要验证的三元组的数目。另外,Shamos还设计一个O(nlogn)的算法,该算法利用了这个特性:包围所有S点的最小圆是唯一的……
[/Quote]
厉害,也不简单呐。。。
Hiiishe 2010-08-11
  • 打赏
  • 举报
回复
以下引用网上网友的回答

第一个问题很简单,是最小覆盖问题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)


第二个问题就是求凸包,有很多经典算法。
半刻沙漏 2010-08-11
  • 打赏
  • 举报
回复
我个人觉得可以把所有点的坐标加起来 求个平均 作为圆心 然后找到离这个点最远的一个点 之间距离作为半径 画圆 不过运算量可能不较大 看你多少点了

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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