我正在尝试构建一个点区域四叉树,它使用Python在2D地图上存储点,但是当我尝试插入两个彼此接近(不太近)的点时,我遇到了一个错误: RuntimeError:cmp中超出的最大递归深度。我试图将最大递归数提高到10000,但不起作用。所以我猜我的代码有问题。请有人帮我这个吗?我是编程方面的新手,并且已经坚持了两天。顺便说一句,如果你发现任何不是“专业”的代码我会非常感激,如果你能教会我如何以适当的方式编写它们。非常感谢提前!
每个点由其坐标(x,z)和一个指针组成,该指针指向另一个文件中此点的数据。在四叉树中,每个只存储一个点,因此a)当一个点插入一个没有子元素且没有点的区域时,该点就进入该区域; b)当一个地区有孩子时,我们会尝试将该点插入其中一个孩子。 c)当一个点插入没有子节点但已经被一个点占据的区域时,该区域被细分为四个相等的子区域,旧点从该区域取出并放入其中一个子区域。然后,我们尝试将新点插入到孩子们身上。
class point():
def __init__(self,x,z,pointer):
self.x = x
self.z = z
self.pointer = pointer
class Node():
#_______________________________________________________
# In the case of a root node "parent" will be None. The
# "rect" lists the minx,minz,maxx,maxz of the rectangle
# represented by the node.
def __init__(self, parent, rect):
self.parent = parent
self.children = None
self.point = None
self.leaf = 0 # node is a leaf(=1) if it contains a point
if parent == None:
self.depth = 0
else:
self.depth = parent.depth + 1
self.rect = rect
x0,z0,x1,z1 = rect
#_______________________________________________________
# Subdivides a rectangle. Division occurs
def subdivide(self):
self.point = None
self.leaf = 0
self.children = [None,None,None,None]
x0,z0,x1,z1 = self.rect
h = (x1 - x0)/2
rects = []
rects.append( (x0, z0, x0 + h, z0 + h) )
rects.append( (x0, z0 + h, x0 + h, z1) )
rects.append( (x0 + h, z0 + h, x1, z1) )
rects.append( (x0 + h, z0, x1, z0 + h) )
for n in xrange(len(rects)):
self.children[n] = Node(self,rects[n])
#_______________________________________________________
# A utility proc that returns True if the coordinates of
# a point are within the bounding box of the node.
def contains(self, x, z):
x0,z0,x1,z1 = self.rect
if x >= x0 and x <= x1 and z >= z0 and z <= z1:
return True
return False
def insert(self, p):
if self.contains(p.x, p.z) == False:
return
if self.children == None:
if self.leaf == 1:
temp_point = copy.copy(self.point)
self.subdivide()
self.insert(temp_point)
self.insert(p)
else:
self.point = p
self.leaf = 1
else:
for child in self.children:
child.insert(p)
答案 0 :(得分:2)
h = (x1 - x0)/2
如果您正在使用Python 2.7,并且此处的x1和x0都是整数,则此除法的结果将被截断为最接近的整数。例如,如果x1为1且x0为0,则可能期望它们的中点为0.5。但是(1-0)/2
等于0.这导致subdivide
中的问题,其中四个子集中的三个将是无穷小,而第四个将与父rect相同。尝试执行浮点除法。
h = (x1 - x0)/2.0