如何根据坐标切割图像

时间:2015-03-02 09:24:57

标签: ios vector uiimage

我有一个与切割图像有关的问题,以了解用户点击了哪个部分。对于一些人来说,这是一个相当简单的练习,我想,但是我一直在讨论这个问题并找不到合适的方法。

我想要做的是点击此图像上的身体部位,让设备告诉我它是什么身体部位: The body

但我完全不知道如何编程。

  • 我一直在考虑为每个身体部位设置一个大纲CGPoints数组,但是如何获得这些? Photoshop坐标?然后将触摸点计算到最近的CGPoint上?

  • 有人给我的想法是在不同的区域切割图像,每个身体部位都有不同的图像。但问题是每个图像都是一个矩形,这使得很难知道究竟是什么触摸了。还需要一组点,特别是对于重叠图像。

  • 另一个人告诉我,这只能使用SpriteKit。

让我知道,聪明的窥视:)

更新: 我想到了!我正在制作很多包含手,点,腿的点数......一个例子:

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

当用户点击视图时,我这样做:

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

}

2 个答案:

答案 0 :(得分:0)

对我有用的解决方案。为整个图像大小创建一个二维数组。如果图像是250x250,那么您的阵列将是相同的。 使用NSObjects填充此数组,并使用int bodyInteger

然后将手指拖到图像的手上,并在touchesMoved中从位置获取坐标,并使用坐标从其二维阵列中选择对象并将其bodyInteger设置为1 。

现在当有人把手指放在手上时,你从2d数组中获取相应的对象,看看它有什么bodyInteger。 如果你有内存限制,你可以创建一个结构而不是NSObject,只保存在正文中的点。

或者,您可以为每个身体部位创建边界并保存。当用户用手指触摸时,您可以查看该点是否在保存的多边形内。

答案 1 :(得分:0)

粗略但简单的方法是在各个身体部位上设置透明按钮。如果单个按钮没有正确覆盖身体部位,请添加多个较小的按钮。

您可以在按钮上添加标签,以识别哪个按钮/正文部分被轻击或将它们连接到唯一的动作。