61 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			61 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Factor
		
	
	
| 
								 | 
							
								! Copyright (c) 2012 Anonymous
							 | 
						||
| 
								 | 
							
								! See http://factorcode.org/license.txt for BSD license.
							 | 
						||
| 
								 | 
							
								USING: accessors arrays calendar colors.constants kernel
							 | 
						||
| 
								 | 
							
								locals math math.constants math.functions math.rectangles
							 | 
						||
| 
								 | 
							
								math.vectors opengl sequences system timers ui ui.gadgets ui.render ;
							 | 
						||
| 
								 | 
							
								IN: rosetta-code.animate-pendulum
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! http://rosettacode.org/wiki/Animate_a_pendulum
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! One good way of making an animation is by simulating a
							 | 
						||
| 
								 | 
							
								! physical system and illustrating the variables in that system
							 | 
						||
| 
								 | 
							
								! using a dynamically changing graphical display. The classic such
							 | 
						||
| 
								 | 
							
								! physical system is a simple gravity pendulum.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								! For this task, create a simple physical model of a pendulum
							 | 
						||
| 
								 | 
							
								! and animate it.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CONSTANT: g 9.81
							 | 
						||
| 
								 | 
							
								CONSTANT: l 20
							 | 
						||
| 
								 | 
							
								CONSTANT: theta0 0.5
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: current-time ( -- time ) nano-count -9 10^ * ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: T0 ( -- T0 ) 2 pi l g / sqrt * * ;
							 | 
						||
| 
								 | 
							
								: omega0 ( -- omega0 ) 2 pi * T0 / ;
							 | 
						||
| 
								 | 
							
								: theta ( -- theta ) current-time omega0 * cos theta0 * ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: relative-xy ( theta l -- xy ) 
							 | 
						||
| 
								 | 
							
								    [ [ sin ] [ cos ] bi ]
							 | 
						||
| 
								 | 
							
								    [ [ * ] curry ] bi* bi@ 2array ;
							 | 
						||
| 
								 | 
							
								: theta-to-xy ( origin theta l -- xy ) relative-xy v+ ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TUPLE: pendulum-gadget < gadget alarm ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: O ( gadget -- origin ) rect-bounds [ drop ] [ first 2 / ] bi* 0 2array ;
							 | 
						||
| 
								 | 
							
								: window-l ( gadget -- l ) rect-bounds [ drop ] [ second ] bi* ;
							 | 
						||
| 
								 | 
							
								: gadget-xy ( gadget -- xy ) [ O ] [ drop theta ] [ window-l ] tri theta-to-xy ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: pendulum-gadget draw-gadget* 
							 | 
						||
| 
								 | 
							
								    COLOR: black gl-color
							 | 
						||
| 
								 | 
							
								    [ O ] [ gadget-xy ] bi gl-line ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: pendulum-gadget graft* ( gadget -- )
							 | 
						||
| 
								 | 
							
								    [ call-next-method ]
							 | 
						||
| 
								 | 
							
								    [
							 | 
						||
| 
								 | 
							
								        dup [ relayout-1 ] curry
							 | 
						||
| 
								 | 
							
								        20 milliseconds every >>alarm drop
							 | 
						||
| 
								 | 
							
								    ] bi ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								M: pendulum-gadget ungraft*
							 | 
						||
| 
								 | 
							
								    [ alarm>> stop-timer ] [ call-next-method ] bi ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: <pendulum-gadget> ( -- gadget ) 
							 | 
						||
| 
								 | 
							
								    pendulum-gadget new 
							 | 
						||
| 
								 | 
							
								    { 500 500 } >>pref-dim ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								: pendulum-main ( -- )
							 | 
						||
| 
								 | 
							
								    [ <pendulum-gadget> "pendulum" open-window ] with-ui ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								MAIN: pendulum-main
							 |