如何将矩形分成 4 个部分?
How do I partition a rectangle into 4 parts?
我正在制作一个将黑白图像转换为四叉树的程序,所以我必须递归地将一个矩形分成 4 个部分,这些部分不必相等但必须保持在整数网格上.
我的逻辑有点不对劲,导致随机方块之间出现小间隙,我似乎找不到它。
这是分割矩形的代码。它是分裂自身的 "node" class 的一部分。节点接受左下角的 (x,y) 元组(存储为 self.min)、宽度、高度,然后是其父节点。
def subDivide(self):
newHeight = math.floor(self.height/2)
newWidth = math.floor(self.width/2)
newHeight2 = math.ceil(self.height/2)
newWidth2 = math.ceil(self.width/2)
self.children.append(node(self.min, newWidth, newHeight, self))
self.children.append(
node((self.min[0]+newWidth2, self.min[1]), newWidth, newHeight, self))
self.children.append(
node((self.min[0]+newWidth2, self.min[1]+newHeight2), newWidth, newHeight, self))
self.children.append(
node((self.min[0], self.min[1]+newHeight2), newWidth, newHeight, self))
return self.children
这是渲染矩形的代码。该方法接受一个包含 8 个数字的元组(它们是每个点的 x 和 y 值)。我的点的 y 轴翻转了,所以我用 abs(... - height) 翻转它们(高度是整个图片的高度)。
pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2f', (x.min[0], abs(x.min[1] - height),
x.min[0] + x.width , abs(x.min[1] - height) ,
x.min[0] + x.width , abs(x.min[1] + x.height - height),
x.min[0], abs(x.min[1] + x.height - height) )), ('c3B', (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) )
Output
Expected Output
在你的细分函数中,你将所有四个最终象限都设为 newWidth 乘以 newHeight,但是你将最右边的两个象限和上面的两个象限分别偏移了 newWidth2 和 newHeight2 像素,所以有一个 one-pixel-wide在自身具有 odd-numbered 长度或宽度的情况下,left/right 或 top/bottom 两半之间的间隙。
尝试
def subDivide(self):
newHeight = math.floor(self.height/2)
newWidth = math.floor(self.width/2)
newHeight2 = math.ceil(self.height/2)
newWidth2 = math.ceil(self.width/2)
self.children.append(node(self.min, newWidth, newHeight, self))
self.children.append(
node((self.min[0]+newWidth, self.min[1]), newWidth2, newHeight, self))
self.children.append(
node((self.min[0]+newWidth, self.min[1]+newHeight), newWidth2, newHeight2, self))
self.children.append(
node((self.min[0], self.min[1]+newHeight), newWidth, newHeight2, self))
return self.children
我正在制作一个将黑白图像转换为四叉树的程序,所以我必须递归地将一个矩形分成 4 个部分,这些部分不必相等但必须保持在整数网格上.
我的逻辑有点不对劲,导致随机方块之间出现小间隙,我似乎找不到它。
这是分割矩形的代码。它是分裂自身的 "node" class 的一部分。节点接受左下角的 (x,y) 元组(存储为 self.min)、宽度、高度,然后是其父节点。
def subDivide(self):
newHeight = math.floor(self.height/2)
newWidth = math.floor(self.width/2)
newHeight2 = math.ceil(self.height/2)
newWidth2 = math.ceil(self.width/2)
self.children.append(node(self.min, newWidth, newHeight, self))
self.children.append(
node((self.min[0]+newWidth2, self.min[1]), newWidth, newHeight, self))
self.children.append(
node((self.min[0]+newWidth2, self.min[1]+newHeight2), newWidth, newHeight, self))
self.children.append(
node((self.min[0], self.min[1]+newHeight2), newWidth, newHeight, self))
return self.children
这是渲染矩形的代码。该方法接受一个包含 8 个数字的元组(它们是每个点的 x 和 y 值)。我的点的 y 轴翻转了,所以我用 abs(... - height) 翻转它们(高度是整个图片的高度)。
pyglet.graphics.draw(4, pyglet.gl.GL_QUADS, ('v2f', (x.min[0], abs(x.min[1] - height),
x.min[0] + x.width , abs(x.min[1] - height) ,
x.min[0] + x.width , abs(x.min[1] + x.height - height),
x.min[0], abs(x.min[1] + x.height - height) )), ('c3B', (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)) )
Output Expected Output
在你的细分函数中,你将所有四个最终象限都设为 newWidth 乘以 newHeight,但是你将最右边的两个象限和上面的两个象限分别偏移了 newWidth2 和 newHeight2 像素,所以有一个 one-pixel-wide在自身具有 odd-numbered 长度或宽度的情况下,left/right 或 top/bottom 两半之间的间隙。
尝试
def subDivide(self):
newHeight = math.floor(self.height/2)
newWidth = math.floor(self.width/2)
newHeight2 = math.ceil(self.height/2)
newWidth2 = math.ceil(self.width/2)
self.children.append(node(self.min, newWidth, newHeight, self))
self.children.append(
node((self.min[0]+newWidth, self.min[1]), newWidth2, newHeight, self))
self.children.append(
node((self.min[0]+newWidth, self.min[1]+newHeight), newWidth2, newHeight2, self))
self.children.append(
node((self.min[0], self.min[1]+newHeight), newWidth, newHeight2, self))
return self.children