Посилана стаття продумана. Тим НЕ менше, я вважаю , що це «просте і елегантне» рішення: для наборів географічних даних, є два види обмежує коробки. Ті, хто не перетинає меридіан + -180, можуть зберігатися та шукатись, як завжди. Ті, хто перетинає меридіан + -180, можуть зберігатися у напівдоповнювальній формі: а саме зберігати діапазон широт як зазвичай, а натомість зберігати діапазон довжин, не включений у поле (та трохи перемикати, щоб вказати, яка форма зберігання використовується). По суті, не потрібно вносити жодних змін до географічних покажчиків або структур дерев пошуку; для алгоритмів пошуку потрібна лише незначна модифікація.
У будь-якому випадку, ось вирішення самого питання.
Я припускаю, що ви передбачаєте, що вхід є послідовністю дескрипторів обмежувальної коробки ((LLx, LLy), (URx, URy)), де:
-540 <= LLx, -180 <= URx, LLx <= 180 і URx <= 180. Також -90 <= LLy <= URy <= 90.
точка в (довгота, широта) = (x, y) вважається лежати в межах ВВ тоді і тільки тоді
LLy <= y <= URy і
або LLx <= x <= URx, або LLx - 360 <= x <= URx.
Для виведення ви хочете параметри для найменшого обмежувального поля, що містить об'єднання всіх входів.
Очевидно, що y-межі мінімального обмежувального поля (MBR) будуть мінімальними та максимумами y-значень. Для x-меж використовуйте розгортку рядка, щоб знайти найбільший проміжок .
Ось опис алгоритму. Для ілюстрації цього припустімо, що вхід складається з чотирьох коробок,
((-81,-16),(-77,80)),
((77,-19),(156,5)),
((-149,-45),(-90,81)),
((-69,-85),(-36,-76))
Ось схема полів (червоним кольором) та MBR (чорним кольором) першого, потім перших двох, потім перших трьох, потім усіх коробок.
Зверніть увагу, як на другому кроці коробки у східній та західній півкулях оточені MBR, який перетинає меридіан + -180 градусів, завдяки чому він виглядає як два окремих поля на цій карті. На останньому кроці MBR необхідно розширити на схід, щоб розмістити невеликий ящик між Південною Америкою та Антарктидою.
Витягніть всі x-координати коробок, обчисліть їх по модулю 360 (щоб розмістити їх у діапазоні -180..180), відсортуйте їх у порядку зростання та додайте до кінця перше значення (збільшене на 360 градусів), щоб згорнути їх навколо:
-149, -90, -81, -77, -69, -36, 77, 156, 211
(Зауважте, що 211 та -149 - той самий меридіан.)
Подумайте про кожну координату x як на інтервал між попередньою координатою (але не враховуючи це попереднє значення) та її. Наприклад, -77 представляє всі значення від -81 до -77, але не включає -81. Для кожного з них після першого підрахуйте кількість полів, що містять цей інтервал.
1, 0, 1, 0, 1, 0, 1, 0
Наприклад, перший "1" означає, що один ящик охоплює інтервал від -149 до -90. (Це третя скринька.)
В якості оптимізації ви можете зупинити підрахунок, як тільки знайдете будь-яке поле, що охоплює інтервал x, і перейти до наступного x-інтервалу. Ми лише намагаємося визначити, які проміжки можуть не покриватися жодними полями.
Обчисліть перші відмінності відсортованих x-координат у (1).
59, 9, 4, 8, 33, 113, 79, 55
Зіставте їх з підрахунками покриття в (2). Знайдіть найбільшу різницю, для якої кількість покриття дорівнює 0. Тут вона дорівнює 113
шостому елементу попереднього масиву. Це найбільший розрив у довготі, що залишився від колекції ящиків.
(Цікаво, що можливість того, що максимум виникає в більш ніж одному місці, показує, що рішення не обов'язково унікальне! Для набору вікон може бути більше одного MBR. Ви можете визначити унікальний, додавши додаткові умови, наприклад, необхідні щоб середня відстань в межах MBR до меридіана + -180 була якомога більшою; щоб вирішити крапку, виберіть (скажімо) найсхідніший варіант рішення.)
Знайдіть відповідний інтервал: тут це від -36 до 77. Це діапазон довжин, не в MBR. Тому візьміть його доповнення в діапазоні від -180 до 180. Тут доповнення є двома непересічними інтервалами: один від -180 до -36 та інший від 77 до 180. Крім того, представляйте доповнення як єдиний прямокутник, можливо простягаючи + -180 градусів меридіана: від -283 до -36 тут (або, що еквівалентно, від 77 до 324).
Використовуйте min та max y-значень для кутів MBR.
((-283, -85), (-36, 81))