diff --git a/tools/formatter.py b/tools/formatter.py index 60681f3c..f9af7a1f 100644 --- a/tools/formatter.py +++ b/tools/formatter.py @@ -188,7 +188,49 @@ def convert_subreddit_to_website(entry: dict): entry["subreddit"] = "" return entry - + +def calculate_center(path: list): + """ + Caluclates the center of a polygon + + adapted from /web/_js/draw.js:calucalteCenter() + """ + area = 0 + x = 0 + y = 0 + + for i in range(len(path)): + point1 = path[i] + point2 = path[i-1 if i != 0 else len(path)-1] + f = point1[0] * point2[1] - point2[0] * point1[1] + area += f + x += (point1[0] + point2[0]) * f + y += (point1[1] + point2[1]) * f + + area *= 3 + + if area != 0: + return [x // area + 0.5, y // area + 0.5] + else: + # get the center of a straight line + max_x = max(i[0] for i in path) + min_x = min(i[0] for i in path) + max_y = max(i[1] for i in path) + min_y = min(i[1] for i in path) + return [(max_x + min_x) // 2 + 0.5, (max_y + min_y) // 2 + 0.5] + +def update_center(entry: dict): + """ + checks if the center of a entry is up to date, and updates it if it's either missing or outdated + """ + if 'path' not in entry: + return entry + path = entry['path'] + if len(path) > 1: + calculated_center = calculate_center(path) + if 'center' not in entry or entry['center'] != calculated_center: + entry['center'] = calculated_center + return entry def validate(entry: dict): """ @@ -256,6 +298,8 @@ def print_(*args, **kwargs): entry = fix_no_protocol_urls(entry) print_("Removing extras...") entry = remove_extras(entry) + print_("Updating center") + entry = update_center(entry) print_("Validating...") status_code = validate(entry) print_("Completed!") @@ -287,4 +331,4 @@ def go(path): print("Writing completed. All done.") - go("../web/atlas.json") \ No newline at end of file + go("../web/atlas.json") diff --git a/web/_js/draw.js b/web/_js/draw.js index a028fc2c..7026b86e 100644 --- a/web/_js/draw.js +++ b/web/_js/draw.js @@ -231,33 +231,25 @@ function initDraw(){ function calculateCenter(path){ var area = 0, - i, - j, - point1, - point2; + i, + j, + point1, + point2, + x = 0, + y = 0, + f; - for (i = 0, j = path.length - 1; i < path.length; j=i,i++) { - point1 = path[i]; - point2 = path[j]; - area += point1[0] * point2[1]; - area -= point1[1] * point2[0]; - } - area *= 3; - - var x = 0, - y = 0, - f; + for (i = 0, j = path.length - 1; i < path.length; j=i,i++) { + point1 = path[i]; + point2 = path[j]; + f = point1[0] * point2[1] - point2[0] * point1[1]; + area += f; + x += (point1[0] + point2[0]) * f; + y += (point1[1] + point2[1]) * f; + } + area *= 3; - for (i = 0, j = path.length - 1; i < path.length; j=i,i++) { - point1 = path[i]; - point2 = path[j]; - f = point1[0] * point2[1] - point2[0] * point1[1]; - x += (point1[0] + point2[0]) * f; - y += (point1[1] + point2[1]) * f; - } - - return [~~(x / area)+0.5, ~~(y / area)+0.5]; - + return [Math.floor(x / area)+0.5, Math.floor(y / area)+0.5]; } function undo(){