KDTree Utilities (mathutils.kdtree)#

Generic 3-dimensional kd-tree to perform spatial searches.

import mathutils

# create a kd-tree from a mesh
from bpy import context
obj = context.object

mesh = obj.data
size = len(mesh.vertices)
kd = mathutils.kdtree.KDTree(size)

for i, v in enumerate(mesh.vertices):
    kd.insert(v.co, i)

kd.balance()


# Find the closest point to the center
co_find = (0.0, 0.0, 0.0)
co, index, dist = kd.find(co_find)
print("Close to center:", co, index, dist)

# 3d cursor relative to the object data
co_find = obj.matrix_world.inverted() @ context.scene.cursor.location

# Find the closest 10 points to the 3d cursor
print("Close 10 points")
for (co, index, dist) in kd.find_n(co_find, 10):
    print("    ", co, index, dist)


# Find points within a radius of the 3d cursor
print("Close points within 0.5 distance")
for (co, index, dist) in kd.find_range(co_find, 0.5):
    print("    ", co, index, dist)
class mathutils.kdtree.KDTree#

KdTree(size) -> new kd-tree initialized to hold size items.

Note

KDTree.balance must have been called before using any of the find methods.

balance()#

Balance the tree.

Note

This builds the entire tree, avoid calling after each insertion.

find(co, filter=None)#

Find nearest point to co.

Parameters:
  • co (Sequence[float]) – 3D coordinates.

  • filter (Callable[[int], bool]) – function which takes an index and returns True for indices to include in the search.

Returns:

Returns (position, index, distance).

Return type:

tuple[Vector, int, float]

find_n(co, n)#

Find nearest n points to co.

Parameters:
  • co (Sequence[float]) – 3D coordinates.

  • n (int) – Number of points to find.

Returns:

Returns a list of tuples (position, index, distance).

Return type:

list[tuple[Vector, int, float]]

find_range(co, radius)#

Find all points within radius of co.

Parameters:
  • co (Sequence[float]) – 3D coordinates.

  • radius (float) – Distance to search for points.

Returns:

Returns a list of tuples (position, index, distance).

Return type:

list[tuple[Vector, int, float]]

insert(co, index)#

Insert a point into the KDTree.

Parameters:
  • co (Sequence[float]) – Point 3d position.

  • index (int) – The index of the point.