Лабораторная работа 6. Правильный многоугольник Рело

Вычислительная практика II, ММФ, БГУ

Лаврова О.А., май 2020

In [1]:
import math as mth
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

Необходимые теоретические сведения

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

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

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

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

Постановка задачи

  1. Напишите пользовательскую функцию regular_polygon_Relo(n, center, r, N), которая строит матрицу координат для поточечного описания границы правильного многоугольника Рело.

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

  • n -- количество вершин правильного многоугольника Рело; является нечетным целым числом большим 2; по умолчанию n=3;
  • center -- последовательность из двух координат центра правильного многоугольника Рело; по умолчанию центру соответствует начало координат;
  • r -- ширина правильного многоугольника Рело; является положительным числом; по умолчанию r=1;
  • N -- количеству точек для описания одной стороны правильного многоугольника Рело; является натуральным числом; по умолчанию N=100.

Для пользовательской функции напишите строки документирования. Используйте инструкцию отладочной проверки assert для контроля значений аргументов.

  1. Постройте в одной системе координат правильные многоугольники Рело для различных значений вершин и различных значений центров.

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

Инициализация исходных данных

In [15]:
n = 3 # количество вершин правильного треугольнака Рело
center = np.array([0,0]) # центр правильного треугольника Рело
r = 10 # ширина правильного треугольника Рело
N = 100 # количество точек для описания стороны треугольника Рело

Определение координат вершин правильного треугольника

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

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

In [3]:
l = r # !!! справедливо только для треугольника Рело
R = l/(2*mth.sin(mth.pi/n))

Построим матрицу с координатами вершин правильного треугольника

In [4]:
t = np.arange(0,2*np.pi,2*np.pi/n)

vertices = center + R*np.transpose([np.cos(t), np.sin(t)]) 
In [5]:
plt.plot(vertices[:,0],vertices[:,1],'r.',markersize=20)
plt.axis('equal');

Поточечное описание стороны правильного треугольника Рело

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

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

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

In [6]:
alpha = 2*mth.pi/n 
beta = alpha/2

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

In [7]:
angle = np.linspace(-beta/2,beta/2,N)

Построим матрицу с координатами точек, описывающих сторону правильного треугольника Рело относительно первой вершины

In [8]:
side0 = np.zeros(N)
side0 = vertices[0] + r*np.transpose([np.cos(angle + np.pi), np.sin(angle + np.pi)])
In [9]:
plt.plot(vertices[:,0],vertices[:,1],'r.',markersize=20)
plt.plot(side0[:,0],side0[:,1],'b-',markersize=20)
plt.axis('equal');

Построим матрицу с координатами точек, описывающих сторону правильного треугольника Рело относительно второй вершины

In [10]:
side1 = np.zeros(N)
side1 = vertices[1] + r*np.transpose([np.cos(angle + np.pi + alpha), np.sin(angle + np.pi + alpha)])
In [11]:
plt.plot(vertices[:,0],vertices[:,1],'r.',markersize=20)
plt.plot(side0[:,0],side0[:,1],'b-',markersize=20)
plt.plot(side1[:,0],side1[:,1],'g-',markersize=20)
plt.axis('equal');

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

In [12]:
sides = [] 
for i in range(n):
    sides = sides + list(vertices[i] + r*np.transpose([np.cos(angle + np.pi + i*alpha), np.sin(angle + np.pi + i*alpha)]))
sides = np.array(sides)
In [13]:
plt.plot(vertices[:,0],vertices[:,1],'r.',markersize=20)
plt.plot(sides[:,0],sides[:,1],'b-',markersize=20)
plt.axis('equal');