66 auto c =
Coord { Traits::getCoord(data, 0), Traits::getCoord(data, 1) };
67 auto quad = getQuadrant(c);
68 if (m_sub_trees[quad] !=
nullptr) {
69 m_sub_trees[quad]->remove(data);
72 auto it =
std::find(m_data.begin(), m_data.end(), data);
73 if (it != m_data.end()) {
81 auto range_sq = range * range;
84 for (
int i=0; i<4; i++) {
85 if (m_sub_trees[i] !=
nullptr) {
87 auto dx_sq =
std::min((c.
x - m_sub_trees[i]->m_min.x) * (c.
x - m_sub_trees[i]->m_min.x),
88 (c.
x - m_sub_trees[i]->m_max.x) * (c.
x - m_sub_trees[i]->m_max.x));
89 auto dy_sq =
std::min((c.
y - m_sub_trees[i]->m_min.y) * (c.
y - m_sub_trees[i]->m_min.y),
90 (c.
y - m_sub_trees[i]->m_max.y) * (c.
y - m_sub_trees[i]->m_max.y));
91 if (dx_sq + dy_sq <= range_sq) {
92 auto subtree_points = m_sub_trees[i]->getPointsWithinRange(c, range);
93 points.
insert(points.
end(), subtree_points.begin(), subtree_points.end());
101 [c, range_sq](
const T& point) {
102 auto pc = Coord { Traits::getCoord(point, 0), Traits::getCoord(point, 1) };
103 return (pc.x - c.
x) * (pc.x - c.
x) + (pc.y - c.
y) * (pc.y - c.
y) <= range_sq;
145 assert(m_is_divided && !isContained(c));
150 m_min.x -= (m_max.x - m_min.x);
152 m_max.x += (m_max.x - m_min.x);
155 m_min.y -= (m_max.y - m_min.y);
157 m_max.y += (m_max.y - m_min.y);
160 auto quad = getQuadrant({ (clone->m_min.x + clone->m_max.x) / 2.0, (clone->m_min.y + clone->m_max.y) / 2.0 });
161 m_sub_trees[quad] = clone;
162 for (
size_t i=0; i<4; i++) {
164 m_sub_trees[i] =
nullptr;