Polyline drawMapRect оптимизированный рисунок

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

мой drawMapRect выглядит так:

- for each polyline segment 
- verify if it's bounding box intersects the currently drawn MKMapRect
- if id does, draw it

Что здорово, если очков не так много. Но когда есть 8-16 видимых карт и 2-3000 точек, они невероятно медленно проходят через for,

Если бы они были только местоположениями, решение состояло бы в том, чтобы реализовать некую структуру дерева квадрантов / r-деревьев и фильтровать только те местоположения в текущей отрисовке. MKMapRect, но я не уверен в том, будет ли это подходящим для самих полилиний.

Если я отфильтрую только по конечным точкам сегмента внутри текущего maprect, то некоторые отрезки линии могут не отображаться. Например, два красных maprects между точками 1-2 не имеют конечных точек сегмента в них, но все еще должны рисовать...

Есть ли какой-то алгоритм, похожий на квадри, или какой-то подход к этой проблеме?

1 ответ

К сожалению, я не знаю такой структуры данных, которая позволила бы проверить пересечение линии с прямоугольником.
Однако один из подходов к решению проблемы может быть следующим:
Нарисуйте все полилинии на карте с очень низким разрешением (массив 2 dim) и отметьте для каждого пикселя, какая полилиния его нарисовала. Затем отсканируйте в этой карте низкого разрешения соответствующие прямоугольники для нарисованных пикселей и сохраните все соответствующие полилинии. Затем их можно нарисовать на карте полного разрешения.
Возможно, этот приблизительный алгоритм работает быстрее, чем тот алгоритм, который вы используете прямо сейчас.

РЕДАКТИРОВАТЬ:

Я предполагаю, что вы используете для проверки пересечения ломаной линии MKMapRect эффективный алгоритм, такой как показан в разделе Как найти точку пересечения между линией и прямоугольником?,

Другие вопросы по тегам