• Advertisement
Sign in to follow this  

Calculating the bounded box around a 2D (or 3D) object.

This topic is 1791 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

http://puu.sh/2qGTC

 

As you can see from the image, I'm trying to calculate the bounding box of the pac-man "sprite" but I've got a few things to fix it seems I was wondering if there's anyway to calculate a bounding box (or sphere) for any object, whether 2D or 3D. Here's my code for the pac man "sprite."

 

glPushMatrix();
		glTranslated(mPosition.getX() + mTranslation.getX(), 
					 mPosition.getY() + mTranslation.getY(),0.0);
		glScaled(mScale.getX(),mScale.getY(),mScale.getZ());
		glTranslated(-mPosition.getX(),mPosition.getY(),0);
		glPopMatrix();

		Vertex* v2[4];
		glBegin(GL_POLYGON);
			glColor4d(0.5,0.5,1,0.2);

			v2[0] = new Vertex();
			v2[0]->setVertexd(-10.0 - Radius + mPosition.getX() - 4, -10.0 - Radius + mPosition.getY() - 4,0);
			v2[1] = new Vertex();
			v2[1]->setVertexd(-10.0 - Radius + mPosition.getX() - 4 ,  10.0 + Radius + mPosition.getY() - 4,0);
			v2[2] = new Vertex();
			v2[2]->setVertexd(10.0 + Radius + mPosition.getX() - 4, 10.0 + Radius + mPosition.getY() - 4,0);
			v2[3] = new Vertex();
			v2[3]->setVertexd( 10.0 + Radius + mPosition.getX() - 4, -10.0 - Radius + mPosition.getY() - 4,0);
			// rounded rectangle - accidental.
			/*
			for(unsigned int x = 0; x < Vertices.size(); x++) {
				Vertex* v = Vertices[x];
				vertX = v->getX();
				vertY = v->getY();
				v2[0] = new Vertex();
				v2[0]->setVertexd(-0.5 - mPosition.getX() - vertX, -0.5 - mPosition.getY() - vertY,0 );
				v2[1] = new Vertex();
				v2[1]->setVertexd(-0.5 - mPosition.getX() - vertX, 0.5 + mPosition.getY() + vertY,0);
				v2[2] = new Vertex();
				v2[2]->setVertexd(0.5 + mPosition.getX() + vertX, 0.5 + mPosition.getY() + vertY, 0);
				v2[3] = new Vertex();
				v2[3]->setVertexd(0.5 + mPosition.getX() + vertX, -0.5 - mPosition.getY() - vertY,0);

			}*/ 

		glEnd();

 

 

Share this post


Link to post
Share on other sites
Advertisement

If you mean a 2D bounding box regardless of whether its 2D or 3D, you need to:

1.Transform all the points to 2D coordinates (using all the matrices, projection, model, etc. you pass to opengl) (you might want to find a way to ignore points you know not to affect the bounding box, like stuff inside the object, or make a simplified representation of it...)

(if its top down and practically 2D however, you can probably just ignore the depth and treat them like 2D points)

2.Find the maximum X coord you can find, max y, min X, min Y

3.You have an axis aligned bounding box

Edited by Waterlimon

Share this post


Link to post
Share on other sites

OK, going back and working through it and with a lot of help from a friend of mine I've come up with this: 

 

http://puu.sh/2r2ye

 

if you can't tell in the image, I am rendering a bounding box but.........looks more like a sphere then a box which i think is due to the fact that the shape's vertices are in a circular formation, I could be wrong, anyways, it's progress at least. here's my revised function to render a bounding box.

 

double minX = FLT_MAX;
		double minY = FLT_MAX;
		double maxX =-FLT_MAX;
		double maxY =-FLT_MAX;

		// try to draw the aabb
		glBegin(GL_POLYGON);
			glColor4d(0.55,0.8,1.0,0.5);
			for(int i = 0; i < Vertices.size(); i++) {
				Vertex* v = Vertices;
				
				// check minX x < minX;
				if(v->getX() < minX)
				{
					minX = v->getX();
				}

				// check minX x > minX;
				if(v->getX() > minX)
				{
					minX = v->getX();
				}

				// check y < miny
				if(v->getY() < minY)
				{
					minY = v->getY();
				}

				// check y > miny
				if(v->getY() > minY)
				{
					minY = v->getY();
				}

				// check x < maxX
				if(v->getX() < maxX)
				{
					maxX = v->getX();
				}

				// check x > maxX
				if(v->getX() > maxX)
				{
					maxX = v->getX();
				}


				// check y < maxY
				if(v->getY() < maxY)
				{
					maxY = v->getY();
				}

				// check y > maxY
				if(v->getY() > maxY)
				{
					maxY = v->getY();
				}

				glVertex2d(maxX + mPosition.getX(),maxY + mPosition.getY());
				glVertex2d(minX + mPosition.getX(),minY + mPosition.getY());
	
			}
		glEnd();

 

Not sure what else to do to get it right...........

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement