2016-11-22 11 views
9

Jak wykryć, czy MKPolyline się przecina? Próbowałem to zbadać, ale znalazłem tylko problemy, które mają dwie lub więcej linii. Jak mogę wykryć, czy mam tylko jedną linię/jeden skok? Chcę to wykryć po tym, jak użytkownik zwolni dotknięcie.Linia wykrywająca linię MKPolyline CIEKĄ C

Obecnie mam ten kod w funkcji dotykowej zakończonej.

  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]; 
       } 

      } 

Odpowiedz

4

MKPolyline forma dziedziczy MKMultiPoint który ma metodę - (MKMapPoint *)points;,

Można spróbować sprawdzić skrzyżowaniach między wszystkich odcinków.

"Punkty są połączone od końca do końca w kolejności, w jakiej zostały dostarczone."

Dzięki temu można tworzyć własne segmenty linii między każdym z 2 punktów, , a po utworzeniu segmentu linii można sprawdzić ich przecięcia.

Oto fragment kodu C++ do sprawdzania skrzyżowań: Można go łatwo przetłumaczyć na Objective-C i cokolwiek innego.

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); 
}