Даны угол альфа, ширина и сагитта. Радиус r
круга можно рассчитать по альфе, а ширину по формуле синуса. Аналогично, x - sagitta
следует из формулы косинуса.
Чтобы найти y
, мы масштабируем чертеж в направлении x с коэффициентом y/x
. Это превратит эллипс в круг радиуса y
. Он преобразует точку в [x-sagitta, width/2]
в [(x-sagitta)*y/x, width/2]
. Эта преобразованная точка должна быть на окружности с радиусом y
. Мы получаем квадратное c уравнение в y
:
((x-sagitta)*y/x)^2 + (width/2)^2 = y^2
.
Его положительное решение -
y = width * x * sqrt(1 / (sagitta * (2 * x - sagitta))) / 2
.
при условии это 2*x > sagitta
. Что уменьшает до cos(alpha/2) > 0
или alpha < 180°
. Конечно, экстремальные комбинации сагитты, ширины и альфы могут привести к чрезвычайно вытянутым эллипсам.
При возобновлении это дает (r - радиус круга, х и у - оси эллипса):
r = width / 2 / sin(alpha / 2)
x = r * cos(alpha / 2) + sagitta
y = width * x / sqrt(sagitta * (2 * x - sagitta)) / 2
Печать всего с использованием Python и matplotlib гарантирует, что уравнения имеют смысл:
from matplotlib import pyplot as plt
from matplotlib.patches import Ellipse
from math import sqrt, sin, cos, atan, pi
sagitta = 15
alpha = 120 * pi / 180
width = 100
r = width / 2 / sin(alpha / 2)
x = r * cos(alpha / 2) + sagitta
y = width * x / sqrt(sagitta * (2 * x - sagitta)) / 2
ax = plt.gca()
ax.plot([r * cos(alpha / 2), 0, r * cos(alpha / 2)], [- r * sin(alpha / 2), 0, r * sin(alpha / 2)], ls='-',
color='crimson')
ellipse = Ellipse((0, 0), 2 * x, 2 * y, color='purple', linewidth=1, fill=False, ls='-')
circle = Ellipse((0, 0), 2 * r, 2 * r, color='tomato', linewidth=1, fill=False, ls='-.')
lim = max(x, y) * 1.05
ax.set_xlim(-lim, lim)
ax.set_ylim(-lim, lim)
ax.axhline(0, color='silver')
ax.axvline(0, color='silver')
ax.plot([x-sagitta, x-sagitta], [width/2, -width/2], color='limegreen', ls='--')
ax.plot([x-sagitta, x], [0, 0], color='brown', ls='--')
ax.add_patch(ellipse)
ax.add_patch(circle)
ax.text(x-sagitta, width/2, ' [x-s, w/2]')
ax.set_aspect(1)
plt.show()