我有四个坐标: x,y,width=w,height=h,我有两个矩形,坐标如下:
r1.x=2,r1.y=3,r1.w=5,r1.h=6;
r2.x=0, r2.y=7,r2.w=-4,r4.h=2
你如何观察这个交叉点是空的。
到目前为止,我所做的是:
rectangle intersection (rectangle r1, rectangle r2){
r1.x=max(r1.x,r2.x);
r1.y=max(r1.y,r2.y);
r1.w=min(r1.w,r2.w);
r1.h=min(r1.h,r2.h);
return r1;
}
我认为上面的代码是在有交叉口的时候使用的,但是当交叉口是空的时候我就不知道了。另外,当没有交叉点时,我想打印一条消息"empty“。
谢谢!
发布于 2018-05-28 07:24:57
当用矩形的宽度和高度表示矩形时,用于矩形相交的方法不起作用。
如果你存储矩形的两个相对的角(而不是一个角和尺寸),并确保第一个角的坐标总是小于或等于第二个角,那么它可以有效地存储矩形的min_x
、min_y
、max_x
和max_y
。
我建议您采用这样的约定,即确保矩形始终包含它们的min
坐标,并且始终排除它们的max
坐标。
发布于 2018-05-28 08:08:26
假设你有一些与以下内容没有太大区别的东西:
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;
}
}
https://stackoverflow.com/questions/50560470
复制相似问题