Как разделить прямоугольник на 4 части? - PullRequest
0 голосов
/ 08 июля 2019

Я делаю программу, которая преобразует черно-белое изображение в квадри, поэтому мне нужно рекурсивно разделить прямоугольник на 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 (... - высота) (высота - это высота всего изображения).

 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)) )

Вывод Ожидаемый результат

1 Ответ

1 голос
/ 08 июля 2019

В вашей функции деления вы делаете все четыре из ваших последних квадрантов 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
...