Мой основной вид имеет несколько (возможно, много) полигональных активных областей, реализованных как подпредставления. Когда пользователь касается вида, я хочу определить, попала ли она в одну из этих активных областей.
Есть ли что-нибудь лучше наивного алгоритма, который перебирает список всех [возможных *] активных областей и спрашивает каждую из них, находится ли точка внутри него?
Я не могу использовать (без переопределения) hitTest:withEvent:
, поскольку в документации указано: «Этот метод игнорирует скрытые объекты просмотра, которые отключили взаимодействие с пользователем или имеют уровень альфа менее 0,01.». И мои подпредставления действительно скрыты (большую часть времени).
Я вижу эти варианты:
Реализация собственной полноценной реализации четырехъядерных деревьев. Это пахнет преждевременной оптимизацией, и это заново изобретает колесо, так как я ожидаю, что реализация теста на удар Apple уже оптимизирована
Ограничьте [возможные *] области, поддерживая для каждой его максимальные и минимальные координаты x и y, и сначала проверяя попадание по этому прямоугольнику. Фактически, мои подпредставления frame
являются этими прямоугольниками. Я ожидаю, что тестирование Apple будет использовать их.
Переопределить Cocoa Touch hitTest:withEvent:
в моих подпредставлениях, чтобы убрать задокументированное ограничение. Надеюсь, это не окажет негативного влияния на мое приложение (например, я могу игнорировать любое случайное прикосновение к моим подпредставлениям или перенаправить их на мой основной вид).
Будьте наивны и верьте, что пользователи никогда не добавят слишком много активных областей в реальном использовании, чтобы наивный алгоритм работал слишком плохо.
Есть предложения?
Обратите внимание, что многоугольники всегда простые, но не обязательно выпуклые.
Кроме того, самый точный хит-тест, который я использую, - это процедура Quartz CGPathContainsPoint