Member 12870019 Ответов: 1

Написание прямоугольников на прямоугольном фоне


Привет, люди. Я пытаюсь создать функцию, в которой у вас есть фон,и вы пишете прямоугольники из списка с координатами x, y на фоне с помощью модуля png.

Что я уже пробовал:

Я пытался записать это так

def foto(self,lista,randomname):
    width = self.w
    length = self.h
    def create(iw, ih, c=(0,0,0)):
        img = []
        for _ in range(ih):
            row = []
            for _ in range(iw):
                row.append(c)
                img.append(row)
        return img
    def inside(img, i, j):
        return 0 <= i < width and 0<= j < lenght
    def draw_quad_simple(img, x, y, w, h, c=(0,0,0)):
        for j in range(y, y+h):
            for i in range(x,x+w):
                if inside(img,i,j):
                    img[j][i] = c
    background= create(self.w,self.h,(self.r,self.g,self.b))
    p=0
    for p in range(len(lista)) :
        draw_quad_simple(background,self.w,self.h,(lista[p].x - self.x),(lista[p].y-self.y),lista[p].w,lista[p].h,(lista[p].r,lista[p].g,lista[p].b))
        p=p+1
    def save(filename, img):
        pyimg =png.from_array(img, 'RGB')
        pyimg.save(filename)
    save(fname_out,background)


Но в коде есть что-то неправильное, чего я не понимаю. Я должен получить это ИЗОБРАЖЕНИЕ но я получаю ЭТОТ , и я понятия не имею, где ошибка. Вход есть :

BackgroundRectangle = starting point p1(50,70) color c1(255,0,0) Rectangle(p1,150,100,c1)

Rect2= starting point p2(100,40) color c2(0,255,0) Rectangle(p2,40,70,c2)
Rect3= starting point p3(120,90) color c3(0,0,255) Rectangle(p3,60,40,c3)
Rect4= starting point p4(30,140) color c4(255,255,0) Rectangle(p4,50,20,c4)
Rect5= starting point p5(130,20) color c5(0,255,255) Rectangle(p5,50,20,c5)
lista= [Rect2,Rect3,Rect4,Rect5]
randomname='randomname'


Правка: исправлен код, теперь он работает

1 Ответов

Рейтинг:
7

Jochen Arndt

Я не очень хорошо знаю Python, но не должен ли img.append(row) во время телефонного разговора с повышенным уровнем должно быть исполнено вне iw петля?

def create(iw, ih, c=(0,0,0)):
    img = []
    for _ in range(ih):
        row = []
        for _ in range(iw):
            row.append(c)
        img.append(row)
    return img


[РЕДАКТИРОВАТЬ]
Существует также оператор инкремента для p переменная внутри цикла, так что обрабатывается только каждый второй элемент. Если это не намеренно, удалите его:
#p=0
for p in range(len(lista)) :
    draw_quad_simple(background,lista[p].x,lista[p].y,lista[p].w,lista[p].h,(lista[p].r,lista[p].g,lista[p].b))
    #p=p+1

[/РЕДАКТИРОВАТЬ]


Member 12870019

Ладно , это была одна из ошибок, теперь изображение больше не огромное красное вещество, но оно гораздо ближе к решению http://imgur.com/UGKUY7P

Jochen Arndt

Хорошо.

Но, как я уже писал, Я не очень хорошо разбираюсь в Python.

Как насчет переменной p, используемой в цикле и увеличенной внутри?
Разве переменная не увеличивается оператором range?

Я обновлю свое решение.

Member 12870019

Я довольно новичок в Python и исхожу из некоторого опыта работы на c++, я пытался думать об этом на c++, но писать на Python

Jochen Arndt

Если вы посмотрите на мой профиль, то увидите, что я тоже программист на C/C++.

Но как программист на C++ вы должны это понимать

для p в диапазоне (len(lista))

похож на

for (int p = 0; p < lista. count(); p++)

потому что этот тип оператора range использует параметры start и step по умолчанию 0 resp. 1.

Member 12870019

Правда. Должен признаться, что я немного наклонился, так как у меня есть 5 дней, чтобы сделать другие 2 программы. Исправил это Тхо, онна редактирует главный пост. Я создавал bg, не учитывая, что он начинался с 0,0, а не с 50,70

Jochen Arndt

Спасибо вам за ваши отзывы и принятие решения.

Такие ошибки случаются и со мной после многих лет опыта. И часто требуется много времени, чтобы найти виновника, например, неправильные начальные значения в вашем случае.