我有一个矩形列表,我需要生成一个相交的矩形列表 矩形使用
定义无法移动矩形但无法移除
使用
定义交叉点我需要一个容器,因为可以添加,移除或移动矩形。我需要的操作:
我如何实施这样的容器?我可以使用交叉检查方法轻松完成,但这远非优化
我想保留一个矩形地图 - >交叉然后每当添加一个矩形时检查它是否相交并向地图添加交集,当它被移除时,从地图中删除键,但我不知道如何检查它是否与任何快速相交,或者如何移动矩形而不移除并重新插入。
我可以使用C ++ 11。
答案 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
成员只是容器中矩形的迭代列表。每个次区域是可以容纳矩形的总区域的百分之一。添加矩形时,指向它的指针会添加到矩形所触及的所有子区域。删除矩形后,它的指针将从矩形接触的所有子区域中删除。移动实际上是删除,矩形更新,然后是添加。
然后,要查找交叉点(取决于您希望它们的方式),您只需查看包含多个指针的每个子区域,并对该子区域中的每个矩形进行简单比较。