RVN*_*RVN 3 iphone objective-c flood-fill ipad
我在iPad上使用Flood Filling作为我的一个Coloring应用程序.
该应用程序基本上填充图像的黑线内的颜色,我能够毫无问题地做到这一点,但它太慢了.
结论:
我终于设法使用以下Class为iPhone/iPad制作了可接受的Floodfill
请原谅任何僵尸代码:),建议改进总是欢迎
*如何使用* 创建CanvasView对象并设置originalImage(这应该是带有黑色线条的无色/彩色图像,黑色线条以外的区域必须是清晰的颜色),您可以在绘制后访问图像的coloredImage.
.h文件
-(void)floodFillAtPoint:(CGPoint)atPoint
{
Stack *stack = [[Stack alloc] init];
[stack push:[StackPoint pointWithPoint:atPoint]];
StackPoint *currentPoint = nil;
int counter = 0;
while ((currentPoint = [stack pop]))
{
CGPoint aPoint = currentPoint.point;//CGPointMake(pointPixel.x, pointPixel.y);
[self setColorAtPoint:aPoint];
CGPoint bPoint = aPoint;
bPoint.x+=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
bPoint = aPoint;
bPoint.x-=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
bPoint = aPoint;
bPoint.y+=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
bPoint = aPoint;
bPoint.y-=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
counter++;
}
[stack release];
}
Run Code Online (Sandbox Code Playgroud)
和.m文件
-(void)floodFillAtPoint:(CGPoint)atPoint
{
Stack *stack = [[Stack alloc] init];
[stack push:[StackPoint pointWithPoint:atPoint]];
StackPoint *currentPoint = nil;
int counter = 0;
while ((currentPoint = [stack pop]))
{
CGPoint aPoint = currentPoint.point;//CGPointMake(pointPixel.x, pointPixel.y);
[self setColorAtPoint:aPoint];
CGPoint bPoint = aPoint;
bPoint.x+=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
bPoint = aPoint;
bPoint.x-=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
bPoint = aPoint;
bPoint.y+=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
bPoint = aPoint;
bPoint.y-=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
counter++;
}
[stack release];
}
Run Code Online (Sandbox Code Playgroud)
附加信息:
StackPoint.h
-(void)floodFillAtPoint:(CGPoint)atPoint
{
Stack *stack = [[Stack alloc] init];
[stack push:[StackPoint pointWithPoint:atPoint]];
StackPoint *currentPoint = nil;
int counter = 0;
while ((currentPoint = [stack pop]))
{
CGPoint aPoint = currentPoint.point;//CGPointMake(pointPixel.x, pointPixel.y);
[self setColorAtPoint:aPoint];
CGPoint bPoint = aPoint;
bPoint.x+=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
bPoint = aPoint;
bPoint.x-=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
bPoint = aPoint;
bPoint.y+=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
bPoint = aPoint;
bPoint.y-=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
counter++;
}
[stack release];
}
Run Code Online (Sandbox Code Playgroud)
StackPoint.m
-(void)floodFillAtPoint:(CGPoint)atPoint
{
Stack *stack = [[Stack alloc] init];
[stack push:[StackPoint pointWithPoint:atPoint]];
StackPoint *currentPoint = nil;
int counter = 0;
while ((currentPoint = [stack pop]))
{
CGPoint aPoint = currentPoint.point;//CGPointMake(pointPixel.x, pointPixel.y);
[self setColorAtPoint:aPoint];
CGPoint bPoint = aPoint;
bPoint.x+=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
bPoint = aPoint;
bPoint.x-=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
bPoint = aPoint;
bPoint.y+=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
bPoint = aPoint;
bPoint.y-=1;
if([self checkForValidRegionAtPoint:bPoint])
[stack push:[StackPoint pointWithPoint:bPoint]];
counter++;
}
[stack release];
}
Run Code Online (Sandbox Code Playgroud)
我希望这有任何帮助!!! 请享用 :)
使用Objective-C对象来表示每个像素将会非常缓慢并且几乎没有任何好处.
使用不同的数据结构来表示您的位图,就像各种CG*位图封装机制之一一样.然后直接旋转位图中的位.这将是吨和吨更快.