2013-05-06 3 views
1

У меня есть функция, которую пользователь может рисовать/окрашивать определенную область изображения, а затем рисовать область как результат обрезки.Получить граничные/внешние координаты CGPoints

enter image description here

В настоящее время я храню жеребьёвка координаты внутри массива, и в конце процесса я использую UIBezierPath и CGContextClipToMask, чтобы обрезать изображение. Проблема в том, что мне нужны только внешние координаты из координат ничьей, которые я сохранил в массиве. Есть ли способ фильтровать CGPoints только для получения внешних координат?

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    // add the first coordinate 
    [points addObject:[NSValue valueWithCGPoint:lastPoint]]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    // add more coordinates as finger moves 
    [points addObject:[NSValue valueWithCGPoint:currentPoint]]; 

} 

- (void) crop { 


    CGRect rect = CGRectZero; 
    rect.size = self.mainImage.image.size; 

    UIGraphicsBeginImageContextWithOptions(rect.size, YES, 0.0); 

    { 

     [[UIColor blackColor] setFill]; 
     UIRectFill(rect); 
     [[UIColor whiteColor] setFill]; 

     UIBezierPath * beziPath = [UIBezierPath bezierPath]; 

     NSValue * firstValue = [points objectAtIndex:0]; 
     CGPoint firstPoint = firstValue.CGPointValue; 
     [beziPath moveToPoint:[ARCroppingViewController 
         convertCGPoint:firstPoint fromRect1:self.mainImage.frame.size 
         toRect2:self.mainImage.image.size]]; 

     for (uint i = 1; i < points.count; i++) { 


      NSValue * value = [points objectAtIndex:i]; 
      CGPoint point = value.CGPointValue; 
      NSLog(@"point: %@", NSStringFromCGPoint(point)); 
      [beziPath addLineToPoint:[ARCroppingViewController 
          convertCGPoint:point fromRect1:self.mainImage.frame.size 
          toRect2:self.mainImage.image.size]]; 

      } 

    [beziPath closePath]; 
    [beziPath fill]; 


     } 


    UIImage *mask = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0); 
    { 

     CGContextClipToMask(UIGraphicsGetCurrentContext(), rect, mask.CGImage); 
     [self.mainImage.image drawAtPoint:CGPointZero]; 

    } 

    UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    NSLog(@"mask image: %@", NSStringFromCGSize(maskedImage.size)); 
    self.mainImage.image = maskedImage; 

} 

ответ

0

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

редактировать

int xMin, xMax, yMin, yMax; 
-(void)resetValues 
{ 
    xMax = yMax = 0; 

    xMin = yMin = self.mainImage.image.size.width; 
} 

- (void)checkForExtremes:(CGPoint)point 
{ 
    // Have my IDE not here for checking the MIN() and MAX(), so using this way :P 
    lastPoint.x > xMax ? xMax = lastPoint.x : nil; 
    lastPoint.x < xMin ? xMin = lastPoint.x : nil; 
    lastPoint.y > yMax ? yMax = lastPoint.y : nil; 
    lastPoint.y < yMin ? yMin = lastPoint.y : nil; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 

    // add the first coordinate 
    [points addObject:[NSValue valueWithCGPoint:lastPoint]]; 

    [self checkForExtremes:lastPoint]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    // add more coordinates as finger moves 
    [points addObject:[NSValue valueWithCGPoint:currentPoint]]; 
    [self checkForExtremes:currentPoint]; 
} 

кстати, результат затем

cut Image

+0

Как получить предельные значения? – ariauakbar

+0

проверить мои изменения :) – geo

+0

спасибо, попробуем ответить. Но мне нужен точный результат обрезки круга (как и путь рисования) – ariauakbar

0

петля Только над точками (как сейчас) но проверьте каждую точку и сохраните max и min для значений x и y. Затем в конце цикла вы можете получить 4 точки в углах выбранной области (теперь квадрата).

CGFloat minX, maxX, minY, maxY; 

for (... { 
    minX = MIN(minX, point.x); 
    maxX = ... 
} 

CGPoint topLeft = CGPointMake(minX, minY); 
CGPoint topRight = ... 

Вы также можете выполнить эти расчеты, пока пользователь прослеживает форму (вы можете также изменить путь Безье тогда тоже).