Нахождение подпредставления неправильной формы, содержащего точку - PullRequest
2 голосов
/ 06 октября 2011

Мой основной вид имеет несколько (возможно, много) полигональных активных областей, реализованных как подпредставления. Когда пользователь касается вида, я хочу определить, попала ли она в одну из этих активных областей.

Есть ли что-нибудь лучше наивного алгоритма, который перебирает список всех [возможных *] активных областей и спрашивает каждую из них, находится ли точка внутри него?

Я не могу использовать (без переопределения) hitTest:withEvent:, поскольку в документации указано: «Этот метод игнорирует скрытые объекты просмотра, которые отключили взаимодействие с пользователем или имеют уровень альфа менее 0,01.». И мои подпредставления действительно скрыты (большую часть времени).

Я вижу эти варианты:

  • Реализация собственной полноценной реализации четырехъядерных деревьев. Это пахнет преждевременной оптимизацией, и это заново изобретает колесо, так как я ожидаю, что реализация теста на удар Apple уже оптимизирована

  • Ограничьте [возможные *] области, поддерживая для каждой его максимальные и минимальные координаты x и y, и сначала проверяя попадание по этому прямоугольнику. Фактически, мои подпредставления frame являются этими прямоугольниками. Я ожидаю, что тестирование Apple будет использовать их.

  • Переопределить Cocoa Touch hitTest:withEvent: в моих подпредставлениях, чтобы убрать задокументированное ограничение. Надеюсь, это не окажет негативного влияния на мое приложение (например, я могу игнорировать любое случайное прикосновение к моим подпредставлениям или перенаправить их на мой основной вид).

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

Есть предложения?

Обратите внимание, что многоугольники всегда простые, но не обязательно выпуклые. Кроме того, самый точный хит-тест, который я использую, - это процедура Quartz CGPathContainsPoint

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