matlab练习程序(Ritter‘s最小包围圆)

原始算法是sphere,我这里简化为circle了。

Ritter‘s求最小包围圆为线性算法,因为非常简单,所以应用非常广泛。

该算法求出的圆比最优圆大概会大个5%到20%左右,求最优圆应该可以用Bouncing Bubble算法,以后有机会可以尝试一下。

Ritter‘s算法如下:

1.从点集中随机选出两个点作为直径对圆进行初始化。

2.判断下一个点p是否在圆中,如果在则继续本步骤,如果不在则进行步骤3。

3.使用p作为新圆的一个边界点,另一个边界点为距离p最远的圆上的点,使用这两个点作为直径构造新圆。

4.继续步骤2,直到遍历完所有点。

结果如下:

matlab代码如下:

clear all;close all;clc;

n=100;
p=rand(n,2);

p1=p(1,:);
p2=p(2,:);
r=sqrt((p1(1)-p2(1))^2+(p1(2)-p2(2))^2)/2;
cenp=(p1+p2)/2;

for i=3:n
    newp=p(i,:);
    d=sqrt((cenp(1)-newp(1))^2+(cenp(2)-newp(2))^2);
    if d>r
        r=(r+d)/2;
        cenp=cenp+(d-r)/d*(newp-cenp);
    end
end

hold on;
plot(p(:,1),p(:,2),‘o‘);
x0=cenp(1);
y0=cenp(2);
theta=0:0.01:2*pi;
x=x0+r*cos(theta);
y=y0+r*sin(theta);
plot(x,y,‘-‘,x0,y0,‘.‘);
axis equal

参考:http://en.wikipedia.org/wiki/Bounding_sphere

时间: 2024-10-12 03:15:05

matlab练习程序(Ritter‘s最小包围圆)的相关文章

平面点集的最小包围圆 hdu 3932

最小覆盖圆算法地址:http://soft.cs.tsinghua.edu.cn/blog/?q=node/1066 平面点集的最小包围圆 1.           问题背景 考察固定在工作平台上的一直机械手,要捡起散落在不同位置的多个零件,并送到别的地方.那么,这只机械手的底座应该选在哪里呢?根据直觉,应该选在机械手需够着的那些位置的"中心".准确地讲,也就是包围这些点的那个最小圆的圆心----该位置的好处是,可使机械手的底座到它需要够着的那些点的最大距离最小化.于是可得如下问题:给

Opencv源码之平面点集的最小包围圆

平面点集的最小包围圆 --Cracent整理 2016.5.28 目录 1.问题背景.... 1 2.算法及原理.... 1 3.算法(摘自OPENCV)... 1 4.基础数学知识.... 7 三角形的外心.... 7 三角形的三条垂直平分线必交于一点.... 7 三角形的外心的性质.... 7 三角形的内心.... 8 证明.... 8 性质.... 8 三角形的垂心.... 8 三角形的三条高必交于一点.... 9 三角形的垂心的性质.... 9 三角形的重心.... 10 三角形的三条中

matlab练习程序(矩形变换为圆)

最近对图像坐标的变换很感兴趣啊,这次是将一张图像变换为圆形. 变换原理就是按变换前后像素到圆心的距离按比例缩减就行了. 改变x,y方向上的系数,应该还可以变换为椭圆,不过我还没有尝试. 注意我这里相当于缩小图像了,所以用的是正向插值,如果想生成一个大圆,还是需要逆向插值的. 原图如下: 处理后效果: matlab代码如下: clear all;close all;clc; img=imread('lena.jpg'); [h w]=size(img); imshow(img); imgn=zer

matlab练习程序(三点确定圆)

中学内容. 三角形两边的垂直平分线就能确定圆. 结果如下: matlab代码如下: clear all;close all;clc; p=rand(3,2); cen1=(p(1,:)+p(2,:))/2; %三角形一条边中点 cen2=(p(2,:)+p(3,:))/2; %另一条边中点 k1=-1/((p(1,2)-p(2,2))/(p(1,1)-p(2,1))); %一条边垂直平分线 b1=cen1(2)-k1*cen1(1); k2=-1/((p(2,2)-p(3,2))/(p(2,1)

matlab练习程序(最小包围矩形)

又是计算几何,我感觉最近对计算几何上瘾了. 当然,工作上也会用一些,不过工作上一般直接调用boost的geometry库. 上次写过最小包围圆,这次是最小包围矩形,要比最小包围圆复杂些. 最小包围矩形可不一定是个直立的矩形,也可能像下图一样是倾斜的. 求法如下: 1.求多边形凸包,这里凸包直接调用系统函数了,细节可以参考这里,虽然当时写的不怎么样. 2.将凸包两个相邻的点连线作为矩形一条边. 3.寻找凸包上距离已得到的边最远的点,过该点做平行线,得到矩形第二条边. 4.将凸包上点向已求得的边投影

matlab练习程序(生成黑白网格)

提供了两种生成方法,一个是自己编程实现,比较灵活:另一个是调用系统的checkerboard函数,似乎只能生成8*8网格. 至于用途,也许可以用来下国际象棋. 自己函数生成: 系统函数生成: 代码如下: clear all;close all;clc h=256; w=256; n=8; img=zeros(h,w); flag=1; for y=1:h for x=1:w if flag>0 img(y,x)=255; end if mod(x,int8(w/n))==0 flag=-flag

matlab练习程序(旋转、径向模糊)

还记得过去写过径向模糊,不过当时效果似乎不好. 这次效果还可以,程序中用的算法是: 1.求当前处理点和图像中心点之间的距离r与角度ang; 2.通过对r的修改得到径向模糊. 3.通过对ang的修改得到旋转模糊. 一看代码就能全部明白,不仔细解释了. 原图如下: 处理后效果: matlab代码如下: clear all;close all;clc img=imread('lena.jpg'); [h w]=size(img); imshow(img) imgn=zeros(h,w); for y=

matlab练习程序(弧形投影)

这个其实也算是圆柱体投影了,不过上一篇文章是从正面看,得到的是凸形的结果,而这个是从反面看,得到的是凹形的结果. 计算公式就不写了,大致介绍一下,计算公式中关于x坐标求法和上篇一样,y坐标则正好是上篇公式的反变换,结合上篇公式代码和本篇的代码,应该都不是很难理解的. 下面是hfOV为pi/2时得到的变换结果: 原图: 处理后结果: matlab代码如下: clear all; close all;clc; img=imread('lena.jpg'); [h,w]=size(img); hfOV

(转)matlab练习程序(HOG方向梯度直方图)

matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram of Oriented Gradient)方向梯度直方图,主要用来提取图像特征,最常用的是结合svm进行行人检测. 算法流程图如下(这篇论文上的): 下面我再结合自己的程序,表述一遍吧: 1.对原图像gamma校正,img=sqrt(img); 2.求图像竖直边缘,水平边缘,边缘强度,边缘斜率. 3.