Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 确定坐标是否位于给定多段线中的最佳实践?_Iphone_Objective C_Google Maps Api 3_Mkoverlay_Google Polyline - Fatal编程技术网

Iphone 确定坐标是否位于给定多段线中的最佳实践?

Iphone 确定坐标是否位于给定多段线中的最佳实践?,iphone,objective-c,google-maps-api-3,mkoverlay,google-polyline,Iphone,Objective C,Google Maps Api 3,Mkoverlay,Google Polyline,对于导航应用程序,我需要检测用户何时偏离给定的驾驶路径(表示为坐标列表),因此我要做的是,每当我为用户更新新位置时,我都会检查该位置是否在路径中。 这太复杂了吗?对于类似的问题,我用CGPath创建了一条路径,然后测试路径中是否有点。通过控制路径宽度,可以很容易地控制偏差量 以下是示例代码,用于从触摸事件测试锥体的点: - (void)createPath { CGMutablePathRef path = CGPathCreateMutable(); CGPathMoveToP

对于导航应用程序,我需要检测用户何时偏离给定的驾驶路径(表示为坐标列表),因此我要做的是,每当我为用户更新新位置时,我都会检查该位置是否在路径中。
这太复杂了吗?

对于类似的问题,我用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);
}

感谢您的回复,我试图查看CGPath类,但我不确定如何从坐标数组创建一个类,以及如何控制路径宽度。你能告诉我怎么做吗?哇,谢谢,这很有帮助!可以使用解释创建屏幕外文本的部分,为什么我需要它?绘制路径?如果您喜欢在屏幕上显示,您不需要offScreenContext,在我的情况下,它允许我具有不同的命中检测宽度(但在本例中不是)。我使用CloudMake maps API获取从a到B的驾驶路线信息(距离、持续时间)。CloudMake会自动在地图上绘制结果路径,它还提供了一组路径点。因此,我不需要绘制路径,但我需要能够检查用户当前位置是否在该路径中。从您的示例中,我了解了如何从点阵列创建CGPath,但我仍然不了解offScreenContext,它是否仅用于控制路径宽度?什么是kCGPathStroke参数?因为不需要在屏幕上绘制路径,所以只需要屏幕外的路径。