Простое 2D "обнаружение столкновений" iOS - PullRequest
2 голосов
/ 29 января 2012

Я пишу приложение, которое вычислит CGPoint и покажет отметку в конверте (диаграмму, если хотите).Мой конверт является лишь частью фонового изображения в UIImageView.Что я хочу сделать, так это построить своего рода «линию», соответствующую границам огибающей (это не прямые линии, а кривые), так что если рассчитанная CGPoint находится слева от этой линии или справа отдругая линия, то расчетная точка не утверждается.Где он находится в середине этих двух, он одобрен.

Сначала я думал о рисовании линий с использованием CoreGraphics, но я не уверен, можно ли проверить, находится ли вычисленный CGPoint направо или налевоиз этих линий.

Конверт имеет высоту всего 149 пикселей, поэтому я также подумал о том, чтобы собрать словарь, где ключи находятся в позиции y, а значения в позиции x пикселей, которые представляют эту определяющую границуline.

Приложение довольно простое и ничего не анимирует.У кого-нибудь есть идеи о том, как лучше всего найти решение для такого поведения?

1 Ответ

1 голос
/ 29 января 2012

Вы можете сделать это, создав CGPath, который представляет ваши границы (контур вашего конверта) и проверив, что в нем содержится точка с помощью CGPathContainsPoint.

Вам нужно будет сделать несколько проб и ошибок, чтобы создать CGPath, который соответствует вашей форме конверта, попробуйте заполнить его в методе drawRect, чтобы увидеть, каков ваш путь на самом деле.

Вот пример с круговой траекторией:

CGPoint viewCenter = CGPointMake(100,100);
CGPoint checkPoint = CGPointMake(110,110);
UIBezierPath *bpath = [UIBezierPath bezierPathWithArcCenter:viewCenter radius:50 startAngle:0 endAngle:DEGREES_TO_RADIANS(360) clockwise:YES];
CGPathRef path = [bpath CGPath];
BOOL inPath = CGPathContainsPoint(path, NULL, checkPoint, NO);

Здесь я определил DEGREES_TO_RADIANS так:

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)
...