【问题标题】:How do I partition a rectangle into 4 parts?如何将一个矩形分成 4 个部分?
【发布时间】:2019-07-08 05:28:16
【问题描述】:

我正在制作一个将黑白图像转换为四叉树的程序,所以我必须递归地将一个矩形分成 4 部分,它们不必相等但必须保持在整数网格上。

我的逻辑有点不对劲,导致随机方块之间出现小间隙,我似乎找不到。

这是分割矩形的代码。它是分裂自身的“节点”类的一部分。节点接受左下角的 (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

【问题讨论】:

    标签: python quadtree


    【解决方案1】:

    在您的细分函数中,您将所有四个最终象限都设置为 newWidth 通过 newHeight,但是您将最右边的两个和上两个象限分别偏移了 newWidth2 和 newHeight2 像素,因此它们之间有一个像素宽的间隙在 self 的长度或宽度为奇数的情况下,左/右或上/下半部分。

    试试

    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
    

    【讨论】:

    • 谢谢!我在考虑像素而不是它们之间的线。
    猜你喜欢
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2011-05-18
    • 2011-04-24
    • 2023-04-08
    相关资源
    最近更新 更多