iPhone обнаруживает прикосновения на карте - PullRequest
1 голос
/ 02 августа 2009

У меня есть статичное изображение карты с кучей кругов и квадратов, на которых изображены города. Я загрузил изображение в imageView, которое подклассифицировано под scrollView, чтобы я мог захватывать касания пользователя и масштабировать / прокручивать по карте. Моя проблема заключается в том, что я хочу, чтобы пользователь нажимал на ярлык всякий раз, когда пользователь касается одного из этих кругов / квадратов для города, чтобы сообщить ему, какой это город, и, возможно, загрузить подробный вид города. Я подумал, что могу предварительно загрузить все относительные CGPoints для городов на основе карты imageView в словарь, чтобы я мог ссылаться на них во время события "touchesBegan", но я быстро перебираю себе голову и, возможно, собираюсь Неправильный путь.

Пока все работает, и я могу зафиксировать координаты касаний x и y CGPoint. Самая большая проблема, которую я имею, - это определение близости прикосновений пользователя к отдельной точке, которую я могу иметь в словаре. Другими словами, если в словаре есть "Boston = NSPoint: {235, 118};" как я могу определить, когда пользователь находится близко к этой точке, не заставляя его повторять касание, пока оно не станет точным? Есть ли простой способ определить, находится ли касание пользователя «близко» к уже существующей точке? Я иду об этом правильным путем?

Любые советы или шлепки по затылку приветствуются.

Спасибо, Майк

Ответы [ 3 ]

0 голосов
/ 02 августа 2009

Вы можете использовать кнопки UIB для представления городов. Тогда вы получите стандартное сенсорное, выделенное и т. Д. Поведение с меньшими усилиями. Добавление кнопок в качестве подпредставлений на карте должно привести к их масштабированию и прокрутке вместе с картой.

0 голосов
/ 03 августа 2009

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

Вы должны были бы количественно определить закрытие, т. Е. Установить пороговое значение, после которого ответвление будет дальше, до которого ответвление будет ближе.

как только вы это сделаете, вычислите декартову координату расстояния sqrt ((x1-x2) ^ 2 + (y1-y2) ^ 2) для каждого элемента (прочитайте словарь со значениями x, y для городов) в массиве и сохраните результаты в другом массиве. затем возьмите минимум результата. индекс этого результата - город, который ближе всего к крану, если он меньше указанного порога.

0 голосов
/ 02 августа 2009

вы можете использовать R-Tree или вычислить близость касания к каждой видимой точке в текущем представлении. Для вычисления близости вы обычно используете теорему Пифагора, но в этом случае вы можете пропустить квадратный корень, потому что вы сравниваете только относительные размеры. Также вы можете объявить обрезанное расстояние, если хотите, скажем, 50 пикселей в квадрате к 2500. Таким образом, вы поместите результат в объект, содержащий расстояние и опорную точку, и поместите объекты в NSMutableArray, не добавляя результаты под вашей обрезкой, и выберите минимальный результат.

Так что, если у вас есть точка касания pT, то для каждой точки pN вы бы вычислили:

d=(pT.x-pN.x)*(pT.x-pN.x) + (pT.y-pN.y)*(pT.y-pN.y); //d is the squared distance

Точка pN с минимальным значением d - это точка, ближайшая к pT. И, как я уже сказал, если вы хотите, чтобы учитывались только касания в пределах 10 пикселей, вы можете проверить это d <= 10*10;

Метод проверки касаний в пределах площади 20х20 также работает, за исключением случаев, когда две точки находятся в пределах 20 пикселей друг от друга, поэтому вам необходимо знать, какая точка касания является ближайшей.

...