more vector operations; perlin noise vocab
							parent
							
								
									ec1918aaa8
								
							
						
					
					
						commit
						4b64d9a5e5
					
				| 
						 | 
				
			
			@ -6,6 +6,11 @@ IN: math.vectors
 | 
			
		|||
 | 
			
		||||
: vneg ( u -- v ) [ neg ] map ;
 | 
			
		||||
 | 
			
		||||
: v+n ( u n -- v ) [ + ] curry map ;
 | 
			
		||||
: n+v ( n u -- v ) [ + ] with map ;
 | 
			
		||||
: v-n ( u n -- v ) [ - ] curry map ;
 | 
			
		||||
: n-v ( n u -- v ) [ - ] with map ;
 | 
			
		||||
 | 
			
		||||
: v*n ( u n -- v ) [ * ] curry map ;
 | 
			
		||||
: n*v ( n u -- v ) [ * ] with map ;
 | 
			
		||||
: v/n ( u n -- v ) [ / ] curry map ;
 | 
			
		||||
| 
						 | 
				
			
			@ -19,6 +24,10 @@ IN: math.vectors
 | 
			
		|||
: vmax ( u v -- w ) [ max ] 2map ;
 | 
			
		||||
: vmin ( u v -- w ) [ min ] 2map ;
 | 
			
		||||
 | 
			
		||||
: vfloor    ( v -- _v_ ) [ floor    ] map ;
 | 
			
		||||
: vceiling  ( v -- ^v^ ) [ ceiling  ] map ;
 | 
			
		||||
: vtruncate ( v -- -v- ) [ truncate ] map ;
 | 
			
		||||
 | 
			
		||||
: vsupremum ( seq -- vmax ) [ ] [ vmax ] map-reduce ; 
 | 
			
		||||
: vinfimum ( seq -- vmin ) [ ] [ vmin ] map-reduce ; 
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,83 @@
 | 
			
		|||
USING: byte-arrays combinators images kernel locals math
 | 
			
		||||
math.functions math.polynomials math.vectors random sequences
 | 
			
		||||
sequences.product ;
 | 
			
		||||
IN: perlin-noise
 | 
			
		||||
 | 
			
		||||
: <noise-table> ( -- table )
 | 
			
		||||
    256 iota >byte-array randomize dup append ;
 | 
			
		||||
 | 
			
		||||
: fade ( point -- point' )
 | 
			
		||||
    { 0.0 0.0 0.0 10.0 -15.0 6.0 } swap [ polyval ] with map ;
 | 
			
		||||
 | 
			
		||||
:: grad ( hash gradients -- gradient )
 | 
			
		||||
    hash 8  bitand zero? [ gradients first ] [ gradients second ] if
 | 
			
		||||
        :> u
 | 
			
		||||
    hash 12 bitand zero?
 | 
			
		||||
    [ gradients second ]
 | 
			
		||||
    [ hash 13 bitand 12 = [ gradients first ] [ gradients third ] if ] if
 | 
			
		||||
        :> v
 | 
			
		||||
 | 
			
		||||
    hash 1 bitand zero? [ u ] [ u neg ] if
 | 
			
		||||
    hash 2 bitand zero? [ v ] [ v neg ] if + ;
 | 
			
		||||
 | 
			
		||||
: unit-cube ( point -- cube )
 | 
			
		||||
    [ floor >fixnum 256 mod ] map ;
 | 
			
		||||
 | 
			
		||||
:: hashes ( table cube -- aaa baa aba bba aab bab abb bbb )
 | 
			
		||||
    cube first  :> x
 | 
			
		||||
    cube second :> y
 | 
			
		||||
    cube third  :> z
 | 
			
		||||
    x     table nth y + :> a
 | 
			
		||||
    x 1 + table nth y + :> b
 | 
			
		||||
 | 
			
		||||
    a     table nth z + :> aa
 | 
			
		||||
    b     table nth z + :> ba
 | 
			
		||||
    a 1 + table nth z + :> ab
 | 
			
		||||
    b 1 + table nth z + :> bb
 | 
			
		||||
 | 
			
		||||
    aa     table nth 
 | 
			
		||||
    ba     table nth 
 | 
			
		||||
    ab     table nth 
 | 
			
		||||
    bb     table nth 
 | 
			
		||||
    aa 1 + table nth 
 | 
			
		||||
    ba 1 + table nth 
 | 
			
		||||
    ab 1 + table nth 
 | 
			
		||||
    bb 1 + table nth ;
 | 
			
		||||
 | 
			
		||||
:: 2tetra@ ( p q r s t u v w quot -- )
 | 
			
		||||
    p q quot call
 | 
			
		||||
    r s quot call
 | 
			
		||||
    t u quot call
 | 
			
		||||
    v w quot call
 | 
			
		||||
    ; inline
 | 
			
		||||
 | 
			
		||||
:: noise ( table point -- value )
 | 
			
		||||
    point unit-cube :> cube
 | 
			
		||||
    point dup vfloor v- :> gradients
 | 
			
		||||
    gradients fade :> faded
 | 
			
		||||
 | 
			
		||||
    table cube hashes {
 | 
			
		||||
        [ gradients                       grad ]
 | 
			
		||||
        [ gradients { -1.0  0.0  0.0 } v+ grad ]
 | 
			
		||||
        [ gradients {  0.0 -1.0  0.0 } v+ grad ]
 | 
			
		||||
        [ gradients { -1.0 -1.0  0.0 } v+ grad ]
 | 
			
		||||
        [ gradients {  0.0  0.0 -1.0 } v+ grad ]
 | 
			
		||||
        [ gradients { -1.0  0.0 -1.0 } v+ grad ]
 | 
			
		||||
        [ gradients {  0.0 -1.0 -1.0 } v+ grad ]
 | 
			
		||||
        [ gradients { -1.0 -1.0 -1.0 } v+ grad ]
 | 
			
		||||
    } spread
 | 
			
		||||
    [ faded first lerp ] 2tetra@
 | 
			
		||||
    [ faded second lerp ] 2bi@
 | 
			
		||||
    faded third lerp ;
 | 
			
		||||
 | 
			
		||||
: noise-map ( table scale dim -- map ) 
 | 
			
		||||
    [ iota ] map [ v* 0.0 suffix noise ] with with product-map ;
 | 
			
		||||
 | 
			
		||||
: normalize ( sequence -- sequence' )
 | 
			
		||||
    [ supremum ] [ infimum [ - ] keep ] [ ] tri
 | 
			
		||||
    [ swap - ] with map [ swap / ] with map ;
 | 
			
		||||
 | 
			
		||||
: noise-image ( table scale dim -- image )
 | 
			
		||||
    [ noise-map normalize [ 255.0 * >fixnum ] B{ } map-as ]
 | 
			
		||||
    [ swap [ L f ] dip image boa ] bi ;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue