11let tiles = [ ] ;
22const tileImages = [ ] ;
3-
43let grid = [ ] ;
54
65const DIM = 25 ;
@@ -20,7 +19,7 @@ function preload() {
2019function removeDuplicatedTiles ( tiles ) {
2120 const uniqueTilesMap = { } ;
2221 for ( const tile of tiles ) {
23- const key = tile . edges . join ( ',' ) ; // ex: " ABB,BCB,BBA,AAA"
22+ const key = tile . edges . join ( ',' ) ; // ex: ' ABB,BCB,BBA,AAA'
2423 uniqueTilesMap [ key ] = tile ;
2524 }
2625 return Object . values ( uniqueTilesMap ) ;
@@ -80,7 +79,7 @@ function setup() {
8079function startOver ( ) {
8180 // Create cell for each spot on the grid
8281 for ( let i = 0 ; i < DIM * DIM ; i ++ ) {
83- grid [ i ] = new Cell ( tiles . length ) ;
82+ grid [ i ] = new Cell ( i % DIM , floor ( i / DIM ) , tiles . length ) ;
8483 }
8584}
8685
@@ -92,7 +91,7 @@ function checkValid(arr, valid) {
9291 // result in removing UP, DOWN, LEFT
9392 let element = arr [ i ] ;
9493 // console.log(element, valid.includes(element));
95- if ( ! valid . includes ( element ) ) {
94+ if ( ! valid . has ( element ) ) {
9695 arr . splice ( i , 1 ) ;
9796 }
9897 }
@@ -111,15 +110,7 @@ function draw() {
111110 const h = height / DIM ;
112111 for ( let j = 0 ; j < DIM ; j ++ ) {
113112 for ( let i = 0 ; i < DIM ; i ++ ) {
114- let cell = grid [ i + j * DIM ] ;
115- if ( cell . collapsed ) {
116- let index = cell . options [ 0 ] ;
117- image ( tiles [ index ] . img , i * w , j * h , w , h ) ;
118- } else {
119- noFill ( ) ;
120- stroke ( 51 ) ;
121- rect ( i * w , j * h , w , h ) ;
122- }
113+ grid [ posIdx ( i , j ) ] . draw ( w , h ) ;
123114 }
124115 }
125116
@@ -155,60 +146,50 @@ function draw() {
155146 }
156147 cell . options = [ pick ] ;
157148
158- const nextGrid = [ ] ;
159- for ( let j = 0 ; j < DIM ; j ++ ) {
160- for ( let i = 0 ; i < DIM ; i ++ ) {
161- let index = i + j * DIM ;
162- if ( grid [ index ] . collapsed ) {
163- nextGrid [ index ] = grid [ index ] ;
164- } else {
165- let options = new Array ( tiles . length ) . fill ( 0 ) . map ( ( x , i ) => i ) ;
166- // Look up
167- if ( j > 0 ) {
168- let up = grid [ i + ( j - 1 ) * DIM ] ;
169- let validOptions = [ ] ;
170- for ( let option of up . options ) {
171- let valid = tiles [ option ] . down ;
172- validOptions = validOptions . concat ( valid ) ;
173- }
174- checkValid ( options , validOptions ) ;
175- }
176- // Look right
177- if ( i < DIM - 1 ) {
178- let right = grid [ i + 1 + j * DIM ] ;
179- let validOptions = [ ] ;
180- for ( let option of right . options ) {
181- let valid = tiles [ option ] . left ;
182- validOptions = validOptions . concat ( valid ) ;
183- }
184- checkValid ( options , validOptions ) ;
185- }
186- // Look down
187- if ( j < DIM - 1 ) {
188- let down = grid [ i + ( j + 1 ) * DIM ] ;
189- let validOptions = [ ] ;
190- for ( let option of down . options ) {
191- let valid = tiles [ option ] . up ;
192- validOptions = validOptions . concat ( valid ) ;
193- }
194- checkValid ( options , validOptions ) ;
195- }
196- // Look left
197- if ( i > 0 ) {
198- let left = grid [ i - 1 + j * DIM ] ;
199- let validOptions = [ ] ;
200- for ( let option of left . options ) {
201- let valid = tiles [ option ] . right ;
202- validOptions = validOptions . concat ( valid ) ;
203- }
204- checkValid ( options , validOptions ) ;
205- }
149+ grid = optimizedNextGrid ( cell ) ;
150+ }
151+
152+ // propagate options from src to dest. If dest is above src, dir == UP.
153+ function propagate ( src , dest , dir ) {
154+ let oldLen = dest . options . length ;
155+ checkValid ( dest . options , src . validOptions ( dir ) ) ;
156+ return oldLen != dest . options . length ;
157+ }
206158
207- // I could immediately collapse if only one option left?
208- nextGrid [ index ] = new Cell ( options ) ;
159+ function optimizedNextGrid ( pick ) {
160+ let touched = [ posIdx ( pick . i , pick . j ) ] ;
161+
162+ while ( touched . length > 0 ) {
163+ let cell = grid [ touched . pop ( ) ] ;
164+
165+ let check = function ( i , j , dir ) {
166+ const idx = posIdx ( i , j ) ;
167+ if ( propagate ( cell , grid [ idx ] , dir ) ) {
168+ if ( ! touched . includes ( idx ) ) {
169+ touched . push ( idx ) ;
170+ }
209171 }
172+ } ;
173+
174+ if ( cell . i > 0 ) {
175+ check ( cell . i - 1 , cell . j , LEFT ) ;
176+ }
177+
178+ if ( cell . i < DIM - 1 ) {
179+ check ( cell . i + 1 , cell . j , RIGHT ) ;
180+ }
181+
182+ if ( cell . j > 0 ) {
183+ check ( cell . i , cell . j - 1 , UP ) ;
184+ }
185+
186+ if ( cell . j < DIM - 1 ) {
187+ check ( cell . i , cell . j + 1 , DOWN ) ;
210188 }
211189 }
190+ return grid ;
191+ }
212192
213- grid = nextGrid ;
193+ function posIdx ( i , j ) {
194+ return i + j * DIM ;
214195}
0 commit comments