2013-03-26 16 views
8

Tworzę aplikację, w której próbuję uzyskać kolor bieżącego dotkniętego punktu, jeśli ten punkt nie jest czarny, to uruchomi iterację/rekursję i będzie przechowywać wszystkie nie czarne punkty w szyk. Używam tej funkcji dla iteracji:Sprawdzanie UIImage Pixel przez piksel

-(void)function:(CGFloat)positiveX:(CGFloat)positiveY:(CGFloat)negativeX:(CGFloat)negativeY 
{ 
    if (canDoPositiveX == YES) 
    { 
     //Checking in positive 
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
     { 
      CGPoint point = CGPointMake(positiveX, positiveY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX+1 :positiveY :negativeX :negativeY]; 
     } 
     else 
     { 
      canDoPositiveX = NO; 
     } 
    } 

    if (canDoPositiveY == YES) 
    { 
     //Checking in positive 
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 0"]) 
     { 
      CGPoint point = CGPointMake(positiveX, positiveY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX :positiveY+1 :negativeX :negativeY]; 
     } 
     else 
     { 
      canDoPositiveY = NO; 
     } 
    } 

    if (canDoNegativeX == YES) 
    { 
     //Checking in negative 
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(negativeX, negativeY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
     { 
      CGPoint point = CGPointMake(negativeX, negativeY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX :positiveY :negativeX-1 :negativeY]; 
     } 
     else 
     { 
      canDoNegativeX = NO; 
     } 
    } 

    if (canDoNegativeY == YES) 
    { 
     //Checking in negative   
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(negativeX, negativeY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
     { 
      negativeY -= 1; 
      CGPoint point = CGPointMake(negativeX, negativeY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX :positiveY :negativeX :negativeY-1]; 
     } 
     else 
     { 
      canDoNegativeY = NO; 
     } 
    } 

    NSLog(@"%u",[array count]); 

} 

Teraz jestem zmianę koloru tych punktach, które są w tablicy, ale tylko kolory linia prosta punktów, nie każdy piksel. Każda pomoc będzie naprawdę doceniana. Dzięki!

+0

Czy to jest poprawna składnia dla metody? Nie wydaje mi się to właściwe. Nazwałeś swoją funkcję "funkcją"? Niezbyt wyraźne. Co to są CanDoNegativeY i canDoNegativeX? – Odrakir

+0

To tylko kontrole (booleans). Ponadto nie mam pojęcia o rekursji tego typu f: P. Jeśli wiesz, jak to zrobić dobrze, uprzejmie powiedz mi. @Odrakir Mogę ci dać nagrodę w wysokości 100 za to. –

+1

Wiem, że są booleanami, ale obawiam się, że nie mogę ci pomóc, jeśli nie rozumiem, co robi twój kod. Co oznaczają ci Booleans? – Odrakir

Odpowiedz

2

Spróbuj tego. Nie mogę go przetestować, ale powinien zadziałać.

-(void)function:(CGFloat)positiveX:(CGFloat)positiveY:(CGFloat)negativeX:(CGFloat)negativeY 
{ 
    // Check your current point 
    if ([[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
    { 
     // reached the dead end (break recursion) 
     return; 
    } 

    CGPoint point = CGPointMake(positiveX, positiveY); 
    [array addObject:[NSValue valueWithCGPoint:point]]; 

    BOOL canDoPositiveX = ![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX+1, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]; 
    BOOL canDoPositiveY = ![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY+1)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]; 
    BOOL canDoNegativeX = ![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX-1, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]; 
    BOOL canDoNegativeY = ![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY-1)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]; 

    if (canDoPositiveX == YES) 
    { 
     [self function:positiveX+1 :positiveY :negativeX :negativeY]; 
    } 

    if (canDoPositiveY == YES) 
    { 
     [self function:positiveX :positiveY+1 :negativeX :negativeY]; 
    } 

    if (canDoNegativeX == YES) 
    { 
     [self function:positiveX :positiveY :negativeX-1 :negativeY]; 
    } 

    if (canDoNegativeY == YES) 
    { 
     [self function:positiveX :positiveY :negativeX :negativeY-1]; 
    } 

    NSLog(@"%u",[array count]); 
} 

również usunąć te zmienne z klasy canDoPositiveX, canDoPositiveY, canDoNegativeX, canDoNegativeY

+0

Dzięki za pomoc. Myślę, że nie dostałeś tego, co chcę robić. Najpierw je wyczyść. Mam UIImage, gdy użytkownik dotknie nie-czarnej części UIImage, powinien iterować i zapisać wszystkie nie-czarne punkty UIImage i jako iteracji znaleźć czarny punkt powinien przestać. Ale ten kod, który mi dałeś, nie działa. –

2

Spróbuj z tym kodem modyfikowany:

-(void)function:(CGFloat)positiveX:(CGFloat)positiveY:(CGFloat)negativeX:(CGFloat)negativeY 
{ 
    if (canDoPositiveX == YES) 
    { 
     //Checking in positive 
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
     { 
      CGPoint point = CGPointMake(positiveX, positiveY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX+1 :positiveY :negativeX :negativeY]; 
     } 
     else 
     { 
      canDoPositiveX = NO; 
      canDoPositiveY = YES; 
      canDoNegativeX = YES; 
      canDoNegativeY = YES; 
     } 
    } 

    if (canDoPositiveY == YES) 
    { 
     //Checking in positive 
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(positiveX, positiveY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 0"]) 
     { 
      CGPoint point = CGPointMake(positiveX, positiveY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX :positiveY+1 :negativeX :negativeY]; 
     } 
     else 
     { 
      canDoPositiveX = YES; 
      canDoPositiveY = NO; 
      canDoNegativeX = YES; 
      canDoNegativeY = YES; 
     } 
    } 

    if (canDoNegativeX == YES) 
    { 
     //Checking in negative 
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(negativeX, negativeY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
     { 
      CGPoint point = CGPointMake(negativeX, negativeY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX :positiveY :negativeX-1 :negativeY]; 
     } 
     else 
     { 
      canDoPositiveX = YES; 
      canDoPositiveY = YES; 
      canDoNegativeX = NO; 
      canDoNegativeY = YES; 
     } 
    } 

    if (canDoNegativeY == YES) 
    { 
     //Checking in negative   
     if (![[NSString stringWithFormat:@"%@",[self colorOfPoint:CGPointMake(negativeX, negativeY)]] isEqualToString:@"UIDeviceRGBColorSpace 0 0 0 1"]) 
     { 
      CGPoint point = CGPointMake(negativeX, negativeY); 
      [array addObject:[NSValue valueWithCGPoint:point]]; 
      [self function:positiveX :positiveY :negativeX :negativeY-1]; 
     } 
     else 
     { 
      canDoPositiveX = YES; 
      canDoPositiveY = YES; 
      canDoNegativeX = YES; 
      canDoNegativeY = NO; 
     } 
    } 

    NSLog(@"%u",[array count]); 
} 
+0

Cześć, dziękuję za odpowiedź. Próbowałem już tego kodu. Ale w tym kodzie problem polega na tym, że powoduje to przepełnienie stosu, jak wtedy, gdy próbowałem wywołać tę funkcję, moja aplikacja zatrzymała się, a następnie nagle się zawiesiła :( –