-
Notifications
You must be signed in to change notification settings - Fork 0
/
HeatMapTracker.py
100 lines (80 loc) · 3.57 KB
/
HeatMapTracker.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
import json
import os
from PlayerMatchData import PlayerMatchData
from DrawUtil import DrawUtil
from ThirdParty.graphics import *
from tkinter import filedialog
window_size = 600
max_axis = 1000
class HeatMap:
def __init__(self, win):
self.win = win # Store the graphical window in the class
self.window_size = window_size
self.max_axis = max_axis
def load_heatmap(self, filename):
base_dir = os.path.dirname(__file__)
file_path = os.path.join(base_dir, 'data', filename)
if not os.path.exists(file_path):
raise FileNotFoundError(f"The file {filename} does not exist.")
try:
with open(file_path, 'r') as json_file:
data = json.load(json_file)
heatmap_data = PlayerMatchData(**data)
return heatmap_data
except json.JSONDecodeError:
raise ValueError("The JSON file is not properly formatted.")
except Exception as e:
raise RuntimeError(f"An unexpected error occurred while loading the heatmap data: {e}")
def draw_player_triangle(self, x, y, rotation, color):
triangle, points = DrawUtil.create_triangle( x, y, rotation,color)
triangle.draw(self.win)
# Calculate the bottom middle point (midpoint of rotated_point2 and rotated_point3)
bottom_middle_x = (points[1].x + points[2].x) / 2
bottom_middle_y = (points[1].y + points[2].y) / 2
# Return the bottom middle point as a Point object
return Point(bottom_middle_x, bottom_middle_y)
def draw_heatmap(self, heatmap_data):
if heatmap_data:
map_image = DrawUtil.create_image(self.window_size/2,self.window_size/2,self.window_size,self.window_size,heatmap_data.levelMap.mapPath)
map_image.draw(self.win)
for player in heatmap_data.players:
randomColor = DrawUtil.random_color()
position_data = sorted(player.positionData, key=lambda pos: pos.timestamp)
prev_point = None
worldOffset = (self.max_axis/self.window_size)
for position in position_data:
x = position.x/worldOffset
y = position.y/worldOffset
current_point = self.draw_player_triangle(x, y, position.rotation,randomColor)
if prev_point:
line = DrawUtil.create_line(prev_point,current_point,randomColor)
line.draw(self.win)
# Update the previous point to be the current one
prev_point = current_point
else:
raise ValueError("No heatmap data found.")
def open_file_dialog():
# Open file dialog
file_path = filedialog.askopenfilename(
filetypes=[("JSON files", "*.json")],
title="Select a JSON File"
)
return file_path
if __name__ == "__main__":
win = DrawUtil.create_window("Heatmap Tracker", (window_size, window_size))
heatmap = HeatMap(win)
json_file = open_file_dialog()
if json_file:
heatmap_data = heatmap.load_heatmap(os.path.basename(json_file))
heatmap.draw_heatmap(heatmap_data)
# Keep the window open until the ESC key is pressed
try:
while True:
key = win.getKey()
if key == 'Escape':
break
except GraphicsError as e:
print(f"GraphicsError occurred: {e}")
else:
raise ValueError("A JSON was not selected, exiting program.")
win.close()