View License

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video

Highlights from
A suite of minimal bounding objects

4.9 | 16 ratings Rate this file 106 Downloads (last 30 days) File Size: 268 KB File ID: #34767 Version: 1.2
image thumbnail

A suite of minimal bounding objects


John D'Errico (view profile)


25 Jan 2012 (Updated )

Suite of tools to compute minimal bounding circles, rectangles, triangles, spheres, incircles, etc.

| Watch this File

File Information

I've written quite a few separate tools to generate a minimal bounding object of some ilk. So if you have a set of points in the plane, and wish to generate the minimal bounding...
- rectangle
- triangle
- general quadrilateral
- circle
- parallelogram
- semi-circle

there is a tool in here to solve your task efficiently. You will also find minboundsphere, for 3-d data. Inscribed objects are also supported, computed by incircle and insphere.

Caveat - if you have only an image, don't expect these tools to work directly. (The image processing toolbox can do much here anyway - look there first.) In order to use these tools, I require a set of extracted points.


This file inspired Polarizability Gui5 and Minimal Bounding Box.

MATLAB release MATLAB 7.5 (R2007b)
Tags for This File   Please login to tag files.
Please login to add a comment or rating.
Comments and Ratings (31)
05 Dec 2016 deru jian

19 Oct 2016 Brandon

Great for my 2D tasks. I am going to try to make a 3D version of your minboundrect(). Wish me luck!!

03 Oct 2016 M. F.

M. F. (view profile)

Works like a charm!

11 Aug 2016 Ryan Snowden


Code worked perfectly for a min bounded rectangle around my disc image. For my purposes though I also need to be able to transform my disc shape so that it has the same dimensions as its bounding rectangle. Do you have any advice for how I could achieve this once the bounding rectangle has been generated?

Comment only
09 Apr 2016 ideasensor

Dear John, many thanks! Could you please name a reference paper for the minimum bounding circle used in your code minboundcircle.m? Thanks again!

05 Apr 2016 Image Analyst

Image Analyst (view profile)

I second Tom Trantor's request for a version that finds the largest shape WITHIN a polygon (except that I don't want the shape to bulge through in between vertices). For one project I need the smallest exterior rectangle, and the largest interior rectangle that can fit inside an irregular shape (a binary image). Here is one algorithm:

02 Jun 2015 Daniel Leventhal

there is a bug in minboundquad, after line 122 and before line 127 (edgelist = nchoosek(1:nedges,4);). nedges needs to be reset to account for edges eliminated in the preceding step. Need to add "nedges = length(edgeangles);" after line 122 to fix, I think.

Once I did that, works great! Solved a big problem for me.

Comment only
09 Feb 2015 Ryan Price

Hi, thanks for this. I believe I have also found a typo in minboundcircle(). On line 136 you set radius = old.radius(1); when in fact I think you meant to type radius = old.rads(1); Otherwise you produce an error: Reference to non-existent field 'radius'.

26 Jan 2015 Pete

Pete (view profile)

06 Dec 2014 Andrew Chuang

29 Nov 2014 Yuri

Yuri (view profile)

convhulln is failing in minboundsphere if there are some points with the same XYZ. I have to run minboundsphere(unique(xyz,'rows')) to avoid convhulln crashing. Here is example:
minboundsphere([ 0.8726 0.4577 -0.1708
0.8761 0.4610 -0.1411
0.8761 0.4610 -0.1411
0.8761 0.4610 -0.1411
0.8761 0.4610 -0.1411

20 Oct 2014 John D'Errico

John D'Errico (view profile)

Hi Tom,

The problem is as you point out, that the insphere code uses a dot product to find the distance to each facet. Then it is a simple call to linprog, with one slack variable for each facet.

A similar idea for edges though trips up becasue each edge has two normals. So then the distance to each edge is now the sqrt of the sum of squares of a pair of dot products. While I can avoid the sqrt, such a formulation would involve quadratic equality constraints for each slack variable. Clearly this is not solvable by linprog, or even quadprog. Fmincon would be needed, so a bit more nasty of a problem using a similar formulation to the one in insphere. Certainly one could use the existing insphere code to find decent starting values for such an iterative solution, but it is still a bit more work.

I'll need to think if there is another scheme that might apply.


Comment only
20 Oct 2014 Tom Tranter

Hi John,
Thanks for this submission, it's helped me a lot with a problem I'm working on. I was wondering if the insphere function could be adapted to find the largest sphere bound within the edges of the polygon rather than the faces, as if the polygon were a cage with the sphere bulging through the hollow faces. I'm not too sure how to approach this as the edge normals are not defined in 3D.

30 May 2014 Anton Semechko

Anton Semechko (view profile)

Hi John, I sent you an e-mail to the electronic address provided on your Matlab profile. In that e-mail I attached a point cloud for which 'minboundsphere' fails almost consistently.

Comment only
28 May 2014 John D'Errico

John D'Errico (view profile)


Please send me some cases where it fails, and I will fix it.


Comment only
28 May 2014 Anton Semechko

Anton Semechko (view profile)

Hi John, I ran your 'minboundsphere' function a number of times (for 8 different meshes) and observed that occasionally it fails to produce a minimum bounding sphere that encloses all of the points. In some of these cases, the distance for 5% of the points is a factor of 1.1 greater than the computed radius.

Comment only
27 May 2014 Anton Semechko

Anton Semechko (view profile)

Thanks John! Great submission. I found your function to find minimum bounding spheres especially useful.

23 May 2014 John D'Errico

John D'Errico (view profile)


I can't replicate the cycle that you found with those points, but with only 7 digits printed, the numbers I used were not the same as those you used.

Regardless, I used your idea of maintaining a history that should catch any such problem. I need only keep a small subset of the active sets to catch a cycle, so there is no problem. I've posted a new version to appear tomorrow.

Comment only
22 May 2014 Sebastien Roy

Nice suite, but minboundcircle can hit an infinite loop in the while section. It happens with this set:

X =


Y =


This set results in an oscillation between two wrong solutions.

Maybe the function could track the active sets already considered and jump out of the loop if a repeated state is found. Unfortunately, such solution can lead to a huge stack of past active sets.

Comment only
05 May 2014 Spigge

Spigge (view profile)

Very useful suite John, thanks. Sometimes one would like to exclude outliers, i.e., points far out from the group of interest. If I were to include say only 90% of the total number of points in a bounding circle, what would be the best strategy you recon?

Comment only
14 Oct 2013 John D'Errico

John D'Errico (view profile)

Why modify any code, a silly thing to do since it is completely unnecessary? You must first identify the points of interest. Once that is done, pass those locations into the code. All of this takes little more than a single call to find on your part.

Comment only
14 Oct 2013 Tallha Akram


Code works find for the data points. How can i modify current code for image data?

Comment only
18 Sep 2013 John D'Errico

John D'Errico (view profile)

minboundrect returns a polygon, so the vertices of the bounding rectangle in (x,y) coordinates, as a polygon in the standard form that matlab uses in any tool that works with a polygon (look for example at inpolygon.)

Comment only
17 Sep 2013 Maayan

Maayan (view profile)

Hi, I'm trying to use the miniboundrect file but i don't understand how the vectors of points that i receive from the function define the minimal rectangle.

28 Feb 2013 Sven

Sven (view profile)

John, just a heads-up that MATLAB 2013a pre-release doesn't like calling convhull with those short options any more...

Error using convhull
CONVHULL no longer supports or requires Qhull-specific options.
Please remove these options when calling CONVHULL.

Error in minboundrect (line 102)
edges = convhull(x,y,{'Qt'}); % 'Pp' will silence the warnings

Comment only
04 Feb 2013 John D'Errico

John D'Errico (view profile)

Sorry, but I may have put a code for a bounding ellipse in there in the past, but I won't leave code in there with which I am not satisfied. This is the case of the bounding ellipse.

Comment only
04 Feb 2013 Doctor61

Hi John,
Thanks for your share. I agree with Venkat, 'minboundellipse.m' would have helped me a lot with a case I have in hand.

06 Aug 2012 Ben

Ben (view profile)

Hi John,

minboundellipse.m is in the demo but not in the downloaded zip file. Could you add it? Thanks!

Comment only
07 Jun 2012 Carlos Martinez-Ortiz

02 May 2012 xiuwei zhang

01 Mar 2012 Venkat R

Dear John,

A file 'minboundellipse.m' is missing I suppose.


26 Jan 2012 1.1

Removed a tool I had been testing, but only accidentally included

23 May 2014 1.2

Repair for minboundcircle

Contact us