//Call this with isParentX =true! static MiniTree <Vector2> insertIntoKD(Vector2 Vector, MiniTree <Vector2> root, bool isParentX) { if (root.isEmpty()) { if (isParentX) { return(new Node <Vector2>(Vector, new EmptyNode <Vector2>(), new EmptyNode <Vector2>(), false)); } else { return(new Node <Vector2>(Vector, new EmptyNode <Vector2>(), new EmptyNode <Vector2>(), true)); } } if (root.sortedOnX()) { if (root.getVector() == Vector) { return(root); } if (Vector.X < root.getVector().X) { return(new Node <Vector2>(root.getVector(), insertIntoKD(Vector, root.getLeftMTree(), root.sortedOnX()), root.getRightMTree(), true)); } else { return(new Node <Vector2>(root.getVector(), root.getLeftMTree(), insertIntoKD(Vector, root.getRightMTree(), root.sortedOnX()), true)); } } else { if (root.getVector() == Vector) { return(root); } if (Vector.Y < root.getVector().Y) { return(new Node <Vector2>(root.getVector(), insertIntoKD(Vector, root.getLeftMTree(), root.sortedOnX()), root.getRightMTree(), false)); } else { return(new Node <Vector2>(root.getVector(), root.getLeftMTree(), insertIntoKD(Vector, root.getRightMTree(), root.sortedOnX()), false)); } } }
//Rangesearch static void rangeSearch(MiniTree <Vector2> root, Vector2 houseVector, float radius, List <Vector2> returnList) { if (root.isEmpty() == false) { if (root.sortedOnX() == true) { if (Math.Abs(houseVector.X - root.getVector().X) <= radius) { //Euclidean check for good measure (haha) if (Vector2.Distance(root.getVector(), houseVector) <= radius) { returnList.Add(root.getVector()); } //Be thorough and searche the rest too rangeSearch(root.getLeftMTree(), houseVector, radius, returnList); rangeSearch(root.getRightMTree(), houseVector, radius, returnList); } else if (root.getVector().X >= (houseVector.X + radius)) { Debug.WriteLine(root.getVector().X + " is bigger than " + (houseVector.X + radius) + " so we go left"); rangeSearch(root.getLeftMTree(), houseVector, radius, returnList); } else if (root.getVector().X <= (houseVector.X - radius)) { Debug.WriteLine(root.getVector().X + " is smaller than " + (houseVector.X + radius) + " so we go right"); rangeSearch(root.getRightMTree(), houseVector, radius, returnList); } else { Debug.WriteLine("Not a single matching node found"); } } else { if (Math.Abs(houseVector.Y - root.getVector().Y) <= radius) { //Euclidean check for good measure (haha) if (Vector2.Distance(root.getVector(), houseVector) <= radius) { returnList.Add(root.getVector()); } //Be thorough and searche the rest too rangeSearch(root.getLeftMTree(), houseVector, radius, returnList); rangeSearch(root.getRightMTree(), houseVector, radius, returnList); } else if (root.getVector().Y > (houseVector.Y + radius)) { Debug.WriteLine(root.getVector().Y + " is bigger than " + (houseVector.Y + radius) + " so we go left"); rangeSearch(root.getLeftMTree(), houseVector, radius, returnList); } else if (root.getVector().Y < (houseVector.Y - radius)) { Debug.WriteLine(root.getVector().Y + " is smaller than " + (houseVector.Y + radius) + " so we go right"); rangeSearch(root.getRightMTree(), houseVector, radius, returnList); } else { Debug.WriteLine("Not a single matching node found"); } } } else { Debug.WriteLine("Empty tree"); } }