from collections import defaultdict from sys import argv import matplotlib.pyplot as plt import numpy as np def read_points(filename: str) -> list[tuple[float, float, str]]: points = [] with open(filename, "r", encoding="utf-8") as f: for line in f: line = line.strip() if line and not line.startswith("#"): parts = line.split() if len(parts) >= 3: x = float(parts[0]) y = float(parts[1]) label = parts[2] points.append((x, y, label)) return points def main() -> None: points = read_points(argv[1]) plt.figure(figsize=(8.27, 11.69)) plt.xlim(0, 30) plt.ylim(0, 20) plt.gca().set_aspect("equal", adjustable="box") plt.grid(True, linewidth=0.3) plt.xticks(range(0, 31, 2)) plt.yticks(range(0, 21, 2)) grouped = defaultdict(list) for x, y, phi in points: grouped[phi].append((x, y)) for x, y, label in points: plt.scatter(x, y, color="red", s=15) plt.text(x + 0.3, y + 0.3, label, fontsize=9) for phi, coords in grouped.items(): coords.sort(key=lambda p: p[1]) xs, ys = zip(*coords) plt.plot(xs, ys, linewidth=0.8, label=f"φ={phi} В") if int(argv[2]): theta = np.linspace(0, 2 * np.pi, 200) cx, cy = 15, 9 for r in [5, 6]: x = cx + r * np.cos(theta) y = cy + r * np.sin(theta) plt.plot(x, y, color="blue", linewidth=1) emax_x, emax_y = 22.4, 10 emin_x, emin_y = 15, 9 plt.arrow( emax_x + 2, emax_y + 2, -1.5, -1.2, head_width=0.4, head_length=0.3, fc="darkgreen", ec="darkgreen", linewidth=2, ) plt.text(emax_x + 2.3, emax_y + 2.3, "E_max", fontsize=11, color="darkgreen") plt.arrow( emin_x - 3, emin_y + 3, 1.5, -1.5, head_width=0.4, head_length=0.3, fc="darkgreen", ec="darkgreen", linewidth=2, ) plt.text(emin_x - 4.2, emin_y + 3.2, "E_min", fontsize=11, color="darkgreen") plt.xlabel("X (см)") plt.ylabel("Y (см)") plt.title("Эквипотенциальные линии") plt.savefig("points.png", dpi=300) if __name__ == "__main__": main()