135 lines
3.4 KiB
Python
135 lines
3.4 KiB
Python
|
"""
|
|||
|
https://stepik.org/lesson/468997/step/10?unit=459818
|
|||
|
Реализуйте с помощью библиотеки Graph рисунки "Домик" и "Лягушка"
|
|||
|
|
|||
|
Библиотека graph: https://kpolyakov.spb.ru/download/pygraph.zip
|
|||
|
"""
|
|||
|
|
|||
|
from typing import NamedTuple
|
|||
|
from graph import penColor, brushColor, rectangle, polygon, penSize, label, circle, run
|
|||
|
|
|||
|
black = "black"
|
|||
|
|
|||
|
|
|||
|
class Point(NamedTuple):
|
|||
|
x: int | float
|
|||
|
y: int | float
|
|||
|
|
|||
|
def __add__(self, other):
|
|||
|
if isinstance(other, self.__class__):
|
|||
|
return self.__class__(self.x + other.x, self.y + other.y)
|
|||
|
if isinstance(other, (int, float)):
|
|||
|
return self.__class__(self.x + other, self.y + other)
|
|||
|
return NotImplemented
|
|||
|
|
|||
|
|
|||
|
class Colors(NamedTuple):
|
|||
|
pen: str | tuple[int, int, int]
|
|||
|
brush: str | tuple[int, int, int]
|
|||
|
|
|||
|
|
|||
|
class Figure:
|
|||
|
def __init__(
|
|||
|
self,
|
|||
|
point=Point(0, 0),
|
|||
|
size=Point(1, 1),
|
|||
|
colors=Colors(black, "white"),
|
|||
|
pen_size=1,
|
|||
|
):
|
|||
|
self.point, self.size, self.colors, self.pen_size = (
|
|||
|
point,
|
|||
|
size,
|
|||
|
colors,
|
|||
|
pen_size,
|
|||
|
)
|
|||
|
|
|||
|
def draw(self):
|
|||
|
penColor(self.colors.pen)
|
|||
|
brushColor(self.colors.brush)
|
|||
|
penSize(self.pen_size)
|
|||
|
|
|||
|
|
|||
|
class Box(Figure):
|
|||
|
def draw(self):
|
|||
|
super().draw()
|
|||
|
rectangle(*self.point, *(self.point + self.size))
|
|||
|
|
|||
|
|
|||
|
class TriangleA(Figure):
|
|||
|
def get_mid(self):
|
|||
|
return self.point + Point(self.size.x / 2, -self.size.y)
|
|||
|
|
|||
|
def draw(self):
|
|||
|
super().draw()
|
|||
|
end = self.point + Point(self.size.x, 0)
|
|||
|
polygon([self.point, self.get_mid(), end, self.point])
|
|||
|
|
|||
|
|
|||
|
class TriangleV(TriangleA):
|
|||
|
def get_mid(self):
|
|||
|
return self.point + Point(self.size.x / 2, self.size.y)
|
|||
|
|
|||
|
|
|||
|
class Circle(Figure):
|
|||
|
def draw(self):
|
|||
|
super().draw()
|
|||
|
circle(*self.point, self.size.x)
|
|||
|
|
|||
|
|
|||
|
class Composite(Figure):
|
|||
|
def __init__(self, *args, **kwargs):
|
|||
|
super().__init__(*args, **kwargs)
|
|||
|
self.childs = []
|
|||
|
|
|||
|
def add(self, fig):
|
|||
|
fig.point = self.point + fig.point
|
|||
|
self.childs.append(fig)
|
|||
|
|
|||
|
def draw(self):
|
|||
|
super().draw()
|
|||
|
for fig in self.childs:
|
|||
|
fig.draw()
|
|||
|
|
|||
|
|
|||
|
def home(x, y):
|
|||
|
fig = Composite(Point(x, y))
|
|||
|
fig.add(Box(size=Point(100, 100), colors=Colors(black, "green3")))
|
|||
|
fig.add(TriangleA(Point(-20, 0), Point(140, 50), Colors(black, "blue")))
|
|||
|
fig.add(
|
|||
|
Box(
|
|||
|
Point(30, 20),
|
|||
|
Point(40, 50),
|
|||
|
Colors("white", black),
|
|||
|
5,
|
|||
|
)
|
|||
|
)
|
|||
|
fig.draw()
|
|||
|
|
|||
|
|
|||
|
def frog(x, y):
|
|||
|
fig = Composite(Point(x, y))
|
|||
|
fig.add(Circle(size=Point(35, 35), colors=Colors(black, "red")))
|
|||
|
fig.add(TriangleA(Point(35, 0), Point(180, 60), Colors(black, "indigo")))
|
|||
|
fig.add(TriangleV(Point(35, -60), Point(180, 60), Colors(black, "green1")))
|
|||
|
fig.add(Circle(Point(250, 0), Point(35, 35), Colors(black, "yellow")))
|
|||
|
fig.draw()
|
|||
|
|
|||
|
|
|||
|
def main():
|
|||
|
font = ("Arial", 18)
|
|||
|
indigo = "indigo"
|
|||
|
|
|||
|
label("«3»", 10, 20, font=font, foreground=indigo)
|
|||
|
label(": «Домик»", 51, 20, font=font)
|
|||
|
home(200, 100)
|
|||
|
|
|||
|
label("«4»", 10, 280, font=font, foreground=indigo)
|
|||
|
label(": «Лягушка»", 51, 280, font=font)
|
|||
|
frog(120, 400)
|
|||
|
|
|||
|
run()
|
|||
|
|
|||
|
|
|||
|
if __name__ == "__main__":
|
|||
|
main()
|