我在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++;
} …Run Code Online (Sandbox Code Playgroud) 我需要编写一个泛洪填充算法,用于更大的代码,根据它们所在的房间,用不同颜色的水填充洞穴的特定单元格.
由于某种原因,我的递归算法不起作用,并一直告诉我,我超过了最大递归深度,我不知道为什么.
我试图逐个细胞,检查它是AIR,STONE还是WATER,如果它是STONE或WATER,我希望它什么都不做.如果它是AIR,我希望它填充该单元格.
谁能给我一些提示或建议?
#flood fill algorithm
def fill(cave, row, col, color):
caveWidth = len(cave)
caveHeigth = len(cave[0])
if row > 0:
fill(cave, row-1, col, color) #left
if col > 0:
fill(cave, row, col-1, color) #up
if row < caveWidth-1:
fill(cave, row+1, col, color) #right
if col < caveHeigth-1:
fill(cave, row, col+1, color) #down
if cave[row][col] == STONE or cave[row][col] == WATER:
return
if cave[row][col] == AIR :
cave[row][col] = WATER
grid.fill_cell(row, col, color)
Run Code Online (Sandbox Code Playgroud) 我对Flood Fill算法完全不熟悉.我从维基百科(http://en.wikipedia.org/wiki/Flood_fill)查看了它.但没有变得那么明智.我试图在以下情况下使用它.我有一个矩阵:
matrix = [["a", "a", "b", "a", "a", "b"],
["a", "b", "b", "a", "b", "b"],
["b", "a", "b", "a", "a", "b"],
["b", "a", "b", "a", "b", "b"],
["a", "a", "b", "a", "a", "a"],
["a", "b", "b", "a", "a", "b"]]
Run Code Online (Sandbox Code Playgroud)
然后我让用户从矩阵中决定一个点.如果在那个给定点上"b"没有做任何事情.在另一种情况下,如果在给定点,"a"我想在洪水填充算法的帮助下将该给定点和所有周围或连接点"a"改为"c".
例如,假设用户决定矩阵[0] [0].那么新的矩阵将是:
matrix = [["c", "c", "b", "a", "a", "b"],
["c", "b", "b", "a", "b", "b"],
["b", "a", "b", "a", "a", "b"],
["b", "a", "b", "a", "b", "b"],
["a", "a", …Run Code Online (Sandbox Code Playgroud) 我正在尝试对具有不透明度的UIImage执行floodfill.我尝试用CG(http://en.wikipedia.org/wiki/Flood_fill)实现4路洪水填充,但读取像素颜色和着色像素会使它太慢.填充300x100px区域需要一分多钟.我需要一个像以下的功能:
-(UIImage*)floodFillOnImage:(UIImage*)image fromPoint:(CGPoint)start;
Run Code Online (Sandbox Code Playgroud)
这够快了.
有没有人在Objective-C中使用UIImages进行泛洪填充算法的工作实现或想法?我在一些iOS绘图应用程序中看到过这样的油漆桶工具.
我正在编写自己的 Flood Fill 实现。
我想出了这个代码:
public static void fillArea(int x, int y, int original, int fill, int[][] arr) {
Stack<int[]> q = new Stack<int[]>();
int[] w = new int[2]; //to the west
int[] e = new int[2]; //to the east
if (arr[x][y] != original) {
return;
}
q.push(new int[]{x, y});
while (!q.isEmpty()) {
int[] pos = (int[]) q.pop();
int i = pos[0];
int j = pos[1];
if (arr[i][j] == original) {
e[0] = i;
e[1] = j;
w[0] = i; …Run Code Online (Sandbox Code Playgroud) 即时通讯使用turbo C++在C中创建一个简单的图形库,因为我开发了一个非常原始的绘画风格程序版本,每个都运行良好,但我无法使洪水填充算法工作.我使用4路洪水填充算法,首先我尝试使用递归版本,但它只适用于小区域,填充大区域使其崩溃; 阅读我发现实现它的显式堆栈版本解决了问题,但我没有真正看到它.
我开发了这样的堆栈:
struct node
{
int x, y;
struct node *next;
};
int push(struct node **top, int x, int y)
{
struct node *newNode;
newNode = (struct node *)malloc(sizeof(struct node));
if(newNode == NULL) //If there is no more memory
return 0;
newNode->x = x;
newNode->y = y;
newNode->next = *top;
*top = newNode;
return 1; //If we push the element correctly
}
int pop(struct node **top, int &x, int &y)
{
if(*top == NULL) //If the stack is …Run Code Online (Sandbox Code Playgroud) 我在表单上有一个TImage组件.我需要实现以下功能:
(如果鼠标指针在红色点上方,则将"填充颜色为绿色"应用于该点)
这里的"填充颜色"是指Paint的功能"填充颜色".TImage中有类似的东西吗?或者我应该自己实现这个功能?
谢谢
PS我使用Delphi 7
我正在尝试用Java制作一个类似扫雷的游戏,我已经完成了大部分工作,但我需要帮助的是FloodFill - http://en.wikipedia.org/wiki/Flood_fill.没有真正帮助......但有人可以解释它是如何工作的吗?我看过网上但我并不理解这个解释,所以我会在这里问一下会更容易.
在我的扫雷中,我有:
JButton[] btn = new JButton[100]//buttons being clicked and displaying the values/bombs
int[] mines = new int[100];//int array holding the values for each button.
Run Code Online (Sandbox Code Playgroud)
网格是10x10网格,所以说你点击的按钮是btn [14],
btn[4] // north of btn[14](14-10)
btn[24] // south of btn[14](14+10)
btn[13] // west of btn[14](14-1)
btn[15] // east of btn[14](14+1)
Run Code Online (Sandbox Code Playgroud)
回到这个问题,有人可以向我解释一下吗?
编辑: 我将我的代码更改为2D,而不是上面的代码现在是
btn[1][4]//row one, column 4
Run Code Online (Sandbox Code Playgroud)
单击该按钮时,我希望它检查名为mines [] []的变量,该变量具有值,如果该值等于0(在初始单击的周围),则更改BG
btn[x][y].setBackground(Color.GRAY);
Run Code Online (Sandbox Code Playgroud) 背景:
我正在使用Javascript中基于图块的游戏,其中角色在地图周围自由移动(没有对角线 - 左/右/上/下)并且当他在地图上移动时填充图块.有三种图块类型 - 您填充的图块(蓝色),当前路径(红色)和空图块(黑色).也有在地图上移动的敌人(星星),但仅限于空白区域.目标是尽可能多地填充地图.
地图的大小约为40x40.地图外部周围有一个1瓦厚的边框,已经"填充"(蓝色).
我已经确定泛洪填充算法可以在需要时填充区域的区域.但是,我的问题如下:
问题陈述: 如果没有敌人,我想只填充地图的一部分.
我的问题:
我可以运行泛洪填充算法并在它到达敌人占用的区块时停止它 - 但是,这是最有效的方法(对于实时游戏)吗?
如果是,我如何以系统的方式确定从何处开始算法,因为有多个区域需要检查,并且角色不必在完美的直线上移动(可以向上/向下/向右/向左曲折) ,但不能对角移动).
图片示例1(图片说明更好):
注意:一旦到达另一个填充区域,红色区域将变为蓝色(填充).在下面的示例中,包含区域中没有敌人,因此该区域已填满.

图片示例2:
在第二个例子中,在包含区域内(和外部区域 - 未显示)中有一个敌人,所以只有线条被填满.

总结:这种填充的最佳方法是什么?洪水填充是确定是否填充的最佳选择 - 40x40是一个非常大的计算.如果是,我如何确定从哪个瓷砖开始?
我正在尝试实施洪水填充.这适用于500x500矩阵:
int ud[]={1,0,-1,0};
int lr[]={0,1,0,-1};
void fl(int x,int y)
{
if(x<=0||x>n||y<=0||y>m)
return;
if(mat[x][y]) // seg fault occurs for this condition
return;
mat[x][y]=1;
for(int i=0;i<4;i++)
fl(x+ud[i],y+lr[i]);
}
Run Code Online (Sandbox Code Playgroud)
但是在600 X 600矩阵上,它会产生分段错误.什么可能导致这个?