矩形的交叉点上

Rectangles intersections

本文关键字:交叉点      更新时间:2023-10-16

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

定义矩形
  • 大小
  • 布尔值矩形是否可以移动
  • 布尔值是否可以移除矩形

不能移动但不能移除的矩形

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

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

  1. 插入矩形
  2. 移除矩形(仅适用于那些被标记为矩形的人)
  3. 改变矩形的位置(不是大小,只适用于那些被标记的矩形)
  4. 十字路口生成集。

我该如何实现这样一个容器呢?我可以使用交叉检查方法轻松地做到这一点,但这远远不够优化。
我想保持一个矩形->交集的地图,然后每当一个矩形被添加检查它是否相交任何东西,并添加交集到地图,当它被删除时,从地图中删除键,但我不知道如何检查它是否相交任何东西快,或者如何移动矩形没有删除和重新插入。我可以用c++ 11

假设一个从左到右/从上到下的坐标系,两个矩形的交点是矩形的顶部是顶部的最底部,底部是底部的最顶部,左边是左边的最右边,右边是右边的最左边。

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

另一种方法是使用一个键(对于映射),它是一个x/δ对,带有操作符<考虑a<b,无论a.x+a.delta < b.x在哪里,y也是一样。一个原始点就是一个大小为1的矩形。>

本质上,您需要为矩形本身提供一个容器(在修改矩形时不能重新分配矩形,因此可以使用std::list)和两个std::map(用于纵向和纵向映射),它们具有位置/大小对作为键,列表迭代器(可以是由&*iter产生的矩形指针)作为值。

我的建议是:

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成员仅仅是容器中矩形的迭代列表。每个子区域是可容纳矩形的总区域的百分之一。当添加一个矩形时,指向该矩形的指针将被添加到该矩形所触及的所有子区域。当一个矩形被移除时,它的指针将从该矩形所触及的所有子区域中移除。move实际上是移除,更新矩形,然后添加。

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