From d808837cd368c3772962be591aa6532bcc0cf3e4 Mon Sep 17 00:00:00 2001 From: jianghaiyue <jianghaiyue@zkyt.com> Date: 星期一, 22 九月 2025 12:11:37 +0800 Subject: [PATCH] 更新版本 --- algo-zkd/src/main/java/com/algo/service/CollisionResolver.java | 74 algo-zkd/man_code.json | 10012 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ algo-zkd/src/main/java/com/algo/config/BaseDataConfig.java | 2 algo-zkd/src/main/java/com/algo/model/CTUPhysicalConfig.java | 161 algo-zkd/src/main/java/com/algo/model/PathCode.java | 44 algo-zkd/src/main/java/com/algo/service/PathPlanningService.java | 19 algo-zkd/src/main/java/com/algo/util/PathTimeCalculator.java | 318 + algo-zkd/src/main/java/com/algo/util/JsonUtils.java | 198 algo-zkd/src/main/java/com/algo/service/AStarPathPlanner.java | 208 9 files changed, 10,968 insertions(+), 68 deletions(-) diff --git a/algo-zkd/man_code.json b/algo-zkd/man_code.json new file mode 100644 index 0000000..674a111 --- /dev/null +++ b/algo-zkd/man_code.json @@ -0,0 +1,10012 @@ +{ + "path_id_to_coordinates": { + "1": [ + { + "x": 0.0, + "y": 0.0 + } + ], + "2": [ + { + "x": 0.0, + "y": 1270.0 + } + ], + "3": [ + { + "x": 0.0, + "y": 2240.0 + } + ], + "4": [ + { + "x": 0.0, + "y": 3210.0 + } + ], + "5": [ + { + "x": 0.0, + "y": 4180.0 + } + ], + "6": [ + { + "x": 0.0, + "y": 4964.5 + } + ], + "7": [ + { + "x": 0.0, + "y": 5749.0 + } + ], + "8": [ + { + "x": 0.0, + "y": 6249.0 + } + ], + "9": [ + { + "x": 0.0, + "y": 6749.0 + } + ], + "10": [ + { + "x": 0.0, + "y": 7249.0 + } + ], + "11": [ + { + "x": 0.0, + "y": 7904.0 + } + ], + "12": [ + { + "x": 0.0, + "y": 8404.0 + } + ], + "13": [ + { + "x": 0.0, + "y": 8904.0 + } + ], + "14": [ + { + "x": 0.0, + "y": 9404.0 + } + ], + "15": [ + { + "x": 0.0, + "y": 10145.0 + } + ], + "16": [ + { + "x": 0.0, + "y": 10929.5 + } + ], + "17": [ + { + "x": 0.0, + "y": 11714.0 + } + ], + "18": [ + { + "x": 0.0, + "y": 12214.0 + } + ], + "19": [ + { + "x": 0.0, + "y": 12714.0 + } + ], + "20": [ + { + "x": 0.0, + "y": 13214.0 + } + ], + "21": [ + { + "x": 0.0, + "y": 13869.0 + } + ], + "22": [ + { + "x": 0.0, + "y": 14369.0 + } + ], + "23": [ + { + "x": 0.0, + "y": 14869.0 + } + ], + "24": [ + { + "x": 0.0, + "y": 15369.0 + } + ], + "25": [ + { + "x": 0.0, + "y": 16110.0 + } + ], + "26": [ + { + "x": 0.0, + "y": 16894.5 + } + ], + "27": [ + { + "x": 0.0, + "y": 17679.0 + } + ], + "28": [ + { + "x": 0.0, + "y": 18179.0 + } + ], + "29": [ + { + "x": 0.0, + "y": 18679.0 + } + ], + "30": [ + { + "x": 0.0, + "y": 19179.0 + } + ], + "31": [ + { + "x": 0.0, + "y": 19834.0 + } + ], + "32": [ + { + "x": 0.0, + "y": 20334.0 + } + ], + "33": [ + { + "x": 0.0, + "y": 20834.0 + } + ], + "34": [ + { + "x": 0.0, + "y": 21334.0 + } + ], + "35": [ + { + "x": 0.0, + "y": 22075.0 + } + ], + "36": [ + { + "x": 1195.0, + "y": 0.0 + } + ], + "37": [ + { + "x": 1195.0, + "y": 2240.0 + } + ], + "38": [ + { + "x": 1195.0, + "y": 4180.0 + } + ], + "39": [ + { + "x": 1195.0, + "y": 10145.0 + } + ], + "40": [ + { + "x": 1195.0, + "y": 16110.0 + } + ], + "41": [ + { + "x": 1195.0, + "y": 22075.0 + } + ], + "42": [ + { + "x": 2390.0, + "y": 0.0 + } + ], + "43": [ + { + "x": 2390.0, + "y": 1270.0 + } + ], + "44": [ + { + "x": 2390.0, + "y": 2240.0 + } + ], + "45": [ + { + "x": 2390.0, + "y": 3210.0 + } + ], + "46": [ + { + "x": 2390.0, + "y": 4180.0 + } + ], + "47": [ + { + "x": 2390.0, + "y": 4964.5 + } + ], + "48": [ + { + "x": 2390.0, + "y": 5749.0 + } + ], + "49": [ + { + "x": 2390.0, + "y": 6249.0 + } + ], + "50": [ + { + "x": 2390.0, + "y": 6749.0 + } + ], + "51": [ + { + "x": 2390.0, + "y": 7249.0 + } + ], + "52": [ + { + "x": 2390.0, + "y": 7904.0 + } + ], + "53": [ + { + "x": 2390.0, + "y": 8404.0 + } + ], + "54": [ + { + "x": 2390.0, + "y": 8904.0 + } + ], + "55": [ + { + "x": 2390.0, + "y": 9404.0 + } + ], + "56": [ + { + "x": 2390.0, + "y": 10145.0 + } + ], + "57": [ + { + "x": 2390.0, + "y": 10929.5 + } + ], + "58": [ + { + "x": 2390.0, + "y": 11714.0 + } + ], + "59": [ + { + "x": 2390.0, + "y": 12214.0 + } + ], + "60": [ + { + "x": 2390.0, + "y": 12714.0 + } + ], + "61": [ + { + "x": 2390.0, + "y": 13214.0 + } + ], + "62": [ + { + "x": 2390.0, + "y": 13869.0 + } + ], + "63": [ + { + "x": 2390.0, + "y": 14369.0 + } + ], + "64": [ + { + "x": 2390.0, + "y": 14869.0 + } + ], + "65": [ + { + "x": 2390.0, + "y": 15369.0 + } + ], + "66": [ + { + "x": 2390.0, + "y": 16110.0 + } + ], + "67": [ + { + "x": 2390.0, + "y": 16894.5 + } + ], + "68": [ + { + "x": 2390.0, + "y": 17679.0 + } + ], + "69": [ + { + "x": 2390.0, + "y": 18179.0 + } + ], + "70": [ + { + "x": 2390.0, + "y": 18679.0 + } + ], + "71": [ + { + "x": 2390.0, + "y": 19179.0 + } + ], + "72": [ + { + "x": 2390.0, + "y": 19834.0 + } + ], + "73": [ + { + "x": 2390.0, + "y": 20334.0 + } + ], + "74": [ + { + "x": 2390.0, + "y": 20834.0 + } + ], + "75": [ + { + "x": 2390.0, + "y": 21334.0 + } + ], + "76": [ + { + "x": 2390.0, + "y": 22075.0 + } + ], + "77": [ + { + "x": 3585.0, + "y": 0.0 + } + ], + "78": [ + { + "x": 3585.0, + "y": 2240.0 + } + ], + "79": [ + { + "x": 3585.0, + "y": 4180.0 + } + ], + "80": [ + { + "x": 3585.0, + "y": 10145.0 + } + ], + "81": [ + { + "x": 3585.0, + "y": 16110.0 + } + ], + "82": [ + { + "x": 3585.0, + "y": 22075.0 + } + ], + "83": [ + { + "x": 4780.0, + "y": 0.0 + } + ], + "84": [ + { + "x": 4780.0, + "y": 1270.0 + } + ], + "85": [ + { + "x": 4780.0, + "y": 2240.0 + } + ], + "86": [ + { + "x": 4780.0, + "y": 3210.0 + } + ], + "87": [ + { + "x": 4780.0, + "y": 4180.0 + } + ], + "88": [ + { + "x": 4780.0, + "y": 4964.5 + } + ], + "89": [ + { + "x": 4780.0, + "y": 5749.0 + } + ], + "90": [ + { + "x": 4780.0, + "y": 6249.0 + } + ], + "91": [ + { + "x": 4780.0, + "y": 6749.0 + } + ], + "92": [ + { + "x": 4780.0, + "y": 7249.0 + } + ], + "93": [ + { + "x": 4780.0, + "y": 7904.0 + } + ], + "94": [ + { + "x": 4780.0, + "y": 8404.0 + } + ], + "95": [ + { + "x": 4780.0, + "y": 8904.0 + } + ], + "96": [ + { + "x": 4780.0, + "y": 9404.0 + } + ], + "97": [ + { + "x": 4780.0, + "y": 10145.0 + } + ], + "98": [ + { + "x": 4780.0, + "y": 10929.5 + } + ], + "99": [ + { + "x": 4780.0, + "y": 11714.0 + } + ], + "100": [ + { + "x": 4780.0, + "y": 12214.0 + } + ], + "101": [ + { + "x": 4780.0, + "y": 12714.0 + } + ], + "102": [ + { + "x": 4780.0, + "y": 13214.0 + } + ], + "103": [ + { + "x": 4780.0, + "y": 13869.0 + } + ], + "104": [ + { + "x": 4780.0, + "y": 14369.0 + } + ], + "105": [ + { + "x": 4780.0, + "y": 14869.0 + } + ], + "106": [ + { + "x": 4780.0, + "y": 15369.0 + } + ], + "107": [ + { + "x": 4780.0, + "y": 16110.0 + } + ], + "108": [ + { + "x": 4780.0, + "y": 16894.5 + } + ], + "109": [ + { + "x": 4780.0, + "y": 17679.0 + } + ], + "110": [ + { + "x": 4780.0, + "y": 18179.0 + } + ], + "111": [ + { + "x": 4780.0, + "y": 18679.0 + } + ], + "112": [ + { + "x": 4780.0, + "y": 19179.0 + } + ], + "113": [ + { + "x": 4780.0, + "y": 19834.0 + } + ], + "114": [ + { + "x": 4780.0, + "y": 20334.0 + } + ], + "115": [ + { + "x": 4780.0, + "y": 20834.0 + } + ], + "116": [ + { + "x": 4780.0, + "y": 21334.0 + } + ], + "117": [ + { + "x": 4780.0, + "y": 22075.0 + } + ], + "118": [ + { + "x": 5835.0, + "y": 0.0 + } + ], + "119": [ + { + "x": 5835.0, + "y": 2240.0 + } + ], + "120": [ + { + "x": 5835.0, + "y": 4180.0 + } + ], + "121": [ + { + "x": 5835.0, + "y": 10145.0 + } + ], + "122": [ + { + "x": 5835.0, + "y": 16110.0 + } + ], + "123": [ + { + "x": 5835.0, + "y": 22075.0 + } + ], + "124": [ + { + "x": 6890.0, + "y": 0.0 + } + ], + "125": [ + { + "x": 6890.0, + "y": 2240.0 + } + ], + "126": [ + { + "x": 6890.0, + "y": 4180.0 + } + ], + "127": [ + { + "x": 6890.0, + "y": 4980.0 + } + ], + "128": [ + { + "x": 6890.0, + "y": 6085.0 + } + ], + "129": [ + { + "x": 6890.0, + "y": 7162.5 + } + ], + "130": [ + { + "x": 6890.0, + "y": 8240.0 + } + ], + "131": [ + { + "x": 6890.0, + "y": 9345.0 + } + ], + "132": [ + { + "x": 6890.0, + "y": 10145.0 + } + ], + "133": [ + { + "x": 6890.0, + "y": 10945.0 + } + ], + "134": [ + { + "x": 6890.0, + "y": 12050.0 + } + ], + "135": [ + { + "x": 6890.0, + "y": 16110.0 + } + ], + "136": [ + { + "x": 6890.0, + "y": 16910.0 + } + ], + "137": [ + { + "x": 6890.0, + "y": 18015.0 + } + ], + "138": [ + { + "x": 6890.0, + "y": 19092.5 + } + ], + "139": [ + { + "x": 6890.0, + "y": 20170.0 + } + ], + "140": [ + { + "x": 6890.0, + "y": 21275.0 + } + ], + "141": [ + { + "x": 6890.0, + "y": 22075.0 + } + ], + "142": [ + { + "x": 7945.0, + "y": 0.0 + } + ], + "143": [ + { + "x": 7945.0, + "y": 2240.0 + } + ], + "144": [ + { + "x": 7945.0, + "y": 4180.0 + } + ], + "145": [ + { + "x": 7945.0, + "y": 10145.0 + } + ], + "146": [ + { + "x": 7945.0, + "y": 16110.0 + } + ], + "147": [ + { + "x": 7945.0, + "y": 22075.0 + } + ], + "148": [ + { + "x": 9000.0, + "y": 0.0 + } + ], + "149": [ + { + "x": 9000.0, + "y": 1270.0 + } + ], + "150": [ + { + "x": 9000.0, + "y": 2240.0 + } + ], + "151": [ + { + "x": 9000.0, + "y": 3210.0 + } + ], + "152": [ + { + "x": 9000.0, + "y": 4180.0 + } + ], + "153": [ + { + "x": 9000.0, + "y": 4964.5 + } + ], + "154": [ + { + "x": 9000.0, + "y": 5749.0 + } + ], + "155": [ + { + "x": 9000.0, + "y": 6249.0 + } + ], + "156": [ + { + "x": 9000.0, + "y": 6749.0 + } + ], + "157": [ + { + "x": 9000.0, + "y": 7249.0 + } + ], + "158": [ + { + "x": 9000.0, + "y": 7904.0 + } + ], + "159": [ + { + "x": 9000.0, + "y": 8404.0 + } + ], + "160": [ + { + "x": 9000.0, + "y": 8904.0 + } + ], + "161": [ + { + "x": 9000.0, + "y": 9404.0 + } + ], + "162": [ + { + "x": 9000.0, + "y": 10145.0 + } + ], + "163": [ + { + "x": 9000.0, + "y": 10929.5 + } + ], + "164": [ + { + "x": 9000.0, + "y": 11714.0 + } + ], + "165": [ + { + "x": 9000.0, + "y": 12214.0 + } + ], + "166": [ + { + "x": 9000.0, + "y": 12714.0 + } + ], + "167": [ + { + "x": 9000.0, + "y": 13214.0 + } + ], + "168": [ + { + "x": 9000.0, + "y": 13869.0 + } + ], + "169": [ + { + "x": 9000.0, + "y": 14369.0 + } + ], + "170": [ + { + "x": 9000.0, + "y": 14869.0 + } + ], + "171": [ + { + "x": 9000.0, + "y": 15369.0 + } + ], + "172": [ + { + "x": 9000.0, + "y": 16110.0 + } + ], + "173": [ + { + "x": 9000.0, + "y": 16894.5 + } + ], + "174": [ + { + "x": 9000.0, + "y": 17679.0 + } + ], + "175": [ + { + "x": 9000.0, + "y": 18179.0 + } + ], + "176": [ + { + "x": 9000.0, + "y": 18679.0 + } + ], + "177": [ + { + "x": 9000.0, + "y": 19179.0 + } + ], + "178": [ + { + "x": 9000.0, + "y": 19834.0 + } + ], + "179": [ + { + "x": 9000.0, + "y": 20334.0 + } + ], + "180": [ + { + "x": 9000.0, + "y": 20834.0 + } + ], + "181": [ + { + "x": 9000.0, + "y": 21334.0 + } + ], + "182": [ + { + "x": 9000.0, + "y": 22075.0 + } + ], + "183": [ + { + "x": 10195.0, + "y": 2240.0 + } + ], + "184": [ + { + "x": 10195.0, + "y": 4180.0 + } + ], + "185": [ + { + "x": 10195.0, + "y": 10145.0 + } + ], + "186": [ + { + "x": 10195.0, + "y": 16110.0 + } + ], + "187": [ + { + "x": 10195.0, + "y": 22075.0 + } + ], + "189": [ + { + "x": 11390.0, + "y": 300.0 + } + ], + "190": [ + { + "x": 11390.0, + "y": 1270.0 + } + ], + "191": [ + { + "x": 11390.0, + "y": 2240.0 + } + ], + "192": [ + { + "x": 11390.0, + "y": 3210.0 + } + ], + "193": [ + { + "x": 11390.0, + "y": 4180.0 + } + ], + "194": [ + { + "x": 11390.0, + "y": 4964.5 + } + ], + "195": [ + { + "x": 11390.0, + "y": 5749.0 + } + ], + "196": [ + { + "x": 11390.0, + "y": 6249.0 + } + ], + "197": [ + { + "x": 11390.0, + "y": 6749.0 + } + ], + "198": [ + { + "x": 11390.0, + "y": 7249.0 + } + ], + "199": [ + { + "x": 11390.0, + "y": 7904.0 + } + ], + "200": [ + { + "x": 11390.0, + "y": 8404.0 + } + ], + "201": [ + { + "x": 11390.0, + "y": 8904.0 + } + ], + "202": [ + { + "x": 11390.0, + "y": 9404.0 + } + ], + "203": [ + { + "x": 11390.0, + "y": 10145.0 + } + ], + "204": [ + { + "x": 11390.0, + "y": 10929.5 + } + ], + "205": [ + { + "x": 11390.0, + "y": 11714.0 + } + ], + "206": [ + { + "x": 11390.0, + "y": 12214.0 + } + ], + "207": [ + { + "x": 11390.0, + "y": 12714.0 + } + ], + "208": [ + { + "x": 11390.0, + "y": 13214.0 + } + ], + "209": [ + { + "x": 11390.0, + "y": 13869.0 + } + ], + "210": [ + { + "x": 11390.0, + "y": 14369.0 + } + ], + "211": [ + { + "x": 11390.0, + "y": 14869.0 + } + ], + "212": [ + { + "x": 11390.0, + "y": 15369.0 + } + ], + "213": [ + { + "x": 11390.0, + "y": 16110.0 + } + ], + "214": [ + { + "x": 11390.0, + "y": 16894.5 + } + ], + "215": [ + { + "x": 11390.0, + "y": 17679.0 + } + ], + "216": [ + { + "x": 11390.0, + "y": 18179.0 + } + ], + "217": [ + { + "x": 11390.0, + "y": 18679.0 + } + ], + "218": [ + { + "x": 11390.0, + "y": 19179.0 + } + ], + "219": [ + { + "x": 11390.0, + "y": 19834.0 + } + ], + "220": [ + { + "x": 11390.0, + "y": 20334.0 + } + ], + "221": [ + { + "x": 11390.0, + "y": 20834.0 + } + ], + "222": [ + { + "x": 11390.0, + "y": 21334.0 + } + ], + "223": [ + { + "x": 11390.0, + "y": 22075.0 + } + ], + "224": [ + { + "x": 12585.0, + "y": 2240.0 + } + ], + "225": [ + { + "x": 12585.0, + "y": 4180.0 + } + ], + "226": [ + { + "x": 12585.0, + "y": 10145.0 + } + ], + "227": [ + { + "x": 12585.0, + "y": 16110.0 + } + ], + "228": [ + { + "x": 12585.0, + "y": 22075.0 + } + ], + "230": [ + { + "x": 13780.0, + "y": 300.0 + } + ], + "231": [ + { + "x": 13780.0, + "y": 1270.0 + } + ], + "232": [ + { + "x": 13780.0, + "y": 2240.0 + } + ], + "233": [ + { + "x": 13780.0, + "y": 3210.0 + } + ], + "234": [ + { + "x": 13780.0, + "y": 4180.0 + } + ], + "235": [ + { + "x": 13780.0, + "y": 4964.5 + } + ], + "236": [ + { + "x": 13780.0, + "y": 5749.0 + } + ], + "237": [ + { + "x": 13780.0, + "y": 6249.0 + } + ], + "238": [ + { + "x": 13780.0, + "y": 6749.0 + } + ], + "239": [ + { + "x": 13780.0, + "y": 7249.0 + } + ], + "240": [ + { + "x": 13780.0, + "y": 7904.0 + } + ], + "241": [ + { + "x": 13780.0, + "y": 8404.0 + } + ], + "242": [ + { + "x": 13780.0, + "y": 8904.0 + } + ], + "243": [ + { + "x": 13780.0, + "y": 9404.0 + } + ], + "244": [ + { + "x": 13780.0, + "y": 10145.0 + } + ], + "245": [ + { + "x": 13780.0, + "y": 10929.5 + } + ], + "246": [ + { + "x": 13780.0, + "y": 11714.0 + } + ], + "247": [ + { + "x": 13780.0, + "y": 12214.0 + } + ], + "248": [ + { + "x": 13780.0, + "y": 12714.0 + } + ], + "249": [ + { + "x": 13780.0, + "y": 13214.0 + } + ], + "250": [ + { + "x": 13780.0, + "y": 13869.0 + } + ], + "251": [ + { + "x": 13780.0, + "y": 14369.0 + } + ], + "252": [ + { + "x": 13780.0, + "y": 14869.0 + } + ], + "253": [ + { + "x": 13780.0, + "y": 15369.0 + } + ], + "254": [ + { + "x": 13780.0, + "y": 16110.0 + } + ], + "255": [ + { + "x": 13780.0, + "y": 16894.5 + } + ], + "256": [ + { + "x": 13780.0, + "y": 17679.0 + } + ], + "257": [ + { + "x": 13780.0, + "y": 18179.0 + } + ], + "258": [ + { + "x": 13780.0, + "y": 18679.0 + } + ], + "259": [ + { + "x": 13780.0, + "y": 19179.0 + } + ], + "260": [ + { + "x": 13780.0, + "y": 19834.0 + } + ], + "261": [ + { + "x": 13780.0, + "y": 20334.0 + } + ], + "262": [ + { + "x": 13780.0, + "y": 20834.0 + } + ], + "263": [ + { + "x": 13780.0, + "y": 21334.0 + } + ], + "264": [ + { + "x": 13780.0, + "y": 22075.0 + } + ], + "265": [ + { + "x": 14706.25, + "y": 2240.0 + } + ], + "266": [ + { + "x": 14706.25, + "y": 4180.0 + } + ], + "267": [ + { + "x": 14706.25, + "y": 10145.0 + } + ], + "268": [ + { + "x": 14706.25, + "y": 16110.0 + } + ], + "269": [ + { + "x": 14706.25, + "y": 22075.0 + } + ], + "270": [ + { + "x": 15632.5, + "y": 2240.0 + } + ], + "271": [ + { + "x": 15632.5, + "y": 4180.0 + } + ], + "272": [ + { + "x": 15632.5, + "y": 4980.0 + } + ], + "273": [ + { + "x": 15632.5, + "y": 6085.0 + } + ], + "274": [ + { + "x": 15632.5, + "y": 7162.5 + } + ], + "275": [ + { + "x": 15632.5, + "y": 8240.0 + } + ], + "276": [ + { + "x": 15632.5, + "y": 9345.0 + } + ], + "277": [ + { + "x": 15632.5, + "y": 10145.0 + } + ], + "278": [ + { + "x": 15632.5, + "y": 10945.0 + } + ], + "279": [ + { + "x": 15632.5, + "y": 12050.0 + } + ], + "280": [ + { + "x": 15632.5, + "y": 16110.0 + } + ], + "281": [ + { + "x": 15632.5, + "y": 16910.0 + } + ], + "282": [ + { + "x": 15632.5, + "y": 18015.0 + } + ], + "283": [ + { + "x": 15632.5, + "y": 19092.5 + } + ], + "284": [ + { + "x": 15632.5, + "y": 20170.0 + } + ], + "285": [ + { + "x": 15632.5, + "y": 21275.0 + } + ], + "286": [ + { + "x": 15632.5, + "y": 22075.0 + } + ], + "287": [ + { + "x": 16558.75, + "y": 2240.0 + } + ], + "288": [ + { + "x": 16558.75, + "y": 4180.0 + } + ], + "289": [ + { + "x": 16558.75, + "y": 10145.0 + } + ], + "290": [ + { + "x": 16558.75, + "y": 16110.0 + } + ], + "291": [ + { + "x": 16558.75, + "y": 22075.0 + } + ], + "292": [ + { + "x": 17485.0, + "y": 0.0 + } + ], + "293": [ + { + "x": 17485.0, + "y": 1270.0 + } + ], + "294": [ + { + "x": 17485.0, + "y": 2240.0 + } + ], + "295": [ + { + "x": 17485.0, + "y": 3210.0 + } + ], + "296": [ + { + "x": 17485.0, + "y": 4180.0 + } + ], + "297": [ + { + "x": 17485.0, + "y": 4964.5 + } + ], + "298": [ + { + "x": 17485.0, + "y": 5749.0 + } + ], + "299": [ + { + "x": 17485.0, + "y": 6249.0 + } + ], + "300": [ + { + "x": 17485.0, + "y": 6749.0 + } + ], + "301": [ + { + "x": 17485.0, + "y": 7249.0 + } + ], + "302": [ + { + "x": 17485.0, + "y": 7904.0 + } + ], + "303": [ + { + "x": 17485.0, + "y": 8404.0 + } + ], + "304": [ + { + "x": 17485.0, + "y": 8904.0 + } + ], + "305": [ + { + "x": 17485.0, + "y": 9404.0 + } + ], + "306": [ + { + "x": 17485.0, + "y": 10145.0 + } + ], + "307": [ + { + "x": 17485.0, + "y": 10929.5 + } + ], + "308": [ + { + "x": 17485.0, + "y": 11714.0 + } + ], + "309": [ + { + "x": 17485.0, + "y": 12214.0 + } + ], + "310": [ + { + "x": 17485.0, + "y": 12714.0 + } + ], + "311": [ + { + "x": 17485.0, + "y": 13214.0 + } + ], + "312": [ + { + "x": 17485.0, + "y": 13869.0 + } + ], + "313": [ + { + "x": 17485.0, + "y": 14369.0 + } + ], + "314": [ + { + "x": 17485.0, + "y": 14869.0 + } + ], + "315": [ + { + "x": 17485.0, + "y": 15369.0 + } + ], + "316": [ + { + "x": 17485.0, + "y": 16110.0 + } + ], + "317": [ + { + "x": 17485.0, + "y": 16894.5 + } + ], + "318": [ + { + "x": 17485.0, + "y": 17679.0 + } + ], + "319": [ + { + "x": 17485.0, + "y": 18179.0 + } + ], + "320": [ + { + "x": 17485.0, + "y": 18679.0 + } + ], + "321": [ + { + "x": 17485.0, + "y": 19179.0 + } + ], + "322": [ + { + "x": 17485.0, + "y": 19834.0 + } + ], + "323": [ + { + "x": 17485.0, + "y": 20334.0 + } + ], + "324": [ + { + "x": 17485.0, + "y": 20834.0 + } + ], + "325": [ + { + "x": 17485.0, + "y": 21334.0 + } + ], + "326": [ + { + "x": 17485.0, + "y": 22075.0 + } + ], + "327": [ + { + "x": 17485.0, + "y": 22859.5 + } + ], + "328": [ + { + "x": 17485.0, + "y": 23644.0 + } + ], + "329": [ + { + "x": 17485.0, + "y": 24144.0 + } + ], + "330": [ + { + "x": 17485.0, + "y": 24644.0 + } + ], + "331": [ + { + "x": 17485.0, + "y": 25144.0 + } + ], + "332": [ + { + "x": 17485.0, + "y": 25885.0 + } + ], + "333": [ + { + "x": 17485.0, + "y": 26669.5 + } + ], + "334": [ + { + "x": 17485.0, + "y": 27454.0 + } + ], + "335": [ + { + "x": 17485.0, + "y": 27954.0 + } + ], + "336": [ + { + "x": 17485.0, + "y": 28454.0 + } + ], + "337": [ + { + "x": 17485.0, + "y": 28954.0 + } + ], + "338": [ + { + "x": 17485.0, + "y": 29695.0 + } + ], + "339": [ + { + "x": 18680.0, + "y": 0.0 + } + ], + "340": [ + { + "x": 18680.0, + "y": 2240.0 + } + ], + "341": [ + { + "x": 18680.0, + "y": 4180.0 + } + ], + "342": [ + { + "x": 18680.0, + "y": 10145.0 + } + ], + "343": [ + { + "x": 18680.0, + "y": 16110.0 + } + ], + "344": [ + { + "x": 18680.0, + "y": 22075.0 + } + ], + "345": [ + { + "x": 18680.0, + "y": 25885.0 + } + ], + "346": [ + { + "x": 18680.0, + "y": 29695.0 + } + ], + "347": [ + { + "x": 19875.0, + "y": 0.0 + } + ], + "348": [ + { + "x": 19875.0, + "y": 1270.0 + } + ], + "349": [ + { + "x": 19875.0, + "y": 2240.0 + } + ], + "350": [ + { + "x": 19875.0, + "y": 3210.0 + } + ], + "351": [ + { + "x": 19875.0, + "y": 4180.0 + } + ], + "352": [ + { + "x": 19875.0, + "y": 4964.5 + } + ], + "353": [ + { + "x": 19875.0, + "y": 5749.0 + } + ], + "354": [ + { + "x": 19875.0, + "y": 6249.0 + } + ], + "355": [ + { + "x": 19875.0, + "y": 6749.0 + } + ], + "356": [ + { + "x": 19875.0, + "y": 7249.0 + } + ], + "357": [ + { + "x": 19875.0, + "y": 7904.0 + } + ], + "358": [ + { + "x": 19875.0, + "y": 8404.0 + } + ], + "359": [ + { + "x": 19875.0, + "y": 8904.0 + } + ], + "360": [ + { + "x": 19875.0, + "y": 9404.0 + } + ], + "361": [ + { + "x": 19875.0, + "y": 10145.0 + } + ], + "362": [ + { + "x": 19875.0, + "y": 10929.5 + } + ], + "363": [ + { + "x": 19875.0, + "y": 11714.0 + } + ], + "364": [ + { + "x": 19875.0, + "y": 12214.0 + } + ], + "365": [ + { + "x": 19875.0, + "y": 12714.0 + } + ], + "366": [ + { + "x": 19875.0, + "y": 13214.0 + } + ], + "367": [ + { + "x": 19875.0, + "y": 13869.0 + } + ], + "368": [ + { + "x": 19875.0, + "y": 14369.0 + } + ], + "369": [ + { + "x": 19875.0, + "y": 14869.0 + } + ], + "370": [ + { + "x": 19875.0, + "y": 15369.0 + } + ], + "371": [ + { + "x": 19875.0, + "y": 16110.0 + } + ], + "372": [ + { + "x": 19875.0, + "y": 16894.5 + } + ], + "373": [ + { + "x": 19875.0, + "y": 17679.0 + } + ], + "374": [ + { + "x": 19875.0, + "y": 18179.0 + } + ], + "375": [ + { + "x": 19875.0, + "y": 18679.0 + } + ], + "376": [ + { + "x": 19875.0, + "y": 19179.0 + } + ], + "377": [ + { + "x": 19875.0, + "y": 19834.0 + } + ], + "378": [ + { + "x": 19875.0, + "y": 20334.0 + } + ], + "379": [ + { + "x": 19875.0, + "y": 20834.0 + } + ], + "380": [ + { + "x": 19875.0, + "y": 21334.0 + } + ], + "381": [ + { + "x": 19875.0, + "y": 22075.0 + } + ], + "382": [ + { + "x": 19875.0, + "y": 22859.5 + } + ], + "383": [ + { + "x": 19875.0, + "y": 23644.0 + } + ], + "384": [ + { + "x": 19875.0, + "y": 24144.0 + } + ], + "385": [ + { + "x": 19875.0, + "y": 24644.0 + } + ], + "386": [ + { + "x": 19875.0, + "y": 25144.0 + } + ], + "387": [ + { + "x": 19875.0, + "y": 25885.0 + } + ], + "388": [ + { + "x": 19875.0, + "y": 26669.5 + } + ], + "389": [ + { + "x": 19875.0, + "y": 27454.0 + } + ], + "390": [ + { + "x": 19875.0, + "y": 27954.0 + } + ], + "391": [ + { + "x": 19875.0, + "y": 28454.0 + } + ], + "392": [ + { + "x": 19875.0, + "y": 28954.0 + } + ], + "393": [ + { + "x": 19875.0, + "y": 29695.0 + } + ], + "394": [ + { + "x": 21070.0, + "y": 0.0 + } + ], + "395": [ + { + "x": 21070.0, + "y": 2240.0 + } + ], + "396": [ + { + "x": 21070.0, + "y": 4180.0 + } + ], + "397": [ + { + "x": 21070.0, + "y": 10145.0 + } + ], + "398": [ + { + "x": 21070.0, + "y": 16110.0 + } + ], + "399": [ + { + "x": 21070.0, + "y": 22075.0 + } + ], + "400": [ + { + "x": 21070.0, + "y": 25885.0 + } + ], + "401": [ + { + "x": 21070.0, + "y": 29695.0 + } + ], + "402": [ + { + "x": 22265.0, + "y": 0.0 + } + ], + "403": [ + { + "x": 22265.0, + "y": 1270.0 + } + ], + "404": [ + { + "x": 22265.0, + "y": 2240.0 + } + ], + "405": [ + { + "x": 22265.0, + "y": 3210.0 + } + ], + "406": [ + { + "x": 22265.0, + "y": 4180.0 + } + ], + "407": [ + { + "x": 22265.0, + "y": 4964.5 + } + ], + "408": [ + { + "x": 22265.0, + "y": 5749.0 + } + ], + "409": [ + { + "x": 22265.0, + "y": 6249.0 + } + ], + "410": [ + { + "x": 22265.0, + "y": 6749.0 + } + ], + "411": [ + { + "x": 22265.0, + "y": 7249.0 + } + ], + "412": [ + { + "x": 22265.0, + "y": 7904.0 + } + ], + "413": [ + { + "x": 22265.0, + "y": 8404.0 + } + ], + "414": [ + { + "x": 22265.0, + "y": 8904.0 + } + ], + "415": [ + { + "x": 22265.0, + "y": 9404.0 + } + ], + "416": [ + { + "x": 22265.0, + "y": 10145.0 + } + ], + "417": [ + { + "x": 22265.0, + "y": 10929.5 + } + ], + "418": [ + { + "x": 22265.0, + "y": 11714.0 + } + ], + "419": [ + { + "x": 22265.0, + "y": 12214.0 + } + ], + "420": [ + { + "x": 22265.0, + "y": 12714.0 + } + ], + "421": [ + { + "x": 22265.0, + "y": 13214.0 + } + ], + "422": [ + { + "x": 22265.0, + "y": 13869.0 + } + ], + "423": [ + { + "x": 22265.0, + "y": 14369.0 + } + ], + "424": [ + { + "x": 22265.0, + "y": 14869.0 + } + ], + "425": [ + { + "x": 22265.0, + "y": 15369.0 + } + ], + "426": [ + { + "x": 22265.0, + "y": 16110.0 + } + ], + "427": [ + { + "x": 22265.0, + "y": 16894.5 + } + ], + "428": [ + { + "x": 22265.0, + "y": 17679.0 + } + ], + "429": [ + { + "x": 22265.0, + "y": 18179.0 + } + ], + "430": [ + { + "x": 22265.0, + "y": 18679.0 + } + ], + "431": [ + { + "x": 22265.0, + "y": 19179.0 + } + ], + "432": [ + { + "x": 22265.0, + "y": 19834.0 + } + ], + "433": [ + { + "x": 22265.0, + "y": 20334.0 + } + ], + "434": [ + { + "x": 22265.0, + "y": 20834.0 + } + ], + "435": [ + { + "x": 22265.0, + "y": 21334.0 + } + ], + "436": [ + { + "x": 22265.0, + "y": 22075.0 + } + ], + "437": [ + { + "x": 22265.0, + "y": 22859.5 + } + ], + "438": [ + { + "x": 22265.0, + "y": 23644.0 + } + ], + "439": [ + { + "x": 22265.0, + "y": 24144.0 + } + ], + "440": [ + { + "x": 22265.0, + "y": 24644.0 + } + ], + "441": [ + { + "x": 22265.0, + "y": 25144.0 + } + ], + "442": [ + { + "x": 22265.0, + "y": 25885.0 + } + ], + "443": [ + { + "x": 22265.0, + "y": 26669.5 + } + ], + "444": [ + { + "x": 22265.0, + "y": 27454.0 + } + ], + "445": [ + { + "x": 22265.0, + "y": 27954.0 + } + ], + "446": [ + { + "x": 22265.0, + "y": 28454.0 + } + ], + "447": [ + { + "x": 22265.0, + "y": 28954.0 + } + ], + "448": [ + { + "x": 22265.0, + "y": 29695.0 + } + ], + "449": [ + { + "x": 23320.0, + "y": 0.0 + } + ], + "450": [ + { + "x": 23320.0, + "y": 2240.0 + } + ], + "451": [ + { + "x": 23320.0, + "y": 4180.0 + } + ], + "452": [ + { + "x": 23320.0, + "y": 10145.0 + } + ], + "453": [ + { + "x": 23320.0, + "y": 16110.0 + } + ], + "454": [ + { + "x": 23320.0, + "y": 22075.0 + } + ], + "455": [ + { + "x": 23320.0, + "y": 25885.0 + } + ], + "456": [ + { + "x": 23320.0, + "y": 29695.0 + } + ], + "457": [ + { + "x": 24375.0, + "y": 0.0 + } + ], + "458": [ + { + "x": 24375.0, + "y": 2240.0 + } + ], + "459": [ + { + "x": 24375.0, + "y": 4180.0 + } + ], + "460": [ + { + "x": 24375.0, + "y": 4980.0 + } + ], + "461": [ + { + "x": 24375.0, + "y": 6085.0 + } + ], + "462": [ + { + "x": 24375.0, + "y": 7162.5 + } + ], + "463": [ + { + "x": 24375.0, + "y": 8240.0 + } + ], + "464": [ + { + "x": 24375.0, + "y": 9345.0 + } + ], + "465": [ + { + "x": 24375.0, + "y": 10145.0 + } + ], + "466": [ + { + "x": 24375.0, + "y": 10945.0 + } + ], + "467": [ + { + "x": 24375.0, + "y": 12050.0 + } + ], + "468": [ + { + "x": 24375.0, + "y": 16110.0 + } + ], + "469": [ + { + "x": 24375.0, + "y": 16910.0 + } + ], + "470": [ + { + "x": 24375.0, + "y": 18015.0 + } + ], + "471": [ + { + "x": 24375.0, + "y": 19092.5 + } + ], + "472": [ + { + "x": 24375.0, + "y": 20170.0 + } + ], + "473": [ + { + "x": 24375.0, + "y": 21275.0 + } + ], + "474": [ + { + "x": 24375.0, + "y": 22075.0 + } + ], + "475": [ + { + "x": 24375.0, + "y": 22875.0 + } + ], + "476": [ + { + "x": 24375.0, + "y": 23980.0 + } + ], + "477": [ + { + "x": 24375.0, + "y": 25085.0 + } + ], + "478": [ + { + "x": 24375.0, + "y": 25885.0 + } + ], + "479": [ + { + "x": 24375.0, + "y": 26685.0 + } + ], + "480": [ + { + "x": 24375.0, + "y": 27790.0 + } + ], + "481": [ + { + "x": 24375.0, + "y": 28895.0 + } + ], + "482": [ + { + "x": 24375.0, + "y": 29695.0 + } + ], + "483": [ + { + "x": 25430.0, + "y": 0.0 + } + ], + "484": [ + { + "x": 25430.0, + "y": 2240.0 + } + ], + "485": [ + { + "x": 25430.0, + "y": 4180.0 + } + ], + "486": [ + { + "x": 25430.0, + "y": 10145.0 + } + ], + "487": [ + { + "x": 25430.0, + "y": 16110.0 + } + ], + "488": [ + { + "x": 25430.0, + "y": 22075.0 + } + ], + "489": [ + { + "x": 25430.0, + "y": 25885.0 + } + ], + "490": [ + { + "x": 25430.0, + "y": 29695.0 + } + ], + "491": [ + { + "x": 26485.0, + "y": 0.0 + } + ], + "492": [ + { + "x": 26485.0, + "y": 1270.0 + } + ], + "493": [ + { + "x": 26485.0, + "y": 2240.0 + } + ], + "494": [ + { + "x": 26485.0, + "y": 3210.0 + } + ], + "495": [ + { + "x": 26485.0, + "y": 4180.0 + } + ], + "496": [ + { + "x": 26485.0, + "y": 4964.5 + } + ], + "497": [ + { + "x": 26485.0, + "y": 5749.0 + } + ], + "498": [ + { + "x": 26485.0, + "y": 6249.0 + } + ], + "499": [ + { + "x": 26485.0, + "y": 6749.0 + } + ], + "500": [ + { + "x": 26485.0, + "y": 7249.0 + } + ], + "501": [ + { + "x": 26485.0, + "y": 7904.0 + } + ], + "502": [ + { + "x": 26485.0, + "y": 8404.0 + } + ], + "503": [ + { + "x": 26485.0, + "y": 8904.0 + } + ], + "504": [ + { + "x": 26485.0, + "y": 9404.0 + } + ], + "505": [ + { + "x": 26485.0, + "y": 10145.0 + } + ], + "506": [ + { + "x": 26485.0, + "y": 10929.5 + } + ], + "507": [ + { + "x": 26485.0, + "y": 11714.0 + } + ], + "508": [ + { + "x": 26485.0, + "y": 12214.0 + } + ], + "509": [ + { + "x": 26485.0, + "y": 12714.0 + } + ], + "510": [ + { + "x": 26485.0, + "y": 13214.0 + } + ], + "511": [ + { + "x": 26485.0, + "y": 13869.0 + } + ], + "512": [ + { + "x": 26485.0, + "y": 14369.0 + } + ], + "513": [ + { + "x": 26485.0, + "y": 14869.0 + } + ], + "514": [ + { + "x": 26485.0, + "y": 15369.0 + } + ], + "515": [ + { + "x": 26485.0, + "y": 16110.0 + } + ], + "516": [ + { + "x": 26485.0, + "y": 16894.5 + } + ], + "517": [ + { + "x": 26485.0, + "y": 17679.0 + } + ], + "518": [ + { + "x": 26485.0, + "y": 18179.0 + } + ], + "519": [ + { + "x": 26485.0, + "y": 18679.0 + } + ], + "520": [ + { + "x": 26485.0, + "y": 19179.0 + } + ], + "521": [ + { + "x": 26485.0, + "y": 19834.0 + } + ], + "522": [ + { + "x": 26485.0, + "y": 20334.0 + } + ], + "523": [ + { + "x": 26485.0, + "y": 20834.0 + } + ], + "524": [ + { + "x": 26485.0, + "y": 21334.0 + } + ], + "525": [ + { + "x": 26485.0, + "y": 22075.0 + } + ], + "526": [ + { + "x": 26485.0, + "y": 22859.5 + } + ], + "527": [ + { + "x": 26485.0, + "y": 23644.0 + } + ], + "528": [ + { + "x": 26485.0, + "y": 24144.0 + } + ], + "529": [ + { + "x": 26485.0, + "y": 24644.0 + } + ], + "530": [ + { + "x": 26485.0, + "y": 25144.0 + } + ], + "531": [ + { + "x": 26485.0, + "y": 25885.0 + } + ], + "532": [ + { + "x": 26485.0, + "y": 26669.5 + } + ], + "533": [ + { + "x": 26485.0, + "y": 27454.0 + } + ], + "534": [ + { + "x": 26485.0, + "y": 27954.0 + } + ], + "535": [ + { + "x": 26485.0, + "y": 28454.0 + } + ], + "536": [ + { + "x": 26485.0, + "y": 28954.0 + } + ], + "537": [ + { + "x": 26485.0, + "y": 29695.0 + } + ], + "538": [ + { + "x": 27680.0, + "y": 2240.0 + } + ], + "539": [ + { + "x": 27680.0, + "y": 4180.0 + } + ], + "540": [ + { + "x": 27680.0, + "y": 10145.0 + } + ], + "541": [ + { + "x": 27680.0, + "y": 16110.0 + } + ], + "542": [ + { + "x": 27680.0, + "y": 22075.0 + } + ], + "543": [ + { + "x": 27680.0, + "y": 25885.0 + } + ], + "544": [ + { + "x": 27680.0, + "y": 29695.0 + } + ], + "546": [ + { + "x": 28875.0, + "y": 300.0 + } + ], + "547": [ + { + "x": 28875.0, + "y": 1270.0 + } + ], + "548": [ + { + "x": 28875.0, + "y": 2240.0 + } + ], + "549": [ + { + "x": 28875.0, + "y": 3210.0 + } + ], + "550": [ + { + "x": 28875.0, + "y": 4180.0 + } + ], + "551": [ + { + "x": 28875.0, + "y": 4964.5 + } + ], + "552": [ + { + "x": 28875.0, + "y": 5749.0 + } + ], + "553": [ + { + "x": 28875.0, + "y": 6249.0 + } + ], + "554": [ + { + "x": 28875.0, + "y": 6749.0 + } + ], + "555": [ + { + "x": 28875.0, + "y": 7249.0 + } + ], + "556": [ + { + "x": 28875.0, + "y": 7904.0 + } + ], + "557": [ + { + "x": 28875.0, + "y": 8404.0 + } + ], + "558": [ + { + "x": 28875.0, + "y": 8904.0 + } + ], + "559": [ + { + "x": 28875.0, + "y": 9404.0 + } + ], + "560": [ + { + "x": 28875.0, + "y": 10145.0 + } + ], + "561": [ + { + "x": 28875.0, + "y": 10929.5 + } + ], + "562": [ + { + "x": 28875.0, + "y": 11714.0 + } + ], + "563": [ + { + "x": 28875.0, + "y": 12214.0 + } + ], + "564": [ + { + "x": 28875.0, + "y": 12714.0 + } + ], + "565": [ + { + "x": 28875.0, + "y": 13214.0 + } + ], + "566": [ + { + "x": 28875.0, + "y": 13869.0 + } + ], + "567": [ + { + "x": 28875.0, + "y": 14369.0 + } + ], + "568": [ + { + "x": 28875.0, + "y": 14869.0 + } + ], + "569": [ + { + "x": 28875.0, + "y": 15369.0 + } + ], + "570": [ + { + "x": 28875.0, + "y": 16110.0 + } + ], + "571": [ + { + "x": 28875.0, + "y": 16894.5 + } + ], + "572": [ + { + "x": 28875.0, + "y": 17679.0 + } + ], + "573": [ + { + "x": 28875.0, + "y": 18179.0 + } + ], + "574": [ + { + "x": 28875.0, + "y": 18679.0 + } + ], + "575": [ + { + "x": 28875.0, + "y": 19179.0 + } + ], + "576": [ + { + "x": 28875.0, + "y": 19834.0 + } + ], + "577": [ + { + "x": 28875.0, + "y": 20334.0 + } + ], + "578": [ + { + "x": 28875.0, + "y": 20834.0 + } + ], + "579": [ + { + "x": 28875.0, + "y": 21334.0 + } + ], + "580": [ + { + "x": 28875.0, + "y": 22075.0 + } + ], + "581": [ + { + "x": 28875.0, + "y": 22859.5 + } + ], + "582": [ + { + "x": 28875.0, + "y": 23644.0 + } + ], + "583": [ + { + "x": 28875.0, + "y": 24144.0 + } + ], + "584": [ + { + "x": 28875.0, + "y": 24644.0 + } + ], + "585": [ + { + "x": 28875.0, + "y": 25144.0 + } + ], + "586": [ + { + "x": 28875.0, + "y": 25885.0 + } + ], + "587": [ + { + "x": 28875.0, + "y": 26669.5 + } + ], + "588": [ + { + "x": 28875.0, + "y": 27454.0 + } + ], + "589": [ + { + "x": 28875.0, + "y": 27954.0 + } + ], + "590": [ + { + "x": 28875.0, + "y": 28454.0 + } + ], + "591": [ + { + "x": 28875.0, + "y": 28954.0 + } + ], + "592": [ + { + "x": 28875.0, + "y": 29695.0 + } + ], + "593": [ + { + "x": 30070.0, + "y": 2240.0 + } + ], + "594": [ + { + "x": 30070.0, + "y": 4180.0 + } + ], + "595": [ + { + "x": 30070.0, + "y": 10145.0 + } + ], + "596": [ + { + "x": 30070.0, + "y": 16110.0 + } + ], + "597": [ + { + "x": 30070.0, + "y": 22075.0 + } + ], + "598": [ + { + "x": 30070.0, + "y": 25885.0 + } + ], + "599": [ + { + "x": 30070.0, + "y": 29695.0 + } + ], + "601": [ + { + "x": 31265.0, + "y": 300.0 + } + ], + "602": [ + { + "x": 31265.0, + "y": 1270.0 + } + ], + "603": [ + { + "x": 31265.0, + "y": 2240.0 + } + ], + "604": [ + { + "x": 31265.0, + "y": 3210.0 + } + ], + "605": [ + { + "x": 31265.0, + "y": 4180.0 + } + ], + "606": [ + { + "x": 31265.0, + "y": 4964.5 + } + ], + "607": [ + { + "x": 31265.0, + "y": 5749.0 + } + ], + "608": [ + { + "x": 31265.0, + "y": 6249.0 + } + ], + "609": [ + { + "x": 31265.0, + "y": 6749.0 + } + ], + "610": [ + { + "x": 31265.0, + "y": 7249.0 + } + ], + "611": [ + { + "x": 31265.0, + "y": 7904.0 + } + ], + "612": [ + { + "x": 31265.0, + "y": 8404.0 + } + ], + "613": [ + { + "x": 31265.0, + "y": 8904.0 + } + ], + "614": [ + { + "x": 31265.0, + "y": 9404.0 + } + ], + "615": [ + { + "x": 31265.0, + "y": 10145.0 + } + ], + "616": [ + { + "x": 31265.0, + "y": 10929.5 + } + ], + "617": [ + { + "x": 31265.0, + "y": 11714.0 + } + ], + "618": [ + { + "x": 31265.0, + "y": 12214.0 + } + ], + "619": [ + { + "x": 31265.0, + "y": 12714.0 + } + ], + "620": [ + { + "x": 31265.0, + "y": 13214.0 + } + ], + "621": [ + { + "x": 31265.0, + "y": 13869.0 + } + ], + "622": [ + { + "x": 31265.0, + "y": 14369.0 + } + ], + "623": [ + { + "x": 31265.0, + "y": 14869.0 + } + ], + "624": [ + { + "x": 31265.0, + "y": 15369.0 + } + ], + "625": [ + { + "x": 31265.0, + "y": 16110.0 + } + ], + "626": [ + { + "x": 31265.0, + "y": 16894.5 + } + ], + "627": [ + { + "x": 31265.0, + "y": 17679.0 + } + ], + "628": [ + { + "x": 31265.0, + "y": 18179.0 + } + ], + "629": [ + { + "x": 31265.0, + "y": 18679.0 + } + ], + "630": [ + { + "x": 31265.0, + "y": 19179.0 + } + ], + "631": [ + { + "x": 31265.0, + "y": 19834.0 + } + ], + "632": [ + { + "x": 31265.0, + "y": 20334.0 + } + ], + "633": [ + { + "x": 31265.0, + "y": 20834.0 + } + ], + "634": [ + { + "x": 31265.0, + "y": 21334.0 + } + ], + "635": [ + { + "x": 31265.0, + "y": 22075.0 + } + ], + "636": [ + { + "x": 31265.0, + "y": 22859.5 + } + ], + "637": [ + { + "x": 31265.0, + "y": 23644.0 + } + ], + "638": [ + { + "x": 31265.0, + "y": 24144.0 + } + ], + "639": [ + { + "x": 31265.0, + "y": 24644.0 + } + ], + "640": [ + { + "x": 31265.0, + "y": 25144.0 + } + ], + "641": [ + { + "x": 31265.0, + "y": 25885.0 + } + ], + "642": [ + { + "x": 31265.0, + "y": 26669.5 + } + ], + "643": [ + { + "x": 31265.0, + "y": 27454.0 + } + ], + "644": [ + { + "x": 31265.0, + "y": 27954.0 + } + ], + "645": [ + { + "x": 31265.0, + "y": 28454.0 + } + ], + "646": [ + { + "x": 31265.0, + "y": 28954.0 + } + ], + "647": [ + { + "x": 31265.0, + "y": 29695.0 + } + ], + "648": [ + { + "x": 32320.0, + "y": 2240.0 + } + ], + "649": [ + { + "x": 32320.0, + "y": 4180.0 + } + ], + "650": [ + { + "x": 32320.0, + "y": 10145.0 + } + ], + "651": [ + { + "x": 32320.0, + "y": 16110.0 + } + ], + "652": [ + { + "x": 32320.0, + "y": 22075.0 + } + ], + "653": [ + { + "x": 32320.0, + "y": 25885.0 + } + ], + "654": [ + { + "x": 32320.0, + "y": 29695.0 + } + ], + "655": [ + { + "x": 33375.0, + "y": 2240.0 + } + ], + "656": [ + { + "x": 33375.0, + "y": 4180.0 + } + ], + "657": [ + { + "x": 33375.0, + "y": 4980.0 + } + ], + "658": [ + { + "x": 33375.0, + "y": 6085.0 + } + ], + "659": [ + { + "x": 33375.0, + "y": 7162.5 + } + ], + "660": [ + { + "x": 33375.0, + "y": 8240.0 + } + ], + "661": [ + { + "x": 33375.0, + "y": 9345.0 + } + ], + "662": [ + { + "x": 33375.0, + "y": 10145.0 + } + ], + "663": [ + { + "x": 33375.0, + "y": 10945.0 + } + ], + "664": [ + { + "x": 33375.0, + "y": 12050.0 + } + ], + "665": [ + { + "x": 33375.0, + "y": 16110.0 + } + ], + "666": [ + { + "x": 33375.0, + "y": 16910.0 + } + ], + "667": [ + { + "x": 33375.0, + "y": 18015.0 + } + ], + "668": [ + { + "x": 33375.0, + "y": 19092.5 + } + ], + "669": [ + { + "x": 33375.0, + "y": 20170.0 + } + ], + "670": [ + { + "x": 33375.0, + "y": 21275.0 + } + ], + "671": [ + { + "x": 33375.0, + "y": 22075.0 + } + ], + "672": [ + { + "x": 33375.0, + "y": 22875.0 + } + ], + "673": [ + { + "x": 33375.0, + "y": 23980.0 + } + ], + "674": [ + { + "x": 33375.0, + "y": 25085.0 + } + ], + "675": [ + { + "x": 33375.0, + "y": 25885.0 + } + ], + "676": [ + { + "x": 33375.0, + "y": 26685.0 + } + ], + "677": [ + { + "x": 33375.0, + "y": 27790.0 + } + ], + "678": [ + { + "x": 33375.0, + "y": 28895.0 + } + ], + "679": [ + { + "x": 33375.0, + "y": 29695.0 + } + ], + "680": [ + { + "x": 34430.0, + "y": 2240.0 + } + ], + "681": [ + { + "x": 34430.0, + "y": 4180.0 + } + ], + "682": [ + { + "x": 34430.0, + "y": 10145.0 + } + ], + "683": [ + { + "x": 34430.0, + "y": 16110.0 + } + ], + "684": [ + { + "x": 34430.0, + "y": 22075.0 + } + ], + "685": [ + { + "x": 34430.0, + "y": 25885.0 + } + ], + "686": [ + { + "x": 34430.0, + "y": 29695.0 + } + ], + "687": [ + { + "x": 35485.0, + "y": 0.0 + } + ], + "688": [ + { + "x": 35485.0, + "y": 1270.0 + } + ], + "689": [ + { + "x": 35485.0, + "y": 2240.0 + } + ], + "690": [ + { + "x": 35485.0, + "y": 3210.0 + } + ], + "691": [ + { + "x": 35485.0, + "y": 4180.0 + } + ], + "692": [ + { + "x": 35485.0, + "y": 4964.5 + } + ], + "693": [ + { + "x": 35485.0, + "y": 5749.0 + } + ], + "694": [ + { + "x": 35485.0, + "y": 6249.0 + } + ], + "695": [ + { + "x": 35485.0, + "y": 6749.0 + } + ], + "696": [ + { + "x": 35485.0, + "y": 7249.0 + } + ], + "697": [ + { + "x": 35485.0, + "y": 7904.0 + } + ], + "698": [ + { + "x": 35485.0, + "y": 8404.0 + } + ], + "699": [ + { + "x": 35485.0, + "y": 8904.0 + } + ], + "700": [ + { + "x": 35485.0, + "y": 9404.0 + } + ], + "701": [ + { + "x": 35485.0, + "y": 10145.0 + } + ], + "702": [ + { + "x": 35485.0, + "y": 10929.5 + } + ], + "703": [ + { + "x": 35485.0, + "y": 11714.0 + } + ], + "704": [ + { + "x": 35485.0, + "y": 12214.0 + } + ], + "705": [ + { + "x": 35485.0, + "y": 12714.0 + } + ], + "706": [ + { + "x": 35485.0, + "y": 13214.0 + } + ], + "707": [ + { + "x": 35485.0, + "y": 13869.0 + } + ], + "708": [ + { + "x": 35485.0, + "y": 14369.0 + } + ], + "709": [ + { + "x": 35485.0, + "y": 14869.0 + } + ], + "710": [ + { + "x": 35485.0, + "y": 15369.0 + } + ], + "711": [ + { + "x": 35485.0, + "y": 16110.0 + } + ], + "712": [ + { + "x": 35485.0, + "y": 16894.5 + } + ], + "713": [ + { + "x": 35485.0, + "y": 17679.0 + } + ], + "714": [ + { + "x": 35485.0, + "y": 18179.0 + } + ], + "715": [ + { + "x": 35485.0, + "y": 18679.0 + } + ], + "716": [ + { + "x": 35485.0, + "y": 19179.0 + } + ], + "717": [ + { + "x": 35485.0, + "y": 19834.0 + } + ], + "718": [ + { + "x": 35485.0, + "y": 20334.0 + } + ], + "719": [ + { + "x": 35485.0, + "y": 20834.0 + } + ], + "720": [ + { + "x": 35485.0, + "y": 21334.0 + } + ], + "721": [ + { + "x": 35485.0, + "y": 22075.0 + } + ], + "722": [ + { + "x": 35485.0, + "y": 22859.5 + } + ], + "723": [ + { + "x": 35485.0, + "y": 23644.0 + } + ], + "724": [ + { + "x": 35485.0, + "y": 24144.0 + } + ], + "725": [ + { + "x": 35485.0, + "y": 24644.0 + } + ], + "726": [ + { + "x": 35485.0, + "y": 25144.0 + } + ], + "727": [ + { + "x": 35485.0, + "y": 25885.0 + } + ], + "728": [ + { + "x": 35485.0, + "y": 26669.5 + } + ], + "729": [ + { + "x": 35485.0, + "y": 27454.0 + } + ], + "730": [ + { + "x": 35485.0, + "y": 27954.0 + } + ], + "731": [ + { + "x": 35485.0, + "y": 28454.0 + } + ], + "732": [ + { + "x": 35485.0, + "y": 28954.0 + } + ], + "733": [ + { + "x": 35485.0, + "y": 29695.0 + } + ], + "734": [ + { + "x": 36680.0, + "y": 0.0 + } + ], + "735": [ + { + "x": 36680.0, + "y": 2240.0 + } + ], + "736": [ + { + "x": 36680.0, + "y": 4180.0 + } + ], + "737": [ + { + "x": 36680.0, + "y": 10145.0 + } + ], + "738": [ + { + "x": 36680.0, + "y": 16110.0 + } + ], + "739": [ + { + "x": 36680.0, + "y": 22075.0 + } + ], + "740": [ + { + "x": 36680.0, + "y": 25885.0 + } + ], + "741": [ + { + "x": 36680.0, + "y": 29695.0 + } + ], + "742": [ + { + "x": 37875.0, + "y": 0.0 + } + ], + "743": [ + { + "x": 37875.0, + "y": 1270.0 + } + ], + "744": [ + { + "x": 37875.0, + "y": 2240.0 + } + ], + "745": [ + { + "x": 37875.0, + "y": 3210.0 + } + ], + "746": [ + { + "x": 37875.0, + "y": 4180.0 + } + ], + "747": [ + { + "x": 37875.0, + "y": 4964.5 + } + ], + "748": [ + { + "x": 37875.0, + "y": 5749.0 + } + ], + "749": [ + { + "x": 37875.0, + "y": 6249.0 + } + ], + "750": [ + { + "x": 37875.0, + "y": 6749.0 + } + ], + "751": [ + { + "x": 37875.0, + "y": 7249.0 + } + ], + "752": [ + { + "x": 37875.0, + "y": 7904.0 + } + ], + "753": [ + { + "x": 37875.0, + "y": 8404.0 + } + ], + "754": [ + { + "x": 37875.0, + "y": 8904.0 + } + ], + "755": [ + { + "x": 37875.0, + "y": 9404.0 + } + ], + "756": [ + { + "x": 37875.0, + "y": 10145.0 + } + ], + "757": [ + { + "x": 37875.0, + "y": 10929.5 + } + ], + "758": [ + { + "x": 37875.0, + "y": 11714.0 + } + ], + "759": [ + { + "x": 37875.0, + "y": 12214.0 + } + ], + "760": [ + { + "x": 37875.0, + "y": 12714.0 + } + ], + "761": [ + { + "x": 37875.0, + "y": 13214.0 + } + ], + "762": [ + { + "x": 37875.0, + "y": 13869.0 + } + ], + "763": [ + { + "x": 37875.0, + "y": 14369.0 + } + ], + "764": [ + { + "x": 37875.0, + "y": 14869.0 + } + ], + "765": [ + { + "x": 37875.0, + "y": 15369.0 + } + ], + "766": [ + { + "x": 37875.0, + "y": 16110.0 + } + ], + "767": [ + { + "x": 37875.0, + "y": 16894.5 + } + ], + "768": [ + { + "x": 37875.0, + "y": 17679.0 + } + ], + "769": [ + { + "x": 37875.0, + "y": 18179.0 + } + ], + "770": [ + { + "x": 37875.0, + "y": 18679.0 + } + ], + "771": [ + { + "x": 37875.0, + "y": 19179.0 + } + ], + "772": [ + { + "x": 37875.0, + "y": 19834.0 + } + ], + "773": [ + { + "x": 37875.0, + "y": 20334.0 + } + ], + "774": [ + { + "x": 37875.0, + "y": 20834.0 + } + ], + "775": [ + { + "x": 37875.0, + "y": 21334.0 + } + ], + "776": [ + { + "x": 37875.0, + "y": 22075.0 + } + ], + "777": [ + { + "x": 37875.0, + "y": 22859.5 + } + ], + "778": [ + { + "x": 37875.0, + "y": 23644.0 + } + ], + "779": [ + { + "x": 37875.0, + "y": 24144.0 + } + ], + "780": [ + { + "x": 37875.0, + "y": 24644.0 + } + ], + "781": [ + { + "x": 37875.0, + "y": 25144.0 + } + ], + "782": [ + { + "x": 37875.0, + "y": 25885.0 + } + ], + "783": [ + { + "x": 37875.0, + "y": 26669.5 + } + ], + "784": [ + { + "x": 37875.0, + "y": 27454.0 + } + ], + "785": [ + { + "x": 37875.0, + "y": 27954.0 + } + ], + "786": [ + { + "x": 37875.0, + "y": 28454.0 + } + ], + "787": [ + { + "x": 37875.0, + "y": 28954.0 + } + ], + "788": [ + { + "x": 37875.0, + "y": 29695.0 + } + ], + "789": [ + { + "x": 39070.0, + "y": 0.0 + } + ], + "790": [ + { + "x": 39070.0, + "y": 2240.0 + } + ], + "791": [ + { + "x": 39070.0, + "y": 4180.0 + } + ], + "792": [ + { + "x": 39070.0, + "y": 10145.0 + } + ], + "793": [ + { + "x": 39070.0, + "y": 16110.0 + } + ], + "794": [ + { + "x": 39070.0, + "y": 22075.0 + } + ], + "795": [ + { + "x": 39070.0, + "y": 25885.0 + } + ], + "796": [ + { + "x": 39070.0, + "y": 29695.0 + } + ], + "797": [ + { + "x": 40265.0, + "y": 0.0 + } + ], + "798": [ + { + "x": 40265.0, + "y": 1270.0 + } + ], + "799": [ + { + "x": 40265.0, + "y": 2240.0 + } + ], + "800": [ + { + "x": 40265.0, + "y": 3210.0 + } + ], + "801": [ + { + "x": 40265.0, + "y": 4180.0 + } + ], + "802": [ + { + "x": 40265.0, + "y": 4964.5 + } + ], + "803": [ + { + "x": 40265.0, + "y": 5749.0 + } + ], + "804": [ + { + "x": 40265.0, + "y": 6249.0 + } + ], + "805": [ + { + "x": 40265.0, + "y": 6749.0 + } + ], + "806": [ + { + "x": 40265.0, + "y": 7249.0 + } + ], + "807": [ + { + "x": 40265.0, + "y": 7904.0 + } + ], + "808": [ + { + "x": 40265.0, + "y": 8404.0 + } + ], + "809": [ + { + "x": 40265.0, + "y": 8904.0 + } + ], + "810": [ + { + "x": 40265.0, + "y": 9404.0 + } + ], + "811": [ + { + "x": 40265.0, + "y": 10145.0 + } + ], + "812": [ + { + "x": 40265.0, + "y": 10929.5 + } + ], + "813": [ + { + "x": 40265.0, + "y": 11714.0 + } + ], + "814": [ + { + "x": 40265.0, + "y": 12214.0 + } + ], + "815": [ + { + "x": 40265.0, + "y": 12714.0 + } + ], + "816": [ + { + "x": 40265.0, + "y": 13214.0 + } + ], + "817": [ + { + "x": 40265.0, + "y": 13869.0 + } + ], + "818": [ + { + "x": 40265.0, + "y": 14369.0 + } + ], + "819": [ + { + "x": 40265.0, + "y": 14869.0 + } + ], + "820": [ + { + "x": 40265.0, + "y": 15369.0 + } + ], + "821": [ + { + "x": 40265.0, + "y": 16110.0 + } + ], + "822": [ + { + "x": 40265.0, + "y": 16894.5 + } + ], + "823": [ + { + "x": 40265.0, + "y": 17679.0 + } + ], + "824": [ + { + "x": 40265.0, + "y": 18179.0 + } + ], + "825": [ + { + "x": 40265.0, + "y": 18679.0 + } + ], + "826": [ + { + "x": 40265.0, + "y": 19179.0 + } + ], + "827": [ + { + "x": 40265.0, + "y": 19834.0 + } + ], + "828": [ + { + "x": 40265.0, + "y": 20334.0 + } + ], + "829": [ + { + "x": 40265.0, + "y": 20834.0 + } + ], + "830": [ + { + "x": 40265.0, + "y": 21334.0 + } + ], + "831": [ + { + "x": 40265.0, + "y": 22075.0 + } + ], + "832": [ + { + "x": 40265.0, + "y": 22859.5 + } + ], + "833": [ + { + "x": 40265.0, + "y": 23644.0 + } + ], + "834": [ + { + "x": 40265.0, + "y": 24144.0 + } + ], + "835": [ + { + "x": 40265.0, + "y": 24644.0 + } + ], + "836": [ + { + "x": 40265.0, + "y": 25144.0 + } + ], + "837": [ + { + "x": 40265.0, + "y": 25885.0 + } + ], + "838": [ + { + "x": 40265.0, + "y": 26669.5 + } + ], + "839": [ + { + "x": 40265.0, + "y": 27454.0 + } + ], + "840": [ + { + "x": 40265.0, + "y": 27954.0 + } + ], + "841": [ + { + "x": 40265.0, + "y": 28454.0 + } + ], + "842": [ + { + "x": 40265.0, + "y": 28954.0 + } + ], + "843": [ + { + "x": 40265.0, + "y": 29695.0 + } + ], + "844": [ + { + "x": 41320.0, + "y": 0.0 + } + ], + "845": [ + { + "x": 41320.0, + "y": 2240.0 + } + ], + "846": [ + { + "x": 41320.0, + "y": 4180.0 + } + ], + "847": [ + { + "x": 41320.0, + "y": 10145.0 + } + ], + "848": [ + { + "x": 41320.0, + "y": 16110.0 + } + ], + "849": [ + { + "x": 41320.0, + "y": 22075.0 + } + ], + "850": [ + { + "x": 41320.0, + "y": 25885.0 + } + ], + "851": [ + { + "x": 41320.0, + "y": 29695.0 + } + ], + "852": [ + { + "x": 42375.0, + "y": 0.0 + } + ], + "853": [ + { + "x": 42375.0, + "y": 2240.0 + } + ], + "854": [ + { + "x": 42375.0, + "y": 4180.0 + } + ], + "855": [ + { + "x": 42375.0, + "y": 4980.0 + } + ], + "856": [ + { + "x": 42375.0, + "y": 6085.0 + } + ], + "857": [ + { + "x": 42375.0, + "y": 7162.5 + } + ], + "858": [ + { + "x": 42375.0, + "y": 8240.0 + } + ], + "859": [ + { + "x": 42375.0, + "y": 9345.0 + } + ], + "860": [ + { + "x": 42375.0, + "y": 10145.0 + } + ], + "861": [ + { + "x": 42375.0, + "y": 10945.0 + } + ], + "862": [ + { + "x": 42375.0, + "y": 12050.0 + } + ], + "863": [ + { + "x": 42375.0, + "y": 16110.0 + } + ], + "864": [ + { + "x": 42375.0, + "y": 16910.0 + } + ], + "865": [ + { + "x": 42375.0, + "y": 18015.0 + } + ], + "866": [ + { + "x": 42375.0, + "y": 19092.5 + } + ], + "867": [ + { + "x": 42375.0, + "y": 20170.0 + } + ], + "868": [ + { + "x": 42375.0, + "y": 21275.0 + } + ], + "869": [ + { + "x": 42375.0, + "y": 22075.0 + } + ], + "870": [ + { + "x": 42375.0, + "y": 22875.0 + } + ], + "871": [ + { + "x": 42375.0, + "y": 23980.0 + } + ], + "872": [ + { + "x": 42375.0, + "y": 25085.0 + } + ], + "873": [ + { + "x": 42375.0, + "y": 25885.0 + } + ], + "874": [ + { + "x": 42375.0, + "y": 26685.0 + } + ], + "875": [ + { + "x": 42375.0, + "y": 27790.0 + } + ], + "876": [ + { + "x": 42375.0, + "y": 28895.0 + } + ], + "877": [ + { + "x": 42375.0, + "y": 29695.0 + } + ], + "878": [ + { + "x": 43430.0, + "y": 0.0 + } + ], + "879": [ + { + "x": 43430.0, + "y": 2240.0 + } + ], + "880": [ + { + "x": 43430.0, + "y": 4180.0 + } + ], + "881": [ + { + "x": 43430.0, + "y": 10145.0 + } + ], + "882": [ + { + "x": 43430.0, + "y": 16110.0 + } + ], + "883": [ + { + "x": 43430.0, + "y": 22075.0 + } + ], + "884": [ + { + "x": 43430.0, + "y": 25885.0 + } + ], + "885": [ + { + "x": 43430.0, + "y": 29695.0 + } + ], + "886": [ + { + "x": 44485.0, + "y": 0.0 + } + ], + "887": [ + { + "x": 44485.0, + "y": 1270.0 + } + ], + "888": [ + { + "x": 44485.0, + "y": 2240.0 + } + ], + "889": [ + { + "x": 44485.0, + "y": 3210.0 + } + ], + "890": [ + { + "x": 44485.0, + "y": 4180.0 + } + ], + "891": [ + { + "x": 44485.0, + "y": 4964.5 + } + ], + "892": [ + { + "x": 44485.0, + "y": 5749.0 + } + ], + "893": [ + { + "x": 44485.0, + "y": 6249.0 + } + ], + "894": [ + { + "x": 44485.0, + "y": 6749.0 + } + ], + "895": [ + { + "x": 44485.0, + "y": 7249.0 + } + ], + "896": [ + { + "x": 44485.0, + "y": 7904.0 + } + ], + "897": [ + { + "x": 44485.0, + "y": 8404.0 + } + ], + "898": [ + { + "x": 44485.0, + "y": 8904.0 + } + ], + "899": [ + { + "x": 44485.0, + "y": 9404.0 + } + ], + "900": [ + { + "x": 44485.0, + "y": 10145.0 + } + ], + "901": [ + { + "x": 44485.0, + "y": 10929.5 + } + ], + "902": [ + { + "x": 44485.0, + "y": 11714.0 + } + ], + "903": [ + { + "x": 44485.0, + "y": 12214.0 + } + ], + "904": [ + { + "x": 44485.0, + "y": 12714.0 + } + ], + "905": [ + { + "x": 44485.0, + "y": 13214.0 + } + ], + "906": [ + { + "x": 44485.0, + "y": 13869.0 + } + ], + "907": [ + { + "x": 44485.0, + "y": 14369.0 + } + ], + "908": [ + { + "x": 44485.0, + "y": 14869.0 + } + ], + "909": [ + { + "x": 44485.0, + "y": 15369.0 + } + ], + "910": [ + { + "x": 44485.0, + "y": 16110.0 + } + ], + "911": [ + { + "x": 44485.0, + "y": 16894.5 + } + ], + "912": [ + { + "x": 44485.0, + "y": 17679.0 + } + ], + "913": [ + { + "x": 44485.0, + "y": 18179.0 + } + ], + "914": [ + { + "x": 44485.0, + "y": 18679.0 + } + ], + "915": [ + { + "x": 44485.0, + "y": 19179.0 + } + ], + "916": [ + { + "x": 44485.0, + "y": 19834.0 + } + ], + "917": [ + { + "x": 44485.0, + "y": 20334.0 + } + ], + "918": [ + { + "x": 44485.0, + "y": 20834.0 + } + ], + "919": [ + { + "x": 44485.0, + "y": 21334.0 + } + ], + "920": [ + { + "x": 44485.0, + "y": 22075.0 + } + ], + "921": [ + { + "x": 44485.0, + "y": 22859.5 + } + ], + "922": [ + { + "x": 44485.0, + "y": 23644.0 + } + ], + "923": [ + { + "x": 44485.0, + "y": 24144.0 + } + ], + "924": [ + { + "x": 44485.0, + "y": 24644.0 + } + ], + "925": [ + { + "x": 44485.0, + "y": 25144.0 + } + ], + "926": [ + { + "x": 44485.0, + "y": 25885.0 + } + ], + "927": [ + { + "x": 44485.0, + "y": 26669.5 + } + ], + "928": [ + { + "x": 44485.0, + "y": 27454.0 + } + ], + "929": [ + { + "x": 44485.0, + "y": 27954.0 + } + ], + "930": [ + { + "x": 44485.0, + "y": 28454.0 + } + ], + "931": [ + { + "x": 44485.0, + "y": 28954.0 + } + ], + "932": [ + { + "x": 44485.0, + "y": 29695.0 + } + ], + "933": [ + { + "x": 45680.0, + "y": 2240.0 + } + ], + "934": [ + { + "x": 45680.0, + "y": 4180.0 + } + ], + "935": [ + { + "x": 45680.0, + "y": 10145.0 + } + ], + "936": [ + { + "x": 45680.0, + "y": 16110.0 + } + ], + "937": [ + { + "x": 45680.0, + "y": 22075.0 + } + ], + "938": [ + { + "x": 45680.0, + "y": 25885.0 + } + ], + "939": [ + { + "x": 45680.0, + "y": 29695.0 + } + ], + "941": [ + { + "x": 46875.0, + "y": 300.0 + } + ], + "942": [ + { + "x": 46875.0, + "y": 1270.0 + } + ], + "943": [ + { + "x": 46875.0, + "y": 2240.0 + } + ], + "944": [ + { + "x": 46875.0, + "y": 3210.0 + } + ], + "945": [ + { + "x": 46875.0, + "y": 4180.0 + } + ], + "946": [ + { + "x": 46875.0, + "y": 4964.5 + } + ], + "947": [ + { + "x": 46875.0, + "y": 5749.0 + } + ], + "948": [ + { + "x": 46875.0, + "y": 6249.0 + } + ], + "949": [ + { + "x": 46875.0, + "y": 6749.0 + } + ], + "950": [ + { + "x": 46875.0, + "y": 7249.0 + } + ], + "951": [ + { + "x": 46875.0, + "y": 7904.0 + } + ], + "952": [ + { + "x": 46875.0, + "y": 8404.0 + } + ], + "953": [ + { + "x": 46875.0, + "y": 8904.0 + } + ], + "954": [ + { + "x": 46875.0, + "y": 9404.0 + } + ], + "955": [ + { + "x": 46875.0, + "y": 10145.0 + } + ], + "956": [ + { + "x": 46875.0, + "y": 10929.5 + } + ], + "957": [ + { + "x": 46875.0, + "y": 11714.0 + } + ], + "958": [ + { + "x": 46875.0, + "y": 12214.0 + } + ], + "959": [ + { + "x": 46875.0, + "y": 12714.0 + } + ], + "960": [ + { + "x": 46875.0, + "y": 13214.0 + } + ], + "961": [ + { + "x": 46875.0, + "y": 13869.0 + } + ], + "962": [ + { + "x": 46875.0, + "y": 14369.0 + } + ], + "963": [ + { + "x": 46875.0, + "y": 14869.0 + } + ], + "964": [ + { + "x": 46875.0, + "y": 15369.0 + } + ], + "965": [ + { + "x": 46875.0, + "y": 16110.0 + } + ], + "966": [ + { + "x": 46875.0, + "y": 16894.5 + } + ], + "967": [ + { + "x": 46875.0, + "y": 17679.0 + } + ], + "968": [ + { + "x": 46875.0, + "y": 18179.0 + } + ], + "969": [ + { + "x": 46875.0, + "y": 18679.0 + } + ], + "970": [ + { + "x": 46875.0, + "y": 19179.0 + } + ], + "971": [ + { + "x": 46875.0, + "y": 19834.0 + } + ], + "972": [ + { + "x": 46875.0, + "y": 20334.0 + } + ], + "973": [ + { + "x": 46875.0, + "y": 20834.0 + } + ], + "974": [ + { + "x": 46875.0, + "y": 21334.0 + } + ], + "975": [ + { + "x": 46875.0, + "y": 22075.0 + } + ], + "976": [ + { + "x": 46875.0, + "y": 22859.5 + } + ], + "977": [ + { + "x": 46875.0, + "y": 23644.0 + } + ], + "978": [ + { + "x": 46875.0, + "y": 24144.0 + } + ], + "979": [ + { + "x": 46875.0, + "y": 24644.0 + } + ], + "980": [ + { + "x": 46875.0, + "y": 25144.0 + } + ], + "981": [ + { + "x": 46875.0, + "y": 25885.0 + } + ], + "982": [ + { + "x": 46875.0, + "y": 26669.5 + } + ], + "983": [ + { + "x": 46875.0, + "y": 27454.0 + } + ], + "984": [ + { + "x": 46875.0, + "y": 27954.0 + } + ], + "985": [ + { + "x": 46875.0, + "y": 28454.0 + } + ], + "986": [ + { + "x": 46875.0, + "y": 28954.0 + } + ], + "987": [ + { + "x": 46875.0, + "y": 29695.0 + } + ], + "988": [ + { + "x": 48070.0, + "y": 2240.0 + } + ], + "989": [ + { + "x": 48070.0, + "y": 4180.0 + } + ], + "990": [ + { + "x": 48070.0, + "y": 10145.0 + } + ], + "991": [ + { + "x": 48070.0, + "y": 16110.0 + } + ], + "992": [ + { + "x": 48070.0, + "y": 22075.0 + } + ], + "993": [ + { + "x": 48070.0, + "y": 25885.0 + } + ], + "994": [ + { + "x": 48070.0, + "y": 29695.0 + } + ], + "996": [ + { + "x": 49265.0, + "y": 300.0 + } + ], + "997": [ + { + "x": 49265.0, + "y": 1270.0 + } + ], + "998": [ + { + "x": 49265.0, + "y": 2240.0 + } + ], + "999": [ + { + "x": 49265.0, + "y": 3210.0 + } + ], + "1000": [ + { + "x": 49265.0, + "y": 4180.0 + } + ], + "1001": [ + { + "x": 49265.0, + "y": 4964.5 + } + ], + "1002": [ + { + "x": 49265.0, + "y": 5749.0 + } + ], + "1003": [ + { + "x": 49265.0, + "y": 6249.0 + } + ], + "1004": [ + { + "x": 49265.0, + "y": 6749.0 + } + ], + "1005": [ + { + "x": 49265.0, + "y": 7249.0 + } + ], + "1006": [ + { + "x": 49265.0, + "y": 7904.0 + } + ], + "1007": [ + { + "x": 49265.0, + "y": 8404.0 + } + ], + "1008": [ + { + "x": 49265.0, + "y": 8904.0 + } + ], + "1009": [ + { + "x": 49265.0, + "y": 9404.0 + } + ], + "1010": [ + { + "x": 49265.0, + "y": 10145.0 + } + ], + "1011": [ + { + "x": 49265.0, + "y": 10929.5 + } + ], + "1012": [ + { + "x": 49265.0, + "y": 11714.0 + } + ], + "1013": [ + { + "x": 49265.0, + "y": 12214.0 + } + ], + "1014": [ + { + "x": 49265.0, + "y": 12714.0 + } + ], + "1015": [ + { + "x": 49265.0, + "y": 13214.0 + } + ], + "1016": [ + { + "x": 49265.0, + "y": 13869.0 + } + ], + "1017": [ + { + "x": 49265.0, + "y": 14369.0 + } + ], + "1018": [ + { + "x": 49265.0, + "y": 14869.0 + } + ], + "1019": [ + { + "x": 49265.0, + "y": 15369.0 + } + ], + "1020": [ + { + "x": 49265.0, + "y": 16110.0 + } + ], + "1021": [ + { + "x": 49265.0, + "y": 16894.5 + } + ], + "1022": [ + { + "x": 49265.0, + "y": 17679.0 + } + ], + "1023": [ + { + "x": 49265.0, + "y": 18179.0 + } + ], + "1024": [ + { + "x": 49265.0, + "y": 18679.0 + } + ], + "1025": [ + { + "x": 49265.0, + "y": 19179.0 + } + ], + "1026": [ + { + "x": 49265.0, + "y": 19834.0 + } + ], + "1027": [ + { + "x": 49265.0, + "y": 20334.0 + } + ], + "1028": [ + { + "x": 49265.0, + "y": 20834.0 + } + ], + "1029": [ + { + "x": 49265.0, + "y": 21334.0 + } + ], + "1030": [ + { + "x": 49265.0, + "y": 22075.0 + } + ], + "1031": [ + { + "x": 49265.0, + "y": 22859.5 + } + ], + "1032": [ + { + "x": 49265.0, + "y": 23644.0 + } + ], + "1033": [ + { + "x": 49265.0, + "y": 24144.0 + } + ], + "1034": [ + { + "x": 49265.0, + "y": 24644.0 + } + ], + "1035": [ + { + "x": 49265.0, + "y": 25144.0 + } + ], + "1036": [ + { + "x": 49265.0, + "y": 25885.0 + } + ], + "1037": [ + { + "x": 49265.0, + "y": 26669.5 + } + ], + "1038": [ + { + "x": 49265.0, + "y": 27454.0 + } + ], + "1039": [ + { + "x": 49265.0, + "y": 27954.0 + } + ], + "1040": [ + { + "x": 49265.0, + "y": 28454.0 + } + ], + "1041": [ + { + "x": 49265.0, + "y": 28954.0 + } + ], + "1042": [ + { + "x": 49265.0, + "y": 29695.0 + } + ], + "1043": [ + { + "x": 50320.0, + "y": 2240.0 + } + ], + "1044": [ + { + "x": 50320.0, + "y": 4180.0 + } + ], + "1045": [ + { + "x": 50320.0, + "y": 10145.0 + } + ], + "1046": [ + { + "x": 50320.0, + "y": 16110.0 + } + ], + "1047": [ + { + "x": 50320.0, + "y": 22075.0 + } + ], + "1048": [ + { + "x": 50320.0, + "y": 25885.0 + } + ], + "1049": [ + { + "x": 50320.0, + "y": 29695.0 + } + ], + "1050": [ + { + "x": 51375.0, + "y": 2240.0 + } + ], + "1051": [ + { + "x": 51375.0, + "y": 4180.0 + } + ], + "1052": [ + { + "x": 51375.0, + "y": 4980.0 + } + ], + "1053": [ + { + "x": 51375.0, + "y": 6085.0 + } + ], + "1054": [ + { + "x": 51375.0, + "y": 7162.5 + } + ], + "1055": [ + { + "x": 51375.0, + "y": 8240.0 + } + ], + "1056": [ + { + "x": 51375.0, + "y": 9345.0 + } + ], + "1057": [ + { + "x": 51375.0, + "y": 10145.0 + } + ], + "1058": [ + { + "x": 51375.0, + "y": 10945.0 + } + ], + "1059": [ + { + "x": 51375.0, + "y": 12050.0 + } + ], + "1060": [ + { + "x": 51375.0, + "y": 16110.0 + } + ], + "1061": [ + { + "x": 51375.0, + "y": 16910.0 + } + ], + "1062": [ + { + "x": 51375.0, + "y": 18015.0 + } + ], + "1063": [ + { + "x": 51375.0, + "y": 19092.5 + } + ], + "1064": [ + { + "x": 51375.0, + "y": 20170.0 + } + ], + "1065": [ + { + "x": 51375.0, + "y": 21275.0 + } + ], + "1066": [ + { + "x": 51375.0, + "y": 22075.0 + } + ], + "1067": [ + { + "x": 51375.0, + "y": 22875.0 + } + ], + "1068": [ + { + "x": 51375.0, + "y": 23980.0 + } + ], + "1069": [ + { + "x": 51375.0, + "y": 25085.0 + } + ], + "1070": [ + { + "x": 51375.0, + "y": 25885.0 + } + ], + "1071": [ + { + "x": 51375.0, + "y": 26685.0 + } + ], + "1072": [ + { + "x": 51375.0, + "y": 27790.0 + } + ], + "1073": [ + { + "x": 51375.0, + "y": 28895.0 + } + ], + "1074": [ + { + "x": 51375.0, + "y": 29695.0 + } + ], + "1075": [ + { + "x": 52430.0, + "y": 2240.0 + } + ], + "1076": [ + { + "x": 52430.0, + "y": 4180.0 + } + ], + "1077": [ + { + "x": 52430.0, + "y": 10145.0 + } + ], + "1078": [ + { + "x": 52430.0, + "y": 16110.0 + } + ], + "1079": [ + { + "x": 52430.0, + "y": 22075.0 + } + ], + "1080": [ + { + "x": 52430.0, + "y": 25885.0 + } + ], + "1081": [ + { + "x": 52430.0, + "y": 29695.0 + } + ], + "1082": [ + { + "x": 53485.0, + "y": 0.0 + } + ], + "1083": [ + { + "x": 53485.0, + "y": 1270.0 + } + ], + "1084": [ + { + "x": 53485.0, + "y": 2240.0 + } + ], + "1085": [ + { + "x": 53485.0, + "y": 3210.0 + } + ], + "1086": [ + { + "x": 53485.0, + "y": 4180.0 + } + ], + "1087": [ + { + "x": 53485.0, + "y": 4964.5 + } + ], + "1088": [ + { + "x": 53485.0, + "y": 5749.0 + } + ], + "1089": [ + { + "x": 53485.0, + "y": 6249.0 + } + ], + "1090": [ + { + "x": 53485.0, + "y": 6749.0 + } + ], + "1091": [ + { + "x": 53485.0, + "y": 7249.0 + } + ], + "1092": [ + { + "x": 53485.0, + "y": 7904.0 + } + ], + "1093": [ + { + "x": 53485.0, + "y": 8404.0 + } + ], + "1094": [ + { + "x": 53485.0, + "y": 8904.0 + } + ], + "1095": [ + { + "x": 53485.0, + "y": 9404.0 + } + ], + "1096": [ + { + "x": 53485.0, + "y": 10145.0 + } + ], + "1097": [ + { + "x": 53485.0, + "y": 10929.5 + } + ], + "1098": [ + { + "x": 53485.0, + "y": 11714.0 + } + ], + "1099": [ + { + "x": 53485.0, + "y": 12214.0 + } + ], + "1100": [ + { + "x": 53485.0, + "y": 12714.0 + } + ], + "1101": [ + { + "x": 53485.0, + "y": 13214.0 + } + ], + "1102": [ + { + "x": 53485.0, + "y": 13869.0 + } + ], + "1103": [ + { + "x": 53485.0, + "y": 14369.0 + } + ], + "1104": [ + { + "x": 53485.0, + "y": 14869.0 + } + ], + "1105": [ + { + "x": 53485.0, + "y": 15369.0 + } + ], + "1106": [ + { + "x": 53485.0, + "y": 16110.0 + } + ], + "1107": [ + { + "x": 53485.0, + "y": 16894.5 + } + ], + "1108": [ + { + "x": 53485.0, + "y": 17679.0 + } + ], + "1109": [ + { + "x": 53485.0, + "y": 18179.0 + } + ], + "1110": [ + { + "x": 53485.0, + "y": 18679.0 + } + ], + "1111": [ + { + "x": 53485.0, + "y": 19179.0 + } + ], + "1112": [ + { + "x": 53485.0, + "y": 19834.0 + } + ], + "1113": [ + { + "x": 53485.0, + "y": 20334.0 + } + ], + "1114": [ + { + "x": 53485.0, + "y": 20834.0 + } + ], + "1115": [ + { + "x": 53485.0, + "y": 21334.0 + } + ], + "1116": [ + { + "x": 53485.0, + "y": 22075.0 + } + ], + "1117": [ + { + "x": 53485.0, + "y": 22859.5 + } + ], + "1118": [ + { + "x": 53485.0, + "y": 23644.0 + } + ], + "1119": [ + { + "x": 53485.0, + "y": 24144.0 + } + ], + "1120": [ + { + "x": 53485.0, + "y": 24644.0 + } + ], + "1121": [ + { + "x": 53485.0, + "y": 25144.0 + } + ], + "1122": [ + { + "x": 53485.0, + "y": 25885.0 + } + ], + "1123": [ + { + "x": 53485.0, + "y": 26669.5 + } + ], + "1124": [ + { + "x": 53485.0, + "y": 27454.0 + } + ], + "1125": [ + { + "x": 53485.0, + "y": 27954.0 + } + ], + "1126": [ + { + "x": 53485.0, + "y": 28454.0 + } + ], + "1127": [ + { + "x": 53485.0, + "y": 28954.0 + } + ], + "1128": [ + { + "x": 53485.0, + "y": 29695.0 + } + ], + "1129": [ + { + "x": 54680.0, + "y": 0.0 + } + ], + "1130": [ + { + "x": 54680.0, + "y": 2240.0 + } + ], + "1131": [ + { + "x": 54680.0, + "y": 4180.0 + } + ], + "1132": [ + { + "x": 54680.0, + "y": 10145.0 + } + ], + "1133": [ + { + "x": 54680.0, + "y": 16110.0 + } + ], + "1134": [ + { + "x": 54680.0, + "y": 22075.0 + } + ], + "1135": [ + { + "x": 54680.0, + "y": 25885.0 + } + ], + "1136": [ + { + "x": 54680.0, + "y": 29695.0 + } + ], + "1137": [ + { + "x": 55875.0, + "y": 0.0 + } + ], + "1138": [ + { + "x": 55875.0, + "y": 1270.0 + } + ], + "1139": [ + { + "x": 55875.0, + "y": 2240.0 + } + ], + "1140": [ + { + "x": 55875.0, + "y": 3210.0 + } + ], + "1141": [ + { + "x": 55875.0, + "y": 4180.0 + } + ], + "1142": [ + { + "x": 55875.0, + "y": 4964.5 + } + ], + "1143": [ + { + "x": 55875.0, + "y": 5749.0 + } + ], + "1144": [ + { + "x": 55875.0, + "y": 6249.0 + } + ], + "1145": [ + { + "x": 55875.0, + "y": 6749.0 + } + ], + "1146": [ + { + "x": 55875.0, + "y": 7249.0 + } + ], + "1147": [ + { + "x": 55875.0, + "y": 7904.0 + } + ], + "1148": [ + { + "x": 55875.0, + "y": 8404.0 + } + ], + "1149": [ + { + "x": 55875.0, + "y": 8904.0 + } + ], + "1150": [ + { + "x": 55875.0, + "y": 9404.0 + } + ], + "1151": [ + { + "x": 55875.0, + "y": 10145.0 + } + ], + "1152": [ + { + "x": 55875.0, + "y": 10929.5 + } + ], + "1153": [ + { + "x": 55875.0, + "y": 11714.0 + } + ], + "1154": [ + { + "x": 55875.0, + "y": 12214.0 + } + ], + "1155": [ + { + "x": 55875.0, + "y": 12714.0 + } + ], + "1156": [ + { + "x": 55875.0, + "y": 13214.0 + } + ], + "1157": [ + { + "x": 55875.0, + "y": 13869.0 + } + ], + "1158": [ + { + "x": 55875.0, + "y": 14369.0 + } + ], + "1159": [ + { + "x": 55875.0, + "y": 14869.0 + } + ], + "1160": [ + { + "x": 55875.0, + "y": 15369.0 + } + ], + "1161": [ + { + "x": 55875.0, + "y": 16110.0 + } + ], + "1162": [ + { + "x": 55875.0, + "y": 16894.5 + } + ], + "1163": [ + { + "x": 55875.0, + "y": 17679.0 + } + ], + "1164": [ + { + "x": 55875.0, + "y": 18179.0 + } + ], + "1165": [ + { + "x": 55875.0, + "y": 18679.0 + } + ], + "1166": [ + { + "x": 55875.0, + "y": 19179.0 + } + ], + "1167": [ + { + "x": 55875.0, + "y": 19834.0 + } + ], + "1168": [ + { + "x": 55875.0, + "y": 20334.0 + } + ], + "1169": [ + { + "x": 55875.0, + "y": 20834.0 + } + ], + "1170": [ + { + "x": 55875.0, + "y": 21334.0 + } + ], + "1171": [ + { + "x": 55875.0, + "y": 22075.0 + } + ], + "1172": [ + { + "x": 55875.0, + "y": 22859.5 + } + ], + "1173": [ + { + "x": 55875.0, + "y": 23644.0 + } + ], + "1174": [ + { + "x": 55875.0, + "y": 24144.0 + } + ], + "1175": [ + { + "x": 55875.0, + "y": 24644.0 + } + ], + "1176": [ + { + "x": 55875.0, + "y": 25144.0 + } + ], + "1177": [ + { + "x": 55875.0, + "y": 25885.0 + } + ], + "1178": [ + { + "x": 55875.0, + "y": 26669.5 + } + ], + "1179": [ + { + "x": 55875.0, + "y": 27454.0 + } + ], + "1180": [ + { + "x": 55875.0, + "y": 27954.0 + } + ], + "1181": [ + { + "x": 55875.0, + "y": 28454.0 + } + ], + "1182": [ + { + "x": 55875.0, + "y": 28954.0 + } + ], + "1183": [ + { + "x": 55875.0, + "y": 29695.0 + } + ], + "1184": [ + { + "x": 57070.0, + "y": 0.0 + } + ], + "1185": [ + { + "x": 57070.0, + "y": 2240.0 + } + ], + "1186": [ + { + "x": 57070.0, + "y": 4180.0 + } + ], + "1187": [ + { + "x": 57070.0, + "y": 10145.0 + } + ], + "1188": [ + { + "x": 57070.0, + "y": 16110.0 + } + ], + "1189": [ + { + "x": 57070.0, + "y": 22075.0 + } + ], + "1190": [ + { + "x": 57070.0, + "y": 25885.0 + } + ], + "1191": [ + { + "x": 57070.0, + "y": 29695.0 + } + ], + "1192": [ + { + "x": 58265.0, + "y": 0.0 + } + ], + "1193": [ + { + "x": 58265.0, + "y": 1270.0 + } + ], + "1194": [ + { + "x": 58265.0, + "y": 2240.0 + } + ], + "1195": [ + { + "x": 58265.0, + "y": 3210.0 + } + ], + "1196": [ + { + "x": 58265.0, + "y": 4180.0 + } + ], + "1197": [ + { + "x": 58265.0, + "y": 4964.5 + } + ], + "1198": [ + { + "x": 58265.0, + "y": 5749.0 + } + ], + "1199": [ + { + "x": 58265.0, + "y": 6249.0 + } + ], + "1200": [ + { + "x": 58265.0, + "y": 6749.0 + } + ], + "1201": [ + { + "x": 58265.0, + "y": 7249.0 + } + ], + "1202": [ + { + "x": 58265.0, + "y": 7904.0 + } + ], + "1203": [ + { + "x": 58265.0, + "y": 8404.0 + } + ], + "1204": [ + { + "x": 58265.0, + "y": 8904.0 + } + ], + "1205": [ + { + "x": 58265.0, + "y": 9404.0 + } + ], + "1206": [ + { + "x": 58265.0, + "y": 10145.0 + } + ], + "1207": [ + { + "x": 58265.0, + "y": 10929.5 + } + ], + "1208": [ + { + "x": 58265.0, + "y": 11714.0 + } + ], + "1209": [ + { + "x": 58265.0, + "y": 12214.0 + } + ], + "1210": [ + { + "x": 58265.0, + "y": 12714.0 + } + ], + "1211": [ + { + "x": 58265.0, + "y": 13214.0 + } + ], + "1212": [ + { + "x": 58265.0, + "y": 13869.0 + } + ], + "1213": [ + { + "x": 58265.0, + "y": 14369.0 + } + ], + "1214": [ + { + "x": 58265.0, + "y": 14869.0 + } + ], + "1215": [ + { + "x": 58265.0, + "y": 15369.0 + } + ], + "1216": [ + { + "x": 58265.0, + "y": 16110.0 + } + ], + "1217": [ + { + "x": 58265.0, + "y": 16894.5 + } + ], + "1218": [ + { + "x": 58265.0, + "y": 17679.0 + } + ], + "1219": [ + { + "x": 58265.0, + "y": 18179.0 + } + ], + "1220": [ + { + "x": 58265.0, + "y": 18679.0 + } + ], + "1221": [ + { + "x": 58265.0, + "y": 19179.0 + } + ], + "1222": [ + { + "x": 58265.0, + "y": 19834.0 + } + ], + "1223": [ + { + "x": 58265.0, + "y": 20334.0 + } + ], + "1224": [ + { + "x": 58265.0, + "y": 20834.0 + } + ], + "1225": [ + { + "x": 58265.0, + "y": 21334.0 + } + ], + "1226": [ + { + "x": 58265.0, + "y": 22075.0 + } + ], + "1227": [ + { + "x": 58265.0, + "y": 22859.5 + } + ], + "1228": [ + { + "x": 58265.0, + "y": 23644.0 + } + ], + "1229": [ + { + "x": 58265.0, + "y": 24144.0 + } + ], + "1230": [ + { + "x": 58265.0, + "y": 24644.0 + } + ], + "1231": [ + { + "x": 58265.0, + "y": 25144.0 + } + ], + "1232": [ + { + "x": 58265.0, + "y": 25885.0 + } + ], + "1233": [ + { + "x": 58265.0, + "y": 26669.5 + } + ], + "1234": [ + { + "x": 58265.0, + "y": 27454.0 + } + ], + "1235": [ + { + "x": 58265.0, + "y": 27954.0 + } + ], + "1236": [ + { + "x": 58265.0, + "y": 28454.0 + } + ], + "1237": [ + { + "x": 58265.0, + "y": 28954.0 + } + ], + "1238": [ + { + "x": 58265.0, + "y": 29695.0 + } + ], + "1239": [ + { + "x": 59320.0, + "y": 0.0 + } + ], + "1240": [ + { + "x": 59320.0, + "y": 2240.0 + } + ], + "1241": [ + { + "x": 59320.0, + "y": 4180.0 + } + ], + "1242": [ + { + "x": 59320.0, + "y": 10145.0 + } + ], + "1243": [ + { + "x": 59320.0, + "y": 16110.0 + } + ], + "1244": [ + { + "x": 59320.0, + "y": 22075.0 + } + ], + "1245": [ + { + "x": 59320.0, + "y": 25885.0 + } + ], + "1246": [ + { + "x": 59320.0, + "y": 29695.0 + } + ], + "1247": [ + { + "x": 60375.0, + "y": 0.0 + } + ], + "1248": [ + { + "x": 60375.0, + "y": 2240.0 + } + ], + "1249": [ + { + "x": 60375.0, + "y": 4180.0 + } + ], + "1250": [ + { + "x": 60375.0, + "y": 4980.0 + } + ], + "1251": [ + { + "x": 60375.0, + "y": 6085.0 + } + ], + "1252": [ + { + "x": 60375.0, + "y": 7162.5 + } + ], + "1253": [ + { + "x": 60375.0, + "y": 8240.0 + } + ], + "1254": [ + { + "x": 60375.0, + "y": 9345.0 + } + ], + "1255": [ + { + "x": 60375.0, + "y": 10145.0 + } + ], + "1256": [ + { + "x": 60375.0, + "y": 10945.0 + } + ], + "1257": [ + { + "x": 60375.0, + "y": 12050.0 + } + ], + "1258": [ + { + "x": 60375.0, + "y": 16110.0 + } + ], + "1259": [ + { + "x": 60375.0, + "y": 16910.0 + } + ], + "1260": [ + { + "x": 60375.0, + "y": 18015.0 + } + ], + "1261": [ + { + "x": 60375.0, + "y": 19092.5 + } + ], + "1262": [ + { + "x": 60375.0, + "y": 20170.0 + } + ], + "1263": [ + { + "x": 60375.0, + "y": 21275.0 + } + ], + "1264": [ + { + "x": 60375.0, + "y": 22075.0 + } + ], + "1265": [ + { + "x": 60375.0, + "y": 22875.0 + } + ], + "1266": [ + { + "x": 60375.0, + "y": 23980.0 + } + ], + "1267": [ + { + "x": 60375.0, + "y": 25085.0 + } + ], + "1268": [ + { + "x": 60375.0, + "y": 25885.0 + } + ], + "1269": [ + { + "x": 60375.0, + "y": 26685.0 + } + ], + "1270": [ + { + "x": 60375.0, + "y": 27790.0 + } + ], + "1271": [ + { + "x": 60375.0, + "y": 28895.0 + } + ], + "1272": [ + { + "x": 60375.0, + "y": 29695.0 + } + ], + "1273": [ + { + "x": 61430.0, + "y": 0.0 + } + ], + "1274": [ + { + "x": 61430.0, + "y": 2240.0 + } + ], + "1275": [ + { + "x": 61430.0, + "y": 4180.0 + } + ], + "1276": [ + { + "x": 61430.0, + "y": 10145.0 + } + ], + "1277": [ + { + "x": 61430.0, + "y": 16110.0 + } + ], + "1278": [ + { + "x": 61430.0, + "y": 22075.0 + } + ], + "1279": [ + { + "x": 61430.0, + "y": 25885.0 + } + ], + "1280": [ + { + "x": 61430.0, + "y": 29695.0 + } + ], + "1281": [ + { + "x": 62485.0, + "y": 0.0 + } + ], + "1282": [ + { + "x": 62485.0, + "y": 1270.0 + } + ], + "1283": [ + { + "x": 62485.0, + "y": 2240.0 + } + ], + "1284": [ + { + "x": 62485.0, + "y": 3210.0 + } + ], + "1285": [ + { + "x": 62485.0, + "y": 4180.0 + } + ], + "1286": [ + { + "x": 62485.0, + "y": 4964.5 + } + ], + "1287": [ + { + "x": 62485.0, + "y": 5749.0 + } + ], + "1288": [ + { + "x": 62485.0, + "y": 6249.0 + } + ], + "1289": [ + { + "x": 62485.0, + "y": 6749.0 + } + ], + "1290": [ + { + "x": 62485.0, + "y": 7249.0 + } + ], + "1291": [ + { + "x": 62485.0, + "y": 7904.0 + } + ], + "1292": [ + { + "x": 62485.0, + "y": 8404.0 + } + ], + "1293": [ + { + "x": 62485.0, + "y": 8904.0 + } + ], + "1294": [ + { + "x": 62485.0, + "y": 9404.0 + } + ], + "1295": [ + { + "x": 62485.0, + "y": 10145.0 + } + ], + "1296": [ + { + "x": 62485.0, + "y": 10929.5 + } + ], + "1297": [ + { + "x": 62485.0, + "y": 11714.0 + } + ], + "1298": [ + { + "x": 62485.0, + "y": 12214.0 + } + ], + "1299": [ + { + "x": 62485.0, + "y": 12714.0 + } + ], + "1300": [ + { + "x": 62485.0, + "y": 13214.0 + } + ], + "1301": [ + { + "x": 62485.0, + "y": 13869.0 + } + ], + "1302": [ + { + "x": 62485.0, + "y": 14369.0 + } + ], + "1303": [ + { + "x": 62485.0, + "y": 14869.0 + } + ], + "1304": [ + { + "x": 62485.0, + "y": 15369.0 + } + ], + "1305": [ + { + "x": 62485.0, + "y": 16110.0 + } + ], + "1306": [ + { + "x": 62485.0, + "y": 16894.5 + } + ], + "1307": [ + { + "x": 62485.0, + "y": 17679.0 + } + ], + "1308": [ + { + "x": 62485.0, + "y": 18179.0 + } + ], + "1309": [ + { + "x": 62485.0, + "y": 18679.0 + } + ], + "1310": [ + { + "x": 62485.0, + "y": 19179.0 + } + ], + "1311": [ + { + "x": 62485.0, + "y": 19834.0 + } + ], + "1312": [ + { + "x": 62485.0, + "y": 20334.0 + } + ], + "1313": [ + { + "x": 62485.0, + "y": 20834.0 + } + ], + "1314": [ + { + "x": 62485.0, + "y": 21334.0 + } + ], + "1315": [ + { + "x": 62485.0, + "y": 22075.0 + } + ], + "1316": [ + { + "x": 62485.0, + "y": 22859.5 + } + ], + "1317": [ + { + "x": 62485.0, + "y": 23644.0 + } + ], + "1318": [ + { + "x": 62485.0, + "y": 24144.0 + } + ], + "1319": [ + { + "x": 62485.0, + "y": 24644.0 + } + ], + "1320": [ + { + "x": 62485.0, + "y": 25144.0 + } + ], + "1321": [ + { + "x": 62485.0, + "y": 25885.0 + } + ], + "1322": [ + { + "x": 62485.0, + "y": 26669.5 + } + ], + "1323": [ + { + "x": 62485.0, + "y": 27454.0 + } + ], + "1324": [ + { + "x": 62485.0, + "y": 27954.0 + } + ], + "1325": [ + { + "x": 62485.0, + "y": 28454.0 + } + ], + "1326": [ + { + "x": 62485.0, + "y": 28954.0 + } + ], + "1327": [ + { + "x": 62485.0, + "y": 29695.0 + } + ], + "1328": [ + { + "x": 63680.0, + "y": 2240.0 + } + ], + "1329": [ + { + "x": 63680.0, + "y": 4180.0 + } + ], + "1330": [ + { + "x": 63680.0, + "y": 10145.0 + } + ], + "1331": [ + { + "x": 63680.0, + "y": 16110.0 + } + ], + "1332": [ + { + "x": 63680.0, + "y": 22075.0 + } + ], + "1333": [ + { + "x": 63680.0, + "y": 25885.0 + } + ], + "1334": [ + { + "x": 63680.0, + "y": 29695.0 + } + ], + "1336": [ + { + "x": 64875.0, + "y": 300.0 + } + ], + "1337": [ + { + "x": 64875.0, + "y": 1270.0 + } + ], + "1338": [ + { + "x": 64875.0, + "y": 2240.0 + } + ], + "1339": [ + { + "x": 64875.0, + "y": 3210.0 + } + ], + "1340": [ + { + "x": 64875.0, + "y": 4180.0 + } + ], + "1341": [ + { + "x": 64875.0, + "y": 4964.5 + } + ], + "1342": [ + { + "x": 64875.0, + "y": 5749.0 + } + ], + "1343": [ + { + "x": 64875.0, + "y": 6249.0 + } + ], + "1344": [ + { + "x": 64875.0, + "y": 6749.0 + } + ], + "1345": [ + { + "x": 64875.0, + "y": 7249.0 + } + ], + "1346": [ + { + "x": 64875.0, + "y": 7904.0 + } + ], + "1347": [ + { + "x": 64875.0, + "y": 8404.0 + } + ], + "1348": [ + { + "x": 64875.0, + "y": 8904.0 + } + ], + "1349": [ + { + "x": 64875.0, + "y": 9404.0 + } + ], + "1350": [ + { + "x": 64875.0, + "y": 10145.0 + } + ], + "1351": [ + { + "x": 64875.0, + "y": 10929.5 + } + ], + "1352": [ + { + "x": 64875.0, + "y": 11714.0 + } + ], + "1353": [ + { + "x": 64875.0, + "y": 12214.0 + } + ], + "1354": [ + { + "x": 64875.0, + "y": 12714.0 + } + ], + "1355": [ + { + "x": 64875.0, + "y": 13214.0 + } + ], + "1356": [ + { + "x": 64875.0, + "y": 13869.0 + } + ], + "1357": [ + { + "x": 64875.0, + "y": 14369.0 + } + ], + "1358": [ + { + "x": 64875.0, + "y": 14869.0 + } + ], + "1359": [ + { + "x": 64875.0, + "y": 15369.0 + } + ], + "1360": [ + { + "x": 64875.0, + "y": 16110.0 + } + ], + "1361": [ + { + "x": 64875.0, + "y": 16894.5 + } + ], + "1362": [ + { + "x": 64875.0, + "y": 17679.0 + } + ], + "1363": [ + { + "x": 64875.0, + "y": 18179.0 + } + ], + "1364": [ + { + "x": 64875.0, + "y": 18679.0 + } + ], + "1365": [ + { + "x": 64875.0, + "y": 19179.0 + } + ], + "1366": [ + { + "x": 64875.0, + "y": 19834.0 + } + ], + "1367": [ + { + "x": 64875.0, + "y": 20334.0 + } + ], + "1368": [ + { + "x": 64875.0, + "y": 20834.0 + } + ], + "1369": [ + { + "x": 64875.0, + "y": 21334.0 + } + ], + "1370": [ + { + "x": 64875.0, + "y": 22075.0 + } + ], + "1371": [ + { + "x": 64875.0, + "y": 22859.5 + } + ], + "1372": [ + { + "x": 64875.0, + "y": 23644.0 + } + ], + "1373": [ + { + "x": 64875.0, + "y": 24144.0 + } + ], + "1374": [ + { + "x": 64875.0, + "y": 24644.0 + } + ], + "1375": [ + { + "x": 64875.0, + "y": 25144.0 + } + ], + "1377": [ + { + "x": 64875.0, + "y": 26669.5 + } + ], + "1378": [ + { + "x": 64875.0, + "y": 27454.0 + } + ], + "1379": [ + { + "x": 64875.0, + "y": 27954.0 + } + ], + "1380": [ + { + "x": 64875.0, + "y": 28454.0 + } + ], + "1381": [ + { + "x": 64875.0, + "y": 28954.0 + } + ], + "1382": [ + { + "x": 64875.0, + "y": 29695.0 + } + ], + "1383": [ + { + "x": 66070.0, + "y": 2240.0 + } + ], + "1384": [ + { + "x": 66070.0, + "y": 4180.0 + } + ], + "1385": [ + { + "x": 66070.0, + "y": 10145.0 + } + ], + "1386": [ + { + "x": 66070.0, + "y": 16110.0 + } + ], + "1387": [ + { + "x": 66070.0, + "y": 22075.0 + } + ], + "1388": [ + { + "x": 66070.0, + "y": 25885.0 + } + ], + "1389": [ + { + "x": 66070.0, + "y": 29695.0 + } + ], + "1391": [ + { + "x": 67265.0, + "y": 300.0 + } + ], + "1392": [ + { + "x": 67265.0, + "y": 1270.0 + } + ], + "1393": [ + { + "x": 67265.0, + "y": 2240.0 + } + ], + "1394": [ + { + "x": 67265.0, + "y": 3210.0 + } + ], + "1395": [ + { + "x": 67265.0, + "y": 4180.0 + } + ], + "1396": [ + { + "x": 67265.0, + "y": 4964.5 + } + ], + "1397": [ + { + "x": 67265.0, + "y": 5749.0 + } + ], + "1398": [ + { + "x": 67265.0, + "y": 6249.0 + } + ], + "1399": [ + { + "x": 67265.0, + "y": 6749.0 + } + ], + "1400": [ + { + "x": 67265.0, + "y": 7249.0 + } + ], + "1401": [ + { + "x": 67265.0, + "y": 7904.0 + } + ], + "1402": [ + { + "x": 67265.0, + "y": 8404.0 + } + ], + "1403": [ + { + "x": 67265.0, + "y": 8904.0 + } + ], + "1404": [ + { + "x": 67265.0, + "y": 9404.0 + } + ], + "1405": [ + { + "x": 67265.0, + "y": 10145.0 + } + ], + "1406": [ + { + "x": 67265.0, + "y": 10929.5 + } + ], + "1407": [ + { + "x": 67265.0, + "y": 11714.0 + } + ], + "1408": [ + { + "x": 67265.0, + "y": 12214.0 + } + ], + "1409": [ + { + "x": 67265.0, + "y": 12714.0 + } + ], + "1410": [ + { + "x": 67265.0, + "y": 13214.0 + } + ], + "1411": [ + { + "x": 67265.0, + "y": 13869.0 + } + ], + "1412": [ + { + "x": 67265.0, + "y": 14369.0 + } + ], + "1413": [ + { + "x": 67265.0, + "y": 14869.0 + } + ], + "1414": [ + { + "x": 67265.0, + "y": 15369.0 + } + ], + "1415": [ + { + "x": 67265.0, + "y": 16110.0 + } + ], + "1416": [ + { + "x": 67265.0, + "y": 16894.5 + } + ], + "1417": [ + { + "x": 67265.0, + "y": 17679.0 + } + ], + "1418": [ + { + "x": 67265.0, + "y": 18179.0 + } + ], + "1419": [ + { + "x": 67265.0, + "y": 18679.0 + } + ], + "1420": [ + { + "x": 67265.0, + "y": 19179.0 + } + ], + "1421": [ + { + "x": 67265.0, + "y": 19834.0 + } + ], + "1422": [ + { + "x": 67265.0, + "y": 20334.0 + } + ], + "1423": [ + { + "x": 67265.0, + "y": 20834.0 + } + ], + "1424": [ + { + "x": 67265.0, + "y": 21334.0 + } + ], + "1425": [ + { + "x": 67265.0, + "y": 22075.0 + } + ], + "1426": [ + { + "x": 67265.0, + "y": 22859.5 + } + ], + "1427": [ + { + "x": 67265.0, + "y": 23644.0 + } + ], + "1428": [ + { + "x": 67265.0, + "y": 24144.0 + } + ], + "1429": [ + { + "x": 67265.0, + "y": 24644.0 + } + ], + "1430": [ + { + "x": 67265.0, + "y": 25144.0 + } + ], + "1431": [ + { + "x": 67265.0, + "y": 25885.0 + } + ], + "1432": [ + { + "x": 67265.0, + "y": 26669.5 + } + ], + "1433": [ + { + "x": 67265.0, + "y": 27454.0 + } + ], + "1434": [ + { + "x": 67265.0, + "y": 27954.0 + } + ], + "1435": [ + { + "x": 67265.0, + "y": 28454.0 + } + ], + "1436": [ + { + "x": 67265.0, + "y": 28954.0 + } + ], + "1437": [ + { + "x": 67265.0, + "y": 29695.0 + } + ], + "1438": [ + { + "x": 68191.25, + "y": 2240.0 + } + ], + "1439": [ + { + "x": 68191.25, + "y": 4180.0 + } + ], + "1440": [ + { + "x": 68191.25, + "y": 10145.0 + } + ], + "1441": [ + { + "x": 68191.25, + "y": 16110.0 + } + ], + "1442": [ + { + "x": 68191.25, + "y": 22075.0 + } + ], + "1443": [ + { + "x": 69117.5, + "y": 2240.0 + } + ], + "1444": [ + { + "x": 69117.5, + "y": 4180.0 + } + ], + "1445": [ + { + "x": 69117.5, + "y": 4980.0 + } + ], + "1446": [ + { + "x": 69117.5, + "y": 6085.0 + } + ], + "1447": [ + { + "x": 69117.5, + "y": 7162.5 + } + ], + "1448": [ + { + "x": 69117.5, + "y": 8240.0 + } + ], + "1449": [ + { + "x": 69117.5, + "y": 9345.0 + } + ], + "1450": [ + { + "x": 69117.5, + "y": 10145.0 + } + ], + "1451": [ + { + "x": 69117.5, + "y": 10945.0 + } + ], + "1452": [ + { + "x": 69117.5, + "y": 12050.0 + } + ], + "1453": [ + { + "x": 69117.5, + "y": 16110.0 + } + ], + "1454": [ + { + "x": 69117.5, + "y": 16910.0 + } + ], + "1455": [ + { + "x": 69117.5, + "y": 18015.0 + } + ], + "1456": [ + { + "x": 69117.5, + "y": 19092.5 + } + ], + "1457": [ + { + "x": 69117.5, + "y": 20170.0 + } + ], + "1458": [ + { + "x": 69117.5, + "y": 21275.0 + } + ], + "1459": [ + { + "x": 69117.5, + "y": 22075.0 + } + ], + "1460": [ + { + "x": 70043.75, + "y": 2240.0 + } + ], + "1461": [ + { + "x": 70043.75, + "y": 4180.0 + } + ], + "1462": [ + { + "x": 70043.75, + "y": 10145.0 + } + ], + "1463": [ + { + "x": 70043.75, + "y": 16110.0 + } + ], + "1464": [ + { + "x": 70043.75, + "y": 22075.0 + } + ], + "1465": [ + { + "x": 70970.0, + "y": 300.0 + } + ], + "1466": [ + { + "x": 70970.0, + "y": 1270.0 + } + ], + "1467": [ + { + "x": 70970.0, + "y": 2240.0 + } + ], + "1468": [ + { + "x": 70970.0, + "y": 3210.0 + } + ], + "1469": [ + { + "x": 70970.0, + "y": 4180.0 + } + ], + "1470": [ + { + "x": 70970.0, + "y": 4964.5 + } + ], + "1471": [ + { + "x": 70970.0, + "y": 5749.0 + } + ], + "1472": [ + { + "x": 70970.0, + "y": 6249.0 + } + ], + "1473": [ + { + "x": 70970.0, + "y": 6749.0 + } + ], + "1474": [ + { + "x": 70970.0, + "y": 7249.0 + } + ], + "1475": [ + { + "x": 70970.0, + "y": 7904.0 + } + ], + "1476": [ + { + "x": 70970.0, + "y": 8404.0 + } + ], + "1477": [ + { + "x": 70970.0, + "y": 8904.0 + } + ], + "1478": [ + { + "x": 70970.0, + "y": 9404.0 + } + ], + "1479": [ + { + "x": 70970.0, + "y": 10145.0 + } + ], + "1480": [ + { + "x": 70970.0, + "y": 10929.5 + } + ], + "1481": [ + { + "x": 70970.0, + "y": 11714.0 + } + ], + "1482": [ + { + "x": 70970.0, + "y": 12214.0 + } + ], + "1483": [ + { + "x": 70970.0, + "y": 12714.0 + } + ], + "1484": [ + { + "x": 70970.0, + "y": 13214.0 + } + ], + "1485": [ + { + "x": 70970.0, + "y": 13869.0 + } + ], + "1486": [ + { + "x": 70970.0, + "y": 14369.0 + } + ], + "1487": [ + { + "x": 70970.0, + "y": 14869.0 + } + ], + "1488": [ + { + "x": 70970.0, + "y": 15369.0 + } + ], + "1489": [ + { + "x": 70970.0, + "y": 16110.0 + } + ], + "1490": [ + { + "x": 70970.0, + "y": 16894.5 + } + ], + "1491": [ + { + "x": 70970.0, + "y": 17679.0 + } + ], + "1492": [ + { + "x": 70970.0, + "y": 18179.0 + } + ], + "1493": [ + { + "x": 70970.0, + "y": 18679.0 + } + ], + "1494": [ + { + "x": 70970.0, + "y": 19179.0 + } + ], + "1495": [ + { + "x": 70970.0, + "y": 19834.0 + } + ], + "1496": [ + { + "x": 70970.0, + "y": 20334.0 + } + ], + "1497": [ + { + "x": 70970.0, + "y": 20834.0 + } + ], + "1498": [ + { + "x": 70970.0, + "y": 21334.0 + } + ], + "1499": [ + { + "x": 70970.0, + "y": 22075.0 + } + ], + "1501": [ + { + "x": 72165.0, + "y": 2240.0 + } + ], + "1502": [ + { + "x": 72165.0, + "y": 4180.0 + } + ], + "1503": [ + { + "x": 72165.0, + "y": 10145.0 + } + ], + "1504": [ + { + "x": 72165.0, + "y": 16110.0 + } + ], + "1505": [ + { + "x": 72165.0, + "y": 22075.0 + } + ], + "1506": [ + { + "x": 73360.0, + "y": 0.0 + } + ], + "1507": [ + { + "x": 73360.0, + "y": 1270.0 + } + ], + "1508": [ + { + "x": 73360.0, + "y": 2240.0 + } + ], + "1509": [ + { + "x": 73360.0, + "y": 3210.0 + } + ], + "1510": [ + { + "x": 73360.0, + "y": 4180.0 + } + ], + "1511": [ + { + "x": 73360.0, + "y": 4964.5 + } + ], + "1512": [ + { + "x": 73360.0, + "y": 5749.0 + } + ], + "1513": [ + { + "x": 73360.0, + "y": 6249.0 + } + ], + "1514": [ + { + "x": 73360.0, + "y": 6749.0 + } + ], + "1515": [ + { + "x": 73360.0, + "y": 7249.0 + } + ], + "1516": [ + { + "x": 73360.0, + "y": 7904.0 + } + ], + "1517": [ + { + "x": 73360.0, + "y": 8404.0 + } + ], + "1518": [ + { + "x": 73360.0, + "y": 8904.0 + } + ], + "1519": [ + { + "x": 73360.0, + "y": 9404.0 + } + ], + "1520": [ + { + "x": 73360.0, + "y": 10145.0 + } + ], + "1521": [ + { + "x": 73360.0, + "y": 10929.5 + } + ], + "1522": [ + { + "x": 73360.0, + "y": 11714.0 + } + ], + "1523": [ + { + "x": 73360.0, + "y": 12214.0 + } + ], + "1524": [ + { + "x": 73360.0, + "y": 12714.0 + } + ], + "1525": [ + { + "x": 73360.0, + "y": 13214.0 + } + ], + "1526": [ + { + "x": 73360.0, + "y": 13869.0 + } + ], + "1527": [ + { + "x": 73360.0, + "y": 14369.0 + } + ], + "1528": [ + { + "x": 73360.0, + "y": 14869.0 + } + ], + "1529": [ + { + "x": 73360.0, + "y": 15369.0 + } + ], + "1530": [ + { + "x": 73360.0, + "y": 16110.0 + } + ], + "1531": [ + { + "x": 73360.0, + "y": 16894.5 + } + ], + "1532": [ + { + "x": 73360.0, + "y": 17679.0 + } + ], + "1533": [ + { + "x": 73360.0, + "y": 18179.0 + } + ], + "1534": [ + { + "x": 73360.0, + "y": 18679.0 + } + ], + "1535": [ + { + "x": 73360.0, + "y": 19179.0 + } + ], + "1536": [ + { + "x": 73360.0, + "y": 19834.0 + } + ], + "1537": [ + { + "x": 73360.0, + "y": 20334.0 + } + ], + "1538": [ + { + "x": 73360.0, + "y": 20834.0 + } + ], + "1539": [ + { + "x": 73360.0, + "y": 21334.0 + } + ], + "1540": [ + { + "x": 73360.0, + "y": 22075.0 + } + ], + "1541": [ + { + "x": 74555.0, + "y": 0.0 + } + ], + "1542": [ + { + "x": 74555.0, + "y": 2240.0 + } + ], + "1543": [ + { + "x": 74555.0, + "y": 4180.0 + } + ], + "1544": [ + { + "x": 74555.0, + "y": 10145.0 + } + ], + "1545": [ + { + "x": 74555.0, + "y": 16110.0 + } + ], + "1546": [ + { + "x": 74555.0, + "y": 22075.0 + } + ], + "1547": [ + { + "x": 75750.0, + "y": 0.0 + } + ], + "1548": [ + { + "x": 75750.0, + "y": 1270.0 + } + ], + "1549": [ + { + "x": 75750.0, + "y": 2240.0 + } + ], + "1550": [ + { + "x": 75750.0, + "y": 3210.0 + } + ], + "1551": [ + { + "x": 75750.0, + "y": 4180.0 + } + ], + "1552": [ + { + "x": 75750.0, + "y": 4964.5 + } + ], + "1553": [ + { + "x": 75750.0, + "y": 5749.0 + } + ], + "1554": [ + { + "x": 75750.0, + "y": 6249.0 + } + ], + "1555": [ + { + "x": 75750.0, + "y": 6749.0 + } + ], + "1556": [ + { + "x": 75750.0, + "y": 7249.0 + } + ], + "1557": [ + { + "x": 75750.0, + "y": 7904.0 + } + ], + "1558": [ + { + "x": 75750.0, + "y": 8404.0 + } + ], + "1559": [ + { + "x": 75750.0, + "y": 8904.0 + } + ], + "1560": [ + { + "x": 75750.0, + "y": 9404.0 + } + ], + "1561": [ + { + "x": 75750.0, + "y": 10145.0 + } + ], + "1562": [ + { + "x": 75750.0, + "y": 10929.5 + } + ], + "1563": [ + { + "x": 75750.0, + "y": 11714.0 + } + ], + "1564": [ + { + "x": 75750.0, + "y": 12214.0 + } + ], + "1565": [ + { + "x": 75750.0, + "y": 12714.0 + } + ], + "1566": [ + { + "x": 75750.0, + "y": 13214.0 + } + ], + "1567": [ + { + "x": 75750.0, + "y": 13869.0 + } + ], + "1568": [ + { + "x": 75750.0, + "y": 14369.0 + } + ], + "1569": [ + { + "x": 75750.0, + "y": 14869.0 + } + ], + "1570": [ + { + "x": 75750.0, + "y": 15369.0 + } + ], + "1571": [ + { + "x": 75750.0, + "y": 16110.0 + } + ], + "1572": [ + { + "x": 75750.0, + "y": 16894.5 + } + ], + "1573": [ + { + "x": 75750.0, + "y": 17679.0 + } + ], + "1574": [ + { + "x": 75750.0, + "y": 18179.0 + } + ], + "1575": [ + { + "x": 75750.0, + "y": 18679.0 + } + ], + "1576": [ + { + "x": 75750.0, + "y": 19179.0 + } + ], + "1577": [ + { + "x": 75750.0, + "y": 19834.0 + } + ], + "1578": [ + { + "x": 75750.0, + "y": 20334.0 + } + ], + "1579": [ + { + "x": 75750.0, + "y": 20834.0 + } + ], + "1580": [ + { + "x": 75750.0, + "y": 21334.0 + } + ], + "1581": [ + { + "x": 75750.0, + "y": 22075.0 + } + ], + "1582": [ + { + "x": 76805.0, + "y": 0.0 + } + ], + "1583": [ + { + "x": 76805.0, + "y": 2240.0 + } + ], + "1584": [ + { + "x": 76805.0, + "y": 4180.0 + } + ], + "1585": [ + { + "x": 76805.0, + "y": 10145.0 + } + ], + "1586": [ + { + "x": 76805.0, + "y": 16110.0 + } + ], + "1587": [ + { + "x": 76805.0, + "y": 22075.0 + } + ], + "1588": [ + { + "x": 77860.0, + "y": 0.0 + } + ], + "1589": [ + { + "x": 77860.0, + "y": 2240.0 + } + ], + "1590": [ + { + "x": 77860.0, + "y": 4180.0 + } + ], + "1591": [ + { + "x": 77860.0, + "y": 4980.0 + } + ], + "1592": [ + { + "x": 77860.0, + "y": 6085.0 + } + ], + "1593": [ + { + "x": 77860.0, + "y": 7162.5 + } + ], + "1594": [ + { + "x": 77860.0, + "y": 8240.0 + } + ], + "1595": [ + { + "x": 77860.0, + "y": 9345.0 + } + ], + "1596": [ + { + "x": 77860.0, + "y": 10145.0 + } + ], + "1597": [ + { + "x": 77860.0, + "y": 10945.0 + } + ], + "1598": [ + { + "x": 77860.0, + "y": 12050.0 + } + ], + "1599": [ + { + "x": 77860.0, + "y": 16110.0 + } + ], + "1600": [ + { + "x": 77860.0, + "y": 16910.0 + } + ], + "1601": [ + { + "x": 77860.0, + "y": 18015.0 + } + ], + "1602": [ + { + "x": 77860.0, + "y": 19092.5 + } + ], + "1603": [ + { + "x": 77860.0, + "y": 20170.0 + } + ], + "1604": [ + { + "x": 77860.0, + "y": 21275.0 + } + ], + "1605": [ + { + "x": 77860.0, + "y": 22075.0 + } + ], + "1606": [ + { + "x": 78915.0, + "y": 0.0 + } + ], + "1607": [ + { + "x": 78915.0, + "y": 2240.0 + } + ], + "1608": [ + { + "x": 78915.0, + "y": 4180.0 + } + ], + "1609": [ + { + "x": 78915.0, + "y": 10145.0 + } + ], + "1610": [ + { + "x": 78915.0, + "y": 16110.0 + } + ], + "1611": [ + { + "x": 78915.0, + "y": 22075.0 + } + ], + "1612": [ + { + "x": 79970.0, + "y": 0.0 + } + ], + "1613": [ + { + "x": 79970.0, + "y": 1270.0 + } + ], + "1614": [ + { + "x": 79970.0, + "y": 2240.0 + } + ], + "1615": [ + { + "x": 79970.0, + "y": 3210.0 + } + ], + "1616": [ + { + "x": 79970.0, + "y": 4180.0 + } + ], + "1617": [ + { + "x": 79970.0, + "y": 4964.5 + } + ], + "1618": [ + { + "x": 79970.0, + "y": 5749.0 + } + ], + "1619": [ + { + "x": 79970.0, + "y": 6249.0 + } + ], + "1620": [ + { + "x": 79970.0, + "y": 6749.0 + } + ], + "1621": [ + { + "x": 79970.0, + "y": 7249.0 + } + ], + "1622": [ + { + "x": 79970.0, + "y": 7904.0 + } + ], + "1623": [ + { + "x": 79970.0, + "y": 8404.0 + } + ], + "1624": [ + { + "x": 79970.0, + "y": 8904.0 + } + ], + "1625": [ + { + "x": 79970.0, + "y": 9404.0 + } + ], + "1626": [ + { + "x": 79970.0, + "y": 10145.0 + } + ], + "1627": [ + { + "x": 79970.0, + "y": 10929.5 + } + ], + "1628": [ + { + "x": 79970.0, + "y": 11714.0 + } + ], + "1629": [ + { + "x": 79970.0, + "y": 12214.0 + } + ], + "1630": [ + { + "x": 79970.0, + "y": 12714.0 + } + ], + "1631": [ + { + "x": 79970.0, + "y": 13214.0 + } + ], + "1632": [ + { + "x": 79970.0, + "y": 13869.0 + } + ], + "1633": [ + { + "x": 79970.0, + "y": 14369.0 + } + ], + "1634": [ + { + "x": 79970.0, + "y": 14869.0 + } + ], + "1635": [ + { + "x": 79970.0, + "y": 15369.0 + } + ], + "1636": [ + { + "x": 79970.0, + "y": 16110.0 + } + ], + "1637": [ + { + "x": 79970.0, + "y": 16894.5 + } + ], + "1638": [ + { + "x": 79970.0, + "y": 17679.0 + } + ], + "1639": [ + { + "x": 79970.0, + "y": 18179.0 + } + ], + "1640": [ + { + "x": 79970.0, + "y": 18679.0 + } + ], + "1641": [ + { + "x": 79970.0, + "y": 19179.0 + } + ], + "1642": [ + { + "x": 79970.0, + "y": 19834.0 + } + ], + "1643": [ + { + "x": 79970.0, + "y": 20334.0 + } + ], + "1644": [ + { + "x": 79970.0, + "y": 20834.0 + } + ], + "1645": [ + { + "x": 79970.0, + "y": 21334.0 + } + ], + "1646": [ + { + "x": 79970.0, + "y": 22075.0 + } + ], + "1647": [ + { + "x": 81165.0, + "y": 2240.0 + } + ], + "1648": [ + { + "x": 81165.0, + "y": 4180.0 + } + ], + "1649": [ + { + "x": 81165.0, + "y": 10145.0 + } + ], + "1653": [ + { + "x": 82360.0, + "y": 300.0 + } + ], + "1654": [ + { + "x": 82360.0, + "y": 1270.0 + } + ], + "1655": [ + { + "x": 82360.0, + "y": 2240.0 + } + ], + "1656": [ + { + "x": 82360.0, + "y": 3210.0 + } + ], + "1657": [ + { + "x": 82360.0, + "y": 4180.0 + } + ], + "1658": [ + { + "x": 82360.0, + "y": 4964.5 + } + ], + "1659": [ + { + "x": 82360.0, + "y": 5749.0 + } + ], + "1660": [ + { + "x": 82360.0, + "y": 6249.0 + } + ], + "1661": [ + { + "x": 82360.0, + "y": 6749.0 + } + ], + "1662": [ + { + "x": 82360.0, + "y": 7249.0 + } + ], + "1663": [ + { + "x": 82360.0, + "y": 7904.0 + } + ], + "1664": [ + { + "x": 82360.0, + "y": 8404.0 + } + ], + "1665": [ + { + "x": 82360.0, + "y": 8904.0 + } + ], + "1666": [ + { + "x": 82360.0, + "y": 9404.0 + } + ], + "1667": [ + { + "x": 82360.0, + "y": 10145.0 + } + ], + "1708": [ + { + "x": 15632.5, + "y": 300.0 + } + ], + "1709": [ + { + "x": 15632.5, + "y": 1270.0 + } + ], + "1714": [ + { + "x": 51375.0, + "y": 1270.0 + } + ], + "1713": [ + { + "x": 51375.0, + "y": 300.0 + } + ], + "1717": [ + { + "x": 69117.5, + "y": 1270.0 + } + ], + "1716": [ + { + "x": 69117.5, + "y": 300.0 + } + ], + "1718": [ + { + "x": 15632.5, + "y": 3210.0 + } + ], + "1712": [ + { + "x": 33375.0, + "y": 1270.0 + } + ], + "1711": [ + { + "x": 33375.0, + "y": 300.0 + } + ], + "1719": [ + { + "x": 33375.0, + "y": 3210.0 + } + ], + "1720": [ + { + "x": 51375.0, + "y": 3210.0 + } + ], + "1800": [ + { + "x": 69117.5, + "y": 3210.0 + } + ], + "1850": [ + { + "x": 83555.0, + "y": 10145.0 + } + ], + "1851": [ + { + "x": 84750.0, + "y": 10145.0 + } + ] + } +} \ No newline at end of file diff --git a/algo-zkd/src/main/java/com/algo/config/BaseDataConfig.java b/algo-zkd/src/main/java/com/algo/config/BaseDataConfig.java index 24e04a6..eb3971a 100644 --- a/algo-zkd/src/main/java/com/algo/config/BaseDataConfig.java +++ b/algo-zkd/src/main/java/com/algo/config/BaseDataConfig.java @@ -1,4 +1,4 @@ -//package com.algo.config; +package com.algo.config;//package com.algo.config; // //import com.algo.expose.BaseDataService; //import com.algo.expose.impl.BaseDataServiceImpl; diff --git a/algo-zkd/src/main/java/com/algo/model/CTUPhysicalConfig.java b/algo-zkd/src/main/java/com/algo/model/CTUPhysicalConfig.java index a63d923..d201612 100644 --- a/algo-zkd/src/main/java/com/algo/model/CTUPhysicalConfig.java +++ b/algo-zkd/src/main/java/com/algo/model/CTUPhysicalConfig.java @@ -71,16 +71,16 @@ */ private double standardPointDistance; - // 榛樿鏋勯�犲嚱鏁� - 浣跨敤鎺ㄨ崘鐨勯粯璁ゅ�� + // 榛樿鏋勯�犲嚱鏁� - 浣跨敤鍩轰簬瀹為檯鍦哄湴鐨勭墿鐞嗗弬鏁� public CTUPhysicalConfig() { - this.maxSpeed = 2.0; // 2绫�/绉� - this.normalSpeed = 1.5; // 1.5绫�/绉� - this.maxAcceleration = 1.0; // 1绫�/绉捖� - this.maxDeceleration = 1.5; // 1.5绫�/绉捖� - this.turnTime90 = 2.0; // 90搴﹁浆鍚戦渶瑕�2绉� - this.turnTime180 = 4.0; // 180搴﹁浆鍚戦渶瑕�4绉� + this.maxSpeed = 1.0; // 1000mm/s = 1.0绫�/绉� + this.normalSpeed = 1.0; // 姝e父杩愯閫熷害100%鏈�澶ч�熷害 + this.maxAcceleration = 0.4; // 400 mm/s^2 = 0.4绫�/绉捖� + this.maxDeceleration = 0.4; // 鐩稿悓鐨勫姞鍑忛�熷害 + this.turnTime90 = 4.0; // 姣�90搴﹁浆鍚戦渶瑕�4绉� + this.turnTime180 = 8.0; // 180搴﹁浆鍚戦渶瑕�8绉� this.minSafetyDistance = 3.0; // 鏈�灏忓畨鍏ㄨ窛绂�3绫� - this.minFollowingDistance = 2.0; // 鏈�灏忚窡闅忚窛绂�2绫� + this.minFollowingDistance = 3.0; // 鏈�灏忚窡闅忚窛绂�3绫� this.ctuLength = 1.5; // CTU闀垮害1.5绫� this.ctuWidth = 1.0; // CTU瀹藉害1绫� this.startupTime = 1.0; // 鍚姩鏃堕棿1绉� @@ -301,6 +301,151 @@ return distance >= minDistance; } + /** + * 璁$畻绮剧‘鐨勭Щ鍔ㄦ椂闂达紝鑰冭檻鍔犻�熷害銆佸噺閫熷害鍜屽疄闄呰窛绂� + * + * @param distance 瀹為檯绉诲姩璺濈锛堢背锛� + * @param startSpeed 璧峰閫熷害锛堢背/绉掞級 + * @param endSpeed 缁撴潫閫熷害锛堢背/绉掞級 + * @param targetSpeed 鐩爣宸¤埅閫熷害锛堢背/绉掞級 + * @return 绉诲姩鏃堕棿锛堢锛� + */ + public double calculatePreciseMovementTime(double distance, double startSpeed, double endSpeed, double targetSpeed) { + if (distance <= 0) return 0.0; + + // 濡傛灉璺濈寰堢煭锛岀洿鎺ヨ绠楀钩鍧囬�熷害 + if (distance < 0.5) { // 灏忎簬0.5绫� + double avgSpeed = Math.max(0.1, (startSpeed + endSpeed) / 2.0); + return distance / avgSpeed; + } + + double totalTime = 0.0; + double currentSpeed = startSpeed; + double remainingDistance = distance; + + // 闃舵1: 鍔犻�熷埌鐩爣閫熷害 + if (currentSpeed < targetSpeed) { + double accelerationTime = (targetSpeed - currentSpeed) / maxAcceleration; + double accelerationDistance = currentSpeed * accelerationTime + 0.5 * maxAcceleration * accelerationTime * accelerationTime; + + if (accelerationDistance < remainingDistance) { + totalTime += accelerationTime; + remainingDistance -= accelerationDistance; + currentSpeed = targetSpeed; + } else { + // 璺濈涓嶈冻浠ュ畬鍏ㄥ姞閫燂紝鐩存帴璁$畻 + return calculateTimeForShortDistance(distance, startSpeed, endSpeed); + } + } + + // 闃舵2: 鍑忛�熷埌鐩爣缁撴潫閫熷害 + double decelerationDistance = 0.0; + double decelerationTime = 0.0; + if (currentSpeed > endSpeed) { + decelerationTime = (currentSpeed - endSpeed) / maxDeceleration; + decelerationDistance = endSpeed * decelerationTime + 0.5 * maxDeceleration * decelerationTime * decelerationTime; + } + + // 闃舵3: 鍖�閫熷贰鑸� + if (remainingDistance > decelerationDistance) { + double cruisingDistance = remainingDistance - decelerationDistance; + double cruisingTime = cruisingDistance / currentSpeed; + totalTime += cruisingTime; + } + + // 娣诲姞鍑忛�熸椂闂� + totalTime += decelerationTime; + + return totalTime; + } + + /** + * 璁$畻鐭窛绂荤Щ鍔ㄦ椂闂达紙鏃犳硶瀹屾暣鍔犻�熷噺閫熺殑鎯呭喌锛� + */ + private double calculateTimeForShortDistance(double distance, double startSpeed, double endSpeed) { + // 浣跨敤杩愬姩瀛﹀叕寮�: s = v0*t + 0.5*a*t^2 + // 鍏朵腑 v_f = v0 + a*t锛屾眰瑙� t + double avgAcceleration = (endSpeed > startSpeed) ? maxAcceleration : -maxDeceleration; + + // 濡傛灉鍔犻�熷害寰堝皬鎴栦负0锛屼娇鐢ㄥ钩鍧囬�熷害 + if (Math.abs(avgAcceleration) < 0.01) { + return distance / Math.max(0.1, (startSpeed + endSpeed) / 2.0); + } + + // 姹傝В浜屾鏂圭▼: 0.5*a*t^2 + v0*t - s = 0 + double a = 0.5 * avgAcceleration; + double b = startSpeed; + double c = -distance; + + double discriminant = b * b - 4 * a * c; + if (discriminant < 0) { + // 鏃犺В锛屼娇鐢ㄥ钩鍧囬�熷害 + return distance / Math.max(0.1, (startSpeed + endSpeed) / 2.0); + } + + double t1 = (-b + Math.sqrt(discriminant)) / (2 * a); + double t2 = (-b - Math.sqrt(discriminant)) / (2 * a); + + // 閫夋嫨姝g殑鏃堕棿鍊� + double time = (t1 > 0) ? t1 : t2; + return Math.max(0.1, time); // 纭繚鏃堕棿涓烘 + } + + /** + * 鍩轰簬瀹為檯鍧愭爣璁$畻涓ょ偣闂寸殑绮剧‘璺濈锛堢背锛� + * + * @param coord1 璧风偣鍧愭爣 [x_mm, y_mm] + * @param coord2 缁堢偣鍧愭爣 [x_mm, y_mm] + * @return 璺濈锛堢背锛� + */ + public static double calculateRealDistance(double[] coord1, double[] coord2) { + if (coord1 == null || coord2 == null || coord1.length < 2 || coord2.length < 2) { + return 0.0; + } + + // 鍧愭爣鍗曚綅涓烘绫筹紝杞崲涓虹背 + double dx = (coord2[0] - coord1[0]) / 1000.0; + double dy = (coord2[1] - coord1[1]) / 1000.0; + + return Math.sqrt(dx * dx + dy * dy); + } + + /** + * 璁$畻鏂瑰悜鏀瑰彉瑙掑害 + * + * @param coord1 璧风偣鍧愭爣 + * @param coord2 涓棿鐐瑰潗鏍� + * @param coord3 缁堢偣鍧愭爣 + * @return 杞悜瑙掑害锛堝害锛� + */ + public static double calculateTurnAngle(double[] coord1, double[] coord2, double[] coord3) { + if (coord1 == null || coord2 == null || coord3 == null) { + return 0.0; + } + + // 璁$畻涓や釜鍚戦噺 + double[] vec1 = {coord2[0] - coord1[0], coord2[1] - coord1[1]}; + double[] vec2 = {coord3[0] - coord2[0], coord3[1] - coord2[1]}; + + // 璁$畻鍚戦噺闀垮害 + double len1 = Math.sqrt(vec1[0] * vec1[0] + vec1[1] * vec1[1]); + double len2 = Math.sqrt(vec2[0] * vec2[0] + vec2[1] * vec2[1]); + + if (len1 < 1e-6 || len2 < 1e-6) { + return 0.0; + } + + // 璁$畻澶硅 + double dot = vec1[0] * vec2[0] + vec1[1] * vec2[1]; + double cosAngle = dot / (len1 * len2); + + // 闄愬埗cosAngle鍦╗-1, 1]鑼冨洿鍐� + cosAngle = Math.max(-1.0, Math.min(1.0, cosAngle)); + + double angle = Math.acos(cosAngle); + return Math.toDegrees(angle); + } + @Override public String toString() { return "CTUPhysicalConfig{" + diff --git a/algo-zkd/src/main/java/com/algo/model/PathCode.java b/algo-zkd/src/main/java/com/algo/model/PathCode.java index 27716dd..72a7c10 100644 --- a/algo-zkd/src/main/java/com/algo/model/PathCode.java +++ b/algo-zkd/src/main/java/com/algo/model/PathCode.java @@ -1,6 +1,5 @@ package com.algo.model; -import com.fasterxml.jackson.annotation.JsonProperty; /** * 璺緞浠g爜妯″瀷 @@ -41,8 +40,22 @@ /** * 鏄惁涓虹洰鏍囩偣 */ - @JsonProperty("isTargetPoint") private boolean isTargetPoint; + + /** + * 鍒拌揪鏃堕棿锛堟绉掓椂闂存埑锛� + */ + private Long arrivalTime; + + /** + * 绂诲紑鏃堕棿锛堟绉掓椂闂存埑锛� + */ + private Long departureTime; + + /** + * 绱鏃堕棿锛堜粠璺緞璧风偣寮�濮嬬殑绱鏃堕棿锛屾绉掞級 + */ + private Long cumulativeTime; // 鏋勯�犲嚱鏁� public PathCode() { @@ -121,6 +134,30 @@ isTargetPoint = targetPoint; } + public Long getArrivalTime() { + return arrivalTime; + } + + public void setArrivalTime(Long arrivalTime) { + this.arrivalTime = arrivalTime; + } + + public Long getDepartureTime() { + return departureTime; + } + + public void setDepartureTime(Long departureTime) { + this.departureTime = departureTime; + } + + public Long getCumulativeTime() { + return cumulativeTime; + } + + public void setCumulativeTime(Long cumulativeTime) { + this.cumulativeTime = cumulativeTime; + } + @Override public String toString() { return "PathCode{" + @@ -131,6 +168,9 @@ ", posType='" + posType + '\'' + ", lev=" + lev + ", isTargetPoint=" + isTargetPoint + + ", arrivalTime=" + arrivalTime + + ", departureTime=" + departureTime + + ", cumulativeTime=" + cumulativeTime + '}'; } } \ No newline at end of file diff --git a/algo-zkd/src/main/java/com/algo/service/AStarPathPlanner.java b/algo-zkd/src/main/java/com/algo/service/AStarPathPlanner.java index 4ae0129..5fe5554 100644 --- a/algo-zkd/src/main/java/com/algo/service/AStarPathPlanner.java +++ b/algo-zkd/src/main/java/com/algo/service/AStarPathPlanner.java @@ -4,12 +4,12 @@ import com.algo.model.PathCode; import com.algo.model.PlannedPath; import com.algo.util.JsonUtils; +import com.algo.util.PathTimeCalculator; import java.util.*; /** * A*璺緞瑙勫垝鍣ㄥ疄鐜� - * 浣跨敤3D A*绠楁硶杩涜CTU鏃剁┖璺緞瑙勫垝锛屾敮鎸佺墿鐞嗙害鏉� */ public class AStarPathPlanner implements PathPlanner { @@ -22,6 +22,11 @@ * 閭绘帴琛� */ private final Map<String, List<Map<String, String>>> adjacencyList; + + /** + * 鐜杩為�氭�ф暟鎹� + */ + private final JsonUtils.EnvironmentConnectivity environmentConnectivity; /** * 鏃堕棿绮惧害锛堟绉掞級 @@ -39,7 +44,7 @@ private final int maxSearchDepth = 15000; /** - * 璺濈缂撳瓨 - 浼樺寲锛氱紦瀛樿窛绂昏绠楃粨鏋� + * 璺濈缂撳瓨 */ private final Map<String, Double> distanceCache = new HashMap<>(); @@ -47,6 +52,16 @@ * 蹇�熻矾寰勭紦瀛� */ private final Map<String, List<String>> fastPathCache = new HashMap<>(); + + /** + * 瀹為檯鍧愭爣鏄犲皠 + */ + private Map<String, double[]> realCoordinateMapping; + + /** + * 璺緞鏃堕棿璁$畻鍣� + */ + private PathTimeCalculator timeCalculator; /** * 鏋勯�犲嚱鏁� @@ -57,13 +72,38 @@ this.pathMapping = pathMapping; this.adjacencyList = new HashMap<>(); - // 鐩存帴鏋勫缓閭绘帴琛� - buildAdjacencyList(); + // 鍔犺浇鐜杩為�氭�ф暟鎹� + this.environmentConnectivity = JsonUtils.loadEnvironmentConnectivity("environment.json"); + + // 鏋勫缓鐜鎰熺煡鐨勯偦鎺ヨ〃 + buildEnvironmentAwareAdjacencyList(); + + // 鍔犺浇瀹為檯鍧愭爣鏄犲皠 + loadRealCoordinateMapping(); + + // 鍒濆鍖栨椂闂磋绠楀櫒 + this.timeCalculator = new PathTimeCalculator(pathMapping, realCoordinateMapping); // 棰勮绠楀父鐢ㄨ窛绂� precomputeCommonDistances(); System.out.println("A*璺緞瑙勫垝鍣ㄥ垵濮嬪寲瀹屾垚锛岄偦鎺ヨ〃鍖呭惈 " + adjacencyList.size() + " 涓妭鐐�"); + } + + /** + * 鍔犺浇瀹為檯鍧愭爣鏄犲皠 + */ + private void loadRealCoordinateMapping() { + try { + this.realCoordinateMapping = JsonUtils.loadRealCoordinateMapping("man_code.json"); + if (realCoordinateMapping == null || realCoordinateMapping.isEmpty()) { + System.out.println("鏈兘鍔犺浇瀹為檯鍧愭爣鏄犲皠锛屼娇鐢ㄧ綉鏍煎潗鏍�"); + this.realCoordinateMapping = new HashMap<>(); + } + } catch (Exception e) { + System.err.println("鍔犺浇瀹為檯鍧愭爣鏄犲皠澶辫触: " + e.getMessage()); + this.realCoordinateMapping = new HashMap<>(); + } } @Override @@ -278,7 +318,7 @@ } } - // 鍑忓皯绛夊緟閫夐」 - 鍙湪蹇呰鏃剁瓑寰咃紙20%姒傜巼锛� + // 鍑忓皯绛夊緟閫夐」 if (Math.random() < 0.2) { long waitTime = timeResolution; long waitUntilTime = current.timePoint + waitTime; @@ -308,27 +348,61 @@ /** * 鏃剁┖鍚彂寮忓嚱鏁� * - * @param coord1 褰撳墠鍧愭爣 - * @param coord2 鐩爣鍧愭爣 + * @param coord1 褰撳墠鍧愭爣锛堢綉鏍硷級 + * @param coord2 鐩爣鍧愭爣锛堢綉鏍硷級 * @param currentTime 褰撳墠鏃堕棿 * @param physicalConfig 鐗╃悊閰嶇疆 * @return 鍚彂寮忓�� */ private double spaceTimeHeuristic(int[] coord1, int[] coord2, long currentTime, CTUPhysicalConfig physicalConfig) { - // 绌洪棿璺濈 + String pathId1 = findPathIdByCoordinate(coord1); + String pathId2 = findPathIdByCoordinate(coord2); + + if (pathId1 != null && pathId2 != null) { + double[] realCoord1 = JsonUtils.getRealCoordinate(pathId1, realCoordinateMapping); + double[] realCoord2 = JsonUtils.getRealCoordinate(pathId2, realCoordinateMapping); + + if (realCoord1 != null && realCoord2 != null) { + // 浣跨敤瀹為檯璺濈璁$畻 + double realDistance = CTUPhysicalConfig.calculateRealDistance(realCoord1, realCoord2); + + // 鏃堕棿鎴愭湰浼拌锛堝亣璁惧钩鍧囬�熷害锛� + double timeEstimate = realDistance / physicalConfig.getNormalSpeed(); + + // 鑰冭檻杞悜鎴愭湰 + double turnPenalty = realDistance > 0.5 ? physicalConfig.getTurnTime90() / 2.0 : 0; + + return timeEstimate + turnPenalty; + } + } + + // 鍓嶆柟妗堬細浣跨敤缃戞牸鍧愭爣 double spatialDistance = Math.abs(coord1[0] - coord2[0]) + Math.abs(coord1[1] - coord2[1]); - - // 鏃堕棿鎴愭湰浼拌 double timeEstimate = spatialDistance * physicalConfig.getStandardPointDistance() / physicalConfig.getNormalSpeed(); - - // 鑰冭檻杞悜鎴愭湰 double turnPenalty = spatialDistance > 1 ? physicalConfig.getTurnTime90() : 0; return timeEstimate + turnPenalty; } + + /** + * 鏍规嵁缃戞牸鍧愭爣鏌ユ壘璺緞ID + */ + private String findPathIdByCoordinate(int[] coord) { + if (coord == null) return null; + + for (Map.Entry<String, Map<String, Integer>> entry : pathMapping.entrySet()) { + Map<String, Integer> coordMap = entry.getValue(); + if (coordMap != null && + coord[0] == coordMap.getOrDefault("x", -1) && + coord[1] == coordMap.getOrDefault("y", -1)) { + return entry.getKey(); + } + } + return null; + } /** - * 璁$畻绉诲姩鏃堕棿 + * 璁$畻绮剧‘鐨勭Щ鍔ㄦ椂闂达紝鍩轰簬瀹為檯鍧愭爣鍜岀墿鐞嗗弬鏁� * * @param fromCode 璧峰浠g爜 * @param toCode 鐩爣浠g爜 @@ -337,14 +411,70 @@ * @return 绉诲姩鏃堕棿锛堟绉掞級 */ private long calculateTravelTime(String fromCode, String toCode, String direction, CTUPhysicalConfig physicalConfig) { - // 鍩烘湰绉诲姩鏃堕棿 + // 鑾峰彇瀹為檯鍧愭爣 + double[] fromCoord = JsonUtils.getRealCoordinate(fromCode, realCoordinateMapping); + double[] toCoord = JsonUtils.getRealCoordinate(toCode, realCoordinateMapping); + + if (fromCoord == null || toCoord == null) { + // fallback鍒扮綉鏍煎潗鏍囪绠� + return calculateFallbackTravelTime(fromCode, toCode, physicalConfig); + } + + // 璁$畻瀹為檯璺濈锛堢背锛� + double realDistance = CTUPhysicalConfig.calculateRealDistance(fromCoord, toCoord); + + if (realDistance == 0.0) { + return 100; // 鏈�灏忔椂闂�100ms + } + + // 鍋囪璧峰鍜岀粨鏉熼�熷害锛堝彲浠ユ牴鎹笂涓嬫枃杩涗竴姝ヤ紭鍖栵級 + double startSpeed = 0.0; // 鍋囪浠庨潤姝㈠紑濮� + double endSpeed = 0.0; // 鍋囪缁撴潫鏃跺仠姝� + double targetSpeed = physicalConfig.getNormalSpeed(); + + // 璁$畻绮剧‘鐨勭Щ鍔ㄦ椂闂� + double movementTime = physicalConfig.calculatePreciseMovementTime( + realDistance, startSpeed, endSpeed, targetSpeed + ); + + // 璁$畻杞悜鏃堕棿 + double turnTime = calculateTurnTime(fromCode, toCode, physicalConfig); + + return Math.max(100, (long) ((movementTime + turnTime) * 1000)); + } + + /** + * 璁$畻杞悜鏃堕棿 + */ + private double calculateTurnTime(String fromCode, String toCode, CTUPhysicalConfig physicalConfig) { + + double[] fromCoord = JsonUtils.getRealCoordinate(fromCode, realCoordinateMapping); + double[] toCoord = JsonUtils.getRealCoordinate(toCode, realCoordinateMapping); + + if (fromCoord == null || toCoord == null) { + return physicalConfig.getTurnTime90() / 4.0; // 骞冲潎杞悜鏃堕棿 + } + + // 璁$畻鏂瑰悜鍙樺寲 + double dx = toCoord[0] - fromCoord[0]; + double dy = toCoord[1] - fromCoord[1]; + + // 鐩寸嚎杩愬姩鏃犻渶杞悜 + if (Math.abs(dx) < 1.0 && Math.abs(dy) < 1.0) { + return 0.0; + } + + return physicalConfig.getTurnTime90() / 2.0; + } + + /** + * 澶囩敤鏃堕棿璁$畻鏂规硶锛堝綋鏃犳硶鑾峰彇瀹為檯鍧愭爣鏃朵娇鐢級 + */ + private long calculateFallbackTravelTime(String fromCode, String toCode, CTUPhysicalConfig physicalConfig) { double distance = physicalConfig.getStandardPointDistance(); double speed = physicalConfig.getNormalSpeed(); long moveTime = (long) ((distance / speed) * 1000); - - // 杞悜鏃堕棿 - long turnTime = (long) (physicalConfig.getTurnTime90() * 1000 / 4); // 鍋囪骞冲潎杞悜鏃堕棿 - + long turnTime = (long) (physicalConfig.getTurnTime90() * 1000 / 4); return moveTime + turnTime; } @@ -384,14 +514,17 @@ } PathCode pathCode = new PathCode(node.code, direction); - - // 娣诲姞鏃堕棿淇℃伅 - // pathCode.setArrivalTime(node.timePoint); - codeList.add(pathCode); } - return new PlannedPath("", "", codeList); + PlannedPath plannedPath = new PlannedPath("", "", codeList); + + // 浣跨敤缁熶竴鐨勬椂闂磋绠楀櫒璁$畻绮剧‘鏃堕棿 + long startTime = pathNodes.get(0).timePoint; + CTUPhysicalConfig defaultConfig = createDefaultPhysicalConfig(); + timeCalculator.calculatePathTiming(plannedPath, startTime, defaultConfig, 0.0); + + return plannedPath; } /** @@ -472,6 +605,15 @@ @Override public double calculateDistance(String startCode, String endCode) { + // 浼樺厛浣跨敤瀹為檯鍧愭爣 + double[] startRealCoord = JsonUtils.getRealCoordinate(startCode, realCoordinateMapping); + double[] endRealCoord = JsonUtils.getRealCoordinate(endCode, realCoordinateMapping); + + if (startRealCoord != null && endRealCoord != null) { + return CTUPhysicalConfig.calculateRealDistance(startRealCoord, endRealCoord); + } + + // 鍓嶆柟妗堬細浣跨敤缃戞牸鍧愭爣 int[] startCoord = JsonUtils.getCoordinate(startCode, pathMapping); int[] endCoord = JsonUtils.getCoordinate(endCode, pathMapping); @@ -493,9 +635,9 @@ } /** - * 鏋勫缓閭绘帴琛� + * 鏋勫缓鐜鎰熺煡鐨勯偦鎺ヨ〃 */ - private void buildAdjacencyList() { + private void buildEnvironmentAwareAdjacencyList() { // 鍒涘缓鍧愭爣鍒扮紪鍙风殑涓存椂鏄犲皠 Map<String, String> tempCoordToCode = new HashMap<>(); for (Map.Entry<String, Map<String, Integer>> entry : pathMapping.entrySet()) { @@ -523,6 +665,12 @@ int x = coordMap.get("x"); int y = coordMap.get("y"); + // 鐜鎰熺煡锛氭鏌ュ綋鍓嶈妭鐐规槸鍚﹀彲閫氳 + if (!environmentConnectivity.isTraversable(x, y)) { + adjacencyList.put(code, new ArrayList<>()); // 涓嶅彲閫氳鐨勮妭鐐规病鏈夐偦灞� + continue; + } + List<Map<String, String>> neighbors = new ArrayList<>(); // 妫�鏌ュ洓涓柟鍚戠殑閭诲眳 @@ -532,7 +680,9 @@ String coordKey = newX + "," + newY; String neighborCode = tempCoordToCode.get(coordKey); - if (neighborCode != null) { + + // 鐜鎰熺煡锛氬彧鏈夊綋閭诲眳鑺傜偣涔熷彲閫氳鏃舵墠娣诲姞杩炴帴 + if (neighborCode != null && environmentConnectivity.isTraversable(newX, newY)) { Map<String, String> neighbor = new HashMap<>(); neighbor.put("code", neighborCode); neighbor.put("direction", directionAngles[i]); @@ -542,6 +692,8 @@ adjacencyList.put(code, neighbors); } + + System.out.println("鐜鎰熺煡閭绘帴琛ㄦ瀯寤哄畬鎴愶紝杩囨护浜嗕笉鍙�氳鐨勮繛鎺�"); } /** @@ -673,7 +825,7 @@ } /** - * 蹇�熻矾寰勮鍒� - 鍏堝皾璇曠畝鍖栫┖闂磋矾寰勮鍒� + * 蹇�熻矾寰勮鍒� * 瀵逛簬杩戣窛绂昏矾寰勶紝鐩存帴杩斿洖缁撴灉閬垮厤澶嶆潅鐨勬椂绌鸿绠� */ private PlannedPath tryFastPathPlanning(String startCode, String endCode, List<double[]> constraints) { @@ -722,7 +874,7 @@ openSet.offer(startNode); gScores.put(startCode, 0.0); - // 绠�鍖栫殑绾︽潫妫�鏌ュ櫒 + // 绾︽潫妫�鏌ュ櫒 FastConstraintChecker constraintChecker = new FastConstraintChecker(constraints); int searchDepth = 0; diff --git a/algo-zkd/src/main/java/com/algo/service/CollisionResolver.java b/algo-zkd/src/main/java/com/algo/service/CollisionResolver.java index cdf70d7..1c70c81 100644 --- a/algo-zkd/src/main/java/com/algo/service/CollisionResolver.java +++ b/algo-zkd/src/main/java/com/algo/service/CollisionResolver.java @@ -4,6 +4,8 @@ import com.algo.model.ExecutingTask; import com.algo.model.PathCode; import com.algo.model.PlannedPath; +import com.algo.model.CTUPhysicalConfig; +import com.algo.util.PathTimeCalculator; import java.util.*; @@ -17,6 +19,11 @@ * 纰版挒妫�娴嬪櫒 */ private final CollisionDetector collisionDetector; + + /** + * 璺緞鏃堕棿璁$畻鍣� + */ + private PathTimeCalculator timeCalculator; /** * 鏋勯�犲嚱鏁� @@ -25,6 +32,13 @@ */ public CollisionResolver(CollisionDetector collisionDetector) { this.collisionDetector = collisionDetector; + } + + /** + * 璁剧疆鏃堕棿璁$畻鍣� + */ + public void setTimeCalculator(PathTimeCalculator timeCalculator) { + this.timeCalculator = timeCalculator; } /** @@ -243,7 +257,7 @@ } /** - * 涓鸿矾寰勬坊鍔犲欢杩� + * 涓鸿矾寰勬坊鍔犲欢杩燂紙澧炲己鐗堬紝姝g‘閲嶈绠楁椂闂寸獥锛� * * @param path 璺緞 * @param timeStep 寤惰繜寮�濮嬬殑鏃堕棿姝� @@ -263,6 +277,9 @@ // 鑾峰彇寤惰繜浣嶇疆鐨勮矾寰勪唬鐮� PathCode delayCode = codeList.get(timeStep); + + // 璁$畻寤惰繜鏃堕棿锛堟瘡涓欢杩熸楠�1绉掞級 + long delayDuration = delaySteps * 1000L; // 鍒涘缓寤惰繜姝ラ List<PathCode> delaySteps_list = new ArrayList<>(); @@ -273,14 +290,69 @@ waitCode.setPosType(delayCode.getPosType()); waitCode.setLev(delayCode.getLev()); waitCode.setTargetPoint(false); // 绛夊緟姝ラ涓嶆槸鐩爣鐐� + + // 璁剧疆绛夊緟姝ラ鐨勬椂闂翠俊鎭� + if (delayCode.getArrivalTime() != null) { + long waitStartTime = delayCode.getArrivalTime() + (i * 1000L); + waitCode.setArrivalTime(waitStartTime); + waitCode.setDepartureTime(waitStartTime + 1000L); + } + delaySteps_list.add(waitCode); } // 鎻掑叆寤惰繜姝ラ codeList.addAll(timeStep, delaySteps_list); + // 鏇存柊鍘熻矾寰勭偣鐨勬椂闂达紙鍚戝悗鎺ㄨ繜锛� + if (delayCode.getArrivalTime() != null) { + delayCode.setArrivalTime(delayCode.getArrivalTime() + delayDuration); + if (delayCode.getDepartureTime() != null) { + delayCode.setDepartureTime(delayCode.getDepartureTime() + delayDuration); + } + } + // 鏇存柊璺緞 path.setCodeList(codeList); + + // 馃敡 鍏抽敭淇锛氶噸鏂拌绠楀悗缁矾寰勭偣鐨勬椂闂寸獥 + if (timeCalculator != null) { + CTUPhysicalConfig defaultConfig = createDefaultPhysicalConfig(); + timeCalculator.recalculatePathTimingFromIndex(path, timeStep + delaySteps, defaultConfig); + } else { + // 澶囩敤鏂规锛氭墜鍔ㄦ洿鏂板悗缁椂闂� + updateSubsequentPathTiming(path, timeStep + delaySteps, delayDuration); + } + } + + /** + * 澶囩敤鏂规锛氭墜鍔ㄦ洿鏂板悗缁矾寰勭偣鐨勬椂闂� + */ + private void updateSubsequentPathTiming(PlannedPath path, int fromIndex, long timeOffset) { + List<PathCode> codeList = path.getCodeList(); + + for (int i = fromIndex; i < codeList.size(); i++) { + PathCode pathCode = codeList.get(i); + + if (pathCode.getArrivalTime() != null) { + pathCode.setArrivalTime(pathCode.getArrivalTime() + timeOffset); + } + + if (pathCode.getDepartureTime() != null) { + pathCode.setDepartureTime(pathCode.getDepartureTime() + timeOffset); + } + + if (pathCode.getCumulativeTime() != null) { + pathCode.setCumulativeTime(pathCode.getCumulativeTime() + timeOffset); + } + } + } + + /** + * 鍒涘缓榛樿鐗╃悊閰嶇疆 + */ + private CTUPhysicalConfig createDefaultPhysicalConfig() { + return new CTUPhysicalConfig(); // 浣跨敤榛樿鏋勯�犲嚱鏁� } /** diff --git a/algo-zkd/src/main/java/com/algo/service/PathPlanningService.java b/algo-zkd/src/main/java/com/algo/service/PathPlanningService.java index 833510e..eaafc68 100644 --- a/algo-zkd/src/main/java/com/algo/service/PathPlanningService.java +++ b/algo-zkd/src/main/java/com/algo/service/PathPlanningService.java @@ -3,6 +3,7 @@ import com.algo.config.EnvDataConfig; import com.algo.model.*; import com.algo.util.JsonUtils; +import com.algo.util.PathTimeCalculator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -43,6 +44,11 @@ * 鍓╀綑璺緞澶勭悊 */ private RemainingPathProcessor remainingPathProcessor; + + /** + * 璺緞鏃堕棿璁$畻鍣� + */ + private PathTimeCalculator timeCalculator; /** @@ -73,6 +79,13 @@ // 鍒濆鍖栧墿浣欒矾寰勫鐞嗗櫒 this.remainingPathProcessor = new RemainingPathProcessor(envDataConfig.getPathMapping()); + + // 鍒濆鍖栨椂闂磋绠楀櫒 + Map<String, double[]> realCoordinateMapping = JsonUtils.loadRealCoordinateMapping("man_code.json"); + this.timeCalculator = new PathTimeCalculator(envDataConfig.getPathMapping(), realCoordinateMapping); + + // 涓虹鎾炶В鍐冲櫒璁剧疆鏃堕棿璁$畻鍣� + this.collisionResolver.setTimeCalculator(timeCalculator); } /** @@ -320,7 +333,7 @@ List<double[]> constraints, Map<String, String> occupancyMap, AGVStatus agvStatus) { - // 棣栧厛灏濊瘯鍩烘湰璺緞瑙勫垝 + // 灏濊瘯鍩烘湰璺緞瑙勫垝 PlannedPath basicPath = pathPlanner.planPath(startPos, endPos, constraints); if (basicPath == null) { return null; @@ -331,8 +344,8 @@ basicPath, occupancyMap, agvStatus.getPhysicalConfig() ); - // 璁剧疆璺緞鐨勬椂闂翠俊鎭� - enhancePathWithTimeInfo(basicPath, safeStartTime, agvStatus.getPhysicalConfig()); + // 浣跨敤缁熶竴鐨勬椂闂磋绠楀櫒璁剧疆绮剧‘鐨勬椂闂翠俊鎭� + timeCalculator.calculatePathTiming(basicPath, safeStartTime, agvStatus.getPhysicalConfig(), 0.0); return basicPath; } diff --git a/algo-zkd/src/main/java/com/algo/util/JsonUtils.java b/algo-zkd/src/main/java/com/algo/util/JsonUtils.java index 8ec1aff..7a858e5 100644 --- a/algo-zkd/src/main/java/com/algo/util/JsonUtils.java +++ b/algo-zkd/src/main/java/com/algo/util/JsonUtils.java @@ -5,18 +5,17 @@ import java.io.*; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; /** - * JSON鏂囦欢璇诲彇宸ュ叿绫� - * 鐢ㄤ簬璇诲彇鐜閰嶇疆鍜岃矾寰勬槧灏勬枃浠� + * JSON鏂囦欢璇诲彇 */ public class JsonUtils { /** - * 璇诲彇JSON鏂囦欢鍐呭 - * * @param filePath 鏂囦欢璺緞 * @return JSON瀛楃涓插唴瀹� * @throws IOException 鏂囦欢璇诲彇寮傚父 @@ -33,8 +32,7 @@ } /** - * 瑙f瀽璺緞鏄犲皠JSON鍐呭 - * 姝g‘瑙f瀽path_mapping.json鐨勫疄闄呮牸寮忥細{"path_id_to_coordinates": {...}} + * 瑙f瀽璺緞鏄犲皠JSON * * @param jsonContent JSON鍐呭 * @return 璺緞鏄犲皠Map锛宬ey涓鸿矾寰勭紪鍙凤紝value涓哄潗鏍囦俊鎭� @@ -43,7 +41,6 @@ Map<String, Map<String, Integer>> pathMapping = new HashMap<>(); try { - // 鎵惧埌path_id_to_coordinates閮ㄥ垎 String pathIdSection = extractJsonSection(jsonContent, "path_id_to_coordinates"); if (pathIdSection == null) { System.err.println("鏈壘鍒皃ath_id_to_coordinates閮ㄥ垎"); @@ -101,8 +98,7 @@ } /** - * 鍔犺浇鍜岃В鏋愯矾寰勬槧灏勬枃浠� - * 姝g‘瑙f瀽path_mapping.json鐨勫疄闄呮牸寮忥細{"path_id_to_coordinates": {...}} + * 璺緞鏄犲皠 * * @param filePath 鏂囦欢鍦板潃 * @return 璺緞鏄犲皠Map锛宬ey涓鸿矾寰勭紪鍙凤紝value涓哄潗鏍囦俊鎭� @@ -112,7 +108,6 @@ Map<String, Map<String, Integer>> pathMapping = new HashMap<>(); ObjectMapper objectMapper = new ObjectMapper(); try { - // 鍏堣В鏋愪负椤跺眰Map<String, Object> Map<String, Object> topLevelMap = objectMapper.readValue( new File(filePath), Map.class @@ -123,10 +118,9 @@ return pathMapping; } - // 澶勭悊 path_id_to_coordinates锛堝皢鍧愭爣鍒楄〃杞崲涓虹涓�涓潗鏍囩殑path_id鏄犲皠锛� + // 澶勭悊 path_id_to_coordinates Map<String, Object> pathIdCoords = (Map<String, Object>) topLevelMap.get("path_id_to_coordinates"); for (Map.Entry<String, Object> entry : pathIdCoords.entrySet()) { - // 淇濆瓨鏂瑰紡: 璺緞ID:{"x": , "y":} String pathId = entry.getKey(); Object coordsObj = entry.getValue(); if (coordsObj instanceof List) { @@ -155,8 +149,7 @@ } /** - * 瑙f瀽鐜閰嶇疆JSON鍐呭 - * 瑙f瀽environment.json涓殑stations淇℃伅 + * 鐜閰嶇疆JSON * * @param jsonContent JSON鍐呭 * @return 鐜閰嶇疆Map @@ -165,7 +158,6 @@ Map<String, Object> config = new HashMap<>(); try { - // 瑙f瀽width if (jsonContent.contains("\"width\":")) { String widthStr = jsonContent.substring(jsonContent.indexOf("\"width\":") + 8); widthStr = widthStr.substring(0, widthStr.indexOf(",")).trim(); @@ -176,7 +168,6 @@ } } - // 瑙f瀽height if (jsonContent.contains("\"height\":")) { String heightStr = jsonContent.substring(jsonContent.indexOf("\"height\":") + 9); heightStr = heightStr.substring(0, heightStr.indexOf(",")).trim(); @@ -187,7 +178,6 @@ } } - // 瑙f瀽stations淇℃伅 Map<String, Map<String, Object>> stations = parseStations(jsonContent); config.put("stations", stations); config.put("stationCount", stations.size()); @@ -202,7 +192,6 @@ } /** - * 鍔犺浇鍜岃В鏋愮幆澧冮厤缃枃浠� * 瑙f瀽environment.json涓殑stations淇℃伅 * * @param filePath 鏂囦欢鍦板潃 @@ -219,21 +208,18 @@ Map.class ); - // 瑙f瀽width if (topLevelMap.containsKey("width")) { environmentMap.put("width", Integer.parseInt(topLevelMap.get("width").toString())); } else { environmentMap.put("width", 78); } - // 瑙f瀽height if (topLevelMap.containsKey("width")) { environmentMap.put("height", Integer.parseInt(topLevelMap.get("height").toString())); } else { environmentMap.put("height", 50); } - // 瑙f瀽stations淇℃伅 if (topLevelMap.containsKey("stations")) { Map<String, Map<String, Object>> stations = new HashMap<>(); Map<String, Object> stationMap = (Map<String, Object>) topLevelMap.get("stations"); @@ -292,14 +278,12 @@ for (String line : lines) { line = line.trim(); - // 鏌ユ壘宸ヤ綔绔橧D if (line.startsWith("\"") && line.contains("\":{")) { int endIndex = line.indexOf("\":{"); currentStation = line.substring(1, endIndex); stations.put(currentStation, new HashMap<>()); } - // 瑙f瀽capacity if (currentStation != null && line.contains("\"capacity\":")) { String capacityStr = line.substring(line.indexOf("\"capacity\":") + 11); capacityStr = capacityStr.substring(0, capacityStr.indexOf(",")).trim(); @@ -311,7 +295,6 @@ } } - // 瑙f瀽load_position鍜寀nload_position if (currentStation != null && line.contains("\"load_position\":")) { List<Integer> loadPos = parsePosition(stationsSection, currentStation, "load_position"); if (loadPos != null) { @@ -372,7 +355,7 @@ } /** - * 鎻愬彇JSON涓殑鐗瑰畾閮ㄥ垎 + * 鎻愬彇JSON涓壒瀹氶儴鍒� * * @param jsonContent JSON鍐呭 * @param sectionName 閮ㄥ垎鍚嶇О @@ -421,6 +404,64 @@ return new int[]{coordMap.get("x"), coordMap.get("y")}; } return null; + } + + /** + * 鍔犺浇瀹為檯鐗╃悊鍧愭爣鏄犲皠 + * + * @param filePath 鏂囦欢璺緞 + * @return 瀹為檯鍧愭爣鏄犲皠 Map<pathId, double[]{x_mm, y_mm}> + */ + public static Map<String, double[]> loadRealCoordinateMapping(String filePath) { + Map<String, double[]> coordinateMapping = new HashMap<>(); + ObjectMapper objectMapper = new ObjectMapper(); + + try { + Map<String, Object> topLevelMap = objectMapper.readValue(new File(filePath), Map.class); + + if (!topLevelMap.containsKey("path_id_to_coordinates")) { + System.err.println("鏈壘鍒皃ath_id_to_coordinates閮ㄥ垎"); + return coordinateMapping; + } + + Map<String, Object> pathIdCoords = (Map<String, Object>) topLevelMap.get("path_id_to_coordinates"); + for (Map.Entry<String, Object> entry : pathIdCoords.entrySet()) { + String pathId = entry.getKey(); + Object coordsObj = entry.getValue(); + + if (coordsObj instanceof List) { + List<?> coordsList = (List<?>) coordsObj; + if (!coordsList.isEmpty()) { + Map<?, ?> coordMap = (Map<?, ?>) coordsList.get(0); + double x = ((Number) coordMap.get("x")).doubleValue(); + double y = ((Number) coordMap.get("y")).doubleValue(); + coordinateMapping.put(pathId, new double[]{x, y}); + } + } + } + + System.out.println("鎴愬姛鍔犺浇瀹為檯鍧愭爣鏄犲皠锛屽寘鍚� " + coordinateMapping.size() + " 涓矾寰勭偣"); + + } catch (FileNotFoundException e) { + System.err.println("瀹為檯鍧愭爣鏂囦欢涓嶅瓨鍦�: " + e.getMessage()); + } catch (IOException e) { + System.err.println("瀹為檯鍧愭爣鏂囦欢璇诲彇閿欒: " + e.getMessage()); + } catch (Exception e) { + System.err.println("鍔犺浇瀹為檯鍧愭爣鏂囦欢澶辫触: " + e.getMessage()); + } + + return coordinateMapping; + } + + /** + * 鑾峰彇璺緞鐐圭殑瀹為檯鍧愭爣 + * + * @param pathId 璺緞鐐笽D + * @param realCoordinateMap 瀹為檯鍧愭爣鏄犲皠 + * @return 鍧愭爣鏁扮粍 [x_mm, y_mm]锛屽鏋滄湭鎵惧埌杩斿洖null + */ + public static double[] getRealCoordinate(String pathId, Map<String, double[]> realCoordinateMap) { + return realCoordinateMap.get(pathId); } /** @@ -483,4 +524,111 @@ int dy = coord1[1] - coord2[1]; return Math.sqrt(dx * dx + dy * dy); } + + /** + * 鍔犺浇鐜璺緞杩為�氭�ф暟鎹紙environment.json涓殑paths鍜宱bstacles锛� + * + * @param filePath 鐜鏂囦欢璺緞 + * @return 鐜杩為�氭�ф暟鎹� + */ + public static EnvironmentConnectivity loadEnvironmentConnectivity(String filePath) { + EnvironmentConnectivity connectivity = new EnvironmentConnectivity(); + ObjectMapper objectMapper = new ObjectMapper(); + + try { + Map<String, Object> topLevelMap = objectMapper.readValue(new File(filePath), Map.class); + + // 鍔犺浇鍙�氳璺緞 + if (topLevelMap.containsKey("paths")) { + List<Map<String, Object>> pathsList = (List<Map<String, Object>>) topLevelMap.get("paths"); + for (Map<String, Object> pathPoint : pathsList) { + Integer x = (Integer) pathPoint.get("x"); + Integer y = (Integer) pathPoint.get("y"); + if (x != null && y != null) { + connectivity.addValidPath(x, y); + } + } + } + + // 鍔犺浇闅滅鐗� + if (topLevelMap.containsKey("obstacles")) { + List<Map<String, Object>> obstaclesList = (List<Map<String, Object>>) topLevelMap.get("obstacles"); + for (Map<String, Object> obstacle : obstaclesList) { + Integer x = (Integer) obstacle.get("x"); + Integer y = (Integer) obstacle.get("y"); + if (x != null && y != null) { + connectivity.addObstacle(x, y); + } + } + } + + System.out.println("鎴愬姛鍔犺浇鐜杩為�氭�ф暟鎹細" + + connectivity.getValidPathsCount() + " 涓彲閫氳鐐癸紝" + + connectivity.getObstaclesCount() + " 涓殰纰嶇墿鐐�"); + + } catch (FileNotFoundException e) { + System.err.println("鐜鏂囦欢涓嶅瓨鍦�: " + e.getMessage()); + } catch (IOException e) { + System.err.println("鐜鏂囦欢璇诲彇閿欒: " + e.getMessage()); + } catch (Exception e) { + System.err.println("鍔犺浇鐜杩為�氭�ф暟鎹け璐�: " + e.getMessage()); + } + + return connectivity; + } + + /** + * 鐜杩為�氭�ф暟鎹被 + */ + public static class EnvironmentConnectivity { + private final Set<String> validPaths = new HashSet<>(); + private final Set<String> obstacles = new HashSet<>(); + + public void addValidPath(int x, int y) { + validPaths.add(x + "," + y); + } + + public void addObstacle(int x, int y) { + obstacles.add(x + "," + y); + } + + public boolean isValidPath(int x, int y) { + return validPaths.contains(x + "," + y); + } + + public boolean isObstacle(int x, int y) { + return obstacles.contains(x + "," + y); + } + + public boolean isTraversable(int x, int y) { + return isValidPath(x, y) && !isObstacle(x, y); + } + + public int getValidPathsCount() { + return validPaths.size(); + } + + public int getObstaclesCount() { + return obstacles.size(); + } + + /** + * 鑾峰彇鏈夋晥鐨勭浉閭昏妭鐐� + */ + public List<int[]> getValidNeighbors(int x, int y) { + List<int[]> neighbors = new ArrayList<>(); + int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 涓婁笅宸﹀彸 + + for (int[] dir : directions) { + int newX = x + dir[0]; + int newY = y + dir[1]; + + if (isTraversable(newX, newY)) { + neighbors.add(new int[]{newX, newY}); + } + } + + return neighbors; + } + } } \ No newline at end of file diff --git a/algo-zkd/src/main/java/com/algo/util/PathTimeCalculator.java b/algo-zkd/src/main/java/com/algo/util/PathTimeCalculator.java new file mode 100644 index 0000000..3f9ddcf --- /dev/null +++ b/algo-zkd/src/main/java/com/algo/util/PathTimeCalculator.java @@ -0,0 +1,318 @@ +package com.algo.util; + +import com.algo.model.CTUPhysicalConfig; +import com.algo.model.PathCode; +import com.algo.model.PlannedPath; + +import java.util.List; +import java.util.Map; + +/** + * 璺緞鏃堕棿璁$畻鍣� + * 缁熶竴澶勭悊璺緞涓瘡涓偣鐨勬椂闂磋绠楋紝纭繚鍦ㄥ悇涓ā鍧椾腑璁$畻鐨勪竴鑷存�� + * 鑰冭檻鍔犲噺閫熴�佽浆鍚戙�佸仠鐣欑瓑鎵�鏈夋椂闂村洜绱� + */ +public class PathTimeCalculator { + + /** + * 璺緞鏄犲皠琛紙缃戞牸鍧愭爣锛� + */ + private final Map<String, Map<String, Integer>> pathMapping; + + /** + * 瀹為檯鍧愭爣鏄犲皠琛紙鐗╃悊鍧愭爣锛屾绫筹級 + */ + private final Map<String, double[]> realCoordinateMapping; + + public PathTimeCalculator(Map<String, Map<String, Integer>> pathMapping, + Map<String, double[]> realCoordinateMapping) { + this.pathMapping = pathMapping; + this.realCoordinateMapping = realCoordinateMapping; + } + + /** + * 涓鸿矾寰勮绠楁椂闂翠俊鎭� + * + * @param path 瑙勫垝璺緞 + * @param startTime 璧峰鏃堕棿锛堟绉掓椂闂存埑锛� + * @param config CTU鐗╃悊閰嶇疆 + * @param initialSpeed 鍒濆閫熷害锛堢背/绉掞級 + */ + public void calculatePathTiming(PlannedPath path, long startTime, + CTUPhysicalConfig config, double initialSpeed) { + List<PathCode> codeList = path.getCodeList(); + if (codeList == null || codeList.isEmpty()) { + return; + } + + long currentTime = startTime; + double currentSpeed = initialSpeed; + + for (int i = 0; i < codeList.size(); i++) { + PathCode currentCode = codeList.get(i); + + // 璁剧疆鍒拌揪鏃堕棿 + currentCode.setArrivalTime(currentTime); + + // 璁$畻鍦ㄥ綋鍓嶄綅缃殑鍋滅暀鏃堕棿 + double stayDuration = calculateStayDuration(currentCode, config); + + // 濡傛灉涓嶆槸鏈�鍚庝竴涓偣锛岃绠楄浆鍚戞椂闂� + if (i < codeList.size() - 1) { + PathCode nextCode = codeList.get(i + 1); + double turnTime = calculateTurnTime(currentCode, nextCode, config); + stayDuration += turnTime; + } + + // 璁剧疆绂诲紑鏃堕棿 + long departureTime = currentTime + (long)(stayDuration * 1000); + currentCode.setDepartureTime(departureTime); + + // 璁$畻绱鏃堕棿 + currentCode.setCumulativeTime(departureTime - startTime); + + // 濡傛灉鏈変笅涓�涓偣锛岃绠楃Щ鍔ㄦ椂闂村拰閫熷害鍙樺寲 + if (i < codeList.size() - 1) { + PathCode nextCode = codeList.get(i + 1); + + // 璁$畻绮剧‘鐨勭Щ鍔ㄦ椂闂达紙鑰冭檻鍔犲噺閫燂級 + MovementTimeResult movement = calculatePreciseMovementTime( + currentCode, nextCode, currentSpeed, config + ); + + currentTime = departureTime + movement.travelTime; + currentSpeed = movement.endSpeed; + } + } + } + + /** + * 璁$畻涓ょ偣闂寸Щ鍔ㄦ椂闂� + */ + private MovementTimeResult calculatePreciseMovementTime(PathCode fromCode, PathCode toCode, + double startSpeed, CTUPhysicalConfig config) { + // 鑾峰彇瀹為檯璺濈 + double realDistance = getRealDistance(fromCode.getCode(), toCode.getCode()); + + if (realDistance <= 0) { + // 澶囩敤锛氫娇鐢ㄧ綉鏍艰窛绂� + realDistance = getGridDistance(fromCode.getCode(), toCode.getCode()) + * config.getStandardPointDistance(); + } + + // 纭畾鐩爣閫熷害锛堣�冭檻鏄惁涓虹洰鏍囩偣锛� + double targetSpeed = toCode.isTargetPoint() ? 0.0 : config.getNormalSpeed(); + + // 浣跨敤鐗╃悊閰嶇疆鐨勭簿纭绠楁柟娉� + double movementTime = config.calculatePreciseMovementTime( + realDistance, startSpeed, targetSpeed, config.getNormalSpeed() + ); + + return new MovementTimeResult((long)(movementTime * 1000), targetSpeed); + } + + /** + * 璁$畻鍦ㄨ矾寰勭偣鐨勫仠鐣欐椂闂� + */ + private double calculateStayDuration(PathCode pathCode, CTUPhysicalConfig config) { + double stayTime = 0.1; // 鍩虹鍋滅暀鏃堕棿100ms + + // 鏍规嵁鍔ㄤ綔绫诲瀷澧炲姞鍋滅暀鏃堕棿 + if (pathCode.getActionType() != null) { + switch (pathCode.getActionType()) { + case "1": // 鍙栬揣 + stayTime += 10.0; + break; + case "2": // 鏀捐揣 + stayTime += 10.0; + break; + case "3": // 鍏呯數 + stayTime += 600.0; + break; + default: + stayTime += 0.5; + break; + } + } else if (pathCode.isTargetPoint()) { + // 鐩爣鐐瑰仠鐣欐椂闂� + if ("1".equals(pathCode.getPosType())) { + stayTime += 10.0; // 鍙栬揣 + } else if ("2".equals(pathCode.getPosType())) { + stayTime += 10.0; // 鏀捐揣 + } else { + stayTime += 10.0; // 鍏朵粬鐩爣鐐� + } + } + + return stayTime; + } + + /** + * 璁$畻杞悜鏃堕棿 + */ + private double calculateTurnTime(PathCode fromCode, PathCode toCode, CTUPhysicalConfig config) { + if (fromCode.getDirection().equals(toCode.getDirection())) { + return 0.0; + } + + // 浣跨敤閰嶇疆鐨勮浆鍚戞椂闂磋绠楁柟娉� + return config.getTurnTime(fromCode.getDirection(), toCode.getDirection()); + } + + /** + * 鑾峰彇瀹為檯鐗╃悊璺濈 + */ + private double getRealDistance(String fromCode, String toCode) { + if (realCoordinateMapping == null) { + return 0.0; + } + + double[] fromCoord = realCoordinateMapping.get(fromCode); + double[] toCoord = realCoordinateMapping.get(toCode); + + if (fromCoord != null && toCoord != null) { + return CTUPhysicalConfig.calculateRealDistance(fromCoord, toCoord); + } + + return 0.0; + } + + /** + * 鑾峰彇缃戞牸璺濈 + */ + private double getGridDistance(String fromCode, String toCode) { + int[] fromCoord = JsonUtils.getCoordinate(fromCode, pathMapping); + int[] toCoord = JsonUtils.getCoordinate(toCode, pathMapping); + + if (fromCoord != null && toCoord != null) { + return JsonUtils.calculateEuclideanDistance(fromCoord, toCoord); + } + + return 1.0; // 榛樿璺濈 + } + + /** + * 璁$畻璺緞涓寚瀹氫綅缃箣鍚庣殑鏃堕棿锛堢敤浜庡啿绐佽В鍐筹級 + * + * @param path 璺緞 + * @param fromIndex 寮�濮嬮噸鏂拌绠楃殑绱㈠紩 + * @param config 鐗╃悊閰嶇疆 + */ + public void recalculatePathTimingFromIndex(PlannedPath path, int fromIndex, CTUPhysicalConfig config) { + List<PathCode> codeList = path.getCodeList(); + if (codeList == null || fromIndex >= codeList.size()) { + return; + } + + // 鑾峰彇閲嶆柊璁$畻璧风偣鐨勬椂闂村拰閫熷害 + PathCode startCode = codeList.get(fromIndex); + long startTime = startCode.getDepartureTime() != null ? + startCode.getDepartureTime() : startCode.getArrivalTime(); + + // 浼扮畻褰撳墠閫熷害 + double currentSpeed = config.getNormalSpeed(); + + // 浠庢寚瀹氫綅缃紑濮嬮噸鏂拌绠� + long currentTime = startTime; + + for (int i = fromIndex + 1; i < codeList.size(); i++) { + PathCode currentCode = codeList.get(i); + PathCode previousCode = codeList.get(i - 1); + + // 璁$畻绉诲姩鏃堕棿 + MovementTimeResult movement = calculatePreciseMovementTime( + previousCode, currentCode, currentSpeed, config + ); + + currentTime += movement.travelTime; + currentSpeed = movement.endSpeed; + + // 璁剧疆鍒拌揪鏃堕棿 + currentCode.setArrivalTime(currentTime); + + // 璁$畻鍋滅暀鏃堕棿 + double stayDuration = calculateStayDuration(currentCode, config); + + // 濡傛灉涓嶆槸鏈�鍚庝竴涓偣锛屽鍔犺浆鍚戞椂闂� + if (i < codeList.size() - 1) { + PathCode nextCode = codeList.get(i + 1); + double turnTime = calculateTurnTime(currentCode, nextCode, config); + stayDuration += turnTime; + } + + // 璁剧疆绂诲紑鏃堕棿 + long departureTime = currentTime + (long)(stayDuration * 1000); + currentCode.setDepartureTime(departureTime); + + // 鏇存柊绱鏃堕棿 + long pathStartTime = codeList.get(0).getArrivalTime(); + currentCode.setCumulativeTime(departureTime - pathStartTime); + + currentTime = departureTime; + } + } + + /** + * 璁$畻璺緞鐨勬�绘墽琛屾椂闂� + */ + public long calculateTotalPathTime(PlannedPath path) { + List<PathCode> codeList = path.getCodeList(); + if (codeList == null || codeList.isEmpty()) { + return 0; + } + + PathCode firstCode = codeList.get(0); + PathCode lastCode = codeList.get(codeList.size() - 1); + + if (firstCode.getArrivalTime() != null && lastCode.getDepartureTime() != null) { + return lastCode.getDepartureTime() - firstCode.getArrivalTime(); + } + + return 0; + } + + /** + * 妫�鏌ヨ矾寰勫湪鎸囧畾鏃堕棿绐楀彛鏄惁涓庡崰鐢ㄨ〃鍐茬獊 + */ + public boolean isPathTimeConflictFree(PlannedPath path, Map<String, String> occupancyMap) { + List<PathCode> codeList = path.getCodeList(); + if (codeList == null || codeList.isEmpty()) { + return true; + } + + for (PathCode pathCode : codeList) { + if (pathCode.getArrivalTime() == null || pathCode.getDepartureTime() == null) { + continue; + } + + int[] coord = JsonUtils.getCoordinate(pathCode.getCode(), pathMapping); + if (coord == null) continue; + + // 妫�鏌ユ暣涓仠鐣欐椂闂存 + long startTimeSlot = pathCode.getArrivalTime() / 1000; + long endTimeSlot = pathCode.getDepartureTime() / 1000; + + for (long timeSlot = startTimeSlot; timeSlot <= endTimeSlot; timeSlot++) { + String spaceTimeKey = coord[0] + "," + coord[1] + "," + timeSlot; + if (occupancyMap.containsKey(spaceTimeKey)) { + return false; + } + } + } + + return true; + } + + /** + * 绉诲姩鏃堕棿璁$畻缁撴灉 + */ + private static class MovementTimeResult { + final long travelTime; // 绉诲姩鏃堕棿锛堟绉掞級 + final double endSpeed; // 缁撴潫閫熷害锛堢背/绉掞級 + + public MovementTimeResult(long travelTime, double endSpeed) { + this.travelTime = travelTime; + this.endSpeed = endSpeed; + } + } +} -- Gitblit v1.9.1