定义一个区域,区域中有很多矩形,请通过四叉树的方式用c++一段代码,在给出一个点时迅速判断这个点在哪个矩形中
时间: 2024-05-10 08:17:56 浏览: 11
以下是基于四叉树的代码实现:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 定义矩形类
class Rectangle {
public:
double x_min, y_min, x_max, y_max;
Rectangle(double x1, double y1, double x2, double y2)
: x_min(x1), y_min(y1), x_max(x2), y_max(y2) {}
};
// 定义四叉树节点类
class QuadTreeNode {
public:
Rectangle rec;
vector<Rectangle> rects;
QuadTreeNode *child[4];
QuadTreeNode(Rectangle r) : rec(r) {
for (int i = 0; i < 4; i++)
child[i] = NULL;
}
};
// 插入矩形到四叉树中
void insert(QuadTreeNode *node, Rectangle r) {
// 如果当前节点中包含矩形,将矩形加入到当前节点
if (node->rec.x_min <= r.x_min && node->rec.y_min <= r.y_min
&& node->rec.x_max >= r.x_max && node->rec.y_max >= r.y_max) {
node->rects.push_back(r);
return;
}
// 如果当前节点无子节点,则创建四个子节点
if (node->child[0] == NULL) {
double mid_x = (node->rec.x_min + node->rec.x_max) / 2;
double mid_y = (node->rec.y_min + node->rec.y_max) / 2;
node->child[0] = new QuadTreeNode(Rectangle(node->rec.x_min, mid_y, mid_x, node->rec.y_max));
node->child[1] = new QuadTreeNode(Rectangle(mid_x, mid_y, node->rec.x_max, node->rec.y_max));
node->child[2] = new QuadTreeNode(Rectangle(node->rec.x_min, node->rec.y_min, mid_x, mid_y));
node->child[3] = new QuadTreeNode(Rectangle(mid_x, node->rec.y_min, node->rec.x_max, mid_y));
}
// 递归插入到对应的子节点中
for (int i = 0; i < 4; i++) {
if (node->child[i]->rec.x_min <= r.x_min && node->child[i]->rec.y_min <= r.y_min
&& node->child[i]->rec.x_max >= r.x_max && node->child[i]->rec.y_max >= r.y_max) {
insert(node->child[i], r);
break;
}
}
}
// 判断点是否在矩形内部
bool inRectangle(Rectangle r, double x, double y) {
return (x >= r.x_min && x <= r.x_max && y >= r.y_min && y <= r.y_max);
}
// 查找包含点的矩形
void search(QuadTreeNode *node, double x, double y, vector<Rectangle> &result) {
// 如果当前节点中有矩形包含该点,则将这些矩形加入到结果中
for (auto r : node->rects) {
if (inRectangle(r, x, y)) {
result.push_back(r);
}
}
// 如果当前节点无子节点,则返回
if (node->child[0] == NULL) return;
// 否则递归查找对应的子节点
for (int i = 0; i < 4; i++) {
if (inRectangle(node->child[i]->rec, x, y)) {
search(node->child[i], x, y, result);
}
}
}
int main() {
// 创建一个根节点
QuadTreeNode *root = new QuadTreeNode(Rectangle(0, 0, 100, 100));
// 插入多个矩形
insert(root, Rectangle(10, 10, 20, 20));
insert(root, Rectangle(30, 30, 40, 40));
insert(root, Rectangle(50, 50, 60, 60));
insert(root, Rectangle(70, 70, 80, 80));
// 查找包含点的矩形
vector<Rectangle> result;
search(root, 15, 15, result);
for (auto r : result) {
cout << r.x_min << "," << r.y_min << "," << r.x_max << "," << r.y_max << endl;
}
return 0;
}
```
以上代码实现了一个基于四叉树的矩形查找算法。给定一个根节点和多个矩形,将矩形插入到四叉树中,然后根据给定的点坐标,通过递归搜索对应的子节点,最终找到包含该点的矩形。