构建点的KD树,这应该给你比O(n)更好的复杂性,平均O(log(n))我认为.
您可以使用2D树,因为这些点被约束到平面.
假设我们已经将问题转换为2D,我们将为这些点提供类似的东西:
struct Node {
Pos2 point;
enum {
X,
Y
} splitaxis;
Node* greater;
Node* less;
};
Run Code Online (Sandbox Code Playgroud)
greater并且less包含沿splitaxis分别具有更大和更小坐标的点.
void
findPoints(Node* node, std::vector<Pos2>& result, const Pos2& origin, float radius) {
if (squareDist(origin - node->point) < radius * radius) {
result.push_back(node->point);
}
if (!node->greater) { //No children
return;
}
if (node->splitaxis == X) {
if (node->point.x - origin.x > radius) {
findPoints(node->greater, result, origin radius);
return;
}
if (node->point.x - origin.x < -radius) {
findPoints(node->less, result, origin radius);
return;
}
findPoints(node->greater, result, origin radius);
findPoints(node->less, result, origin radius);
} else {
//Same for Y
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用KD树的根调用此函数