vector localToWorld(vector *v, object *o) { vector r = rotateVec(v, o->ang); r = addVec(&r, &(o->pos)); return r; }
void Ground::makeHole(b2Vec2 epicenter, float radius) { std::list<b2Vec2>::iterator first,second, firstToDel, lastToDel, circleStart, circleEnd, itr, leftCircleBorder, rightCircleBorder; b2Vec2 leftBorder, rightBorder; bool leftFound(false), rightFound(false); //find left border first = this->edges.begin(); for (second=++(this->edges.begin()); second!=this->edges.end(); first++,second++) { if (distance(*second, epicenter) <= radius) { leftBorder = (*first); circleStart = first; leftFound = true; firstToDel = second; break; } } //find right border first = --(this->edges.end()); for (second= --(--this->edges.end()); second!=this->edges.begin(); first--,second--) { if (distance(*second, epicenter) <= radius) { rightBorder = (*first); circleEnd = first; rightFound = true; lastToDel = second; break; } } if ( !(leftFound && rightFound) ) return; leftBorder = getBorder(*circleStart, *firstToDel, epicenter, radius); leftCircleBorder = circleStart; leftCircleBorder++; this->edges.insert(leftCircleBorder,leftBorder); leftCircleBorder--; rightBorder = getBorder(*circleEnd, *lastToDel, epicenter, radius); rightCircleBorder = circleEnd; this->edges.insert(rightCircleBorder,rightBorder); rightCircleBorder--; this->edges.erase(firstToDel, ++lastToDel); b2Vec2 aVec(leftBorder.x-epicenter.x, leftBorder.y-epicenter.y), bVec(rightBorder.x-epicenter.x, rightBorder.y-epicenter.y); positiveAngle ab = getPositiveAngle(aVec,bVec); positiveAngle step = 1/57.296; b2Vec2 toInsert = rotateVec(aVec, step); positiveAngle rotated(step); for (itr = ++leftCircleBorder; rotated < ab; rotated+=step) { this->edges.insert(itr,epicenter + toInsert); toInsert = rotateVec(toInsert,step); } }
// Rotate object o by angle a void turnObject(object *o, float a) { o->ang += a; o->dir = rotateVec(&(o->dir), a); }