1+ function sleep ( ms ) {
2+ return new Promise ( resolve => setTimeout ( resolve , ms ) )
3+ }
4+
5+ function banner ( ) {
6+ let fps = 17
7+ let canvas = document . getElementById ( "banner" )
8+ let w = 5
9+ let cw = 300
10+ let ch = 90
11+ let nc = 'hsl(0, 0%, 30%)'
12+ let bc = 'hsl(0, 0%, 20%)'
13+ let tc = 'hsl(0, 0%, 30%)'
14+ function makeNode ( cx , cy , id ) {
15+ let g = document . createElementNS ( "http://www.w3.org/2000/svg" , 'g' )
16+ canvas . appendChild ( g )
17+ g . setAttribute ( 'class' , 'node' )
18+
19+ let b = document . createElementNS ( "http://www.w3.org/2000/svg" , 'rect' )
20+ g . appendChild ( b )
21+
22+ b . setAttribute ( 'x' , cx - w / 2 )
23+ b . setAttribute ( 'y' , cy - w / 2 )
24+ b . setAttribute ( 'width' , w )
25+ b . setAttribute ( 'height' , w )
26+
27+ let node = { }
28+ node . element = g
29+ node . x = cx
30+ node . y = cy
31+ node . children = [ ]
32+ node . parent = undefined
33+ node . active = false
34+ node . responces = 0
35+ node . propagate = async ( ) => {
36+ return new Promise ( async resolve => {
37+ if ( node . active == false ) {
38+ node . active = true
39+ g . setAttribute ( 'class' , '' )
40+ let result = [ ]
41+ for ( let i = 0 ; i < node . children . length ; i ++ ) {
42+ result . push ( node . children [ i ] ( ) )
43+ }
44+ await Promise . all ( result )
45+ }
46+ else {
47+ while ( node . active == true ) {
48+ await sleep ( 500 )
49+ }
50+ }
51+ g . setAttribute ( 'class' , 'node' )
52+ resolve ( )
53+ } )
54+ }
55+ b . onmouseover = node . propagate
56+ return node
57+ }
58+ function makeBranch ( from , to ) {
59+ if ( to . parent != undefined )
60+ throw to + " already has a parent" ;
61+ let x1 = from . x
62+ let y1 = from . y
63+ let x2 = to . x
64+ let y2 = to . y
65+ let mag = Math . sqrt ( Math . pow ( ( x2 - x1 ) , 2 ) + Math . pow ( ( y2 - y1 ) , 2 ) )
66+ let xn = ( x2 - x1 ) / mag
67+ let yn = ( y2 - y1 ) / mag
68+ let line = document . createElementNS ( "http://www.w3.org/2000/svg" , 'line' )
69+ line . setAttribute ( 'x1' , x1 + xn * w / 2 )
70+ line . setAttribute ( 'y1' , y1 + yn * w / 2 )
71+ line . setAttribute ( 'x2' , x2 - xn * w / 2 )
72+ line . setAttribute ( 'y2' , y2 - yn * w / 2 )
73+ line . setAttribute ( 'stroke' , bc )
74+ line . setAttribute ( 'stroke-width' , '0.1' )
75+
76+ let circle = document . createElementNS ( "http://www.w3.org/2000/svg" , 'circle' )
77+
78+ circle . setAttribute ( 'cx' , x1 )
79+ circle . setAttribute ( 'cy' , y1 )
80+ circle . setAttribute ( 'r' , '0' )
81+ circle . setAttribute ( 'stroke' , tc )
82+ circle . setAttribute ( 'stroke-width' , '1' )
83+ circle . setAttribute ( 'fill' , tc )
84+
85+ canvas . appendChild ( line )
86+ canvas . appendChild ( circle )
87+
88+ async function propagate ( ) {
89+ return new Promise ( async resolve => {
90+ circle . setAttribute ( 'r' , '1' )
91+ let curx = x1
92+ let cury = y1
93+
94+ while ( Math . sqrt ( Math . pow ( ( x2 - curx ) , 2 ) + Math . pow ( ( y2 - cury ) , 2 ) ) > 1 ) {
95+ curx += xn * 1
96+ cury += yn * 1
97+ circle . setAttribute ( 'cx' , curx )
98+ circle . setAttribute ( 'cy' , cury )
99+ await sleep ( fps )
100+ }
101+
102+ if ( to . children . length != 0 ) {
103+ circle . setAttribute ( 'r' , '0' )
104+ await to . propagate ( )
105+ circle . setAttribute ( 'r' , '1' )
106+
107+ }
108+ while ( Math . sqrt ( Math . pow ( ( x1 - curx ) , 2 ) + Math . pow ( ( y1 - cury ) , 2 ) ) > 1 ) {
109+ curx -= xn * 1
110+ cury -= yn * 1
111+ circle . setAttribute ( 'cx' , curx )
112+ circle . setAttribute ( 'cy' , cury )
113+ await sleep ( fps )
114+ }
115+ circle . setAttribute ( 'r' , '0' )
116+ from . active = false
117+ resolve ( )
118+ } )
119+ }
120+ from . children . push ( propagate )
121+ }
122+ function makeTree ( lx , ux , y , inc , d , b , c ) {
123+ if ( 0 == d )
124+ return undefined ;
125+
126+
127+ let parent = makeNode ( ( ux - lx ) / 2 + lx , y )
128+ for ( let i = 0 ; i < b ; i ++ ) {
129+
130+ let child = makeTree ( ( ux - lx ) / b * ( i + 1 ) + lx , ( ux - lx ) / b * i + lx , y - inc , inc * 1.3 , d - 1 , ( c == true ? 2 : b - 1 ) , ( c == false && b == 3 ? true : false ) )
131+ if ( child != undefined ) {
132+ makeBranch ( parent , child )
133+ }
134+ }
135+
136+ return parent
137+ }
138+ makeTree ( 0 , cw , ch - w , 10 , 6 , 4 , false )
139+
140+ function makeText ( ) {
141+ let textele = document . createElementNS ( 'http://www.w3.org/2000/svg' , 'text' )
142+ let textnode = document . createTextNode ( "Adversarial Search" )
143+ textele . setAttribute ( 'x' , '150' )
144+ textele . setAttribute ( 'y' , '50' )
145+ textele . setAttribute ( 'alignment-baseline' , 'middle' )
146+ textele . setAttribute ( 'text-anchor' , 'middle' )
147+ textele . setAttribute ( 'id' , 'htext' )
148+ textele . appendChild ( textnode )
149+ canvas . appendChild ( textele )
150+ }
151+
152+ makeText ( )
153+ let state = true
154+ let brk = 1.5
155+ function resize ( ) {
156+ if ( state ) {
157+ if ( window . innerWidth / window . innerHeight < brk ) {
158+ state = false
159+ canvas . setAttribute ( "viewBox" , "100 15 100 75" )
160+ canvas . removeChild ( document . getElementById ( "htext" ) ) ;
161+ makeText ( )
162+ }
163+ }
164+ else {
165+ if ( window . innerWidth / window . innerHeight >= brk ) {
166+ state = true
167+ canvas . setAttribute ( "viewBox" , "0 0 300 90" )
168+ }
169+ }
170+
171+ }
172+ window . addEventListener ( "resize" , resize )
173+ resize ( )
174+
175+ }
0 commit comments