64 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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)
 | ||
| 
 | ||
|     plt.xlabel("X (см)")
 | ||
|     plt.ylabel("Y (см)")
 | ||
|     plt.title("Эквипотенциальные линии")
 | ||
|     plt.savefig("points.png", dpi=300)
 | ||
| 
 | ||
| 
 | ||
| if __name__ == "__main__":
 | ||
|     main()
 | 
