2 USING: kernel syntax accessors sequences
4 combinators.cleave combinators.short-circuit
5 locals math math.constants math.functions math.libm
6 math.order math.points math.vectors
7 namespaces random sequences threads ui ui.gadgets ui.gestures
17 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
23 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
25 : 2random ( a b -- num ) 2dup swap - 100 / <range> random ;
27 : 1random ( b -- num ) 0 swap 2random ;
29 : at-fraction ( seq fraction -- val ) over length 1- * swap nth ;
31 : at-fraction-of ( fraction seq -- val ) swap at-fraction ;
33 : mouse ( -- point ) hand-loc get ;
35 : mouse-x ( -- x ) mouse first ;
36 : mouse-y ( -- y ) mouse second ;
38 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
39 ! bubble-chamber.particle
40 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
42 GENERIC: collide ( particle -- )
43 GENERIC: move ( particle -- )
45 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
48 bubble-chamber pos vel speed speed-d theta theta-d theta-dd myc mya ;
50 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
52 : initialize-particle ( particle -- particle )
63 0 0 0 1 rgba boa >>myc
64 0 0 0 1 rgba boa >>mya ;
66 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
68 : center ( particle -- point ) bubble-chamber>> size>> 2 v/n ;
70 DEFER: collision-theta
72 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
74 : move-by ( obj delta -- obj ) over pos>> v+ >>pos ;
76 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
78 : theta-dd-small? ( par limit -- par ? ) >r dup theta-dd>> abs r> < ;
80 : random-theta-dd ( par a b -- par ) 2random >>theta-dd ;
82 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
84 : turn ( particle -- particle )
86 [ speed>> ] [ theta>> { sin cos } <arr> ] bi n*v
89 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
91 : step-theta ( p -- p ) [ ] [ theta>> ] [ theta-d>> ] tri + >>theta ;
92 : step-theta-d ( p -- p ) [ ] [ theta-d>> ] [ theta-dd>> ] tri + >>theta-d ;
93 : step-speed-sub ( p -- p ) [ ] [ speed>> ] [ speed-d>> ] tri - >>speed ;
94 : step-speed-mul ( p -- p ) [ ] [ speed>> ] [ speed-d>> ] tri * >>speed ;
96 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
98 :: out-of-bounds? ( PARTICLE -- ? )
99 [let | X [ PARTICLE pos>> first ]
100 Y [ PARTICLE pos>> second ]
101 WIDTH [ PARTICLE bubble-chamber>> size>> first ]
102 HEIGHT [ PARTICLE bubble-chamber>> size>> second ] |
104 [let | LEFT [ WIDTH neg ]
106 BOTTOM [ HEIGHT neg ]
109 { [ X LEFT < ] [ X RIGHT > ] [ Y BOTTOM < ] [ Y TOP > ] } 0|| ] ] ;
111 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
112 ! bubble-chamber.particle.axion
113 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
115 TUPLE: <axion> < particle ;
117 : axion ( -- <axion> ) <axion> new initialize-particle ;
119 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
121 METHOD: collide ( <axion> -- )
124 2 pi * 1random >>theta
125 1.0 6.0 2random >>speed
126 0.998 1.000 2random >>speed-d
130 [ 0.00001 theta-dd-small? ] [ -0.001 0.001 random-theta-dd ] [ ] while
134 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
136 : dy>alpha ( dy -- alpha ) neg 6 * 30 + 255.0 / ;
138 ! : axion-white ( dy -- dy ) dup 1 swap dy>alpha {2} \ stroke-color set ;
139 ! : axion-black ( dy -- dy ) dup 0 swap dy>alpha {2} \ stroke-color set ;
141 : axion-white ( dy -- dy ) dup 1 swap dy>alpha gray boa \ stroke-color set ;
142 : axion-black ( dy -- dy ) dup 0 swap dy>alpha gray boa \ stroke-color set ;
144 : axion-point- ( particle dy -- particle ) >r dup pos>> r> v-y point ;
145 : axion-point+ ( particle dy -- particle ) >r dup pos>> r> v+y point ;
147 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
149 METHOD: move ( <axion> -- )
151 T{ gray f 0.06 0.59 } \ stroke-color set
154 1 4 [a,b] [ axion-white axion-point- ] each
155 1 4 [a,b] [ axion-black axion-point+ ] each
165 [ ] [ speed-d>> 0.9999 * ] bi >>speed-d
169 dup speed>> neg >>speed
170 dup speed-d>> neg 2 + >>speed-d
172 100 random 30 > [ collide ] [ drop ] if
177 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
178 ! bubble-chamber.particle.hadron
179 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
181 TUPLE: <hadron> < particle ;
183 : hadron ( -- <hadron> ) <hadron> new initialize-particle ;
185 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
187 METHOD: collide ( <hadron> -- )
190 2 pi * 1random >>theta
191 0.5 3.5 2random >>speed
192 0.996 1.001 2random >>speed-d
196 [ 0.00001 theta-dd-small? ] [ -0.001 0.001 random-theta-dd ] [ ] while
198 0 1 0 1 rgba boa >>myc
202 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
204 METHOD: move ( <hadron> -- )
206 T{ gray f 1 0.11 } \ stroke-color set dup pos>> 1 v-y point
207 T{ gray f 0 0.11 } \ stroke-color set dup pos>> 1 v+y point
222 100 random 70 > [ dup collide ] when
226 dup out-of-bounds? [ collide ] [ drop ] if ;
228 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
229 ! bubble-chamber.particle.muon.colors
230 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
232 : good-colors ( -- seq )
234 T{ rgba f 0.23 0.14 0.17 1 }
235 T{ rgba f 0.23 0.14 0.15 1 }
236 T{ rgba f 0.21 0.14 0.15 1 }
237 T{ rgba f 0.51 0.39 0.33 1 }
238 T{ rgba f 0.49 0.33 0.20 1 }
239 T{ rgba f 0.55 0.45 0.32 1 }
240 T{ rgba f 0.69 0.63 0.51 1 }
241 T{ rgba f 0.64 0.39 0.18 1 }
242 T{ rgba f 0.73 0.42 0.20 1 }
243 T{ rgba f 0.71 0.45 0.29 1 }
244 T{ rgba f 0.79 0.45 0.22 1 }
245 T{ rgba f 0.82 0.56 0.34 1 }
246 T{ rgba f 0.88 0.72 0.49 1 }
247 T{ rgba f 0.85 0.69 0.40 1 }
248 T{ rgba f 0.96 0.92 0.75 1 }
249 T{ rgba f 0.99 0.98 0.87 1 }
250 T{ rgba f 0.85 0.82 0.69 1 }
251 T{ rgba f 0.99 0.98 0.87 1 }
252 T{ rgba f 0.82 0.82 0.79 1 }
253 T{ rgba f 0.65 0.69 0.67 1 }
254 T{ rgba f 0.53 0.60 0.55 1 }
255 T{ rgba f 0.57 0.53 0.68 1 }
256 T{ rgba f 0.47 0.42 0.56 1 }
259 : anti-colors ( -- seq ) good-colors <reversed> ;
261 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
263 : color-fraction ( particle -- particle fraction ) dup theta>> pi + 2 pi * / ;
265 : set-good-color ( particle -- particle )
266 color-fraction dup 0 1 between?
267 [ good-colors at-fraction-of >>myc ]
271 : set-anti-color ( particle -- particle )
272 color-fraction dup 0 1 between?
273 [ anti-colors at-fraction-of >>mya ]
277 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
278 ! bubble-chamber.particle.muon
279 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
281 TUPLE: <muon> < particle ;
283 : muon ( -- <muon> ) <muon> new initialize-particle ;
285 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
287 METHOD: collide ( <muon> -- )
290 2 32 [a,b] random >>speed
291 0.0001 0.001 2random >>speed-d
293 dup collision-theta -0.1 0.1 2random + >>theta
297 [ 0.001 theta-dd-small? ] [ -0.1 0.1 random-theta-dd ] [ ] while
304 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
306 METHOD: move ( <muon> -- )
310 [let | WIDTH [ MUON bubble-chamber>> size>> first ] |
314 dup myc>> 0.16 >>alpha \ stroke-color set
317 dup mya>> 0.16 >>alpha \ stroke-color set
318 dup pos>> first2 [ WIDTH swap - ] dip 2array point
321 [ speed>> ] [ theta>> { sin cos } <arr> ] bi n*v
328 dup out-of-bounds? [ collide ] [ drop ] if ] ] ;
330 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
331 ! bubble-chamber.particle.quark
332 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
334 TUPLE: <quark> < particle ;
336 : quark ( -- <quark> ) <quark> new initialize-particle ;
338 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
340 METHOD: collide ( <quark> -- )
343 dup collision-theta -0.11 0.11 2random + >>theta
344 0.5 3.0 2random >>speed
346 0.996 1.001 2random >>speed-d
350 [ 0.00001 theta-dd-small? ] [ -0.001 0.001 random-theta-dd ] [ ] while
354 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
356 METHOD: move ( <quark> -- )
360 [let | WIDTH [ QUARK bubble-chamber>> size>> first ] |
364 dup myc>> 0.13 >>alpha \ stroke-color set
367 dup pos>> first2 [ WIDTH swap - ] dip 2array point
369 [ ] [ vel>> ] bi move-by
379 dup speed>> neg >>speed
380 2 over speed-d>> - >>speed-d
384 dup out-of-bounds? [ collide ] [ drop ] if ] ] ;
386 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
388 USE: syntax ! Switch back to non-multi-method 'TUPLE:' syntax
390 TUPLE: <bubble-chamber> < <frame-buffer>
391 paused particles collision-theta size ;
393 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
395 ! : randomize-collision-theta ( bubble-chamber -- bubble-chamber )
396 ! 0 2 pi * 0.001 <range> random >>collision-theta ;
398 : randomize-collision-theta ( bubble-chamber -- bubble-chamber )
399 pi neg pi 0.001 <range> random >>collision-theta ;
401 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
403 : collision-theta ( particle -- theta ) bubble-chamber>> collision-theta>> ;
405 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
407 M: <bubble-chamber> pref-dim* ( gadget -- dim ) size>> ;
409 M: <bubble-chamber> ungraft* ( <bubble-chamber> -- ) t >>paused drop ;
411 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
413 : iterate-particle ( particle -- ) move ;
415 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
417 M:: <bubble-chamber> update-frame-buffer ( BUBBLE-CHAMBER -- )
419 BUBBLE-CHAMBER particles>> [ iterate-particle ] each ;
421 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
423 : iterate-system ( <bubble-chamber> -- ) drop ;
425 :: start-bubble-chamber-thread ( GADGET -- )
426 GADGET f >>paused drop
431 [ GADGET iterate-system GADGET relayout-1 1 milliseconds sleep t ]
438 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
440 : bubble-chamber ( -- <bubble-chamber> )
441 <bubble-chamber> new-gadget
443 randomize-collision-theta ;
445 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
447 : bubble-chamber-window ( -- <bubble-chamber> )
449 dup start-bubble-chamber-thread
450 dup "Bubble Chamber" open-window ;
452 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
454 :: add-particle ( BUBBLE-CHAMBER PARTICLE -- bubble-chamber )
456 PARTICLE BUBBLE-CHAMBER >>bubble-chamber drop
458 BUBBLE-CHAMBER BUBBLE-CHAMBER particles>> PARTICLE suffix >>particles ;
460 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
462 :: mouse->collision-theta ( BUBBLE-CHAMBER -- BUBBLE-CHAMBER )
464 BUBBLE-CHAMBER size>> 2 v/n
468 BUBBLE-CHAMBER (>>collision-theta)
471 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
473 :: mouse-pressed ( BUBBLE-CHAMBER -- )
475 BUBBLE-CHAMBER mouse->collision-theta drop
479 BUBBLE-CHAMBER particles>> [ <hadron>? ] filter random [ collide ] when*
480 BUBBLE-CHAMBER particles>> [ <quark>? ] filter random [ collide ] when*
481 BUBBLE-CHAMBER particles>> [ <muon>? ] filter random [ collide ] when*
485 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
487 <bubble-chamber> H{ { T{ button-down } [ mouse-pressed ] } } set-gestures
489 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
491 : collide-random-particle ( bubble-chamber -- bubble-chamber )
492 dup particles>> random collide ;
494 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
496 : big-bang ( bubble-chamber -- bubble-chamber )
497 dup particles>> [ collide ] each ;
499 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
500 ! Some initial configurations
501 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
504 bubble-chamber-window
505 10 [ drop hadron add-particle ] each
508 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
512 bubble-chamber-window
514 1789 [ muon add-particle ] times
515 1300 [ quark add-particle ] times
516 1000 [ hadron add-particle ] times
517 111 [ axion add-particle ] times
520 [ [ <muon>? ] filter random collide ]
521 [ [ <quark>? ] filter random collide ]
522 [ [ <hadron>? ] filter random collide ]
525 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
527 : original-big-bang ( -- )
530 dup start-bubble-chamber-thread
531 dup "Bubble Chamber" open-window
533 1789 [ muon add-particle ] times
534 1300 [ quark add-particle ] times
535 1000 [ hadron add-particle ] times
536 111 [ axion add-particle ] times
542 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
544 : hadron-chamber ( -- )
545 bubble-chamber-window
546 1000 [ hadron add-particle ] times
550 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
552 : muon-chamber ( -- )
553 bubble-chamber-window
554 1000 [ muon add-particle ] times
555 dup particles>> [ collide randomize-collision-theta ] each
558 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
560 : original-big-bang-variant ( -- )
561 bubble-chamber-window
562 1789 [ muon add-particle ] times
563 1300 [ quark add-particle ] times
564 1000 [ hadron add-particle ] times
565 111 [ axion add-particle ] times
566 dup particles>> [ collide randomize-collision-theta ] each