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






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