1
+ function removeFromArray ( arr , elt ) {
2
+ for ( var i = arr . length - 1 ; i >= 0 ; i -- ) {
3
+ if ( arr [ i ] == elt ) {
4
+ arr . splice ( i , 1 ) ;
5
+ }
6
+ }
7
+ }
8
+
9
+ function heuristic ( a , b ) {
10
+ var d = dist ( a . i , a . j , b . i , b . j ) ;
11
+ return d ;
12
+ }
13
+
14
+ var cols = 50 ;
15
+ var rows = 50 ;
16
+
17
+ var grid = new Array ( cols ) ;
18
+
19
+ var openSet = [ ] ;
20
+ var closedSet = [ ] ;
21
+
22
+ var start ;
23
+ var end ;
24
+
25
+ var w , h ;
26
+
27
+ var path = [ ] ;
28
+
29
+ function setup ( ) {
30
+ createCanvas ( 400 , 400 ) ;
31
+ console . log ( 'A*' ) ;
32
+
33
+ w = width / cols ;
34
+ h = height / rows ;
35
+
36
+ for ( var i = 0 ; i < cols ; i ++ ) {
37
+ grid [ i ] = new Array ( rows ) ;
38
+ }
39
+
40
+ for ( var i = 0 ; i < cols ; i ++ ) {
41
+ for ( var j = 0 ; j < rows ; j ++ ) {
42
+ grid [ i ] [ j ] = new Spot ( i , j ) ;
43
+ }
44
+ }
45
+
46
+ for ( var i = 0 ; i < cols ; i ++ ) {
47
+ for ( var j = 0 ; j < rows ; j ++ ) {
48
+ grid [ i ] [ j ] . addNeighbors ( grid ) ;
49
+ }
50
+ }
51
+
52
+
53
+ start = grid [ 0 ] [ 0 ] ;
54
+ end = grid [ cols - 1 ] [ rows - 1 ] ;
55
+ start . wall = false ;
56
+ end . wall = false ;
57
+
58
+ openSet . push ( start ) ;
59
+ }
60
+
61
+ function draw ( ) {
62
+
63
+ if ( openSet . length > 0 ) {
64
+
65
+ var winner = 0 ;
66
+ for ( var i = 0 ; i < openSet . length ; i ++ ) {
67
+ if ( openSet [ i ] . f < openSet [ winner ] . f ) {
68
+ winner = i ;
69
+ }
70
+ }
71
+ var current = openSet [ winner ] ;
72
+
73
+ if ( current === end ) {
74
+ noLoop ( ) ;
75
+ console . log ( "DONE!" ) ;
76
+ }
77
+
78
+ removeFromArray ( openSet , current ) ;
79
+ closedSet . push ( current ) ;
80
+
81
+ var neighbors = current . neighbors ;
82
+ for ( var i = 0 ; i < neighbors . length ; i ++ ) {
83
+ var neighbor = neighbors [ i ] ;
84
+
85
+ if ( ! closedSet . includes ( neighbor ) && ! neighbor . wall ) {
86
+ var tempG = current . g + heuristic ( neighbor , current ) ;
87
+
88
+ var newPath = false ;
89
+ if ( openSet . includes ( neighbor ) ) {
90
+ if ( tempG < neighbor . g ) {
91
+ neighbor . g = tempG ;
92
+ newPath = true ;
93
+ }
94
+ } else {
95
+ neighbor . g = tempG ;
96
+ newPath = true ;
97
+ openSet . push ( neighbor ) ;
98
+ }
99
+
100
+ if ( newPath ) {
101
+ neighbor . h = heuristic ( neighbor , end ) ;
102
+ neighbor . f = neighbor . g + neighbor . h ;
103
+ neighbor . previous = current ;
104
+ }
105
+ }
106
+
107
+ }
108
+ } else {
109
+ console . log ( 'no solution' ) ;
110
+ noLoop ( ) ;
111
+ return ;
112
+ }
113
+
114
+ background ( 255 ) ;
115
+
116
+ for ( var i = 0 ; i < cols ; i ++ ) {
117
+ for ( var j = 0 ; j < rows ; j ++ ) {
118
+ grid [ i ] [ j ] . show ( ) ;
119
+ }
120
+ }
121
+
122
+ for ( var i = 0 ; i < closedSet . length ; i ++ ) {
123
+ closedSet [ i ] . show ( color ( 255 , 0 , 0 , 50 ) ) ;
124
+ }
125
+
126
+ for ( var i = 0 ; i < openSet . length ; i ++ ) {
127
+ openSet [ i ] . show ( color ( 0 , 255 , 0 , 50 ) ) ;
128
+ }
129
+
130
+
131
+ path = [ ] ;
132
+ var temp = current ;
133
+ path . push ( temp ) ;
134
+ while ( temp . previous ) {
135
+ path . push ( temp . previous ) ;
136
+ temp = temp . previous ;
137
+ }
138
+
139
+
140
+
141
+ noFill ( ) ;
142
+ stroke ( 255 , 0 , 200 ) ;
143
+ strokeWeight ( w / 2 ) ;
144
+ beginShape ( ) ;
145
+ for ( var i = 0 ; i < path . length ; i ++ ) {
146
+ vertex ( path [ i ] . i * w + w / 2 , path [ i ] . j * h + h / 2 ) ;
147
+ }
148
+ endShape ( ) ;
149
+
150
+
151
+
152
+ }
0 commit comments