Date: Sat, 1 Mar 1997 08:20:35 -0500
Message-Id: <199703011320.IAA23334@delorie.com>
From: DJ Delorie
To: ao950 AT FreeNet DOT Carleton DOT CA
CC: djgpp AT delorie DOT com
In-reply-to: <5f8aob$93q@freenet-news.carleton.ca> (ao950@FreeNet.Carleton.CA)
Subject: Re: bounding circle vs. bounding boxes
> Get the centroid of all your points. Then get the distance to the furthest
> point. This gets you the center and radius.
Another step you could do afterwards to optimize the centroid (which
is just a mathematical average, where what you really want is a 2D
median). The pseudo-code below can be used after the centroid
algorithm, or you can just start at the center of the bounding box.
loop {
for step in ((-1,0), (1,0), (0,-1), (0,1))
{
new center = old center + step
new radius = max radius (set of points, new center)
remember if smallest radius of the four
}
if (smallest new radius < old radius)
set new centroid and radius
else
done
}
You could optimize the first part by only stepping towards the point
that corresponded to the max radius in the previous iteration, since
you know that moving away from it will only make it worse.
As for an example of when this optimization helps, consider a sprite
that is a large circle with a line extending out one side. the bulk
of the circle keeps the average centroid near its own center, but the
line moves the max radius way out. The closest-fitting circle has a
center halfway between the tip of the line and the other side of the
circle.
Of course, none if this should be done on the fly. It's best to do
them at compile time if you can (compiled sprites) or once at program
startup.