forked from TheAlgorithms/JavaScript
- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFloodFill.js
More file actions
Latest commit
103 lines (92 loc) · 3.76 KB
/
Copy pathFloodFill.js
File metadata and controls
103 lines (92 loc) · 3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/**
* Flood fill.
*
* Flood fill, also called seed fill, is an algorithm that determines and alters the area connected to a given node in a
* multi-dimensional array with some matching attribute. It is used in the "bucket" fill tool of paint programs to fill
* connected, similarly-colored areas with a different color.
*
* (description adapted from https://en.wikipedia.org/wiki/Flood_fill)
* @see https://www.techiedelight.com/flood-fill-algorithm/
*/
constneighbors=[[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]]
/**
* Implements the flood fill algorithm through a breadth-first approach using a queue.
*
* @param rgbData The image to which the algorithm is applied.
* @param location The start location on the image.
* @param targetColor The old color to be replaced.
* @param replacementColor The new color to replace the old one.
*/
exportfunctionbreadthFirstSearch(rgbData,location,targetColor,replacementColor){
if(location[0]<0||
location[0]>=rgbData.length||
location[1]<0||
location[1]>=rgbData[0].length){
thrownewError('location should point to a pixel within the rgbData')
}
constqueue=[]
queue.push(location)
while(queue.length>0){
breadthFirstFill(rgbData,location,targetColor,replacementColor,queue)
}
}
/**
* Implements the flood fill algorithm through a depth-first approach using recursion.
*
* @param rgbData The image to which the algorithm is applied.
* @param location The start location on the image.
* @param targetColor The old color to be replaced.
* @param replacementColor The new color to replace the old one.
*/
exportfunctiondepthFirstSearch(rgbData,location,targetColor,replacementColor){
if(location[0]<0||
location[0]>=rgbData.length||
location[1]<0||
location[1]>=rgbData[0].length){
thrownewError('location should point to a pixel within the rgbData')
}
depthFirstFill(rgbData,location,targetColor,replacementColor)
}
/**
* Utility-function to implement the breadth-first loop.
*
* @param rgbData The image to which the algorithm is applied.
* @param location The start location on the image.
* @param targetColor The old color to be replaced.
* @param replacementColor The new color to replace the old one.
* @param queue The locations that still need to be visited.
*/
functionbreadthFirstFill(rgbData,location,targetColor,replacementColor,queue){
constcurrentLocation=queue[0]
queue.shift()
if(rgbData[currentLocation[0]][currentLocation[1]]===targetColor){
rgbData[currentLocation[0]][currentLocation[1]]=replacementColor
for(leti=0;i<neighbors.length;i++){
constx=currentLocation[0]+neighbors[i][0]
consty=currentLocation[1]+neighbors[i][1]
if(x>=0&&x<rgbData.length&&y>=0&&y<rgbData[0].length){
queue.push([x,y])
}
}
}
}
/**
* Utility-function to implement the depth-first loop.
*
* @param rgbData The image to which the algorithm is applied.
* @param location The start location on the image.
* @param targetColor The old color to be replaced.
* @param replacementColor The new color to replace the old one.
*/
functiondepthFirstFill(rgbData,location,targetColor,replacementColor){
if(rgbData[location[0]][location[1]]===targetColor){
rgbData[location[0]][location[1]]=replacementColor
for(leti=0;i<neighbors.length;i++){
constx=location[0]+neighbors[i][0]
consty=location[1]+neighbors[i][1]
if(x>=0&&x<rgbData.length&&y>=0&&y<rgbData[0].length){
depthFirstFill(rgbData,[x,y],targetColor,replacementColor)
}
}
}
}