Imager
view release on metacpan or search on metacpan
lib/Imager/Transform.pm view on Meta::CPAN
cony = mult cony diffy
cony = add cony miny
nx = 0
ny = 0
var count:n
count = 0
loop:
# calculate (nx,ny)**2 +(x,y)->
# (nx*nx-ny*ny+x, 2.nx.ny+y)
var wx:n ; var wy:n ; var work:n
wx = mult nx nx
wy = mult ny ny
wx = subtract wx wy
ny = mult ny nx
ny = mult ny 2
nx = wx
nx = add nx conx
ny = add ny cony
work = distance nx ny 0 0
work = gt work 2
jumpnz work docol
count = add count 1
work = lt count maxcount
jumpnz work loop
jumpnz insideangle doinang
var workp:p
workp = rgb 0 0 0
ret workp
doinang:
var ang:n
ang = atan2 ny nx
ang = mult ang 360
ang = div ang pi
workp = hsv ang 255 0.5
ret workp
docol:
var outvalue:n
outvalue = mult outsidevaluestep count
outvalue = add outvalue outsidevalue
outvalue = mod outvalue 1.01
jumpnz outsideangle do_outang
work = mult count huestep
work = add work huebase
work = mod work 360
workp = hsv work 1 outvalue
ret workp
do_outang:
ang = atan2 ny nx
ang = mult ang 360
ang = div ang pi
ang = add ang outsidebase
workp = hsv ang outsidesat outvalue
ret workp
EOS
constants=>
{
minx=>{ default=>-2, desc=>'Left of rendered area', },
miny=>{ default=>-1.5, desc=>'Top of rendered area', },
maxx=>{ default=>1, desc=>'Right of rendered area', },
maxy=>{ default=>1.5, desc=>'Bottom of rendered area', },
maxcount=>{ default=>100, desc=>'Maximum iterations', },
huestep=>{ default=>21.1, desc=>'Hue step for number of iterations', },
huebase=>{ default=>0, desc=>'Base hue for number of iterations', },
insideangle=>
{
default=>0,
desc=>'Non-zero to use angle of final as hue for inside',
},
insidebase=>
{
default=>0,
desc=>'Base angle for inside colours if insideangle is non-zero',
},
outsideangle=>
{
default=>0,
desc=>'Non-zero to use angle of final as hue for outside',
},
outsidebase=>
{
default=>0,
desc=>'Base angle if outsideangle is true',
},
outsidevalue=>
{
default=>1,
desc=>'Brightness for outside pixels',
},
outsidevaluestep=>
{
default=>0,
desc=>'Brightness step for each count for outside pixels',
},
outsidesat=>
{
default=>1,
desc=>'Saturation for outside pixels',
},
},
inputs=>[],
},
julia=>
{
desc=>"Julia set",
type=>'assem',
assem=><<EOS,
# print x
# x treated as in range minx..maxx
# y treated as in range miny..maxy
var nx:n ; var ny:n
var diffx:n ; var diffy:n
# conx/y are x/y adjusted to min..max ranges
var conx:n ; var cony:n
diffx = subtract maxx minx
conx = div x w
conx = mult conx diffx
conx = add conx minx
diffy = subtract maxy miny
cony = div y h
cony = mult cony diffy
cony = add cony miny
nx = conx
ny = cony
var count:n
count = 0
loop:
# calculate (nx,ny)**2 +(x,y)->
# (nx*nx-ny*ny+x, 2.nx.ny+y)
var wx:n ; var wy:n ; var work:n
wx = mult nx nx
wy = mult ny ny
wx = subtract wx wy
ny = mult ny nx
ny = mult ny 2
nx = wx
nx = add nx zx
ny = add ny zy
work = distance nx ny 0 0
work = gt work 2
jumpnz work docol
count = add count 1
work = lt count maxcount
jumpnz work loop
jumpnz insideangle doinang
var workp:p
workp = rgb 0 0 0
ret workp
doinang:
var ang:n
ang = atan2 ny nx
ang = mult ang 360
ang = div ang pi
workp = hsv ang 255 0.5
ret workp
docol:
var outvalue:n
outvalue = mult outsidevaluestep count
outvalue = add outvalue outsidevalue
outvalue = mod outvalue 1.01
jumpnz outsideangle do_outang
work = mult count huestep
work = add work huebase
work = mod work 360
workp = hsv work 1 outvalue
ret workp
do_outang:
ang = atan2 ny nx
ang = mult ang 360
ang = div ang pi
ang = add ang outsidebase
workp = hsv ang outsidesat outvalue
ret workp
EOS
constants=>
{
zx=>{default=>0.7, desc=>'Real part of initial Z', },
zy=>{default=>0.2, desc=>'Imaginary part of initial Z', },
minx=>{ default=>-1.5, desc=>'Left of rendered area', },
miny=>{ default=>-1.5, desc=>'Top of rendered area', },
maxx=>{ default=>1.5, desc=>'Right of rendered area', },
maxy=>{ default=>1.5, desc=>'Bottom of rendered area', },
maxcount=>{ default=>100, desc=>'Maximum iterations', },
huestep=>{ default=>21.1, desc=>'Hue step for number of iterations', },
huebase=>{ default=>0, desc=>'Base hue for number of iterations', },
insideangle=>
{
default=>0,
desc=>'Non-zero to use angle of final as hue for inside',
},
insidebase=>
{
default=>0,
desc=>'Base angle for inside colours if insideangle is non-zero',
},
outsideangle=>
{
default=>0,
desc=>'Non-zero to use angle of final as hue for outside',
},
outsidebase=>
{
default=>0,
desc=>'Base angle if outsideangle is true',
},
outsidevalue=>
{
default=>1,
desc=>'Brightness for outside pixels',
},
outsidevaluestep=>
{
default=>0,
desc=>'Brightness step for each count for outside pixels',
},
outsidesat=>
{
default=>1,
desc=>'Saturation for outside pixels',
},
},
inputs=>[],
},
circleripple=>
{
type=>'rpnexpr',
desc=>'Adds a circular ripple effect',
rpnexpr=><<'EOS',
x y cx cy distance !dist
@dist freq / sin !scale
@scale depth * @dist + !adj
y cy - x cx - atan2 !ang
cx @ang cos @adj * + cy @ang sin @adj * + getp1 @scale shadow + shadow 1 + / *
EOS
constants=>
{
freq=> { desc=>'Frequency of ripples', default=>5 },
depth=> { desc=>'Depth of ripples', default=>10 },
shadow=> { desc=>'Fraction of shadow', default=>20 },
},
inputs=>
[
{ desc=>'Image to ripple' }
],
},
( run in 1.426 second using v1.01-cache-2.11-cpan-71847e10f99 )