Как получить конкретную сенсорную зону? - PullRequest
0 голосов
/ 09 декабря 2011

Я новичок в Iphone Development,

Учитывая следующее map .Я хочу поднять событие касания всякий раз, когда я выбираю определенную часть, такую ​​как «Западная Австралия».Но эта конкретная область не является квадратной или круглой, чтобы упомянуть область касания.Границы не в порядке.Как я могу получить это событие касания?

Пожалуйста, кто-нибудь поможет мне или дайте мне урок, как работать с этой частью?

Ответы [ 3 ]

3 голосов
/ 10 декабря 2011

На вашей связанной карте вы можете видеть, что каждая область определяется полигонами, представленными массивом вершин. (Если вы этого не видите, посмотрите на источник html, и тогда вы увидите это.) В Интернете можно найти много дискуссий об алгоритмах, которые могут определить, находится ли точка внутри многоугольника, описанного таким образом. Вот одно из обсуждений, которое стоит посмотреть на , и прежде чем разочароваться в его длине (оно очень тщательное), посмотрите на раздел под названием The "Crossing Count" Algorithm. Это довольно простой метод по сравнению с некоторыми другими, которые я видел. Все сводится к тому, чтобы определить, пересекаются ли линии, и подсчитать, сколько ребер многоугольника пересекается с лучом.

Вам нужно проверять точку касания на каждом многоугольнике, пока не найдете тот, который находится внутри. Одна вещь, которая может быть полезна - это сначала проверить, находится ли точка касания внутри ограничительной рамки, определяемой значениями min x, max x, min y и max y каждого массива вершин каждого многоугольника. Если это не внутри ограничительной рамки, то это не внутри многоугольника.

Что касается определения события касания и его местоположения, посмотрите на мой ответ на этот вопрос , в котором рассказывается, как определить, где на экране произошло касание (используя touch: locationInView :).

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

0 голосов
/ 10 декабря 2011

@ Джим дает отличные советы по общему переносимому алгоритму. Однако, поскольку вы работаете на iPhone, вам может быть удобно преобразовать информацию о карте в UIBezierPath объекты. См. Руководство по рисованию и печати для получения подробной информации о том, как создать этот тип объекта пути. Затем вы можете использовать [UIBezierPath containsPoint:], чтобы выполнить тестирование для вас. Наличие объекта path также делает удобным выделение, если вы хотите получить тот же эффект, что и на веб-странице.

0 голосов
/ 10 декабря 2011

Есть несколько вариантов, но реализовать только один будет тривиально.

Прежде всего, вы не сможете сделать это с обычными элементами управления, такими как UIButtons - вместо этого вы захотите обрабатывать сенсорные события самостоятельно.

-1- Цветные регионы; Ваша карта раскрашена, и все кликабельные области имеют разные цвета.

В этом случае все, что вам нужно сделать, это проверить пиксель ниже точки касания на предмет его цвета. Нечто подобное сделано в этом примере .

-2- Пользовательская сенсорная карта; карта геометрических объектов, идеально треугольников.

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

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