矩形交叉点

时间:2011-12-16 10:46:08

标签: c++ algorithm containers intersection

我有一个矩形列表,我需要生成一个相交的矩形列表 矩形使用

定义
  • 尺寸
  • 布尔值矩形是否可以移动
  • 布尔值是否可以删除矩形

无法移动矩形但无法移除

使用

定义交叉点
  • 指向第一个矩形的指针
  • 指向第二个矩形的指针
  • 第二个
  • 中第一个矩形的点列表
  • 第一个
  • 中第二个矩形的点列表

我需要一个容器,因为可以添加,移除或移动矩形。我需要的操作:

  1. 插入矩形
  2. 删除矩形(仅适用于标记为矩形的人)
  3. 更改矩形的位置(不是尺寸,仅适用于标记为矩形的那些)
  4. 生成一组交叉点。
  5. 我如何实施这样的容器?我可以使用交叉检查方法轻松完成,但这远非优化 我想保留一个矩形地图 - >交叉然后每当添加一个矩形时检查它是否相交并向地图添加交集,当它被移除时,从地图中删除键,但我不知道如何检查它是否与任何快速相交,或者如何移动矩形而不移除并重新插入。
    我可以使用C ++ 11。

2 个答案:

答案 0 :(得分:1)

假设从左到右/从上到下的坐标系,两个矩形的交点是顶部是底部的底部的矩形,底部是底部的最顶部,如果是最右边的则是最左边的左派和右派是权利的最低权利。

如果您可以通过按左,上,右和下排序的容器间接访问矩形,则可以有效地运行测试。

替代方案可以是使用密钥(对于地图),该密钥是具有运算符的x / delta对&lt;考虑a<b a.x+a.delta < b.x,{y},&*iter。 原始点只是一个大小为1的矩形。

本质上,你需要一个容器用于矩形本身(在修改时不能重新分配矩形,因此std :: list可以工作)和两个std :: maps(用于horz和vert映射)具有一个地方/大小对作为键和列表迭代器(可以是由{{1}}得到的矩形指针)作为值。

答案 1 :(得分:0)

我的推荐是一个含糊不清的容器:

class region {
    typedef std::vector<vector*> subregion;
    std::array<std::array<subregion, 100>, 100> locations;
    std::vector<rectangle> children;
public:
    std::vector<rectangle>::iterator add(rectangle addme);
    void remove(std::vector<rectangle>::iterator deleteme);
    void move(std::vector<rectangle>::iterator moveme, point to);
    void intersect(std::vector<rectangle>::iterator left, 
                   std::vector<rectangle>::iterator right);
};

children成员只是容器中矩形的迭代列表。每个次区域是可以容纳矩形的总区域的百分之一。添加矩形时,指向它的指针会添加到矩形所触及的所有子区域。删除矩形后,它的指针将从矩形接触的所有子区域中删除。移动实际上是删除,矩形更新,然后是添加。

然后,要查找交叉点(取决于您希望它们的方式),您只需查看包含多个指针的每个子区域,并对该子区域中的每个矩形进行简单比较。