function kdNearestNeighborsInRange(in_kdTreeArray, in_point, in_radius){
if(in_kdTreeArray.length < 1){
return [];
}
const numDims = in_kdTreeArray[0].key.length;
const retVal = [];
const stack = [ [0, 0] ];
const sqrSearchDist = in_radius * in_radius;
while(stack.length > 0){
const [curIdx, depth] = stack.pop();
const curSqrDist = util_calcSquaredDistance(in_kdTreeArray[curIdx].key, in_point);
if(curSqrDist <= sqrSearchDist){
retVal.push(curIdx);
}
const dim = depth % numDims;
let goodSide = -1;
let badSide = -1;
if(in_point[dim] < in_kdTreeArray[curIdx].key[dim]){
goodSide = in_kdTreeArray[curIdx].leftIdx;
badSide = in_kdTreeArray[curIdx].rightIdx;
}else{
goodSide = in_kdTreeArray[curIdx].rightIdx;
badSide = in_kdTreeArray[curIdx].leftIdx;
}
if(badSide != -1){
const sqrBadSideDist = (in_point[dim] - in_kdTreeArray[curIdx].key[dim]) * (in_point[dim] - in_kdTreeArray[curIdx].key[dim]);
if(sqrBadSideDist < sqrSearchDist){
stack.push([badSide, depth + 1]);
}
}
if(goodSide != -1){
stack.push([goodSide, depth + 1]);
}
}
return retVal;
}