Лучшая практика, чтобы найти, если координата находится в данной полилинии? - PullRequest
0 голосов
/ 26 ноября 2011

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

1 Ответ

1 голос
/ 26 ноября 2011

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

Вот пример кода, точка для проверки конусов от события касания:

- (void)createPath {
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(   path, nil, 400, 300);
    CGPathAddLineToPoint(path, nil, 500, 300);
    CGPathAddLineToPoint(path, nil, 500, 400);
    CGPathAddLineToPoint(path, nil, 400, 400);
    self.pathRef   = path;

    CGContextRef context = [self createOffscreenContext];
    CGContextSetLineWidth(context, self.pathWidth);

    CGContextBeginPath(context);
    CGContextAddPath(context, self.pathRef);    
}

- (CGContextRef)createOffscreenContext {
    CFMutableDataRef empty = CFDataCreateMutable(NULL, 0);
    CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData(empty);
    self.offscreenContext = CGPDFContextCreate(consumer, NULL, NULL);
    CGDataConsumerRelease(consumer);
    CFRelease(empty);

    return self.offscreenContext;
}

// Optional, not needed for the test to work
-(void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetStrokeColorWithColor(context, self.colorRef);
    CGContextSetLineWidth(context, self.pathWidth);

    CGContextAddPath(context, self.pathRef);
    CGContextStrokePath(context);
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self];

    BOOL isPointInPath = CGContextPathContainsPoint(self.offscreenContext, touchPoint, kCGPathStroke);

    NSLog(@"pip: %d, x: %3.0f, y: %3.0f", isPointInPath, touchPoint.x, touchPoint.y);
}
...