Как я могу отсортировать координатный список для прямоугольника против часовой стрелки?

Я раньше делал чистый CSS, но я отказался от того преследования в пользу гибридного подхода таблицы/CSS как самый прагматический подход. Как ни странно, это также из-за доступности. Когда-нибудь пытайтесь делать CSS на Кореше? Какой кошмар! Когда-нибудь замеченный, как основанные на CSS веб-сайты представляются на новых браузерах? Элементы наложились бы или просто не отображаются правильно, что я должен был выключить CSS. Когда-нибудь пытайтесь изменить размер основанных на CSS веб-сайтов? Они выглядят ужасными и часто вредными для слепых, если они используют функции изменения масштаба в браузере! Если Вы делаете это с таблицами, они масштабируются намного лучше. Когда люди говорят о доступности, я нахожу, что у многих нет подсказки, и она раздражает меня, потому что я отключен, и они не. Они действительно работали со слепыми? Глухие? Если доступность является основным беспокойством, какого черта 99% видео не закрываются озаглавленные? Многие пуристы CSS используют Ajax, но не удаются понять, что Ajax часто делает содержание недоступным.

Практично, нормально использовать единственную таблицу в качестве основного расположения, пока Вы предоставляете информацию в логическом потоке, если бы ячейки сложены (что-то, что Вы видели бы по мобильным телефонам). Теория CSS звучит великолепно, но частично осуществимый в реальной жизни со слишком многими взломами, что-то, что является против идеалов "чистоты".

Начиная с использования CSS с подходом таблиц, я сэкономил так много времени, разрабатывая веб-сайт, и обслуживание намного легче. Меньше взломов, более интуитивных. Я получаю меньше вызовов от людей, говорящих, что "Я вставил DIV, и теперь это смотрит все завинченные!" И что еще более важно, абсолютно никакие проблемы доступности.

7
задан Crescent Fresh 10 November 2009 в 16:57
поделиться

7 ответов

решение кажется довольно простым:

>>> import math
>>> mlat = sum(x['lat'] for x in l) / len(l)
>>> mlng = sum(x['lng'] for x in l) / len(l)
>>> def algo(x):
    return (math.atan2(x['lat'] - mlat, x['lng'] - mlng) + 2 * math.pi) % (2*math.pi)

>>> l.sort(key=algo)

в основном, алгоритм нормализует ввод в пространство [0, 2pi] , и это будет естественно отсортировывать «против часовой стрелки». Обратите внимание, что оператор% и оператор * имеют одинаковый приоритет, поэтому скобки вокруг (2 * math.pi) важны для получения правильного результата.

8
ответ дан 6 December 2019 в 08:43
поделиться

Предполагая, что ваши «прямоугольники» всегда параллельны экватору и меридианам (это подразумевает ваш пример, но это не указано явно), т.е. у вас есть только две пары разных значений широты и долготы : (lat0, lat1) и (lng0, lng1).

Вы получите следующие 4 угла:

NE: (lat = max(lat0, lat1), lng = max(lng0, lng1))
NW: (lat = max(lat0, lat1), lng = min(lng0, lng1))
SW: (lat = min(lat0, lat1), lng = min(lng0, lng1))
SE: (lat = min(lat0, lat1), lng = max(lng0, lng1))

(это не должно быть кодом Python)

5
ответ дан 6 December 2019 в 08:43
поделиться

Вместо сортировки вы можете просто «перестроить» прямоугольник в любом порядке.

Из исходного набора возьмите минимальную и максимальную широту, а также минимальную и максимальную долготу. Затем постройте прямоугольник в любом порядке.

Северо-западный угол - это максимальная широта и минимальная долгота. Юго-западный угол - это минимальная широта и минимальная долгота. И т.д.

3
ответ дан 6 December 2019 в 08:43
поделиться

Свяжите угол с каждой точкой (относительно внутренней точки), и тогда перемещение будет тривиальным.

Чтобы вычислить угол, найдите точку в середине формы, для Например, (average_lat, average_lng) будет в центре. Тогда atan2 (lng - average_lng, lat - average_lat) будет углом этой точки.

3
ответ дан 6 December 2019 в 08:43
поделиться

Итак, у вас 4 точки.

Вы всегда начинаете с точки NW.

Вы знаете, что точки сортируются, но не в каком направлении.

Это простой тест первых двух точек, по часовой стрелке или против часовой стрелки в списке.

if (pt1.y! = pt2.y) then direction = clockwise.

Если вы обнаружите, что точки расположены по часовой стрелке, просто переверните последние 3 точки в списке.

Итак.

Точки против часовой стрелки: (0,1), (0,0), (1,0), (1,1)

Точки по часовой стрелке: (0 , 1), (1,1), (1,0), (0,0)

Вы можете увидеть, если вы перевернете pts2-4, ваш список по часовой стрелке станет против часовой стрелки.

РЕДАКТИРОВАТЬ: Мои точки начинались с NE, фикс.

0
ответ дан 6 December 2019 в 08:43
поделиться

Это просто. Сначала мы сортируем координаты, чтобы знать, в каком порядке они находятся, а затем просто выбираем их:

Сортируем их сначала по широте, затем по долготе, сначала самые большие. Затем мы меняем местами последние два:

L = [
  { "lat": 34.495239, "lng": -118.127747 }, # north-west
  { "lat": 34.495239, "lng": -117.147217 }, # north-east
  { "lat": 34.095174, "lng": -117.147217 }, # south-east
  { "lat": 34.095174, "lng": -118.127747 }  # south-west
]


L = sorted(L, key=lambda k: (-k["lat"], -k["lng"]))

L[-2], L[-1] = L[-1], L[-2]
import pprint
pprint.pprint(L)

output

[{'lat': 34.495238999999998, 'lng': -117.147217},
 {'lat': 34.495238999999998, 'lng': -118.127747},
 {'lat': 34.095174, 'lng': -118.127747},
 {'lat': 34.095174, 'lng': -117.147217}]

(Минусы в ключевой функции таковы, что большие значения сортируются перед меньшими значениями. При сортировке мы помещаем север перед югом, затем восток перед западом; чтобы получить желаемый порядок мы просто меняем местами два последних (южных) значения.)

1
ответ дан 6 December 2019 в 08:43
поделиться

Если вы возьмете произведение двух векторов из угла, то знак результата скажет вам, по часовой стрелке или против часовой стрелки.

1
ответ дан 6 December 2019 в 08:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: