Вот картинка
вот код на Питоне (юпитер ноутбук)
import numpy as np
import plotly.graph_objects as go
# -----------------------------
# параметры
# -----------------------------
a = 1.0 # полуразмер квадрата
n = 12 # степень (больше => ближе к квадрату)
N = 70 # число витков
R = 4.0 # большой радиус тора
samples = 32000 # точек на всю кривую
frames_count = 90
# -----------------------------
# профиль КВАДРАТА в плоскости XZ
# -----------------------------
def square_profile(phi, a=1.0, n=16):
x = a * np.sign(np.cos(phi)) * np.abs(np.cos(phi))**(2/n)
z = a * np.sign(np.sin(phi)) * np.abs(np.sin(phi))**(2/n)
return x, z
# -----------------------------
# тороидальная намотка
# -----------------------------
psi = np.linspace(0, 2*np.pi, samples)
phi = N * psi
xq, z = square_profile(phi, a=a, n=n)
rad = R + xq
x = rad * np.cos(psi)
y = rad * np.sin(psi)
# -----------------------------
# фиксируем масштаб (важно!)
# -----------------------------
lim_xy = (R + a) * 1.15
lim_z = a * 5.0 # <-- ключевое изменение: визуально растягиваем Z
# -----------------------------
# анимация: наращивание линии
# -----------------------------
idx = np.linspace(2, samples, frames_count).astype(int)
frames = []
for k, m in enumerate(idx):
frames.append(go.Frame(
name=str(k),
data=[
go.Scatter3d(
x=x[:m], y=y[:m], z=z[:m],
mode="lines",
line=dict(width=5),
name="winding"
)
]
))
fig = go.Figure(
data=frames[0].data,
frames=frames
)
fig.update_layout(
title=f"Тороидальная обмотка (квадрат): N={N}, n={n}, R={R}",
scene=dict(
aspectmode="manual",
aspectratio=dict(x=1, y=1, z=1), # геометрия честная
xaxis=dict(range=[-lim_xy, lim_xy], visible=False),
yaxis=dict(range=[-lim_xy, lim_xy], visible=False),
zaxis=dict(range=[-lim_z, lim_z ], visible=False),
),
updatemenus=[dict(
type="buttons",
showactive=False,
buttons=[
dict(
label="▶",
method="animate",
args=[None, {
"frame": {"duration": 30, "redraw": True},
"fromcurrent": True,
"transition": {"duration": 0},
"mode": "immediate"
}]
),
dict(
label="⟲",
method="animate",
args=[[str(0)], {
"frame": {"duration": 0, "redraw": True},
"transition": {"duration": 0},
"mode": "immediate"
}]
),
]
)]
)
fig.show()
вот ссылка на гугль колаб, чтобы посмотреть
Фотмулы