如何将矩形分成4个部分?

时间:2019-07-08 05:28:16

标签: python quadtree

我正在编写一个将黑白图像转换为四叉树的程序,因此我必须将一个矩形递归地分成4个部分,这些部分不必相等,但必须保留在整数网格上。 / p>

在我的逻辑中有些事情会引起随机平方之间的微小间隙,我似乎找不到。

这是将矩形分开的代码。它是自我分裂的“节点”类的一部分。节点采用左下角的一个(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

1 个答案:

答案 0 :(得分:1)

在细分功能中,您将所有四个最后象限的newWidth设置为newHeight,但将最右边的两个象限和最上面的两个象限分别偏移了newWidth2和newHeight2像素,因此,两个像素之间的间隔为一像素宽如果自身的长度或宽度为奇数,则为左/右或上/下半部分。

尝试

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