Вычислительная практика II, ММФ, БГУ
Лаврова О.А., май 2020
import math as mth
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Треугольник Рело представляет собой область пересесения трех кругов радуса $r$ с центрами в вершинах равностороннего треугольника с длиной стороны $r$.
Правильный многоугольник ($n$-угольник) Рело представляет собой область пересесения $n$ равных кругов радуса $r$ с центрами в вершинах правильного многоугольника, который имеет нечетное число сторон. Радиус круга $r$ согласован с длиной стороны $l$ правильного многоугольника таким образом, чтобы окружность проходила через две вершины правильного многоугольника.
Правильный многоугольник Рело и круг являются примерами фигур постоянной ширины. К фигуре постоянной ширины можно провести пары параллельных опорных прямых (прямые касаются фигуры, но не пересекают ее) и, независимо от выбора пары, расстояние между опорными прямыми будет одинаковым.
Расстояние между опорными прямыми называется шириной фигуры. Ширина правильного многоугольника Рело равна радиусу пересекаемых кругов. Ширина круга равна диаметру круга. Среди всех фигур постоянной ширины треугольник Рело имеет наименьшую площадь, круг -- наибольшую площадь.
Аргументами пользовательской функции являются:
Для пользовательской функции напишите строки документирования. Используйте инструкцию отладочной проверки assert для контроля значений аргументов.
n = 3 # количество вершин правильного треугольнака Рело
center = np.array([0,0]) # центр правильного треугольника Рело
r = 10 # ширина правильного треугольника Рело
N = 100 # количество точек для описания стороны треугольника Рело
Вершины правильного многоугольника расположены на окружности, описанной вокруг правильного многоугольник. Радиус $R$ окружности, описанной вокруг правильного $n$-угольника с длиной стороны $l$, вычисляется по формуле $$ R = \frac{l}{2 \sin{\pi/n}}. $$
Вычислим радиус описанной окружности для треугольника Рело
l = r # !!! справедливо только для треугольника Рело
R = l/(2*mth.sin(mth.pi/n))
Построим матрицу с координатами вершин правильного треугольника
t = np.arange(0,2*np.pi,2*np.pi/n)
vertices = center + R*np.transpose([np.cos(t), np.sin(t)])
plt.plot(vertices[:,0],vertices[:,1],'r.',markersize=20)
plt.axis('equal');
Обозначим через $\alpha$ центральный угол, соответствующий стороне правильног $n$-угольника. Известно, что $$\alpha = 2 \pi /n.$$
Обозначим через $\beta$ центральный угол, соответствующий стороне правильного многоугольника Рело, когда центр окружности расположен в вершине правильного многоугольника. Тогда $$\beta = \alpha/2.$$
Вычислим значения центральных углов для правильного треугольника Рело
alpha = 2*mth.pi/n
beta = alpha/2
Введем вспомогательную последовательность значений угла для построения координат точек стороны правильного треугольника Рело
angle = np.linspace(-beta/2,beta/2,N)
Построим матрицу с координатами точек, описывающих сторону правильного треугольника Рело относительно первой вершины
side0 = np.zeros(N)
side0 = vertices[0] + r*np.transpose([np.cos(angle + np.pi), np.sin(angle + np.pi)])
plt.plot(vertices[:,0],vertices[:,1],'r.',markersize=20)
plt.plot(side0[:,0],side0[:,1],'b-',markersize=20)
plt.axis('equal');
Построим матрицу с координатами точек, описывающих сторону правильного треугольника Рело относительно второй вершины
side1 = np.zeros(N)
side1 = vertices[1] + r*np.transpose([np.cos(angle + np.pi + alpha), np.sin(angle + np.pi + alpha)])
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');
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)
plt.plot(vertices[:,0],vertices[:,1],'r.',markersize=20)
plt.plot(sides[:,0],sides[:,1],'b-',markersize=20)
plt.axis('equal');