83 lines
3.3 KiB
Python
83 lines
3.3 KiB
Python
import matplotlib.pyplot as plt
|
|
import matplotlib.image as mpimg
|
|
from matplotlib.path import Path
|
|
import matplotlib.patches as patches
|
|
import numpy as np
|
|
|
|
class TrajectoryDrawer:
|
|
def __init__(self, image_path):
|
|
self.image_path = image_path
|
|
self.points = []
|
|
self.fig, self.ax = plt.subplots(figsize=(12, 8))
|
|
|
|
# Загрузка фонового изображения
|
|
self.img = mpimg.imread(image_path)
|
|
self.ax.imshow(self.img)
|
|
|
|
# Настройка графика
|
|
self.ax.set_title('Нарисуйте траекторию движения (кликните для точек, Enter для завершения)')
|
|
self.ax.set_xlabel('X координата')
|
|
self.ax.set_ylabel('Y координата')
|
|
|
|
# Подключение обработчиков событий
|
|
self.fig.canvas.mpl_connect('button_press_event', self.on_click)
|
|
self.fig.canvas.mpl_connect('key_press_event', self.on_key)
|
|
|
|
self.line, = self.ax.plot([], [], 'ro-', linewidth=2, markersize=6)
|
|
|
|
def on_click(self, event):
|
|
if event.inaxes == self.ax:
|
|
# Добавляем точку только если клик в области графика
|
|
x, y = event.xdata, event.ydata
|
|
self.points.append((x, y))
|
|
self.update_plot()
|
|
|
|
def on_key(self, event):
|
|
if event.key == 'enter':
|
|
self.complete_trajectory()
|
|
elif event.key == 'escape':
|
|
self.clear_trajectory()
|
|
|
|
def update_plot(self):
|
|
if self.points:
|
|
x_coords = [p[0] for p in self.points]
|
|
y_coords = [p[1] for p in self.points]
|
|
self.line.set_data(x_coords, y_coords)
|
|
self.fig.canvas.draw()
|
|
|
|
def complete_trajectory(self):
|
|
if len(self.points) > 1:
|
|
print("Траектория завершена!")
|
|
print(f"Количество точек: {len(self.points)}")
|
|
print("Координаты точек:")
|
|
for i, (x, y) in enumerate(self.points):
|
|
print(f"Точка {i+1}: ({x:.2f}, {y:.2f})")
|
|
|
|
# Можно сохранить координаты в файл
|
|
# self.save_trajectory()
|
|
self.on_complete_trajectory("GOOD")
|
|
|
|
def clear_trajectory(self):
|
|
self.points = []
|
|
self.line.set_data([], [])
|
|
self.fig.canvas.draw()
|
|
print("Траектория очищена")
|
|
|
|
def save_trajectory(self):
|
|
# Сохранение координат в файл
|
|
with open('trajectory_coordinates.txt', 'w') as f:
|
|
for i, (x, y) in enumerate(self.points):
|
|
f.write(f"{i+1},{x:.4f},{y:.4f}\n")
|
|
print("Координаты сохранены в trajectory_coordinates.txt")
|
|
|
|
def show(self):
|
|
plt.tight_layout()
|
|
plt.show()
|
|
|
|
# Использование
|
|
if __name__ == "__main__":
|
|
# Укажите путь к вашему изображению
|
|
image_path = "map.jpg" # Замените на путь к вашему изображению
|
|
|
|
drawer = TrajectoryDrawer(image_path)
|
|
drawer.show() |