// C++ Implementation of Quad Tree
#include <iostream>
#include <cmath>
using namespace std;
// Used to hold details of a point
struct Point
{
int x;
int y;
Point(int _x, int _y)
{
x = _x;
y = _y;
}
Point()
{
x = 0;
y = 0;
}
};
// The objects that we want stored in the quadtree
struct Node
{
Point pos;
int data;
Node(Point _pos, int _data)
{
pos = _pos;
data = _data;
}
Node()
{
data = 0;
}
};
// The main quadtree class
class Quad
{
// Hold details of the boundary of this node
Point topLeft;
Point botRight;
// Contains details of node
Node *n;
// Children of this tree
Quad *topLeftTree;
Quad *topRightTree;
Quad *botLeftTree;
Quad *botRightTree;
public:
Quad()
{
topLeft = Point(0, 0);
botRight = Point(0, 0);
n = NULL;
topLeftTree = NULL;
topRightTree = NULL;
botLeftTree = NULL;
botRightTree = NULL;
}
Quad(Point topL, Point botR)
{
n = NULL;
topLeftTree = NULL;
topRightTree = NULL;
botLeftTree = NULL;
botRightTree = NULL;
topLeft = topL;
botRight = botR;
}
void insert(Node*);
Node* search(Point);
bool inBoundary(Point);
};
// Insert a node into the quadtree
void Quad::insert(Node *node)
{
if (node == NULL)
return;
// Current quad cannot contain it
if (!inBoundary(node->pos))
return;
// We are at a quad of unit area
// We cannot subdivide this quad further
if (abs(topLeft.x - botRight.x) <= 1 &&
abs(topLeft.y - botRight.y) <= 1)
{
if (n == NULL)
n = node;
return;
}
if ((topLeft.x + botRight.x) / 2 >= node->pos.x)
{
// Indicates topLeftTree
if ((topLeft.y + botRight.y) / 2 >= node->pos.y)
{
if (topLeftTree == NULL)
topLeftTree = new Quad(
Point(topLeft.x, topLeft.y),
Point((topLeft.x + botRight.x) / 2,
(topLeft.y + botRight.y) / 2));
topLeftTree->insert(node);
}
// Indicates botLeftTree
else
{
if (botLeftTree == NULL)
botLeftTree = new Quad(
Point(topLeft.x,
(topLeft.y + botRight.y) / 2),
Point((topLeft.x + botRight.x) / 2,
botRight.y));
botLeftTree->insert(node);
}
}
else
{
// Indicates topRightTree
if ((topLeft.y + botRight.y) / 2 >= node->pos.y)
{
if (topRightTree == NULL)
topRightTree = new Quad(
Point((topLeft.x + botRight.x) / 2,
topLeft.y),
Point(botRight.x,
(topLeft.y + botRight.y) / 2));
topRightTree->insert(node);
}
// Indicates botRightTree
else
{
if (botRightTree == NULL)
botRightTree = new Quad(
Point((topLeft.x + botRight.x) / 2,
(topLeft.y + botRight.y) / 2),
Point(botRight.x, botRight.y));
botRightTree->insert(node);
}
}
}
// Find a node in a quadtree
Node* Quad::search(Point p)
{
// Current quad cannot contain it
if (!inBoundary(p))
return NULL;
// We are at a quad of unit length
// We cannot subdivide this quad further
if (n != NULL)
return n;
if ((topLeft.x + botRight.x) / 2 >= p.x)
{
// Indicates topLeftTree
if ((topLeft.y + botRight.y) / 2 >= p.y)
{
if (topLeftTree == NULL)
return NULL;
return topLeftTree->search(p);
}
// Indicates botLeftTree
else
{
if (botLeftTree == NULL)
return NULL;
return botLeftTree->search(p);
}
}
else
{
// Indicates topRightTree
if ((topLeft.y + botRight.y) / 2 >= p.y)
{
if (topRightTree == NULL)
return NULL;
return topRightTree->search(p);
}
// Indicates botRightTree
else
{
if (botRightTree == NULL)
return NULL;
return botRightTree->search(p);
}
}
};
// Check if current quadtree contains the point
bool Quad::inBoundary(Point p)
{
return (p.x >= topLeft.x &&
p.x <= botRight.x &&
p.y >= topLeft.y &&
p.y <= botRight.y);
}
// Driver program
int main()
{
Quad center(Point(0, 0), Point(8, 8));
Node a(Point(1, 1), 1);
Node b(Point(2, 5), 2);
Node c(Point(7, 6), 3);
center.insert(&a);
center.insert(&b);
center.insert(&c);
cout << "Node a: " <<
center.search(Point(1, 1))->data << "\n";
cout << "Node b: " <<
center.search(Point(2, 5))->data << "\n";
cout << "Node c: " <<
center.search(Point(7, 6))->data << "\n";
cout << "Non-existing node: "
<< center.search(Point(5, 5));
return 0;
}
Jul 4, 2018
[algorithm][data structure] Quad Tree
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.