2016-11-22 1 views
9

Как определить, пересекается ли MKPolyline? Я пробовал исследовать это, но нашел только проблемы с двумя или более строками. Как я могу определить, есть ли у меня только одна строка/один штрих? Я хочу обнаружить его после того, как пользователь выпустит прикосновение.MKPolyline обнаруживает самопересекающуюся линию ЦЕЛЬ C

У меня есть этот код в контакте.

  CGPoint location = [touch locationInView:self.mapView]; 
      CLLocationCoordinate2D coordinate = [self.mapView convertPoint:location toCoordinateFromView:self.mapView]; 
      [self.coordinates addObject:[NSValue valueWithMKCoordinate:coordinate]]; 
      NSInteger numberOfPoints = [self.coordinates count]; 

      if(numberOfPoints > 2) 
      { 
       [self setLineLength:[self getLengthArea]]; 
       if([self lineLength] < 401) 
       { 
        if (numberOfPoints > 2) 
        { 
         CLLocationCoordinate2D points[numberOfPoints]; 
         for (NSInteger i = 0; i < numberOfPoints; i++) { 
          points[i] = [self.coordinates[i] MKCoordinateValue]; 
         } 
         [self.mapView addOverlay:[MKPolyline polylineWithCoordinates:points count:numberOfPoints]]; 
        } 

        PCAnnotation *ann = [[PCAnnotation alloc] init]; 
        [ann setCoordinate:coordinate]; 
        ann.title = @"End"; 
        [self.mapView addAnnotation:ann]; 
       } 
       else 
       { 
        NSArray *overlayItems = [self.mapView overlays]; 
        NSArray *annotations = [self.mapView annotations]; 
        [self.mapView removeOverlays:overlayItems]; 
        [self.mapView removeAnnotations:annotations]; 
       } 

      } 

ответ

4

MKPolyline наследуется форма MKMultiPoint , который имеет метод - (MKMapPoint *)points;,

Вы могли бы попытаться проверить наличие пересечений между всеми сегментами линии.

«Точки соединены друг с другом в том порядке, в котором они предусмотрены».

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

Здесь приведен фрагмент кода C++ для проверки пересечений: Его можно легко перевести на Objective-C и все остальное.

public static bool LineSegmentsCross(Vector2 a, Vector2 b, Vector2 c,  Vector2 d) 
{ 
    float denominator = ((b.X - a.X) * (d.Y - c.Y)) - ((b.Y - a.Y) * (d.X - c.X)); 

    if (denominator == 0) 
    { 
      return false; 
    } 

    float numerator1 = ((a.Y - c.Y) * (d.X - c.X)) - ((a.X - c.X) * (d.Y - c.Y)); 

    float numerator2 = ((a.Y - c.Y) * (b.X - a.X)) - ((a.X - c.X) * (b.Y - a.Y)); 

    if (numerator1 == 0 || numerator2 == 0) 
    { 
      return false; 
    } 

    float r = numerator1/denominator; 
    float s = numerator2/denominator; 

    return (r > 0 && r < 1) && (s > 0 && s < 1); 
} 
Смежные вопросы