矩形的交叉点上
Rectangles intersections
我有一个矩形列表,我需要生成一个相交的矩形列表。
使用
- 大小
- 布尔值矩形是否可以移动
- 布尔值是否可以移除矩形
不能移动但不能移除的矩形
用
定义交集- 指针指向第一个矩形
- 指针指向第二个矩形
- 在第二个 中的第一个矩形的点的列表
- 在第一个 中的第二个矩形的点的列表
我需要一个容器,作为矩形可以添加,删除或移动。我需要的操作:
- 插入矩形
- 移除矩形(仅适用于那些被标记为矩形的人)
- 改变矩形的位置(不是大小,只适用于那些被标记的矩形)
- 十字路口生成集。
我该如何实现这样一个容器呢?我可以使用交叉检查方法轻松地做到这一点,但这远远不够优化。
我想保持一个矩形->交集的地图,然后每当一个矩形被添加检查它是否相交任何东西,并添加交集到地图,当它被删除时,从地图中删除键,但我不知道如何检查它是否相交任何东西快,或者如何移动矩形没有删除和重新插入。我可以用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实际上是移除,更新矩形,然后添加。
然后,为了找到交点(取决于您想要它们的方式),您只需查看包含多个指针的每个子区域,并对该子区域中的每个矩形进行简单的比较。
- 快速 SSE 射线 - 4 三角形交叉点
- Boost.Test - 如何在交叉点上检查两个向量
- NS-3 VANET:如何实现简单的交叉点场景?
- 使用Boost ::几何多边形布尔/与线段属性的交叉点
- 如何优化C 代码的以下片段 - 卷中的零交叉点
- Segfault与geos并行测试交叉点时
- 射线体积交叉点在OpenGL中
- 建议计算多个凸2D多边形的交叉点
- 用点填充一条线,然后寻找与轮廓的交叉点
- 在STL中检查空的交叉点
- 设置交叉点不起作用
- 交叉点代码,用于打印两个数组(过帐列表)的交叉点
- CGAL Precondition_exception具有多边形交叉点和不精确构造内核
- 如何获得最近的网格交叉点
- 光线追踪框交叉点
- 矩形的交叉点上
- 在openCV中的拉普拉斯高斯函数,如何找到零交叉点
- 绘制线在交叉点与OpenCV
- 如何获得交叉点?光线三角形交点C++
- 几何图形,交叉点