diff --git a/mod_graph/figures1.py b/mod_graph/figures1.py new file mode 100644 index 0000000..2964c4e --- /dev/null +++ b/mod_graph/figures1.py @@ -0,0 +1,134 @@ +""" + 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()