Лабораторная работа 4

Правильный многоугольник Рело. Векторизация вычислений в numpy

Компьютерная математика II, ММФ, БГУ

Лаврова О.А., март 2022

Навыки

  1. Python: пользовательские функции; списковые включения; range; обработка исключений: оператор assert; встроенное исключение AssertionError
  2. модуль pyplot из пакета matplotlib: plot, axis
  3. расширение numpy: тип данных массив (ndarray); конструктор array; arange; арифметические операции над массивами; sin, cos; transpose; индексация матриц; linspace; concatenate
  4. математика: окружность, описанная вокруг правильного $n$-угольника; центральный угол; правильный многоугольник Рело

Определения и свойства

Треугольник Рело представляет собой область пересечения трех кругов радуса $r$ с центрами в вершинах равностороннего треугольника с длиной стороны $r$.

Правильный $n$-угольник Рело представляет собой область пересечения $n$ кругов радуса $r$ с центрами в вершинах правильного $n$-угольника с нечетным числом сторон длины $l$. Радиус круга $r$ согласован с длиной стороны $l$ правильного многоугольника таким образом, чтобы окружность радиуса $r$ проходила через две соседние вершины правильного $n$-угольника.

Правильный многоугольник Рело и круг являются примерами фигур постоянной ширины. Для фигуры постоянной ширины можно построить пары параллельных опорных прямых, которые касаются фигуры, но не пересекают ее, и, независимо от выбора пары опорных прямых, расстояние между прямыми будет всегда одинаковым.

Расстояние между опорными прямыми называется шириной фигуры. Ширина правильного многоугольника Рело равна радиусу $r$ пересекающихся кругов. Ширина круга равна диаметру круга. Среди всех фигур постоянной ширины треугольник Рело имеет наименьшую площадь, круг имеет наибольшую площадь.

Задание 4.1 (Правильный многоугольник Рело)

$\color{red}{Напишите}$ пользовательскую функцию regular_polygon_Relo(n, center, r, N), которая возвращает матрицу, каждая строка которой содержит координаты точек, описывающих границу правильного многоугольника Рело.

Аргументы пользовательской функции имеют следующий смысл:

Реализация задания 4.1

Этап 1. Построение треугольника Рело

1. Определение переменных

2. Вычисление координат вершин правильного треугольника

Вершины правильного многоугольника расположены на окружности, описанной вокруг многоугольника. Радиус $R$ окружности, описанной вокруг правильного $n$-угольника с длиной стороны $l$, вычисляется по формуле $$ R = \frac{l}{2 \sin{\pi/n}}. $$

Длина стороны $l$ правильного треугольника, на котором будем строить треугольник Рело, совпадает с шириной треугольника Рело $r$

Вычислим радиус $R$ описанной окружности

Введем прямоугольную декартову систему координат. Построим матрицу с координатами вершин правильного треугольника. Центр треуголника размещаем в точке $center$, радиус описанной окружности полагаем равным $R$

3. Представление одной стороны треугольника Рело

Обозначим через $\alpha$ центральный угол, соответствующий стороне правильног $n$-угольника. Тогда $$\alpha = 2 \pi /n.$$

Обозначим через $\beta$ центральный угол, соответствующий стороне правильного многоугольника Рело, когда центр окружности расположен в вершине правильного многоугольника. Тогда $$\beta = \alpha/2.$$

Построим матрицу с координатами точек, описывающих сторону треугольника Рело относительно вершины vertices[0]. Сторона представляет собой дугу окружности радиуса $r$ с центром в точке vertices[0] и значением угла $[\pi-\beta/2, \pi+\beta/2]$.

Вычислим значения введенных величин

Введем вспомогательную последовательность значений угла для построения координат точек стороны треугольника Рело

Строим матрицу с координатами точек первой стороны

Построим матрицу с координатами точек, описывающих сторону треугольника Рело относительно второй вершины vertices[1]. Сторона представляет собой дугу окружности радиуса $r$ с центром в точке vertices[1] и значением угла $[\pi+\alpha-\beta/2, \pi+\alpha+\beta/2]$

4. Моделирование границы треугольника Рело

Создадим список из матриц, каждая их которых содержит координаты точек одной из сторон треугольника Рело

С помощью фунции concatenate из расширения numpy объединим массивы для каждой из сторон в единый массив sides

Этап 2. Построение правильного многоугольника Рело

Следуя аналогичным рассуждениям из Этапа 1, $\color{red}{создайте}$ матричное описание границы правильного многоугольника Рело для произвольных значений переменных n, center, r, N.

$\color{red}{Внимание}$: длина стороны $l$ правильного многоугольника, на основании которого строится многоугольник Рело, является неизвестной величиной и должна быть выражена через количество вершин $n$ и ширину $r$ многоугольника Рело.

$\color{red}{Напишите}$ подробно, как получена аналитическая зависимость $l$ от $n$ и $r$. Объяснения оформите в тексте документа с лабораторной работой.

Этап 3. Результирующая пользовательская функция

$\color{red}{\text{Напишите}}$ результирующую пользовательскую функцию regular_polygon_Relo(n, center, r, N) на основании кода из Этапа 2.

Для функции regular_polygon_Relo $\color{red}{напишите}$ строки документации.

$\color{red}{Протестируйте}$ функцию regular_polygon_Relo для различных значений аргументов в предположении, что корректность вводимых данных не гарантируется.

$\color{red}{Постройте}$ в одной системе координат правильные многоугольники Рело для различного количества вершин и различных положений центров. При этом $\color{red}{вызывайте}$ функцию regular_polygon_Relo с различными способами указания позиционных и ключевых аргументов.

$\color{red}{Создайте}$ модуль relo.py, в котором будет содержаться пользовательская функция regular_polygon_Relo.

Комментарии

Оператор assert может использоваться для контроля за передаваемыми значеними аргументов при вызове функции. Оператор assert генерирует исключение по условию. Например,

Если условие $r>0$ истинно, то код, следующий за оператором assert, выполняется

Если условие $r>0$ ложно, то оператор assert генерирует исключение AssertionError, прерывает процесс выполнения кода и выдает сообщение об ошибке с использованием строкового объекта, указанного при вызове оператора assert