【问题标题】:Rectangle Intersection. print message for empty intersection矩形交点。空交叉口的打印消息
【发布时间】:2018-05-28 06:38:38
【问题描述】:

我有四个坐标: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;
}

我认为上面的代码是在有交叉路口时使用的,但是当交叉路口为空时我不知道。另外,当没有交叉点时,我想打印一条消息“空”。

谢谢!

【问题讨论】:

标签: c++ mathematical-optimization procedure rectangles


【解决方案1】:

当矩形以宽度和高度表示时,您用于矩形交集的方法不起作用

如果您存储矩形的两个对角(而不是一个角和尺寸)并确保第一个角的坐标始终小于或等于第二个角,则可以有效地存储min_x,@ 987654322@、max_xmax_y 用于您的矩形。

我建议您采用确保矩形始终包含min坐标并始终排除max坐标的约定。

【讨论】:

    【解决方案2】:

    假设你有一些与以下没有太大区别的东西:

    struct rectangle {
        int x;
        int y;
        int w;
        int h;
    };
    

    (或同样使用floatdouble 而不是int

    我在这里假设wh总是正数,如果它们可能是负数,你应该首先对输入矩形进行归一化以确保它们是正数。

    您可以通过找到交叉点的对角来找到交叉点,并确保左下角在右上角之前:

    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;
        }
    }
    

    【讨论】:

    • 感谢您的回答!你告诉我的关于规范化的事情是有道理的。如果可能的话,我还有一个问题。我可以通过以下方式分割矩形交叉点吗? 1.我希望矩形交集只做交集,然后 2.创建一个名为 PrintTheRectangle 的函数,当交集为空时将输出,当它不为空时应输出从 (x,y) 到 (w,h) 的交集。 printf("(%d,%d) 到 (%d,%d)\n", r.x, r.y, r.x + r.width, r.y + r.height);
    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多