-
Notifications
You must be signed in to change notification settings - Fork 0
/
SegmentToPoints.py
73 lines (64 loc) · 2.86 KB
/
SegmentToPoints.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import json
import os
import numpy as np
import matplotlib.pyplot as plt
NUM_OF_POINTS = 50
class SegmentToPoints:
def __init__(self):
self._segment_points = []
self._track_x = []
self._track_y = []
self._result_filename = 'Segment_to_Points'
def _generate_line(self, start_point, end_point, num_points=NUM_OF_POINTS):
x_values = np.linspace(start_point[0], end_point[0], num_points).tolist()
y_values = np.linspace(start_point[1], end_point[1], num_points).tolist()
return x_values, y_values
def _generate_curve(self, start_point, end_point, radius, center_point, num_points=NUM_OF_POINTS):
x_start_point, y_start_point = start_point
x_end_point, y_end_point = end_point
center_x , center_y = center_point
start_angle = np.arctan2(y_start_point-center_y, x_start_point-center_x)
end_angle = np.arctan2(y_end_point-center_y, x_end_point-center_x)
if end_angle < start_angle:
end_angle += 2 * np.pi
angles = np.linspace(start_angle, end_angle, num_points)
x_curve = (center_x + radius * np.cos(angles)).tolist()
y_curve = (center_y + radius * np.sin(angles)).tolist()
return x_curve, y_curve
def _plot_points(self, x_points, y_points):
plt.figure(figsize=(10, 5))
plt.plot(x_points, y_points, 'ro--')
plt.title('Segment')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
plt.show()
def _save_points(self, x_points, y_points, filename):
file_name = filename + '.tsv'
file_path = os.path.abspath(file_name)
with open(filename + '.tsv', 'w') as f:
f.write('X\tY\n')
for x, y in zip(x_points, y_points):
f.write(f'{x}\t{y}\n')
return file_path
def generate_points_from_track(self, track_file, plot=False, save=False, result_filename=None):
track_data = None
with open(track_file, 'r') as file:
track_data = json.load(file)
for segment in track_data:
if segment["is_curve"]:
x_points, y_points = self._generate_curve(segment["start_point"], segment["end_point"], segment["radius"], segment["center_point"])
else:
x_points, y_points = self._generate_line(segment["start_point"], segment["end_point"])
self._segment_points.append((x_points, y_points))
for segment in self._segment_points:
x_points, y_points = segment
self._track_x.extend(x_points)
self._track_y.extend(y_points)
if plot:
self._plot_points(self._track_x, self._track_y)
if save:
if result_filename:
self._result_filename = result_filename
file_path = self._save_points(self._track_x, self._track_y, self._result_filename)
return file_path