-
Notifications
You must be signed in to change notification settings - Fork 0
/
render.py
108 lines (81 loc) · 2.45 KB
/
render.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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import sys
# import matplotlib.pyplot as plt
from graph import Graph
BEST_PATH_LINE_WIDTH = 3
PLOT_SIZE = 10000
MARGIN_X = 500
MARGIN_Y = 500
class Render:
def __init__(self, plt):
self.plt = plt
def calc_bounding_box(self, graph):
leftmost = sys.maxsize
rightmost = -sys.maxsize
upmost = -sys.maxsize
downmost = sys.maxsize
for node in graph.nodes:
x = node.point[0]
y = node.point[1]
if x < leftmost:
leftmost = x
if x > rightmost:
rightmost = x
if y < downmost:
downmost = y
if y > upmost:
upmost = y
size_x = rightmost - leftmost
size_y = upmost - downmost
return (
rightmost,
upmost,
size_x,
size_y,
)
def zoom_point(self, point: tuple, bounding_box: tuple):
r, u, size_x, size_y = bounding_box
aspect_ratio = size_x / size_y
x = aspect_ratio * PLOT_SIZE * (r - point[0]) / size_x
y = PLOT_SIZE * (u - point[1]) / size_y
return (x, y)
def plot_path(self, path: list, point_x: list, point_y: list, overall_best_path: list):
path_x = []
path_y = []
path_edges = [(path[x], path[x + 1]) for x in range(len(path) - 1)]
for (c, n) in path_edges:
path_x.append(point_x[c])
path_x.append(point_x[n])
path_y.append(point_y[c])
path_y.append(point_y[n])
self.plt.plot(path_x, path_y, '-g', linewidth = BEST_PATH_LINE_WIDTH)
self.plt.plot(path_x[:len(overall_best_path)*2], path_y[:len(overall_best_path)*2], '-m', linewidth = BEST_PATH_LINE_WIDTH)
def plot(self, graph: Graph, path: list, overall_best_path: list):
bounding_box = self.calc_bounding_box(graph)
point_x = []
point_y = []
edge_x = []
edge_y = []
for node in graph.nodes:
point = self.zoom_point(node.point, bounding_box)
point_x.append(point[0])
point_y.append(point[1])
for key, x in enumerate(point_x):
for x2 in point_x[key + 1:]:
edge_x.append(x)
edge_x.append(x2)
for key, y in enumerate(point_y):
for y2 in point_y[key + 1:]:
edge_y.append(y)
edge_y.append(y2)
self.plt.plot(edge_x, edge_y, '-y')
self.plt.plot(point_x, point_y, 'ro')
self.plt.plot(point_x[0], point_y[0], 'bo')
self.plot_path(path, point_x, point_y, overall_best_path)
self.plt.axis([
-MARGIN_X,
PLOT_SIZE + MARGIN_X,
-MARGIN_Y,
PLOT_SIZE + MARGIN_Y
])
self.plt.draw()
self.plt.pause(1)