2015-03-02 2 views
0

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

То, что я хотел бы сделать, это нажать на часть тела, на этом изображении и есть устройство скажите мне, какая часть тела это: The body

Но у меня нет абсолютно никакого понятия о том, как программировать это.

  • Я думал о настройке массива контуров CGPoints для каждой части тела, но как их получить? Координаты Photoshop? А затем вычислить затронутую точку на ближайший CGPoint?

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

  • Другой человек сказал мне, что это возможно только с помощью SpriteKit.

Позвольте мне знать, умные выглядывает :)

UPDATE: Я понял это! Я делаю много массивов, которые содержат точки в руки, ноги, ... Пример:

CGPoint p1 = CGPointMake(x + 432, y + 200); 
CGPoint p2 = CGPointMake(x + 523, y + 188); 
CGPoint p3 = CGPointMake(x + 530, y + 277); 
CGPoint p4 = CGPointMake(x + 432, y + 277); 
CGPoint p5 = CGPointMake(x + 523, y + 367); 
CGPoint p6 = CGPointMake(x + 432, y + 354); 
CGPoint p7 = CGPointMake(x + 325, y + 355); 
CGPoint p8 = CGPointMake(x + 296, y + 362); 

NSArray *handL = [NSArray arrayWithObjects: 
           [NSValue valueWithCGPoint:p1], 
           [NSValue valueWithCGPoint:p2], 
           [NSValue valueWithCGPoint:p3], 
           [NSValue valueWithCGPoint:p4], nil]; 
[shapes addObject:@{@"name":NSLocalizedString(@"Left Hand", @""), @"points":handL}]; 

NSArray *handR = [NSArray arrayWithObjects: 
           [NSValue valueWithCGPoint:p5], 
           [NSValue valueWithCGPoint:p6], 
           [NSValue valueWithCGPoint:p7], 
           [NSValue valueWithCGPoint:p8], nil]; 
[shapes addObject:@{@"name":NSLocalizedString(@"Right Hand", @""), @"points": handR}]; 

Затем в я прочитал эти значения и слой их:

NSArray *shapes = [[NumbersHelper sharedNumbersHelper] getScreenThreeShapes]; 
    for (int outside = 0; outside < [shapes count]; outside++) { 
     CAShapeLayer *shape = [[CAShapeLayer alloc] init]; 
     [self.scrollView.layer addSublayer:shape]; 
     shape.opacity = 0.5; 
     shape.lineWidth = 2; 
     shape.lineJoin = kCALineJoinRound; 

     NSArray *points = [[[shapes valueForKey:@"points"] allObjects] objectAtIndex:outside]; 
     UIBezierPath *path = [[UIBezierPath alloc] init]; 
     for (int inside = 0; inside < points.count; inside++) { 
      if (inside == 0) { 
       [path moveToPoint:[[points objectAtIndex:inside] CGPointValue]]; 
      } else { 
       [path addLineToPoint:[[points objectAtIndex:inside] CGPointValue]]; 
      } 
     } 
     [path closePath]; 
     shape.path = [path CGPath]; 
     shape.name = [[[shapes valueForKey:@"name"] allObjects] objectAtIndex:outside]; 
    } 

When пользователь вводит мнение, что я делаю это:

- (void)tappedOnView:(UITapGestureRecognizer *)sender 
{ 

if ([sender locationInView:self.scrollView].x > 2048 && [sender locationInView:self.scrollView].x < 3072) { 
    screenTwoTouchedPoint = [sender locationInView:self.scrollView]; 

    CGPoint touchPoint = [sender locationInView:self.scrollView]; 
    NSString *name; 
    for (id sublayers in self.scrollView.layer.sublayers) { 
     if ([sublayers isKindOfClass:[CAShapeLayer class]]) { 
      CAShapeLayer *shape = sublayers; 
      if (CGPathContainsPoint(shape.path, 0, touchPoint, YES)) { 
       name = shape.name; 
       break; 
      } 
     } 
    } 
    [self tappedBody:sender onPart:name]; 
} 

}

+0

Просто из любопытства, для чего вы его используете? :) –

+0

Посмотрите на это - http://stackoverflow.com/questions/27169845/how-to-detect-tap-on-small-nearest-buttons-in-ios/27170107#27170107 – Kampai

+0

@ iosDev82 Ха-ха, может Не скажите, что еще, но это не для человеческого тела :) – Yoko

ответ

0

решение, которое работало для меня. Создайте 2d-массив для всего размера изображения. Если изображение 250x250, ваш массив будет таким же. Заполните этот массив с NSObjects, имея и intbodyInteger

Затем проведите пальцем по руке изображения, и в вашем touchesMoved взять координаты с места, и выбрать объект из 2d массива с помощью сотрудничества -определяет и устанавливает свой bodyInteger на 1.

Теперь, когда кто-то держит палец на руке, вы берете соответствующий объект из массива 2d и видите, что у него есть тело. Если у вас есть ограничения памяти, вы можете создать структуру вместо NSObject и сохранить только те точки, которые находятся внутри тела.

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

+0

Мы раньше пробовали что-то подобное, но проблема в том, что при нажатии, приложение должно вычислить огромное количество очков и сравнить их. Не работает хорошо, было слишком медленно. Спасибо, что! – Yoko

+0

@Yoko обновленный ответ для структур и многоугольника. Кроме того, я понимаю проблему с памятью для первой, но поиск должен быть в o (1). –

0

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

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

+0

Это большая работа, которая также, вероятно, замедлит время загрузки UIViewController, потому что изображение, которое я буду использовать в своем приложении, не относится к человеческому телу, но что-то намного сложнее. И на iPad, так больший экран ... Спасибо! – Yoko

Смежные вопросы