Как разделить прямоугольник на 4 части?

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
531
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

Спасибо! Я думал о пикселях, а не о линиях между ними.

SpyGuyTBM 10.07.2019 07:15

Другие вопросы по теме