Рисуване на многоъгълници с цикли¶
Спомнете си пример за програма, която рисува ограда:
Както научихме междувременно, изготвянето на всеки пикет с отделно изявление не е най-добрият начин да се направи тази рисунка. По-гъвкава програма би била получена чрез изчертаване на пикетите в контур. Нека да разгледаме как трябва да нарисуваме многоъгълник (пикет е представен с шестоъгълник), така че да бъде лесно да нарисуваме същия полигон на други места.
Със сигурност е полезно да се въведе основна точка (котва), във връзка с която биха се изразили всички многоъгълни върхове. При ограда върховете на първия пикет са [(20, 80), (30, 70), (40, 80), (40, 270), (20, 270)]. Можем да изберем първата определена точка (20, 80) за котвата и да изразим останалите точки, използвайки координатите на първата точка. Така получаваме, че върховете на един пикет са [(x, y), (x + 10, y-10), (x + 20, y), (x + 20, y + 190), (x, y + 190)]. Поставяйки x = 20, y = 80, получаваме координатите на първия пикет в оградата и като увеличаваме последователно x по 40 всеки, можем да получим други пикети.
y = 80
for x in range(20, 300, 40):
pg.draw.polygon(canvas, pg.Color('brown'), [(x, y), (x + 10, y-10), (x + 20, y), (x + 20, y+190), (x, y+190)])
Тъй като всички пикети са на една и съща височина, координатата y на котвата не се променя, така че дори не е нужно да го въвеждаме (ще трябва да въведем y координатите, ако някои от пикетите бяха над други). Това означава, че в този случай можем да напишем предишния код малко по-просто.
for x in range(20, 300, 40):
pg.draw.polygon(canvas, pg.Color('brown'), [(x, 80), (x + 10, 70), (x + 20, 80), (x + 20, 270), (x, 270)])
Възможни са различни варианти на тази основна идея. Например, ако първоначално формираме списък на многоъгълни върхове (за първия пикет), можем да формираме списък на разселените върхове по няколко начина.
Можем да изчислим координатите на преместените върхове в допълнителен цикъл:
picket = [(0, 0), (10, -10), (20, 0), (20, 190), (0, 190)]
y0 = 80
for x0 in range(20, 300, 40):
displaced_picket = []
for x, y in picket:
displaced_picket.append((x+x0, y+y0))
pg.draw.polygon(canvas, color, displaced_picket)
Можем да въведем функция за изчертаване на даден многоъгълник в дадена позиция и формиране на списъка с изместени върхове във функцията:
def draw_polygon(points, color, x0, y0):
displaced_points = []
for x, y in points:
displaced_points.append((x+x0, y+y0))
pg.draw.polygon(canvas, color, displaced_points)
picket = [(0, 0), (10, -10), (20, 0), (20, 190), (0, 190)]
for x0 in range(20, 300, 40):
draw_polygon(picket, pg.Color('brown'), x0, 80)
Всеки от тези два подхода може да замени седемте повиквания към функцията pg.draw.polygon в дадения първоначален пример и всеки е по-добър от тегленето на прикачени файлове с отделни команди. Използването на функцията дава малко по-дълъг код, но има предимството, че същата функция може да се използва без никакви изменения, за да нарисувате всеки многоъгълник в нова позиция.
Опитайте една или и двете от предложените промени в горната програма и след това използвайте един от тези методи за решаване на следните задачи.
Задачи за упражнение¶
Задача-осмоъгълници
Напишете програма, която рисува осмоъгълници, както е в примера (щракнете върху бутона „Play Task“)..
Функцията за рисуване на многоъгълник е подобна на предишната. Единствената разлика е, че в него функцията pg.draw.polygon се извиква два пъти: веднъж за вътрешността на полигона, а другия път за ръбовете.
Дадени са и координатите на осмоъгълника, остава да се добави повикване към функцията за рисуване вътре в двоен контур. И двете x и y започват от стойност 0 и напредват в стъпки 48 (48 е „ширината“ и „височината“ на осмоъгълника).
Задача - стрелки
Изпълнете следната програма, за да нарисувате даденото изображение (можете да видите изображението, като кликнете върху бутона „Play Task“).
Белите стрелки са насочени вляво, а черните стрелки - вдясно. Тъй като черно-белите стрелки покриват изцяло изображението, забележете, че е достатъчно да нарисувате само черни стрелки (на бял фон).
Задача - стадо жирафи
Дадени са координатите на върховете на многоъгълника, който представлява жирафа. Завършете програмата, като нарисувате няколко жирафа (използвайки функцията draw_polygon). Направете списък с позиции на жирафи по желание.