Hello,

I am working on a school assignment and have one small problem. Here's the general description of the assignment:

Create an openGL program (2D) that can be used to be a street map of a given area. So some functions are making buildings and streets, being able to place them and rotate and scale them. Now I've got most of that done already, don't worry, I didn't come here looking for someone to do my homework for me ... I'm just stuck on one thing. The tricky part came with group things together. Everything is a rectangle. I have a WorldObject class which has subclasses for building and street, which is not so relevant anyway. WorldObject has a vector of rectangles in this object.

So to rotate an object, I need to rotate every rectangle, with respect to the center of the object. After much math on paper and some old trial and error I figured a good way to do this that works great. My problem comes with the scaling function. I've got a function that almost works, but is slightly off, if I have two rectangles right next to each other (touching) and I increment the scale, they'll be slowly moving towards each other instead of the edges staying just next to each other like they should. It's close to perfect, and I may just give up and leave it like this, but I'm really a perfectionist and want this to work properly. So here's where I would be ever so greatful for your help. This is the code I have for this function:

Sorry if this is the wrong forum, but I figured graphics related would best fit the game programming forum, even if it's not quite a game.Code:void Rectangle::incrementCenter(Point2D * pointOfOrigin, GLfloat width, GLfloat height) { if (this->center == *pointOfOrigin) return; // normalize to origin this->center -= *pointOfOrigin; // determine z and add the new distance to it (will usually be 1) double z = sqrt(pow(this->center.x,2) + pow(this->center.y,2)); double z1 = sqrt(pow(width,2) + pow(height,2)); if (width < 0 || height < 0 && !(width < 0 && height < 0)) z1 *= -1; z += z1; // determine angle between center of rectangle and center of the object double rads = atan(this->center.y/this->center.x); // see comments in rotateCenter for this one if (this->center.x < 0 && this->center.y > 0 || this->center.x < 0 && this->center.y < 0) { rads += PI; } Point2D scaledCenter = Point2D(z*cos(rads), z*sin(rads)); this->center = scaledCenter + *pointOfOrigin; } // the above gets called from WorldObject void WorldObject::scale(GLfloat width, GLfloat height) { Point2D * center = calulateCenter(); // how many rectangles in this object int size = (int) this->rectangles.size(); for (vector<Rectangle>::iterator it = this->rectangles.begin(); it != this->rectangles.end(); it++) { it->incrementScale(width,height); // the center should only move by the width increment/size since there may be multiple // rectangles enlarged // not sure now why I put the 2 there but removing it makes this bad it->incrementCenter(center,width/(2*size),height/(2*size)); } }

Thanks for any help on this