2015-03-02 66 views
0

我有一個與切割圖像有關的問題,以知道用戶點擊哪個部分。對於一些人來說,這是一個相當簡單的練習,我想,但是我一直在爲此感到頭痛,無法找到合適的方法。如何根據座標切割圖像

我想這樣做的是挖掘這個圖像上的身體部位,並有設備告訴我它是什麼身體的一部分: The body

但我對如何編寫這個絕對沒有線索。

  • 我一直在考慮爲每個身體部位設置一個輪廓CGPoint數組,但如何獲得這些? 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]; 
    } 

當用戶點擊我做到這一點的看法:

- (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

出於好奇,你用它來做什麼? :) – 2015-03-02 09:30:42

+0

看看這個 - http://stackoverflow.com/questions/27169845/how-to-detect-tap-on-small-nearest-buttons-in-ios/27170107#27170107 – Kampai 2015-03-02 09:53:06

+0

@ iosDev82哈哈,可以不會告訴你,但它不適合人體:) – Yoko 2015-03-02 10:42:50

回答

0

爲我工作的溶液。爲整個圖像大小創建一個2d數組。如果圖像是250x250,您的數組將是相同的。 填充此陣列NSObjects,具有和intbodyInteger

然後拖動的圖像的手的手指,並在touchesMoved採取座標從位置,並通過使用共同接從2D陣列的對象座標並將其bodyInteger設置爲1.

現在,當有人將手指放在手邊時,您從2d數組中取出相應的對象並查看它具有哪個bodyInteger。 如果您有內存限制,您可以創建一個結構而不是NSObject,並只保存正文內的點。

或者,您可以爲每個身體部位創建一個邊界並保存。當用戶用手指觸摸時,可以看到該點是否在保存的多邊形內。

+0

我們之前嘗試過這樣的事情,但問題在於,當您點擊時,應用程序必須計算大量的點並比較它們。工作不好,速度太慢。感謝壽! – Yoko 2015-03-02 10:48:25

+0

@Yoko更新了結構和多邊形的答案。另外,我理解第一個記憶問題,但搜索應該在o(1)中。 – 2015-03-02 12:34:54

0

一個簡單但粗略的方法是在各個身體部位都有透明的按鈕。如果身體部位沒有被一個按鈕正確覆蓋,請添加多個較小的按鈕。

您可以向按鈕添加標籤以確定哪個按鈕/正文部分已被點按或將其連接到唯一的操作。

+0

這很多工作也可能會減慢UIViewController的加載時間,因爲我在我的應用程序中使用的圖像不是人體,而是更復雜的東西。而在iPad上,如此大的屏幕......謝謝你! – Yoko 2015-03-02 10:46:40