Предполагая, что у вас есть кое-что не очень отличающееся от:
struct rectangle {
int x;
int y;
int w;
int h;
};
(или то же самое, используя float
или double
вместо int
)
Я предполагаю, что здесьw
и h
всегда положительны, если они могут быть отрицательными, вы должны сначала нормализовать входной прямоугольник, чтобы убедиться, что они есть.
Вы найдете пересечение, найдя его противоположные углы и убедившись, что нижеслева до верхнего правого:
rectangle intersection(const rectangle& r1, const rectangle& r2) {
// optionaly control arguments:
if (r1.w < 0 || r1.h < 0 || r2.w < 0 || r2.h < 0) {
throw std::domain_error("Unnormalized rectangles on input");
}
int lowx = max(r1.x, r2.x); // Ok, x coordinate of lower left corner
int lowy = max(r1.y, r2.y); // same for y coordinate
int upx = min(r1.x + r1.w, r2.x + r2.w) // x for upper right corner
int upy = min(r1.y + r1.h, r2.y + r2.h) // y for upper right corner
if (upx < lowx || upy < lowy) { // empty intersection
throw std::domain_error("Empty intersection");
}
return rectangle(lowx, lowy, upx - lowx, upy - lowy);
}
Вы можете нормализовать прямоугольник, принудительно задав положительные значения для ширины и высоты:
rectangle& normalize(rectangle& r) {
if (r.w < 0) {
r.x += r.w;
r.w = - r.w;
}
if (r.h < 0) {
r.y += r.h;
r.h = -r.h;
}
return r;
}
Затем вы можете использовать это во второй функции для отображениярезультат пересечения:
void display_intersection(std::outstream out, rectangle r1, rectangle r2) {
try {
rectangle inter = intersection(normalize(r1), normalize(r2));
out << "(" << inter.x << ", " << inter.y << ") to (";
out << inter.x + inter.w << ", " << inter.y + inter.h << ")" << std::endl;
}
except (std::domain_error& e) {
out << "empty" << std::endl;
}
}