Лабораторная работа № 12. Геометрические задачи

Теоретические сведения

Описание собственного типа данных

Создание собственного класса рассмотрим на примере описания собственного типа Circle, который будет хранить информацию об окружности. Любой объект хранит в себе набор членов класса. К ним относятся поля - состояние объекта и методы - функции, которые меняют состояние класса.

Описание класса начинается со служебного слова class и его имени:

class Circle:
    # члены класса

Python позволяет поместить функцию инициализации полей класса внутрь описания класса. Для этого в класс добавляется метод __init__(). Первый параметр метода будет ссылкой на объект, который нужно инициализировать. Этот параметр может иметь произвольное имя, но принято называть его self:

class Circle:
    # конструктор с тремя параметрами:
    # (x, y) - координаты центра окружностиб
    # r - радиус окружности
    def __init__(self, x, y, r):
        self.x = x
        self.y = y
        self.r = r

Создание объектов класса

Чтобы создать экземпляр класса или объект этого типа, необходимо записать имя класса с круглыми скобками. В примере показано создание двух объектов класса Circle:

krug1 = Circle(0, 0, 4)
krug2 = Circle(3, 4, 5.5)

Методы класса

Помимо конструктора, описание класса может содержать другие методы, предназначенные для работы с объектом данного типа. Например для класса Circle мы можем добавить метод расчёта длины окружности. Назовём метод L(). Все методы класса должны иметь минимум один параметра, который принято называть self - ссылку на обрабатываемый объект:

class Circle:
    def __init__(self, x, y, r):
        self.x = x
        self.y = y
        self.r = r
        
    def L(self):
        # self.r позволяет получить значение поля для обрабатываемого объекта
        return 2 * 3.14 * self.r 

Чтобы вызвать метод, нужно записать имя объекта, а затем через точку имя метода. Важно: при вызове метода параметр self не учитывается. В нашем случае скобки при вызове метода L() будут пустыми:

print(krug1.L())

Задания для самостоятельной работы

💻 Задание 1. Класс Point

Создайте класс Point для описания точки на плоскости.

Поля класса:

  • x - координата x точки - тип float;
  • y - координата y точки - тип float.

Методы класса:

  • __init__(self, x, y) - конструктор класса в который передаются координаты создаваемой точки;
  • dist(self, p) - расстояние до точки p - возвращает значение типа float;
  • __str__(self) - возвращает строковое представление объекта в формате x: <координата x>, y: < координата y> - возвращает значение типа str.

Откройте редактор IDLE и создайте новый скрипт. Сохраните файл на рабочем диске под именем point.py.

Запишите в файл следующий шаблон класса Point:

point.py
from math import sqrt

class Point:
    """Описание точки на плоскости"""
    
    def __init__(self, x, y):
        """Конструктор класса"""
        self.x = x  # абсцисса
        self.y = y  # ордината
        
if __name__ == "__main__":
    p1 = Point(0, 5) # создание первого объекта класса 
    print(p1.x, p1.y)

    p2 = Point(-2, 3) # создание второго объекта класса 
    print(p2.x, p2.y)

Запустите скрипт и проверьте его работоспособность. Результат работы:

0 5
-2 3

Добавьте в класс Point метод __str__(self), который будет вызываться каждый раз, когда объект класса нужно преобразовать в строковый тип:

point.py
from math import sqrt

class Point:
    """Описание точки на плоскости"""
    
    def __init__(self, x, y):
        """Конструктор класса"""
        self.x = x  # абсцисса
        self.y = y  # ордината
        
    def __str__(self):
        return f"x: {self.x}, y: {self.y}"

if __name__ == "__main__":
    p1 = Point(0, 5) # создание первого объекта класса 
    print(p1)

    p2 = Point(-2, 3) # создание второго объекта класса 
    print(p2)

Запустите скрипт. Результат его работы показан ниже:

x: 0, y: 5
x: -2, y: 3

Добавьте в класс Point метод для расчёта расстояния dist(self, p) между текущей точкой и точкой p. Для расчётов используем следующую формулу: \[ d = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2} \] Дополните код скрипта:

point.py
from math import sqrt

class Point:
    """Описание точки на плоскости"""
    
    def __init__(self, x, y):
        """Конструктор класса"""
        self.x = x  # абсцисса
        self.y = y  # ордината
        
    def __str__(self):
        return f"x: {self.x}, y: {self.y}"
    
    def dist(self, p):
        delta_x = self.x - p.x
        delta_y = self.y - p.y
        return sqrt(delta_x ** 2 + delta_y ** 2)

if __name__ == "__main__":
    p1 = Point(0, 5) # создание первого объекта класса 
    print(p1)

    p2 = Point(-2, 3) # создание второго объекта класса 
    print(p2)

    print(p1.dist(p2))

Запустите скрипт. Результат его работы показан ниже:

x: 0, y: 5
x: -2, y: 3
2.8284271247461903

Класс готов.

💻 Задание 2. Класс Triangle

Создайте класс Triangle для описания треугольника, заданного через координаты трёх точек на плоскости - вершин треугольника.

Поля класса:

  • p1 - координата первой вершины треугольника - тип Point;
  • p2 - координата второй вершины треугольника - тип Point;
  • p3 - координата третьей вершины треугольника - тип Point.

Методы класса:

  • __init__(self, p1, p2, p3) - конструктор класса в который передаются координаты вершин треугольника;
  • sq(self) - площадь треугольника - возвращает значение типа float.

Создайте новый скрипт triangle.py. Используйте следующий шаблон. Замените многоточие ( ... ) на необходимые инструкции Python:

triangle.py
from math import sqrt
from point import Point

class Triangle:
    def __init__(self, p1, p2, p3):
        self.p1 = p1
        self.p2 = ...
        self.p3 = ...
        
if __name__ == "__main__":
    a = Point(0, 0)
    b = Point(0, 3)
    
    tr = Triangle(a, b, Point(4, 0))
    print(tr.p1, "|", tr.p2, "|", tr.p3)

Запустите скрипт. Результат его работы показан ниже:

x: 0, y: 0 | x: 0, y: 3 | x: 4, y: 0

Добавьте в класс Triangle метод sq(self) для вычисления площади треугольника. Замените многоточие ( ... ) на необходимые инструкции Python:

triangle.py
from math import sqrt
from point import Point

class Triangle:
    def __init__(self, p1, p2, p3):
        self.p1 = p1
        self.p2 = p2
        self.p3 = p3
        
    def sq(self):
        a = self.p1.dist(self.p2)   # вычисление длины первой стороны треугольника
        b = self.p2.dist(...)       # в качестве аргумента передайте правильное поле
        c = ...     # вычислите длину третьей стороны по аналогии с двумя другими
        
        p = ... # вычисление пулупериметра
        s = ... # вычисление площади по формуле Герона
        return s
        
if __name__ == "__main__":
    a = Point(0, 0)
    b = Point(0, 3)
    
    tr = Triangle(a, b, Point(4, 0))
    print(tr.sq())

Запустите скрипт. Результат его работы показан ниже:

6.0

Задача решена

💻 Задание 3. Класс Polygon

Опишем класс Polygon для представления многоугольника на плоскости. Вершины многоугольника представим в качестве объектов класса Point и будем хранить их в поле класса с типом список (list).

Создайте новый скрипт polygon.py. Используйте следующий шаблон:

polygon.py
from point import Point

class Polygon:
    def __init__(self, points):
        self.points = points

# в качестве аргумента передаём в конструктор
# массив значений типа Point
poly = Polygon([Point(2, 1),Point(6, 1),Point(6, 4),Point(2,4)])

# вывод информации о каждой вершине многоугольника
for p in poly.points:
    print(p)

Запустите скрипт. Результат его работы показан ниже:

x: 2, y: 1
x: 6, y: 1
x: 6, y: 4
x: 2, y: 4

Добавим к классу Polygon метод sq() для нахождения площади многоугольника. Для этого будем находить площади треугольников, образующихся первой вершиной многоугольника и последующими парами вершин:

Площадь многоугольника

Площадь многоугольника

Дополните код класса:

polygon.py
from point import Point
from triangle import Triangle

class Polygon:
    def __init__(self, points):
        self.points = points
        
    def sq(self):
        total = 0
        p0 = self.points[0]
        for i in range(1, len(self.points) - 1):
            p1 = self.points[i]
            p2 = self.points[i+1]
            tr = Triangle(p0, p1, p2)
            total += tr.sq()
        return total
    

poly = Polygon([Point(2, 1),Point(6, 1),Point(6, 4),Point(2,4)])
print(poly.sq())

Запустите скрипт. Результат его работы показан ниже:

12.0

💻 Задание 4 (sam04.py)

Опишите класс, представляющий объёмную фигуру указанную в вашем варианте. Создайте минимум два объекта созданного класса. Минимум один раз вызовите каждый метод, описанный в классе.

Константу \(\pi\) импортируйте из модуля math:

from math import pi

Класс Cone для описания конуса.

Конус

Конус

(1 балл) Поля: r - радиус основания, h - высота. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(2 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс Cuboid для описания прямоугольного параллелепипеда.

Прямоугольный параллелепипед

Прямоугольный параллелепипед

(1 балл) Поля: a - длина, b - ширина, c - высота. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс Spheroid для описания Эллипсоида.

Эллипсоид

Эллипсоид

(1 балл) Поля: a - полуось a, b - полуось b, c - полуось c. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс TCone для описания усечённого конуса.

Усечённый конус

Усечённый конус

(1 балл) Поля: R - радиус нижнего основания, r - радиус верхнего основания, h - высота конуса. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс NPyramid для описания пирамиды с многоугольником в основании.

Пирамида

Пирамида

(1 балл) Поля: a - сторона основания, n - число сторон основания, h - высота пирамиды. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс Cylinder для описания цилиндра.

Цилиндр

Цилиндр

(1 балл) Поля: r - радиус основания, h - высота цилиндра. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс TPyramid для описания усечённой пирамиды.

Усечённая пирамида

Усечённая пирамида

(1 балл) Поля: s1 - площадь верхнего основания, s2 - площадь нижнего основания, h - высота пирамиды. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс Cone для описания конуса.

Конус

Конус

(1 балл) Поля: r - радиус основания, h - высота. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(2 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс Cuboid для описания прямоугольного параллелепипеда.

Прямоугольный параллелепипед

Прямоугольный параллелепипед

(1 балл) Поля: a - длина, b - ширина, c - высота. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс Spheroid для описания Эллипсоида.

Эллипсоид

Эллипсоид

(1 балл) Поля: a - полуось a, b - полуось b, c - полуось c. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс TCone для описания усечённого конуса.

Усечённый конус

Усечённый конус

(1 балл) Поля: R - радиус нижнего основания, r - радиус верхнего основания, h - высота конуса. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс NPyramid для описания пирамиды с многоугольником в основании.

Пирамида

Пирамида

(1 балл) Поля: a - сторона основания, n - число сторон основания, h - высота пирамиды. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс Cylinder для описания цилиндра.

Цилиндр

Цилиндр

(1 балл) Поля: r - радиус основания, h - высота цилиндра. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.

Класс TPyramid для описания усечённой пирамиды.

Усечённая пирамида

Усечённая пирамида

(1 балл) Поля: s1 - площадь верхнего основания, s2 - площадь нижнего основания, h - высота пирамиды. Создано минимум два объекта класса.

(2 балла) Методы: sq() - вычисление площади поверхности, vol() - вычисление объема.

(3 балла) Методы: mass(q) - вычисление массы тела по плотности q, scale(m) - изменение всех размеров тела в m раз.