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