/
talehunter
/
ballistics
Обзор
Документация
Войти
/
talehunter
/
ballistics
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
graphics.py
138 строк
5 KB
talehunter
редактирование второго графика
24 ноя 2025, 13:04
24 ноя 2025, 13:04
bd52c34
Код
Авторство
О чём код?
import numpy as np import matplotlib.pyplot as plt import configparser from matplotlib.patches import Patch from consts import RSE, RSJ from mathematic import alpha1, alpha2, v_001, v_002 def draw_first(): config = configparser.ConfigParser() config.read("config.ini") e1 = float(config["Data"]["e1"]) p1 = float(config["Data"]["p1"]) T1 = float(config["Data"]["T1"]) fig, ax = plt.subplots(subplot_kw={"projection": "polar"}, figsize=(10, 8)) # Угол для построения theta = np.linspace(0, 2 * np.pi, 1000) # 1. Основные орбиты (Земля и Юпитер) ax.plot( theta, np.full_like(theta, RSE), color="blue", linewidth=2, label="Орбита Земли" ) ax.plot( theta, np.full_like(theta, RSJ), color="red", linewidth=2, label="Орбита Юпитера", ) # 2. Эллиптическая орбита (полная) - серая пунктирная # Зеркальное отражение: добавляем π к углу r_elliptical_full = p1 / (1 + e1 * np.cos(theta + np.pi)) ax.plot( theta, r_elliptical_full, "--", color="gray", linewidth=1, alpha=0.7, label="Эллиптическая орбита", ) # 3. Эллиптическая орбита (половина) - черная сплошная # Также зеркально отражаем половину орбиты theta_half = np.linspace(0, np.pi, 500) r_elliptical_half = p1 / (1 + e1 * np.cos(theta_half + np.pi)) ax.plot( theta_half, r_elliptical_half, color="black", linewidth=1.5, label="Активный участок", ) # Настройка графика ax.set_theta_zero_location("N") # 0 градусов сверху ax.set_theta_direction(-1) # по часовой стрелке ax.grid(True, alpha=0.3) ax.set_title("Орбиты планет и переходная траектория", pad=20, fontsize=14) print(f"Время перелета до Юпитера: {T1:.3f} лет") # # Легенда legend_elements = [ Patch(facecolor="blue", label="Орбита Земли"), Patch(facecolor="red", label="Орбита Юпитера"), Patch(facecolor="blue", label=f"Время перелёта: {T1:.3f} лет"), ] ax.legend(handles=legend_elements, loc="upper right", bbox_to_anchor=(1.3, 1.0)) plt.tight_layout() plt.savefig("fig_1.png") # plt.show() def draw_second(): # Создаем общую сетку для обоих графиков theta1_vals = np.linspace(0, np.pi, 100) theta2_vals = np.linspace(0, np.pi, 100) Theta1, Theta2 = np.meshgrid(theta1_vals, theta2_vals) # Вычисляем значения для первого графика Z = alpha2(Theta1) - alpha1(Theta1, Theta2) # Создаем фигуру fig, ax = plt.subplots(figsize=(12, 8)) ax.contourf(Theta1, Theta2, Z, levels=20, cmap="Pastel1", alpha=0.7) ax.contour(Theta1, Theta2, Z, levels=20, colors="black", linewidths=0.5, alpha=0.3) # Второй график: линия где скорости равны (расширяем сетку для второго графика) theta1_vals2 = np.linspace(0, np.pi, 100) theta2_vals2 = np.linspace(0, np.pi, 100) Theta1_2, Theta2_2 = np.meshgrid(theta1_vals2, theta2_vals2) V_diff = v_001(Theta1_2) - v_002(Theta2_2) # Рисуем контур где разность скоростей равна 0 contour2 = ax.contour( Theta1_2, Theta2_2, V_diff, levels=[0], colors="red", linewidths=3, linestyles="--", ) # Добавляем подписи для контуров ax.clabel(contour2, inline=True, fontsize=10, fmt="v₁ = v₂") # Настройки графика ax.set_xlabel("θ1 (рад)", fontsize=12) ax.set_ylabel("θ2 (рад)", fontsize=12) ax.set_title("α₂(θ₁) - α₁(θ₁, θ₂) и v₀₀₁(θ₁) = v₀₀₂(θ₂)", fontsize=14) ax.set_xlim(0, np.pi) ax.set_ylim(0, np.pi) ax.grid(True, alpha=0.3) # Добавляем легенду from matplotlib.patches import Patch legend_elements = [ Patch(facecolor="lightblue", alpha=0.7, label="α₂(θ₁) - α₁(θ₁, θ₂)"), plt.Line2D( [0], [0], color="red", linestyle="--", linewidth=3, label="v₀₀₁(θ₁) = v₀₀₂(θ₂)", ), ] ax.legend(handles=legend_elements, loc="upper right") plt.tight_layout() plt.savefig("fig_2.png") # plt.show()