OSRMProjectedRect OSRMProjectedRectUnion(OSRMProjectedRect rect1, OSRMProjectedRect rect2) { bool rect1IsZero = OSRMProjectedRectIsZero(rect1); bool rect2IsZero = OSRMProjectedRectIsZero(rect2); if (rect1IsZero) return (rect2IsZero ? OSRMProjectedRectZero() : rect2); if (rect2IsZero) return rect1; double minX = RMMIN(rect1.origin.x, rect2.origin.x); double minY = RMMIN(rect1.origin.y, rect2.origin.y); double maxX = RMMAX(rect1.origin.x + rect1.size.width, rect2.origin.x + rect2.size.width); double maxY = RMMAX(rect1.origin.y + rect2.size.height, rect2.origin.y + rect2.size.height); return OSRMProjectedRectMake(minX, minY, maxX - minX, maxY - minY); }
// Rect intersection RMProjectedRect RMProjectedRectIntersection(RMProjectedRect rect1, RMProjectedRect rect2) { bool rect1IsZero = RMProjectedRectIsZero(rect1); bool rect2IsZero = RMProjectedRectIsZero(rect2); if (rect1IsZero) return (rect2IsZero ? RMProjectedRectZero() : rect2); if (rect2IsZero) return rect1; if ( ! RMProjectedRectIntersectsProjectedRect(rect1, rect2)) return RMProjectedRectZero(); double minX, maxX, minY, maxY; minX = RMMAX(rect1.origin.x, rect2.origin.x); minY = RMMAX(rect1.origin.y, rect2.origin.y); maxX = RMMIN(rect1.origin.x + rect1.size.width, rect2.origin.x + rect2.size.width); maxY = RMMIN(rect1.origin.y + rect1.size.height, rect2.origin.y + rect2.size.height); return RMProjectedRectMake(minX, minY, maxX - minX, maxY - minY); }