# Bounding Spheres

Hello, I’m programming the bounding spheres of some meshes, but i’m having troubles. This is my method: First I find te bounding box of the mesh (i need it for later tasks), then, with the max and minimun corner of the BBox, i find the center( center.x = (minCorner.x+maxCorner.x)/2;
center.y = (minCorner.y+maxCorner.y)/2;
center.z = (minCorner.z+maxCorner.z)/2
and i go thought all vertices of the mesh, checking the distace form the center to the current vertex, at the end I have the radius and the center of the sphere, but…
the mesh cut the sphere: www.telecable.es/personales/ffelagund/bbox.jpg www.telecable.es/personales/ffelagund/bbox3.jpg www.telecable.es/personales/ffelagund/bbox2.jpg

with the cilinder all work ok but with the other mesh doesn’t.
Here the code:
//Find max and minus corner of the BBOX:
maxCorner.Assign(vertices,vertices,vertices);
minCorner.Assign(vertices,vertices,vertices);

for(j=0;i<nVertices;i++)
{
if(vertices[j]>maxCorner.x) maxCorner.x=vertices[j];
if(vertices[j]<minCorner.x) minCorner.x=vertices[j];
j++;

``````if(vertices[j]&gt;maxCorner.y) maxCorner.y=vertices[j];
if(vertices[j]&lt;minCorner.y) minCorner.y=vertices[j];
j++;

if(vertices[j]&gt;maxCorner.z) maxCorner.z=vertices[j];
if(vertices[j]&lt;minCorner.z) minCorner.z=vertices[j];
j++;
``````

}

//find center of the sphere
center.x = (minCorner.x+maxCorner.x)/2;
center.y = (minCorner.y+maxCorner.y)/2;
center.z = (minCorner.z+maxCorner.z)/2;

//sphere render
void BSphere::Render()
{
glPushMatrix();
glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_ONE);
glTranslatef(center.x,center.y,center.z);
glDisable(GL_BLEND);
glPopMatrix();
}

If i comment the translatef of the sphere, the sphere of the spiral/capsule mesh appears centrated and in the right place (the origin) but the cilinder sphere appears in the same place, the origin, because the two spheres are drawed in the same place, but if I use the Translatef line, the cilinder sphere are OK, but the other sphere cuts the other mesh.
Can anyone tell me why?
thank you

Originally posted by Ffelagund:
[b] for(j=0;i<nVertices;i++)
{
if(vertices[j]>maxCorner.x) maxCorner.x=vertices[j];
if(vertices[j]<minCorner.x) minCorner.x=vertices[j];
j++;

``````if(vertices[j]&gt;maxCorner.y) maxCorner.y=vertices[j];
if(vertices[j]&lt;minCorner.y) minCorner.y=vertices[j];
j++;
``````
``````if(vertices[j]&gt;maxCorner.z) maxCorner.z=vertices[j];
if(vertices[j]&lt;minCorner.z) minCorner.z=vertices[j];
j++;
``````

}[/b]

This loop is very wrong. Did you copy/paste it or are these just typos?

Also, if you’re interested in other approaches, I use this one: http://geometryalgorithms.com/Archive/algorithm_0107/algorithm_0107.htm#Approximate%20Ball

– Tom

Why are wrong? the vertices array have a size of (sizeof(float)3nVertices).
And i forgot paste “unsigned int i=0,j=0;” before the loop.
Every item of the array are a component (x,y or z) of a vertex, not a vertex.

Edit: I forgot paste the computation of the radio:

``````BAxisAlignedBox b(vertices,nVertices);
center = b.GetCenter();
for(unsigned int i = 0;i&lt;nVertices;i+=3)
{
Vector3D p; p.Assign(&vertices[i]);
float aux = center % p;
}
``````

//float aux = center % p; % <-- operator distance

[This message has been edited by Ffelagund (edited 02-25-2004).]

I thought the i was a typo and that you just meant j. Hence, your loop would have incremented its counter four times per iteration instead of three. My bad.

– Tom

Hi

Can you reproduce the problem with a simpler model? Like a tetrehedron or something.

What’s the difference between the cylinder, where your code seems to work, and the other mesh?