找出两个矩形是否相交

时间:2011-11-30 02:19:20

标签: c++

这是一项家庭作业,所以我主要是要求朝着正确的方向努力。我已经找到了大部分问题。我们有一个Rectangle类,其矩形由Point类中的x和y坐标定义。我坚持的一部分是弄清楚两个矩形是否相交。我做了一些研究,并且发现了这个:

http://silentmatt.com/rectangle-intersection/

这有助于我了解如何完成这项工作。但我似乎无法按照我们的老师在问题概述中设置它的方式来实现它:

//This method returns true if this rectangle intersects with another rectangle (which is provided as a parameter)
bool intersects(Rectangle);

intersects函数只接受一个参数,即Rectangle类。在main中调用它是这样的:

rec1.intersects(rec2);
但是,我似乎无法弄清楚如何实现实际功能。我已经用setter定义了rec1和rec2的点,但我似乎无法弄清楚如何使用只接受一个参数的函数来访问这些点。因为,在上面的示例中,我可以访问rec2的x和y点,但我不能使用rec1。

有关如何进行的任何提示?

编辑:我认为我的部分问题在于如何实施。这是我们在Rectangle类中的内容:

private:
Point lowerLeftCorner;
Point upperRightCorner;

然后他让我们在Point类中设置get和set函数来设置lowerLeftCorner和upperRightCorner的点。

问题是当我在交叉函数中时,我只能(除非我遗漏了某些东西)使用参数(rectangle2)的get函数而不是第一个矩形(rectangle1)。

如果我能够将两个矩形作为参数传递,我可以使用给定的示例来解决这个问题。它能够找到第一个给我带来麻烦的矩形的x和y值。

编辑:罗伯特的信息帮助我弄清楚如何使用“this”来做到这一点。这是我最终得到的,似乎运作良好。它可能不是最好的,我仍然是编程的新手。

bool Rectangle::intersects(Rectangle rec2) {
    return ( getupperX() > rec2.getlowerX() &&
    getlowerX() < rec2.getupperX() &&
    getupperY() > rec2.getlowerY() &&
    getlowerY() < rec2.getupperY());
    }
}

似乎对我测试过的所有价值都有效!

3 个答案:

答案 0 :(得分:2)

在C ++中,如果您在类的成员函数内,则可以隐式访问该类的成员变量。

所以,如果你有

struct Rectangle 
{
  Point UpperLeft;
  Point LowerRight;
  bool intersects(Rectangle);
}

然后在 intersects()函数中,因为它是类的成员,所以可以访问该类的成员变量,如下所示:

Rectangle::intersects(Rectangle rhs)
{
  // So the second UpperLeft here is a member of "this" instance of the class
  if(rhs.UpperLeft < UpperLeft)
    return true;
}

该功能实际上不会检测到交叉点,但这就是您访问所有点的方式。

所以如果你有:

Rectangle rect_a;
Rectangle rect_b;
rect_a.intersects(rect_b);

然后你会调用 rect_a intersects()函数,所以在上面的例子中它将是“this”,其中 rect_b 将是 rhs

编辑: 或者,在上面的示例中,您可以编写类似

的内容
Rectangle::intersects(Rectangle rhs)
{
  if(rhs.GetLowerLeft() < GetLowerLeft())
    return true;
}

第二个GetLowerLeft()将在“this”上调用

答案 1 :(得分:1)

此?

bool Rectangle::intersects(Rectangle r) {
  return
    (x1 < r.x2
  && x2 > r.x1
  && y1 < r.y2
  && y2 > r.y1);
}

如果您想使用get函数,请使用它们:

bool Rectangle::intersects(Rectangle r) {
  return
    (this->getX1() < r.getX2();
  // ....
}

答案 2 :(得分:1)

Pubby为这个问题提供了一个可能的案例。

如果你真的想要解决这个问题,请先尝试在1维案例中查看,2行。你会发现3-5个案例:

左侧重叠。 右侧重叠。 两个左端点坐标都是相同的 两个右端点坐标都是相同的 左侧和右侧坐标都相同(线长度相同,坐标相同)

然后尝试将其扩展为二维对象。 Pubby的例子可以帮助你开始。