IFSEscape1 { ; ; IFS Escape time July 19, 2013 ; adapted from Fractint code of Ramiro Perez ; two transforms ; init: z = #pixel loop: float k = real(z) ; transform 1 if k < @t1 z=z*@p1+@p2 endif ; transform 2 if @t2 <= k z=z*conj(@p1)+@p3 endif bailout: |z| <= @bailout default: title = "IFS Escape 1" maxiter = 1000 center = (0, 1.25) magn = 4 periodicity = 0 method = multipass heading text = "This is an IFS formula that uses an escape time algorithm as first \ presented by Ramiro Perez for Fractint." endheading param version caption = "Formula Version" default = 100 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam complex param p1 caption = "IFS parameter 1" default = (0.9,-0.87) endparam complex param p2 caption = "IFS parameter 2" default = (-1,0) endparam complex param p3 caption = "IFS parameter 3" default = (1,0) endparam float param t1 caption = "Threshold 1" default = 0 endparam float param t2 caption = "Threshold 2" default = 0 endparam float param bailout caption = "Bailout value" default = 1e10 endparam } Gopalsamy1 {; Ron Barnett, February 1999 ; Conversion of one of my old Fractint formulas to UF ; Origin of the formula is unknown. ; versioning and switch modes added in 2006 init: #z = #pixel loop: ; The original code from Fractint was: ; x = real(z), y = imag(z) ; x1 = -2*x*y + p1 ; y = y*y - x*x ; z = x1 + flip(y) #z = -(0,1)*conj(#z)^@power + @p1 bailout: ; The various bailout tests are based upon Fractint bailout tests. (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Gopalsamy" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 101 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam complex param p1 caption = "seed" default = (-0.19, -0.19) hint = "This is the 'Julia' seed." endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" hint = "Diferent modes for determining bailout." endparam complex param power caption = "Power" default = (2,0) endparam float param bailout caption = "Bailout value" default = 10000 min = 1 hint = "The bailout value, which determines when the iterated values \ escape." endparam switch: type = "MandelGopalsamy" bailout = bailout power = power } MandelGopalsamy {; Ron Barnett, September 2006 ; The Mandelbrot equivalent of Gopalsamy1 (one of my old Fractint formulas) ; The origin of the equation is unknown. init: #z = @start loop: #z = -(0,1)*conj(#z)^@power + #pixel bailout: ; The various bailout tests are based upon Fractint bailout tests. (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mandel Gopalsamy" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 101 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam complex param start caption = "Perturbation" default = (0,0) hint = "Changes the iteration starting point and the shape of the fractal." endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" hint = "Diferent modes for determining bailout." endparam float param bailout caption = "Bailout value" default = 10000 min = 1 hint = "The bailout value, which determines when the iterated values \ escape." endparam complex param power caption = "Power" default = (2,0) endparam switch: type = "Gopalsamy1" bailout = bailout start = start p1 = #pixel power = power } ZeePi { ; Ron Barnett, 1993 ; Based upon Ramanujan's iterative function for calculating pi init: #z = @start + #pixel loop: x = (1 - #z^@p1)^(1/@p1) #z = #z*@fn1((1-x)/(1+x)) + @p2 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "ZeePi" maxiter = 255 center = (0, 0) periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10.0 min = 1 endparam param p1 caption = "Parameter 1" default = (1.1, 0.0) endparam param p2 caption = "Parameter 2" default = (0.395, 0.0) endparam func fn1 caption = "Function 1" default = sin() endfunc switch: type = "ZeePiM" bailout = @bailout p1 = @p1 fn1 = @fn1 test = @test } ZeePiM { ; Ron Barnett, 1993 ; Based upon Ramanujan's iterative function for calculating pi init: #z = @start + #pixel loop: x = (1 - #z^@p1)^(1/@p1) #z = #z*@fn1((1-x)/(1+x)) +#pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "ZeePi" maxiter = 255 center = (0, 0) periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10.0 min = 1 endparam param p1 caption = "Parameter 1" default = (1.1, 0.0) endparam func fn1 caption = "Function 1" default = sin() endfunc switch: type = "ZeePi" bailout = @bailout p2 = #pixel p1 = @p1 fn1 = @fn1 test = @test } IkenagaMap {; Ron Barnett, March 1999 ; based upon the Ikenaga function described ; in Dewdneys's The Armchair Universe. ; The initial starting point allows the function to provide a ; "map" for the corresponding Julia function (Julike ) ; modified from the original Fractint frm init: #z = ((1-#pixel)/3)^0.5 loop: #z = #z*#z*#z + (#pixel-1)*#z - #pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Ikenaga Map" maxiter = 1000 center = (0, 0) method = multipass periodicity = 0 magn = 1.5 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10000.0 min = 1 endparam switch: type = "Julike" bailout = @bailout p1 = #pixel test = @test } Julike {; Ron Barnett, March 1999 ; a Julia function based upon the Ikenaga function ; modified from the original Fractint frm init: #z = #pixel loop: #z = #z*#z*#z + (@p1-1)*#z - @p1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Ikenaga Julia" maxiter = 1000 center = (0, 0) method = multipass periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10000.0 min = 1 endparam param p1 caption = "seed" default = (0.0, -0.1625) endparam switch: type = "IkenagaMap" bailout = @bailout test = @test } Frame-RbtM {; Ron Barnett, March 1999 ; from Mazes for the Mind by Pickover init: #z = #pixel loop: #z = #z*#z*#z/5 + #z*#z + #pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Frame-Robert" maxiter = 1000 center = (-2, 0) magn = 0.7 method = multipass periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10000.0 min = 1 endparam switch: type = "Frame-RbtJ" bailout = @bailout p1 = #pixel test = @test } Frame-RbtJ {; Ron Barnett, March 1999 init: #z = #pixel loop: #z = #z*#z*#z/5 + #z*#z + @p1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Frame-Robert Julia" maxiter = 10000 center = (0, 0) method = multipass periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10000.0 min = 1 endparam param p1 caption = "seed" default = (-0.964, -0.178) endparam switch: type = "Frame-RbtM" bailout = @bailout test = @test } IkeNewtM {; Ron Barnett, March 1999 init: #z = #pixel loop: zf = #z*#z*#z + (#pixel-1)*#z - #pixel zd = 3*#z*#z + #pixel-1 #z = #z - @p1*zf/zd bailout: @p2 <= |zf| default: title = "Scaled Ikenaga Newton" maxiter = 255 center = (0, 0) magn = 0.2 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p1 caption = "Scaling Factor" default = (0.5,0.5) endparam param p2 caption = "Bailout value" default = 0.001 max = 0.1 endparam switch: type = "IkeNewtJul" p1 = @p1 p2 = #pixel test = @p2 } IkeNewtJul {; Ron Barnett, March 1999 init: #z = #pixel loop: zf = #z*#z*#z + (@p2-1)*#z - @p2 zd = 3*#z*#z + @p2-1 #z = #z - @p1*zf/zd bailout: @test <= |zf| default: title = "Scaled Julike Newton" maxiter = 255 center = (0, 0) magn = 0.2 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p1 caption = "Scaling Factor" default = (0.5,0.5) endparam param p2 caption = "Julia value" default = (0.01,0.25) endparam param test caption = "Bailout value" default = 0.001 max = 0.1 endparam switch: type = "IkeNewtM" p1 = @p1 p2 = @test } MandellambdaPwr {; Ron Barnett March 1999 ; This provide a "map" for LambdaPwr init: #z = (1/(@p1+1))^(1/@p1) loop: #z = #pixel*#z*(1 - #z^@p1) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mandellambda Power" maxiter = 1000 center = (1.0, 0.0) magn = 0.7 method = multipass periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10000.0 min = 1 endparam param p1 caption = "Power" default = (1.0,0.0) endparam switch: type = "LambdaPwr" bailout = @bailout seed = #pixel p1 = @p1 test = @test } LambdaPwr {; Ron Barnett, March 1999 init: #z = #pixel loop: #z = @seed*#z*(1 - #z^@p1) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Lambda Power" maxiter = 1000 center = (0.5, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10000.0 min = 1 endparam param p1 caption = "Power" default = (1.0,0.0) endparam param seed caption = "Julia Seed" default = (0.964, -0.303) endparam switch: type = "MandellambdaPwr" bailout = @bailout p1 = @p1 test = @test } SJMAND01 {;4D Mandelbrot type SJ, Ron Barnett March 1999 ; Modified March 2000 ; Modified from a formula of Gordon Lamb ; Type SJ iterate in the "zc" plane, ; Altering the real value of p2 in type SJ will ; step the position of the iterated image along the x axis ; of the c-plane Mandelbrot set. ; Parameter p1 will rotate the angle of the iteration plane ; p1=1 will revert to the c-plane giving the classic Mandelbrot init: #z = real(#pixel) + flip(imag(#pixel)*@p1) complex c = @p2 + @p1*real(#pixel) + flip(imag(#pixel)) loop: #z = #z*#z + c bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "4D Mandelbrot SJ" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.0,0.0) endparam param p2 caption = "Plane position" default = (-0.75,0.0) endparam switch: type = "SJMAND01J" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel } SJMAND01J {; Ron Barnett March 2000 init: #z = real(#pixel) + flip(imag(#pixel)*@p1) complex c = @p2 + @p1*real(@p3) + flip(imag(@p3)) loop: #z = #z*#z + c bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "4D Mandelbrot SJ Julia" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.1,0.0) endparam param p2 caption = "Plane position" default = (-0.75,0.0) endparam param p3 caption = "seed" default = (0.8875,0.3625) endparam switch: type = "SJMAND01" bailout = @bailout p1 = @p1 p2 = @p2 } 3RDIM01 {;4D Mandelbrot type 3RDIM, Ron Barnett March 1999 ; Modified March 2000 ; Modified from a formula of Gordon Lamb ; Type 3RDIM iterate in the "cz" plane, ; Altering the imaginary value of p2 in type 3RDIM will ; step the position of the iterated image along the y axis ; of the c-plane Mandelbrot set. ; Parameter p1 will rotate the angle of the iteration plane ; p1=1 will revert to the c-plane giving the classic Mandelbrot init: #z = @p1*real(#pixel)+flip(imag(#pixel)) complex c = @p2+real(#pixel)+flip(imag(#pixel)*@p1) loop: #z = #z*#z + c bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "4D Mandelbrot 3RDIM" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam switch: type = "3RDIM01J" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel } 3RDIM01J {; Ron Barnett March 2000 init: #z = @p1*real(#pixel)+flip(imag(#pixel)) complex c = @p2+real(@p3)+flip(imag(@p3)*@p1) loop: #z = #z*#z + c bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "4D Mandelbrot 3RDIM Julia" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.001) endparam param p3 caption = "seed" default = (-0.8125, -0.3875) endparam switch: type = "3RDIM01" bailout = @bailout p1 = @p1 p2 = @p2 } SlopeNewton { ; based upon the slope (Mandelbrot) ; formula of Damien Jones ; Ron Barnett, March 1999 ; init: complex fz = 0 complex fzp = 0 complex fzp2 = 0 float pwrtest = 10^(100/cabs(@p1)) bool bTest = false float isnear = @p3*cabs(@p2)^cabs(@p1) complex z1 = #pixel ; primary iterated point complex z2 = #pixel + @offset ; horizontally offset point complex z3 = #pixel + flip(@offset) ; vertically offset point int done = 2 float e1 = 0.0 ; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0 ; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0 ; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20 ; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float iterate = 0 loop: complex oldz1 = z1 fz = z1^@p1 - @p2 fzp = @p1*z1^(@p1-1) fzp2 = @p1*(@p1-1)*z1^(@p1-2) if @converge == 0 ; Newton z1 = z1 - fz/fzp elseif @converge == 1 ; Householder z1 = z1 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) elseif @converge == 2 ; Halley z1 = z1 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) elseif @converge == 3 ; Schroder z1 = z1 - fz*fzp/(fzp^2 - fz*fzp2) elseif @converge == 4 ; Ho custom z1 = z1 - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2)) elseif @converge == 5 ; Ha custom z1 = z1 - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 6 ; H_S custom z1 = z1 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 7 ; Mixed1 if iterate % 2 == 0 z1 = z1 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) else z1 = z1 - fz/fzp endif elseif @converge == 8 ; Mixed2 if iterate % 2 == 0 z1 = z1 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) else z1 = z1 - fz/fzp endif elseif @converge == 9 ; Mixed3 if iterate % 2 == 0 z1 = z1 - fz*fzp/(fzp^2 - fz*fzp2) else z1 = z1 - fz/fzp endif elseif @converge == 10 ; Mixed4 if iterate % 2 == 0 z1 = z1 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) else z1 = z1 - fz/fzp endif endif btest = (cabs(oldz1-z1) < isnear) complex oldz2 = z2 fz = z2^@p1 - @p2 fzp = @p1*z2^(@p1-1) fzp2 = @p1*(@p1-1)*z2^(@p1-2) if @converge == 0 ; Newton z2 = z2 - fz/fzp elseif @converge == 1 ; Householder z2 = z2 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) elseif @converge == 2 ; Halley z2 = z2 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) elseif @converge == 3 ; Schroder z2 = z2 - fz*fzp/(fzp^2 - fz*fzp2) elseif @converge == 4 ; Ho custom z2 = z2 - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2)) elseif @converge == 5 ; Ha custom z2 = z2 - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 6 ; H_S custom z2 = z2 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 7 ; Mixed1 if iterate % 2 == 0 z2 = z2 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) else z2 = z2 - fz/fzp endif elseif @converge == 8 ; Mixed2 if iterate % 2 == 0 z2 = z2 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) else z2 = z2 - fz/fzp endif elseif @converge == 9 ; Mixed3 if iterate % 2 == 0 z2 = z2 - fz*fzp/(fzp^2 - fz*fzp2) else z2 = z2 - fz/fzp endif elseif @converge == 10 ; Mixed4 if iterate % 2 == 0 z2 = z2 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) else z2 = z2 - fz/fzp endif endif complex oldz3 = z3 fz = z3^@p1 - @p2 fzp = @p1*z3^(@p1-1) fzp2 = @p1*(@p1-1)*z3^(@p1-2) if @converge == 0 ; Newton z3 = z3 - fz/fzp elseif @converge == 1 ; Householder z3 = z3 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) elseif @converge == 2 ; Halley z3 = z3 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) elseif @converge == 3 ; Schroder z3 = z3 - fz*fzp/(fzp^2 - fz*fzp2) elseif @converge == 4 ; Ho custom z3 = z3 - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2)) elseif @converge == 5 ; Ha custom z3 = z3 - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 6 ; H_S custom z3 = z3 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 7 ; Mixed1 if iterate % 2 == 0 z3 = z3 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) else z3 = z3 - fz/fzp endif elseif @converge == 8 ; Mixed2 if iterate % 2 == 0 z3 = z3 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) else z3 = z3 - fz/fzp endif elseif @converge == 9 ; Mixed3 if iterate % 2 == 0 z3 = z3 - fz*fzp/(fzp^2 - fz*fzp2) else z3 = z3 - fz/fzp endif elseif @converge == 10 ; Mixed4 if iterate % 2 == 0 z3 = z3 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) else z3 = z3 - fz/fzp endif endif IF (@zmode == 5) iterexp1 = iterexp1 + exp(-1/(cabs(oldz1 - z1))) iterexp2 = iterexp2 + exp(-1/(cabs(oldz2 - z2))) iterexp3 = iterexp3 + exp(-1/(cabs(oldz3 - z3))) ENDIF done = done + 1 ; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF IF ( btest || cabs(z1) > pwrtest || \ @everyiter || \ done == #maxit + 2) ; done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1) ; log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2) ; sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3) ; cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4) ; exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5) ; sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6) ; cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7) ; sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8) ; cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9) ; tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy) ; fudge z from vector ELSE ; didn't compute z this time z = z1 ; use primary iteration value to keep periodicity working ENDIF IF (btest || cabs(z) > pwrtest) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "Slope (Newton)" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 heading caption = "Slope Newton" endheading heading caption = "This is a 'convergent' fractal" endheading heading caption = "that uses multiple convergence" endheading heading caption = "methods." endheading heading caption = "Use with Damien's Lighting" endheading heading caption = "formula or 3D Texturizer III" endheading param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p1 caption = "Power" default = (3,0) endparam param p2 caption = "Root" default = (1,0) endparam param p3 caption = "Bailout value" default = 0.000001 max = 0.1 endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam heading caption = "Convergence Methods" endheading param converge caption = "Convergence Method" default = 0 enum = "Newton" "Householder" "Halley" "Schroder" "Ho Custom" \ "Ha Custom" "H_S Custom" "Mixed1" "Mixed2" "Mixed3" "Mixed4" endparam float param custom caption = "H_S Constant" default = 1.5 visible = @converge==4 || @converge==5 || @converge==6 || @converge==10 endparam } SlopeExpMandelbrot { ; based upon the slope (Mandelbrot) ; formula of Damien Jones ; Ron Barnett, March 1999 ; Modified with more height values July 2004 init: complex c1 = #pixel; primary iterated point complex c2 = #pixel + @offset; horizontally offset point complex c3 = #pixel + flip(@offset); vertically offset point complex z1 = @start; starting value complex z2 = @start complex z3 = @start int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float theta = 0.0 float r = 0.0 complex qa = 0 complex qb = 0 complex qc = 0 complex qy = 0 complex qx = 0 complex cx = 0 complex cy = 0 loop: z1 = z1^@power + c1; iterate each point z2 = z2^@power + c2 z3 = z3^@power + c3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: method = multipass periodicity = 0 heading caption = "SlopeExp Mandelbrot" endheading $ifdef VER40 heading text = "Provides 88 different Height Value variants." endheading heading text = "Use Damien's Lighting Coloring or 3D Texturizer Enhanced III. \ Most other coloring formulas can be used." endheading $else heading caption = "Use Damien's Lighting Coloring" endheading heading caption = "Or 3D Texturizer Enhanced III." endheading heading caption = "Most other coloring formulas" endheading heading caption = "can also be used." endheading $endif title = "SlopeExp (Mandelbrot)" center = (-0.5, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.1 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Starting Point" default = (0,0) hint = "Starting value for each point. You can use this to \ 'perturb' the fractal." endparam param power caption = "Exponent" default = (2,0) hint = "Overall exponent for the equation. (2,0) gives \ the classic Mandelbrot type." endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpJulia" seed = #pixel power = @power bailout = @bailout offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeExpJulia { ; based upon the slope (Julia) ; formula of Damien Jones ; Ron Barnett, March 1999 ; Modified with more Height Values July 2004 init: complex z1 = #pixel; primary iterated point complex z2 = #pixel + @offset; horizontally offset point complex z3 = #pixel + flip(@offset); vertically offset point int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 complex polar = 0.0 complex af1 = 0.0 complex af2 = 0.0 loop: z1 = z1^@power + @seed ; iterate each point z2 = z2^@power + @seed z3 = z3^@power + @seed iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) ; theta = atan2(#z) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: method = multipass periodicity = 0 heading caption = "SlopeExp Mandelebrot Julia" endheading $ifdef VER40 heading text = "Provides 88 different Height Value variants." endheading heading text = "Use Damien's Lighting Coloring or 3D Texturizer Enhanced III. \ Most other coloring formulas can be used." endheading $else heading caption = "Use Damien's Lighting Coloring" endheading heading caption = "Or 3D Texturizer Enhanced III." endheading heading caption = "Most other coloring formulas" endheading heading caption = "can also be used." endheading $endif title = "SlopeExp (Julia)" center = (0.0, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param seed caption = "Julia Seed" default = (-0.75,0.2) hint = "This is the Julia seed, a constant parameter which \ defines the shape of the fractal." endparam param start caption = "Starting Point" default = (0,0) hint = "Starting value for each point. You can use this to \ 'perturb' the fractal." endparam param power caption = "Exponent" default = (2,0) hint = "Overall exponent for the equation. (2,0) gives \ the classic Mandelbrot type." endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sextic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpMandelbrot" power = @power bailout = @bailout offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeIkeNewtM { ; based upon the slope (Mandelbrot) ; formula of Damien Jones ; Ron Barnett, March 1999 ; init: complex z1 = #pixel ; primary iterated point complex z2 = #pixel + @offset ; horizontally offset point complex z3 = #pixel + flip(@offset) ; vertically offset point int done = 2 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: complex oldz1 = z1 complex zf1 = z1*z1*z1 + (pixel-1)*z1 - pixel complex zd1 = 3*z1*z1 + pixel-1 z1 = z1 - @p1*zf1/zd1 complex oldz2 = z2 complex zf2 = z2*z2*z2 + (pixel-1)*z2 - pixel complex zd2 = 3*z2*z2 + pixel-1 z2 = z2 - @p1*zf2/zd2 complex oldz3 = z3 complex zf3 = z3*z3*z3 + (pixel-1)*z3 - pixel complex zd3 = 3*z3*z3 + pixel-1 z3 = z3 - @p1*zf3/zd3 IF (@zmode == 5) iterexp1 = iterexp1 + exp(-1/(cabs(oldz1 - z1))) iterexp2 = iterexp2 + exp(-1/(cabs(oldz2 - z2))) iterexp3 = iterexp3 + exp(-1/(cabs(oldz3 - z3))) ENDIF done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1|; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1); update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)); get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1); update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)); get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1); update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)); get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1); update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)); get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1); update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF IF (@p2 > |oldz1-z1| || \ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (@p2 > |oldz1-z1|) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "Slope (Scaled Ikenaga Newton)" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p1 caption = "Scaling Factor" default = (0.5,0.5) endparam param p2 caption = "Bailout value" default = 0.000001 max = 0.1 endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam } SlopeZeePi { ; based upon the slope (Mandelbrot) ; formula of Damien Jones ; Ron Barnett, March 1999 ; init: complex z1 = #pixel ; primary iterated point complex z2 = #pixel + @offset ; horizontally offset point complex z3 = #pixel + flip(@offset) ; vertically offset point int done = 2 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: complex x1 = (1 - z1^@p1)^(1/@p1) complex z1 = z1*@fn1((1-x1)/(1+x1)) + @p2 complex x2 = (1 - z2^@p1)^(1/@p1) complex z2 = z2*@fn1((1-x2)/(1+x2)) + @p2 complex x3 = (1 - z3^@p1)^(1/@p1) complex z3 = z3*@fn1((1-x3)/(1+x3)) + @p2 IF (@zmode == 5) iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) ENDIF done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1|; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1); update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)); get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1); update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)); get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1); update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)); get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1); update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)); get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1); update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF IF (@bailout < |z1| || \ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (@bailout < |z1|) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "Slope (ZeePi)" center = (0.0, 0.0) maxiter = 255 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout value" default = 10.0 min = 1 endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam param p1 caption = "Parameter 1" default = (1.1, 0.0) endparam param p2 caption = "Parameter 2" default = (0.395, 0.0) endparam func fn1 caption = "Function 1" default = sin() endfunc } SlopeCayleyMand { ; based upon the slope (Mandelbrot) ; formula of Damien Jones ; Ron Barnett, March 1999 ; modified to add more height values July 2004 ; modified to add more height values December 2004 ; modified to add alternate convergence methods December 2004 init: complex z1 = 0 ; primary iterated point complex z2 = @offset ; horizontally offset point complex z3 = flip(@offset) ; vertically offset point int done = 2 complex a = #pixel float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 complex fz = 0 complex fzp = 0 complex fzp2 = 0 float iterate = 0 loop: iterate = iterate + 1 oldz1 = z1 fz = z1^3 - a*z1 - a + 1 fzp = 3*z1^2 - a fzp2 = 6*z1 if @converge == 0 ; Newton z1 = z1 - fz/fzp elseif @converge == 1 ; Householder z1 = z1 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) elseif @converge == 2 ; Halley z1 = z1 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) elseif @converge == 3 ; Schroder z1 = z1 - fz*fzp/(fzp^2 - fz*fzp2) elseif @converge == 4 ; Ho custom z1 = z1 - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2)) elseif @converge == 5 ; Ha custom z1 = z1 - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 6 ; H_S custom z1 = z1 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 7 ; Mixed1 if iterate % 2 == 0 z1 = z1 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) else z1 = z1 - fz/fzp endif elseif @converge == 8 ; Mixed2 if iterate % 2 == 0 z1 = z1 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) else z1 = z1 - fz/fzp endif elseif @converge == 9 ; Mixed3 if iterate % 2 == 0 z1 = z1 - fz*fzp/(fzp^2 - fz*fzp2) else z1 = z1 - fz/fzp endif elseif @converge == 10 ; Mixed4 if iterate % 2 == 0 z1 = z1 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) else z1 = z1 - fz/fzp endif endif oldz2 = z2 fz = z2^3 - a*z2 - a + 1 fzp = 3*z2^2 - a fzp2 = 6*z2 if @converge == 0 ; Newton z2 = z2 - fz/fzp elseif @converge == 1 ; Householder z2 = z2 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) elseif @converge == 2 ; Halley z2 = z2 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) elseif @converge == 3 ; Schroder z2 = z2 - fz*fzp/(fzp^2 - fz*fzp2) elseif @converge == 4 ; Ho custom z2 = z2 - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2)) elseif @converge == 5 ; Ha custom z2 = z2 - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 6 ; H_S custom z2 = z2 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 7 ; Mixed1 if iterate % 2 == 0 z2 = z2 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) else z2 = z2 - fz/fzp endif elseif @converge == 8 ; Mixed2 if iterate % 2 == 0 z2 = z2 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) else z2 = z2 - fz/fzp endif elseif @converge == 9 ; Mixed3 if iterate % 2 == 0 z2 = z2 - fz*fzp/(fzp^2 - fz*fzp2) else z2 = z2 - fz/fzp endif elseif @converge == 10 ; Mixed4 if iterate % 2 == 0 z2 = z2 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) else z2 = z2 - fz/fzp endif endif oldz3 = z3 fz = z3^3 - a*z3 - a + 1 fzp = 3*z3^2 - a fzp2 = 6*z3 if @converge == 0 ; Newton z3 = z3 - fz/fzp elseif @converge == 1 ; Householder z3 = z3 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) elseif @converge == 2 ; Halley z3 = z3 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) elseif @converge == 3 ; Schroder z3 = z3 - fz*fzp/(fzp^2 - fz*fzp2) elseif @converge == 4 ; Ho custom z3 = z3 - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2)) elseif @converge == 5 ; Ha custom z3 = z3 - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 6 ; H_S custom z3 = z3 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 7 ; Mixed1 if iterate % 2 == 0 z3 = z3 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) else z3 = z3 - fz/fzp endif elseif @converge == 8 ; Mixed2 if iterate % 2 == 0 z3 = z3 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) else z3 = z3 - fz/fzp endif elseif @converge == 9 ; Mixed3 if iterate % 2 == 0 z3 = z3 - fz*fzp/(fzp^2 - fz*fzp2) else z3 = z3 - fz/fzp endif elseif @converge == 10 ; Mixed4 if iterate % 2 == 0 z3 = z3 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) else z3 = z3 - fz/fzp endif endif IF (@zmode == 87) iterexp1 = iterexp1 + exp(-1/(cabs(oldz1 - z1))) iterexp2 = iterexp2 + exp(-1/(cabs(oldz2 - z2))) iterexp3 = iterexp3 + exp(-1/(cabs(oldz3 - z3))) ENDIF done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF IF (@p2 > |oldz1-z1| || \ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (@p2 > |oldz1-z1|) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "Slope (Cayley Mandelbrot)" helpfile = "Classical Slope Formulas.chm" center = (0.3593516980975, 0) magn = 360 method = multipass periodicity = 0 heading caption = "Slope Cayley Mandelbrot" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal that uses multiple convergence \ methods and has Julia-like regions for several convergence \ methods. Eighty eight different height value types are available. \ Use with Damien's Lighting formula, 3D Texturizer \ Enhanced III or Direct Color Slope." endheading $else heading caption = "This is a 'convergent' fractal" endheading heading caption = "that uses multiple convergence" endheading heading caption = "methods and has Mandelbrot-like regions" endheading heading caption = "for several convergence methods." endheading heading caption = "Use with Damien's Lighting" endheading heading caption = "formula or 3D Texturizer III" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p2 caption = "Bailout value" default = 0.000001 max = 0.1 endparam heading caption = "Convergence Methods" endheading param converge caption = "Convergence Method" default = 0 enum = "Newton" "Householder" "Halley" "Schroder" "Ho Custom" \ "Ha Custom" "H_S Custom" "Mixed1" "Mixed2" "Mixed3" "Mixed4" endparam float param custom caption = "H_S Constant" default = 1.5 visible = @converge==4 || @converge==5 || @converge==6 || @converge==10 endparam heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.0001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.1 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeCayleyJul" p2 = @p2 p1 = #pixel offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot converge = @converge custom = @custom } SlopeCayleyJul {; based upon the slope (Mandelbrot) ; formula of Damien Jones ; Ron Barnett, March 1999 ; modified to add more height values July 2004 ; modified to add more height values December 2004 ; modified to add alternate convergence methods December 2004 init: complex z1 = #pixel ; primary iterated point complex z2 = #pixel + @offset ; horizontally offset point complex z3 = #pixel + flip(@offset) ; vertically offset point int done = 2 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float iterate = 0 complex fz = 0 complex fzp = 0 complex fzp2 = 0 loop: iterate = iterate + 1 oldz1 = z1 fz = z1^3 - @p1*z1 - @p1 + 1 fzp = 3*z1^2 - @p1 fzp2 = 6*z1 if @converge == 0 ; Newton z1 = z1 - fz/fzp elseif @converge == 1 ; Householder z1 = z1 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) elseif @converge == 2 ; Halley z1 = z1 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) elseif @converge == 3 ; Schroder z1 = z1 - fz*fzp/(fzp^2 - fz*fzp2) elseif @converge == 4 ; Ho custom z1 = z1 - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2)) elseif @converge == 5 ; Ha custom z1 = z1 - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 6 ; H_S custom z1 = z1 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 7 ; Mixed1 if iterate % 2 == 0 z1 = z1 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) else z1 = z1 - fz/fzp endif elseif @converge == 8 ; Mixed2 if iterate % 2 == 0 z1 = z1 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) else z1 = z1 - fz/fzp endif elseif @converge == 9 ; Mixed3 if iterate % 2 == 0 z1 = z1 - fz*fzp/(fzp^2 - fz*fzp2) else z1 = z1 - fz/fzp endif elseif @converge == 10 ; Mixed4 if iterate % 2 == 0 z1 = z1 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) else z1 = z1 - fz/fzp endif endif oldz2 = z2 fz = z2^3 - @p1*z2 - @p1 + 1 fzp = 3*z2^2 - @p1 fzp2 = 6*z2 if @converge == 0 ; Newton z2 = z2 - fz/fzp elseif @converge == 1 ; Householder z2 = z2 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) elseif @converge == 2 ; Halley z2 = z2 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) elseif @converge == 3 ; Schroder z2 = z2 - fz*fzp/(fzp^2 - fz*fzp2) elseif @converge == 4 ; Ho custom z2 = z2 - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2)) elseif @converge == 5 ; Ha custom z2 = z2 - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 6 ; H_S custom z2 = z2 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 7 ; Mixed1 if iterate % 2 == 0 z2 = z2 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) else z2 = z2 - fz/fzp endif elseif @converge == 8 ; Mixed2 if iterate % 2 == 0 z2 = z2 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) else z2 = z2 - fz/fzp endif elseif @converge == 9 ; Mixed3 if iterate % 2 == 0 z2 = z2 - fz*fzp/(fzp^2 - fz*fzp2) else z2 = z2 - fz/fzp endif elseif @converge == 10 ; Mixed4 if iterate % 2 == 0 z2 = z2 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) else z2 = z2 - fz/fzp endif endif oldz3 = z3 fz = z3^3 - @p1*z3 - @p1 + 1 fzp = 3*z3^2 - @p1 fzp2 = 6*z3 if @converge == 0 ; Newton z3 = z3 - fz/fzp elseif @converge == 1 ; Householder z3 = z3 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) elseif @converge == 2 ; Halley z3 = z3 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) elseif @converge == 3 ; Schroder z3 = z3 - fz*fzp/(fzp^2 - fz*fzp2) elseif @converge == 4 ; Ho custom z3 = z3 - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2)) elseif @converge == 5 ; Ha custom z3 = z3 - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 6 ; H_S custom z3 = z3 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 7 ; Mixed1 if iterate % 2 == 0 z3 = z3 - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) else z3 = z3 - fz/fzp endif elseif @converge == 8 ; Mixed2 if iterate % 2 == 0 z3 = z3 - 2*fz*fzp/(2*fzp^2 - fz*fzp2) else z3 = z3 - fz/fzp endif elseif @converge == 9 ; Mixed3 if iterate % 2 == 0 z3 = z3 - fz*fzp/(fzp^2 - fz*fzp2) else z3 = z3 - fz/fzp endif elseif @converge == 10 ; Mixed4 if iterate % 2 == 0 z3 = z3 - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) else z3 = z3 - fz/fzp endif endif IF (@zmode == 87) iterexp1 = iterexp1 + exp(-1/(cabs(oldz1 - z1))) iterexp2 = iterexp2 + exp(-1/(cabs(oldz2 - z2))) iterexp3 = iterexp3 + exp(-1/(cabs(oldz3 - z3))) ENDIF done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF IF (@p2 > |oldz1-z1| || \ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (@p2 > |oldz1-z1|) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "Slope (Cayley Julia)" helpfile = "Classical Slope Formulas.chm" maxiter = 1000 center = (0, 0) magn = 32 method = multipass periodicity = 0 heading caption = "Slope Cayley Julia" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal that uses multiple convergence \ methods and has Julia-like regions for several convergence \ methods. Eighty eight different height value types are available. \ Use with Damien's Lighting formula, 3D Texturizer \ Enhanced III or Direct Color Slope." endheading $else heading caption = "This is a 'convergent' fractal" endheading heading caption = "that uses multiple convergence" endheading heading caption = "methods and has Julia-like regions" endheading heading caption = "for several convergence methods." endheading heading caption = "Use with Damien's Lighting" endheading heading caption = "formula or 3D Texturizer III" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p1 caption = "Julia Seed" default = (0.360968017578125,0.00074462890625) hint = "This is the Julia seed, a constant parameter which \ defines the shape of the fractal." endparam param p2 caption = "Bailout value" default = 0.000001 max = 0.1 endparam heading caption = "Convergence Methods" endheading param converge caption = "Convergence Method" default = 0 enum = "Newton" "Householder" "Halley" "Schroder" "Ho Custom" \ "Ha Custom" "H_S Custom" "Mixed1" "Mixed2" "Mixed3" "Mixed4" endparam float param custom caption = "Convergence Param" default = 1.5 visible = @converge==4 || @converge==5 || @converge==6 || @converge==10 endparam heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeCayleyMand" p2 = @p2 offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot converge = @converge custom = @custom } contest4 {; modified from Kerry Mitchell version ; by Ron Barnett, November 1999 init: #z = @start c = pixel loop: z2 = #z*#z #z = #z*z2+c*(1+#z-z2) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Contest4" maxiter = 1024 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1 endparam } SlopeExpContest4 { ; modified from Kerry Mitchell version ; with slope method modified from Damien Jones ; by Ron Barnett, November 1999 init: complex c1 = #pixel; primary iterated point complex c2 = #pixel + @offset; horizontally offset point complex c3 = #pixel + flip(@offset); vertically offset point complex z1 = @start; starting value complex z2 = @start complex z3 = @start int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z11 = z1*z1 z22 = z2*z2 z33 = z3*z3 z1 = z1*z11+c1*(1+z1-z11) z2 = z2*z22+c2*(1+z2-z22) z3 = z3*z33+c3*(1+z3-z33) iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (Contest4)" center = (0.0, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Starting Point" default = (0,0) hint = "Starting value for each point. You can use this to \ 'perturb' the fractal." endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the set anymore." endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam } Pokorny {; Ron Barnett, November 1999 init: #z = @start c = #pixel loop: #z = 1/(#z*#z + c) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Pokorny" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1 endparam switch: type = "PokornyJulia" bailout = @bailout seed = #pixel test = @test } PokornyJulia {; Ron Barnett, December 1999 ; a Julia function based upon the Ikenaga function ; modified from the original Fractint frm init: #z = #pixel loop: #z = 1/(#z*#z + @seed) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Porkorny Julia" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1 endparam param seed caption = "seed" default = (0.575, 0.3375) endparam switch: type = "Pokorny" bailout = @bailout test = @test } SlopeExpIkenaga { ; based upon the slope (Mandelbrot) ; formula of Damien Jones ; Ron Barnett, November 1999 ; Modified with more Height Values July 2004 ; init: complex c1 = #pixel; primary iterated point complex c2 = #pixel + @offset; horizontally offset point complex c3 = #pixel + flip(@offset); vertically offset point complex z1 = ((1-c1)/3)^0.5; starting value complex z2 = ((1-c2)/3)^0.5 complex z3 = ((1-c3)/3)^0.5 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z1 = z1*z1*z1+(c1-1)*z1-c1; iterate each point z2 = z2*z2*z2+(c2-1)*z2-c2 z3 = z3*z3*z3+(c3-1)*z3-c3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 57) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 58) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (Ikenaga)" center = (-0.5, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Ikenaga set anymore." endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 58 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func @fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 endfunc param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpIkenagaJulia" seed = #pixel bailout = @bailout offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b pn = @pn afn1 = @afn1 afn2 = @afn2 fn1 = @fn1 } SlopeExpIkenagaJulia { ; based upon the slope (Julia) ; formula of Damien Jones ; Ron Barnett, November 1999 ; Modified with more Height Values July 2004 ; init: complex z1 = #pixel; primary iterated point complex z2 = #pixel + @offset; horizontally offset point complex z3 = #pixel + flip(@offset); vertically offset point int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z1 = z1*z1*z1+(@seed-1)*z1-@seed ; iterate each point z2 = z2*z2*z2+(@seed-1)*z2-@seed z3 = z3*z3*z3+(@seed-1)*z3-@seed iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 57) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 58) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (Ikenaga Julia)" center = (0.0, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param seed caption = "Julia Seed" default = (0,-0.1625) hint = "This is the Julia seed, a constant parameter which \ defines the shape of the fractal." endparam param bailout caption = "Bail-out Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Ikenaga set anymore." endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 58 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func @fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 endfunc param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpIkenaga" bailout = @bailout offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b pn = @pn afn1 = @afn1 afn2 = @afn2 fn1 = @fn1 } SlopeExpMandelLambdaPwr { ; based upon the slope (Mandelbrot) ; formula of Damien Jones ; Ron Barnett, November 1999 ; init: complex c1 = #pixel; primary iterated point complex c2 = #pixel + @offset; horizontally offset point complex c3 = #pixel + flip(@offset); vertically offset point complex z1 = (1/(@p1+1))^(1/@p1); starting value complex z2 = (1/(@p1+1))^(1/@p1) complex z3 = (1/(@p1+1))^(1/@p1) int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z1 = c1*z1*(1 - z1^@p1); iterate each point z2 = c2*z2*(1 - z2^@p1) z3 = c3*z3*(1 - z3^@p1) iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (MandelLambdaPwr)" center = (1.0, 0.0) magn = 0.7 maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the MandelLambdaPwr set anymore." endparam param p1 caption = "Power" default = (1.0,0.0) endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpLambdaPwr" seed = #pixel p1 = @p1 bailout = @bailout offset = @offset zmode = @zmode xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter } SlopeExpLambdaPwr { ; based upon the slope (Julia) ; formula of Damien Jones ; Ron Barnett, November 1999 ; init: complex z1 = #pixel; primary iterated point complex z2 = #pixel + @offset; horizontally offset point complex z3 = #pixel + flip(@offset); vertically offset point int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z1 = @seed*z1*(1 - z1^@p1) ; iterate each point z2 = @seed*z2*(1 - z2^@p1) z3 = @seed*z3*(1 - z3^@p1) iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (LambdaPwr)" center = (0.0, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param seed caption = "Julia Seed" default = (0.964,-0.303) hint = "This is the Julia seed, a constant parameter which \ defines the shape of the fractal." endparam param p1 caption = "Power" default = (1.0,0.0) endparam param bailout caption = "Bail-out Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Ikenaga set anymore." endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpMandelLambdaPwr" bailout = @bailout offset = @offset zmode = @zmode xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter } SlopeExpFrame-RbtM { ; based upon the slope (Mandelbrot) ; formula of Damien Jones ; Ron Barnett, November 1999 ; init: complex c1 = #pixel; primary iterated point complex c2 = #pixel + @offset; horizontally offset point complex c3 = #pixel + flip(@offset); vertically offset point complex z1 = @start; starting value complex z2 = @start complex z3 = @start int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z1 = z1*z1*z1/5 + z1*z1 + c1 z2 = z2*z2*z2/5 + z2*z2 + c2 z3 = z3*z3*z3/5 + z3*z3 + c3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current angles d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 7) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 8) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (Frame-RbtM)" center = (-2.0, 0.0) magn = 0.7 maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Starting Point" default = (0,0) hint = "Starting value for each point. You can use this to \ 'perturb' the fractal." endparam param power caption = "Exponent" default = (2,0) hint = "Overall exponent for the equation. (2,0) gives \ the classic Mandelbrot type." endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 8 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function(z)|" "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam func @fn1 caption = "Transmute Function" default = sin() endfunc switch: type = "SlopeExpFrame-RbtJ" seed = #pixel bailout = @bailout zmode = @zmode offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter } SlopeExpFrame-RbtJ { ; based upon the slope (Julia) ; formula of Damien Jones ; Ron Barnett, November 1999 ; Modified March 14, 2003 ; init: complex z1 = #pixel; primary iterated point complex z2 = #pixel + @offset; horizontally offset point complex z3 = #pixel + flip(@offset); vertically offset point int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z1 = z1*z1*z1/5 + z1*z1 + @seed z2 = z2*z2*z2/5 + z2*z2 + @seed z3 = z3*z3*z3/5 + z3*z3 + @seed iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function(z)| d1 = abs(real(@fn1(z1))) + abs(imag(@fn1(z1))) ; get current angles d2 = abs(real(@fn1(z2))) + abs(imag(@fn1(z2))) d3 = abs(real(@fn1(z3))) + abs(imag(@fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 7) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 8) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (Frame-RbtJ)" center = (0.0, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param seed caption = "Julia Seed" default = (-0.964,-0.178) hint = "This is the Julia seed, a constant parameter which \ defines the shape of the fractal." endparam param start caption = "Starting Point" default = (0,0) hint = "Starting value for each point. You can use this to \ 'perturb' the fractal." endparam param bailout caption = "Bail-out Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 8 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function(z)|" "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam func @fn1 caption = "Transmute Function" default = sin() endfunc switch: type = "SlopeExpFrame-RbtM" bailout = @bailout offset = @offset zmode = @zmode xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter } SlopeExpGopalsamy { ; based upon the slope (Mandelbrot) ; formula of Damien Jones ; Ron Barnett, December 1999 ; init: complex z1 = #pixel; primary iterated point complex z2 = #pixel + @offset; horizontally offset point complex z3 = #pixel + flip(@offset); vertically offset point int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float px = 0.0 float py = 0.0 float r = 0.0 float theta = 0.0 loop: px = real(#pixel) py = imag(#pixel) theta = atan2(py/px) x = real(z1) y = imag(z1) x1 = -2*x*y + @p1 y = y*y - x*x z1 = x1 + flip(y) x = real(z2) y = imag(z2) x1 = -2*x*y + @p1 y = y*y - x*x z2 = x1 + flip(y) x = real(z3) y = imag(z3) x1 = -2*x*y + @p1 y = y*y - x*x z3 = x1 + flip(y) iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|*|imag(z)| / |real(z)|+|imag(z)| d1 = abs(real(z1))*abs(imag(z1))/(abs(real(z1))+abs(imag(z1))) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2))/(abs(real(z2))+abs(imag(z2))) d3 = abs(real(z3))*abs(imag(z3))/(abs(real(z3))+abs(imag(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |imag(z)|/|real(z)| d1 = abs(imag(z1))/abs(real(z1)) ; get current distances from i axis d2 = abs(imag(z2))/abs(real(z2)) d3 = abs(imag(z3))/abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; distance between z and point d1 = |z1-@point| d2 = |z2-@point| d3 = |z3-@point| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; distance between z and function IF @df == 0 r = @a*sqrt(cos(2*theta)) ELSEIF @df == 1 r = @a*(1-cos(theta)) ELSEIF @df == 2 r = (@a + @b*cos(theta))/cos(theta) ELSEIF @df == 3 r = @a*theta ELSEIF @df == 4 r = exp(@a*theta) ELSEIF @df == 5 r = @a*cos(theta) ENDIF pf = r*cos(theta) + flip(r*sin(theta)) d1 = |z1-pf| d2 = |z2-pf| d3 = |z3-pf| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 10) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 11) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (Gopalsamy)" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Starting Point" default = (0,0) hint = "Starting value for each point. You can use this to \ 'perturb' the fractal." endparam param p1 caption = "seed" default = (-0.19, -0.19) endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 11 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest summ(z)" "smallest prod(z)" "scaled prod(z)" \ "smallest ratio1(z)" "smallest ratio2(z)" "smallest |atan(z)|" \ "distance to point" "distance to function" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin"\ "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param point caption = "Point" default = (-1.0, 1.0) hint = "Point for distance calculation" endparam param df caption = "Polar function" default = 0 enum = "lemniscate" "cardiod" "conchoid" \ "archimedes" "log spiral" "rose" endparam param a caption = "Polar parameter" default = 1.0 hint = "Affects spread and scale" endparam param b caption = "Conchoid parameter" default = 1.0 hint = "Affects shape and scale. \ Use only with conchoid function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam } Mask {; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = @fn1(#pixel) loop: #z = @p1*@fn2(#z)^2 + @p2*@fn3(#z)^2 + #pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mask" center = (0.0, 0.0) maxiter = 256 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1 endparam param p1 caption = "Parameter 1" default = (0.0, 1.0) endparam param p2 caption = "Parameter 2" default = (0.0,1.0) endparam func fn1 caption = "Function 1" default = log() endfunc func fn2 caption = "Function 2" default = sinh() endfunc func fn3 caption = "Function 3" default = cosh() endfunc switch: type = "JMask" bailout = @bailout p3 = #pixel p1 = @p1 p2 = @p2 fn1 = @fn1 fn2 = @fn2 fn3 = @fn3 } JMask {; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = @fn1(#pixel) loop: #z = @p1*@fn2(#z)^2 + @p2*@fn3(#z)^2 + @p3 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "JMask" center = (0.0, 0.0) maxiter = 256 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1 endparam param p1 caption = "Parameter 1" default = (0.0, 1.0) endparam param p2 caption = "Parameter 2" default = (0.0, 1.0) endparam param p3 caption = "Parameter 3" default = (-0.32, -.7125) endparam func fn1 caption = "Function 1" default = log() endfunc func fn2 caption = "Function 2" default = sinh() endfunc func fn3 caption = "Function 3" default = cosh() endfunc switch: type = "Mask" bailout = @bailout p1 = @p1 p2 = @p2 fn1 = @fn1 fn2 = @fn2 fn3 = @fn3 } PseudoZeePi {; Ron Barnett, 1993 ; Modified and tweaked February 2000 init: #z = #pixel loop: x = 1-#z^@p1; #z = #z*((1-x)/(1+x))^(1/@p1) + @p2 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "PseudoZeePi" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1 endparam param p1 caption = "Parameter 1" default = (2.0, 0.0) endparam param p2 caption = "Parameter 2" default = (0.33, 0.0) endparam } RecipIkeM {; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: #z = 1/(#z*#z*#z + (#pixel-1)*#z - #pixel) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) >= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "RecipIkeM" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1 endparam switch: type = "RecipIkeJ" bailout = @bailout p1 = #pixel } RecipIkeJ {; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: #z = 1/(#z*#z*#z + (@p1-1)*#z - @p1) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "RecipIkeJ" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1 endparam param p1 caption = "Parameter 1" default = (0.2125, -0.4875) endparam switch: type = "RecipIkeM" bailout = @bailout } IkeGenM { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = ((1-#pixel)/(3*@p1))^0.5 loop: #z =@p1*#z*#z*#z + (#pixel-1)*#z - #pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "IkeGenM" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (1.0, 0.0) endparam switch: type = "IkeGenJ" bailout = @bailout p2 = #pixel p1 = @p1 } IkeGenJ { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: #z =@p1*#z*#z*#z + (@p2-1)*#z - @p2 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "IkeGenJ" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (1.0, 0.0) endparam param p2 caption = "Parameter 2" default = (0.0375, 0.25) endparam switch: type = "IkeGenM" bailout = @bailout p1 = @p1 } FrRbtGenM {; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: #z = @p1*#z*#z*#z + #z*#z + #pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "FrRbtGenM" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (0.2, 0.0) endparam switch: type = "FrRbtGenJ" bailout = @bailout p2 = #pixel p1 = @p1 } FrRbtGenJ {; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: #z = @p1*#z*#z*#z + #z*#z + @p2 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "FrRbtGenJ" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (0.2, 0.0) endparam param p2 caption = "Parameter 2" default = (-1.025, 0.35) endparam switch: type = "FrRbtGenM" bailout = @bailout p1 = @p1 } IkeFrRbtGenM {; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = 2*(1-#pixel)/(3*@p1) loop: #z = @p1*#z*#z*#z + (#pixel-1)*#z*#z - #pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "IkeFrRbtGenM" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10000.0 min = 1 endparam param p1 caption = "Parameter 1" default = (1.0, 0.0) endparam switch: type = "IkeFrRbtGenJ" bailout = @bailout p2 = #pixel p1 = @p1 } IkeFrRbtGenJ {; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: #z = @p1*#z*#z*#z + (@p2-1)*#z*#z - @p2 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "IkeFrRbtGenJ" center = (0.5, 0.0) maxiter = 1000 periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10000.0 min = 1 endparam param p1 caption = "Parameter 1" default = (1.0, 0.0) endparam param p2 caption = "Parameter 2" default = (0.375, -0.1125) endparam switch: type = "IkeFrRbtGenM" bailout = @bailout p1 = @p1 } PolyGenM { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z=(-@p2+(@p2*@p2+(1-#pixel)*3*@p1)^0.5)/(3*@p1) loop: #z=@p1*#z*#z*#z+@p2*#z*#z+(#pixel-1)* #z-#pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "PolyGenM" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (1.0, 0.0) endparam param p2 caption = "Parameter 2" default = (1.0, 0.0) endparam switch: type = "PolyGenJ" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel } PolyGenJ { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z=(-@p2+(@p2*@p2+(1-#pixel)*3*@p1)^0.5)/(3*@p1) loop: #z=@p1*#z*#z*#z+@p2*#z*#z+(@p3-1)* #z-@p3 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "PolyGenJ" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (1.0, 0.0) endparam param p2 caption = "Parameter 2" default = (1.0, 0.0) endparam param p3 caption = "Parameter 3" default = (0.3375, -0.325) endparam switch: type = "PolyGenM" bailout = @bailout p1 = @p1 p2 = @p2 } Gopalsamy2 { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 ; Modified October 2006 ; Versioning and more parameters added April 2007 init: #z = #pixel loop: ; The original code from Fractint was: ; x = real(#z) ; y = imag(#z) ; x1 = -4*x*y + @p1 ; y = 4*y*y - x*x ; #z = x1 + flip(y) x = real(#z) y = imag(#z)*@a #z = x + flip(y) #z = -(0,1)*conj(#z)^@power + @p1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Gopalsamy2" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param a caption = "Parameter a" default = 2.0 endparam complex param power caption = "Power" default = (2,0) endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam param p1 caption = "Seed" default = (-0.18, -0.18) endparam switch: type = "MandelGopalsamy2" bailout = @bailout a = a power = power } Gopalsamy3 { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: x = real(#z) y = imag(#z) x1 = 3*x*y*y - x*x*x + @p1 y = y*y*y - 3*x*x*y #z = x1 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Gopalsamy3" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam param p1 caption = "Parameter 1" default = (-0.6, -0.6) endparam switch: type = "MandelGopalsamy3" bailout = @bailout } Gopalsamy4 { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: x = real(#z) y = imag(#z) x1 = -x*y + @p1 y = 2*y*y - 3*x*x #z = x1 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Gopalsamy4" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam param p1 caption = "Parameter 1" default = (-0.26, -0.26) endparam switch: type = "MandelGopalsamy4" bailout = @bailout start = @start } Gopalsamy5 { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 ; Modified October 2006 init: #z = #pixel loop: x = real(#z) y = imag(#z) x1 = 2*x*y y1 = x*x - y*y x2 = -2*x1*y1 + @p1 y = y1*y1 - x1*x1 #z = x2 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Gopalsamy5" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam param p1 caption = "Parameter 1" default = (-0.5, -0.5) endparam switch: type = "MandelGopalsamy5" bailout = @bailout } GopalsamySin2 { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: x = real(#z) y = imag(#z) x1 = sin(x)*cosh(y) y1 = cos(x)*sinh(y) x2 = -2*x1*y1 + @p1 y = y1*y1 - x1*x1 #z = x2 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "GopalsamySin2" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (0.96, 0.96) endparam } GopalsamySin { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: x = real(#z) y = imag(#z) x1 = -sin(x)*cosh(y) + @p1 y = -cos(x)*sinh(y) #z = x1 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "GopalsamySin" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam param p1 caption = "Parameter 1" default = (0.96, 0.96) endparam switch: type = "GopalsamySin" bailout = @bailout } GopalsamyExp { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 ; Modified October 2006 init: #z = #pixel loop: x = real(#z) y = imag(#z) x1 = -exp(x)*cos(y) + @p1 y = -exp(x)*sin(y) #z = x1 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "GopalsamyExp" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam param p1 caption = "Parameter 1" default = (0.96, 0.96) endparam switch: type = "MandelGopalsamyExp" bailout = @bailout } GopalsamyExp2 { ; Ron Barnett, October 2006 init: #z = #pixel loop: x = real(#z) y = imag(#z) x1 = exp(x)*cos(y) y1 = exp(x)*sin(y) x2 = -2*x1*y1 + @p1 y = y1*y1 - x1*x1 #z = x2 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "GopalsamyExp2" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam param p1 caption = "Parameter 1" default = (-0.4, 0.19) endparam switch: type = "MandelGopalsamyExp2" bailout = @bailout } GopalsamySinh2 { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: x = real(#z) y = imag(#z) x1 = sinh(x)*cos(y) y1 = cosh(x)*sin(y) x2 = -2*x1*y1 + @p1 y = y1*y1 - x1*x1 #z = x2 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "GopalsamySinh2" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (0.5, 0.5) endparam } GopalsamySinh { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: x = real(#z) y = imag(#z) x1 = -sinh(x)*cos(y) + @p1 y = -cosh(x)*sin(y) #z = x1 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "GopalsamySinh" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (-1.0, 0.9) endparam } GopalsamyFn { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 ; modified October 2006 init: #z = #pixel loop: x = real(#z) y = imag(#z) x1 = @fn1(x)*@fn2(y) y1 = @fn3(x)*@fn4(y) x2 = -2*x1*y1 + @p1 y = y1*y1 - x1*x1 #z = x2 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "GopalsamyFn" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam param p1 caption = "Parameter 1" default = (-0.23, -0.1) endparam func fn1 caption = "First Function" default = asin() endfunc func fn2 caption = "Second Function" default = cos() endfunc func fn3 caption = "Third Function" default = cosh() endfunc func fn4 caption = "Fourth Function" default = atan() endfunc switch: type = "MandelGopalsamyFn" bailout = @bailout fn1 = @fn1 fn2 = @fn2 fn3 = @fn3 fn4 = @fn4 } OldMandelPhoenix {; Ron Barnett, 1990 ; Old formula from Stevens Turbo Pascal book ; Modified and tweaked March 2000 init: #z = 0 complex x1 = 0 complex y = 0 loop: x1 = #z*#z + real(#pixel) + imag(#pixel)*y y = #z #z = x1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "OldMandelPhoenix" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam switch: type = "OldPhoenix" bailout = @bailout p1 = #pixel } OldPhoenix {; Ron Barnett, 1990 ; Old formula from Stevens Turbo Pascal book ; Modified and tweaked March 2000 init: #z = flip(#pixel) complex x1 = 0 complex y = 0 loop: x1 = #z*#z + real(@p1) + imag(@p1)*y y = #z #z = x1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "OldPhoenix" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (0.56667, -0.5) endparam switch: type = "OldMandelPhoenix" bailout = @bailout } Ikenagafn { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: #z = @fn1(#z*#z*#z) + (@p1*#pixel-1)*#z - @p2*#pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Ikenagafn" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (1.0, 0.0) endparam param p2 caption = "Parameter 2" default = (1.0, 0.0) endparam func fn1 caption = "First Function" default = sin() endfunc } IkenagaOriginal { ; Ron Barnett, 1990 ; Modified and tweaked March 2000 init: #z = #pixel loop: #z = #z*#z*#z + (#pixel-1)*#z - #pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "IkenagaOriginal" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam } CubicM { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: #z = (#z-1)*(#z-1)*(#z+1) - #pixel + 1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "CubicM" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam switch: type = "CubicJ" bailout = @bailout p1 = #pixel } CubicJ { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: #z = (#z-1)*(#z-1)*(#z+1) - @p1 + 1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "CubicJ" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (0.559, -0.2) endparam switch: type = "CubicM" bailout = @bailout } CubicfnM { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: #z = @fn1((#z-1)*(#z-1)*(#z+1)) - #pixel*@p1 + @p2 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "CubicfnM" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (1.0, 0.0) endparam param p2 caption = "Parameter 2" default = (1.0, 0.0) endparam func fn1 caption = "Function" default = sin() endfunc switch: type = "CubicfnJ" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel fn1 = @fn1 } CubicfnJ { ; Ron Barnett, 1993 ; Modified and tweaked March 2000 init: #z = #pixel loop: #z = @fn1((#z-1)*(#z-1)*(#z+1)) - @p3*@p1 + @p2 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "CubicfnJ" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (1.0, 0.0) endparam param p2 caption = "Parameter 2" default = (1.0, 0.0) endparam param p3 caption = "Parameter 3" default = (1.525, -0.3125) endparam func fn1 caption = "Function" default = sin() endfunc switch: type = "CubicfnM" bailout = @bailout p1 = @p1 p2 = @p2 fn1 = @fn1 } 4DMandelfnfnczPlane {; Ron Barnett, 1998 ; Modified and tweaked March 2000 init: #z=@p1*real(#pixel)+flip(imag(#pixel)) c=@p2+real(#pixel)+flip(imag(#pixel)*@p1) loop: if (cabs(#z) < @p3) #z = @fn1(#z) + c else #z = @fn2(#z) + c endif bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "4DMandelfnfnczPlane" center = (0.0, 0.0) maxiter = 256 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Parameter 1" default = (0.0, 0.0) endparam param p2 caption = "Parameter 2" default = (0.0, 0.0) endparam param p3 caption = "Parameter 3" default = (0.5, 0.0) endparam func fn1 caption = "Function 1" default = sin() endfunc func fn2 caption = "Function 2" default = sqr() endfunc } SJIkenagamap01 {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: y = ((1-#pixel)/3)^0.5 #z=real(y)+flip(imag(y)*@p1) c=@p2+@p1*real(#pixel)+flip(imag(#pixel)) loop: #z = #z*#z*#z + (c - 1)*#z - c bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "SJIkenagamap01" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.0,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam switch: type = "SJIkenagamap01J" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel } SJIkenagamap01J {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: y = ((1-#pixel)/3)^0.5 #z=real(y)+flip(imag(y)*@p1) c=@p2+@p1*real(@p3)+flip(imag(@p3)) loop: #z = #z*#z*#z + (c - 1)*#z - c bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "SJIkenagamap01J" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "seed" default = (-1.1125, -0.2625) endparam switch: type = "sjikenagamap01" bailout = @bailout p1 = @p1 p2 = @p2 } SJIkenaga01 {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: #z=real(#pixel)+flip(imag(#pixel)*@p1) c=@p2+@p1*real(#pixel)+flip(imag(#pixel)) loop: #z=#z*#z*#z+(c-1)*#z-c bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "SJIkenaga01" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.0,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam } 3RDIMIkenaga01 {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: #z=@p1*real(#pixel)+flip(imag(#pixel)) c=@p2+real(#pixel)+flip(imag(#pixel)*@p1) loop: #z=#z*#z*#z+(c-1)*#z-c bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "3RDIMIkenaga01" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam } SJFrame-Robert {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: #z=real(#pixel)+flip(imag(#pixel)*@p1) c=@p2+@p1*real(#pixel)+flip(imag(#pixel)) loop: #z=#z*#z*#z/5+#z*#z+c bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "SJFrame-Robert" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.0,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam switch: type = "SJFrame-RobertJ" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel } SJFrame-RobertJ {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: #z=real(#pixel)+flip(imag(#pixel)*@p1) c=@p2+@p1*real(@p3)+flip(imag(@p3)) loop: #z=#z*#z*#z/5+#z*#z+c bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "SJFrame-RobertJ" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "seed" default = (-0.157,-0.745) endparam switch: type = "SJFrame-Robert" bailout = @bailout p1 = @p1 p2 = @p2 } 3RDIMFrame-Robert {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: #z=@p1*real(#pixel)+flip(imag(#pixel)) c=@p2+real(#pixel)+flip(imag(#pixel)*@p1) loop: #z=#z*#z*#z/5+#z*#z+c bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "3RDIMFrame-Robert" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam switch: type = "3RDIMFrame-RobertJ" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel } 3RDIMFrame-RobertJ {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: #z=@p1*real(#pixel)+flip(imag(#pixel)) c=@p2+real(@p3)+flip(imag(@p3)*@p1) loop: #z=#z*#z*#z/5+#z*#z+c bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "3RDIMFrame-RobertJ" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "seed" default = (-0.97,-0.55) endparam switch: type = "3RDIMFrame-Robert" bailout = @bailout p1 = @p1 p2 = @p2 } SJSpider01 {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: #z=real(#pixel)+flip(imag(#pixel)*@p1) c=@p2+@p1*real(#pixel)+flip(imag(#pixel)) loop: #z=#z*#z+c c=c/2+#z bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "SJSpider01" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam switch: type = "SJSpider01J" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel } SJSpider01J {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: #z=real(#pixel)+flip(imag(#pixel)*@p1) c=@p2+@p1*real(@p3)+flip(imag(@p3)) loop: #z=#z*#z+c c=c/2+#z bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "SJSpider01J" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "seed" default = (-0.7125,-0.475) endparam switch: type = "SJSpider01" bailout = @bailout p1 = @p1 p2 = @p2 } 3RDIMSpider01 {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: #z=@p1*real(#pixel)+flip(imag(#pixel)) c=@p2+real(#pixel)+flip(imag(#pixel)*@p1) loop: #z=#z*#z+c c=c/2+#z bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "3RDIMSpider01" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam switch: type = "3RDIMSpider01J" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel } 3RDIMSpider01J {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: #z=@p1*real(#pixel)+flip(imag(#pixel)) c=@p2+real(@p3)+flip(imag(@p3)*@p1) loop: #z=#z*#z+c c=c/2+#z bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "3RDIMSpider01J" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "seed" default = (0.1,-0.625) endparam switch: type = "3RDIMSpider01" bailout = @bailout p1 = @p1 p2 = @p2 } SJManowar01 {; Ron Barnett, 1994 ; Modified and tweaked March 2000 ; Fixed algorithm code September 2006 init: #z=real(#pixel)+flip(imag(#pixel)*@p1) z1 = #z c=@p2+@p1*real(#pixel)+flip(imag(#pixel)) loop: complex oldz = #z #z = oldz*oldz + z1 + c z1 = oldz ; old code ; #z=#z*#z+z1+c ; z1=#z bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "SJManowar01" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam switch: type = "SJManowar01J" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel } SJManowar01J {; Ron Barnett, 1994 ; Modified and tweaked March 2000 init: #z=real(#pixel)+flip(imag(#pixel)*@p1) z1 = #z c=@p2+@p1*real(@p3)+flip(imag(@p3)) loop: complex oldz = #z #z = oldz*oldz + z1 + c z1 = oldz ; old code ; #z=#z*#z+z1+c ; z1=#z bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "SJManowar01J" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "seed" default = (0.2,0.06) endparam switch: type = "SJManowar01" bailout = @bailout p1 = @p1 p2 = @p2 } 3RDIMManowar01 {; Ron Barnett, 1994 ; Modified and tweaked March 2000 ; Algorithm error corrected September 2006 init: #z=@p1*real(#pixel)+flip(imag(#pixel)) z1 = #z c=@p2+real(#pixel)+flip(imag(#pixel)*@p1) loop: complex oldz = #z if @version == "1.0" #z = oldz*oldz + z1 + c z1 = oldz elseif @version == "0" ; old code, which is in error #z = #z*#z + z1 + c z1=#z endif bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "3RDIMManowar01" maxiter = 255 center = (0, 0) $ifdef VER40 heading text = "If your old upr does perform correctly, change the default 'Version \ number' to '0'. DO NOT CHANGE THE DEFAULT VALUE FOR NEW UPRS!" endheading $endif param version default = 1 enum = "0" "1.0" hint = "This is for backwards compatibility with old versions \ of the formula. If your old upr does perform correctly, change the default 'Version \ number' to '0'. DO NOT CHANGE THE DEFAULT VALUE FOR NEW UPRS!" endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam switch: type = "3RDIMManowar01J" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel version = @version } 3RDIMManowar01J {; Ron Barnett, 1994 ; Modified and tweaked March 2000 ; code algorithm corrected September 2006 init: #z=@p1*real(#pixel)+flip(imag(#pixel)) z1 = #z c=@p2+real(@p3)+flip(imag(@p3)*@p1) loop: complex oldz = #z if @version == "1.0" #z = oldz*oldz + z1 + c z1 = oldz elseif @version == "0" ; old code, which is in error #z = #z*#z + z1 + c z1=#z endif bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "3RDIMManowar01J" maxiter = 255 center = (0, 0) $ifdef VER40 heading text = "If your old upr does perform correctly, change the default 'Version \ number' to '0'. DO NOT CHANGE THE DEFAULT VALUE FOR NEW UPRS!" endheading $endif param version default = 1 enum = "0" "1.0" hint = "This is for backwards compatibility with old versions \ of the formula. If your old upr does perform correctly, change the default 'Version \ number' to '0'. DO NOT CHANGE THE DEFAULT VALUE FOR NEW UPRS!" endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "seed" default = (0.06,-0.1) endparam switch: type = "3RDIMManowar01" bailout = @bailout p1 = @p1 p2 = @p2 version = @version } MandelbrotMix4_UF {; Ron Barnett, June 2000 ; This is a Ultrafractal conversion with some ; Generalization of the MandelbrotMix4 formula ; created by Jim Muth (with his permission). init: float a = real(@p1) float b = imag(@p1) float d = real(@p2) float f = imag(@p2) #z = (-a*b/(f*d))^(1/(f-b)) float k = real(p3) + 1 float l = imag(p3) + 100 complex c = @fn1(#pixel) loop: #z = k*(a*#z^b + d*#z^f) + c bailout: (@test == 0 && |#z| <= l) || \ (@test == 1 && sqr(real(#z)) <= l) || \ (@test == 2 && sqr(imag(#z)) <= l) || \ (@test == 3 && (sqr(real(#z)) <= l && sqr(imag(#z)) < l)) || \ (@test == 4 && (sqr(real(#z)) <= l || sqr(imag(#z)) < l)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= l)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= l)) default: title = "MandelbrotMix4_UF" maxiter = 255 center = (0, 0) periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p1 caption = "Parameter 1" default = (1,4) endparam param p2 caption = "Parameter 2" default = (2,2) endparam param p3 caption = "Parameter 3" default = (-0.5,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam func fn1 caption = "Function 1" default = abs() endfunc switch: type = "JuliaMix4_UF" p1 = @p1 p2 = @p2 p3 = @p3 test = @test fn1 = @fn1 seed = #pixel } SlopeExpMandelbrotMix4_UF {; Ron Barnett, June 2000 ; This is a Ultrafractal conversion with some ; Generalization of the MandelbrotMix4 formula ; created by Jim Muth (with his permission). ; Some of the code based upon the slope (Mandelbrot) ; formula of Damien Jones init: float a = real(@p1) float b = imag(@p1) float d = real(@p2) float f = imag(@p2) float k = real(p3) + 1 complex c1 = @fn1(#pixel) ; primary iterated point complex c2 = @fn1(#pixel) + @offset ; horizontally offset point complex c3 = @fn1(#pixel) + flip(@offset) ; vertically offset point complex z1 = (-a*b/(f*d))^(1/(f-b)) ; starting value complex z2 = (-a*b/(f*d))^(1/(f-b)) complex z3 = (-a*b/(f*d))^(1/(f-b)) int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z1 = k*(a*z1^b + d*z1^f) + c1 ; iterate each point z2 = k*(a*z2^b + d*z2^f) + c2 z3 = k*(a*z3^b + d*z3^f) + c3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (MandelbrotMix4_UF)" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam float param bailout caption = "bailout" default = 1e5 endparam param p1 caption = "Parameter 1" default = (1,4) endparam param p2 caption = "Parameter 2" default = (2,2) endparam float param p3 caption = "Parameter 3" default = -0.5 endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam func fn1 caption = "Function 1" default = ident() endfunc switch: type = "SlopeExpJuliaMix4_UF" p1 = @p1 p2 = @p2 p3 = @p3 test = @test fn1 = @fn1 offset = @offset zmode = @zmode xfer = @xfer zscale = @zscale zsacale2 = @zscale2 everyiter = @everyiter seed = #pixel } NegativeMandelPower {; Ron Barnett, October 2008 ; Mandelbrot with extended bailout options init: #z = #pixel loop: #z = (-#z)^@power + #pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Negative MandelPower" maxiter = 1000 center = (-0.5, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam complex param power caption = "Power" default = (2,0) endparam switch: type = "NegativeJuliaPower" bailout = @bailout power = @power p1 = #pixel test = @test } NegativeJuliaPower {; Ron Barnett, October 2008 ; Mandelbrot with extended bailout options init: #z = #pixel loop: #z = (-#z)^@power + @p1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Negative JuliaPower" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam complex param power caption = "Power" default = (2,0) endparam param p1 caption = "seed" default = (-0.75, 0.2) endparam switch: type = "NegativeMandelPower" bailout = @bailout power = @power test = @test } MandelbrotBailout {; Ron Barnett, September 2000 ; Mandelbrot with extended bailout options init: #z = #pixel loop: #z = #z^@power + #pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mandelbrot Bailout" maxiter = 1000 center = (-0.5, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam complex param power caption = "Power" default = (2,0) endparam switch: type = "JuliaBailout" bailout = @bailout power = @power p1 = #pixel test = @test } JuliaBailout {; Ron Barnett, September 2000 ; Mandelbrot with extended bailout options init: #z = #pixel loop: #z = #z^@power + @p1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Julia Bailout" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam complex param power caption = "Power" default = (2,0) endparam param p1 caption = "seed" default = (-0.75, 0.2) endparam switch: type = "MandelbrotBailout" bailout = @bailout power = @power test = @test } SlopeExp3RDIMSpider01 {; Ron Barnett, September 2000 ; Some of the code based upon the slope (Mandelbrot) ; formula of Damien Jones init: complex c1 = @p2 + real(#pixel) + flip(imag(#pixel)*@p1) complex c2 = @p2 + real(#pixel) + flip(imag(#pixel)*@p1) + @offset complex c3 = @p2 + real(#pixel) + flip(imag(#pixel)*@p1) + flip(@offset) complex z1 = @p1*real(#pixel) + flip(imag(#pixel)) complex z2 = z1 complex z3 = z1 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z1 = z1*z1 + c1 z2 = z2*z2 + c2 z3 = z3*z3 + c3 c1=c1/2+z1 c2=c2/2+z2 c3=c3/2+z3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (3RDIMSpider01)" center = (0.0, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandel set anymore." endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExp3RDIMSpider01J" bailout = @bailout offset = @offset zmode = @zmode xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter p1 = @p1 p2 = @p2 p3 = #pixel } SlopeExp3RDIMSpider01J {; Ron Barnett, September 2000 ; Some of the code based upon the slope (Mandelbrot) ; formula of Damien Jones init: complex c1 = @p2 + real(@p3) + flip(imag(@p3)*@p1) complex c2 = @p2 + real(@p3) + flip(imag(@p3)*@p1) + @offset complex c3 = @p2 + real(@p3) + flip(imag(@p3)*@p1) + flip(@offset) complex z1 = @p1*real(#pixel) + flip(imag(#pixel)) complex z2 = z1 complex z3 = z1 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z1 = z1*z1 + c1 z2 = z2*z2 + c2 z3 = z3*z3 + c3 c1=c1/2+z1 c2=c2/2+z2 c3=c3/2+z3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (3RDIMSpider01J)" center = (0.0, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandel set anymore." endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "seed" default = (0.1,-0.625) endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExp3RDIMSpider01" bailout = @bailout offset = @offset zmode = @zmode xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter p1 = @p1 p2 = @p2 } SlopeExpSJIkenagamap01 {; Ron Barnett, September 2000 ; Some of the code based upon the slope (Mandelbrot) ; formula of Damien Jones init: y = ((1-#pixel)/3)^0.5 complex c1 = @p2 + @p1*real(#pixel) + flip(imag(#pixel)) complex c2 = @p2 + @p1*real(#pixel) + flip(imag(#pixel)) + @offset complex c3 = @p2 + @p1*real(#pixel) + flip(imag(#pixel)) + flip(@offset) complex z1 = real(y) + flip(imag(y)*@p1) complex z2 = z1 complex z3 = z1 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z1 = z1*z1*z1 + (c1 - 1)*z1 - c1 z2 = z2*z2*z2 + (c2 - 1)*z2 - c2 z3 = z3*z3*z3 + (c3 - 1)*z3 - c3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (SJIkenagamap01)" center = (0.0, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandel set anymore." endparam param p1 caption = "Plane rotation" default = (0.0,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpSJIkenagamap01J" bailout = @bailout offset = @offset zmode = @zmode xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter p1 = @p1 p2 = @p2 p3 = #pixel } SlopeExpSJIkenagamap01J {; Ron Barnett, September 2000 ; Some of the code based upon the slope (Mandelbrot) ; formula of Damien Jones init: y = ((1-#pixel)/3)^0.5 complex c1 = @p2 + @p1*real(@p3) + flip(imag(@p3)) complex c2 = @p2 + @p1*real(@p3) + flip(imag(@p3)) + @offset complex c3 = @p2 + @p1*real(@p3) + flip(imag(@p3)) + flip(@offset) complex z1 = real(y) + flip(imag(y)*@p1) complex z2 = z1 complex z3 = z1 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z1 = z1*z1*z1 + (c1 - 1)*z1 - c1 z2 = z2*z2*z2 + (c2 - 1)*z2 - c2 z3 = z3*z3*z3 + (c3 - 1)*z3 - c3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (SJIkenagamap01J)" center = (0.0, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandel set anymore." endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "seed" default = (-1.1125, -0.2625) endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpSJIkenagamap01" bailout = @bailout offset = @offset zmode = @zmode xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter p1 = @p1 p2 = @p2 } IkenagaRoots-Mandel { ; Ron Barnett, September 2000 ; Another Newton with mini-mandelbrots ; Based on the Ikenaga formula init: #z = 0 oldz = 0 a = ((1-#pixel)/3)^0.5 loop: oldz = #z #z = (2*#z*#z*#z + a) / (3*#z*#z + a - 1) bailout: |#z - oldz| >= @bailout default: title = "Ikenaga Roots - Mandel" maxiter = 1000 center = (-0.663, 0) magn = 140 method = multipass periodicity = 0 heading caption = "Ikenaga Roots-Mandel" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal that \ has Mandelbrot-like regions." endheading $else heading caption = "This is a 'convergent' fractal" endheading heading caption = "that has Mandelbrot-like regions" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout value" default = 0.000001 endparam switch: type = "IkenagaRoots-Julia" bailout = @bailout p1 = #pixel } FrameRobertRoots-Mandel { ; Ron Barnett, September 2000 ; Another Newton with mini-mandelbrot like regions ; Based on the FrameRobert formula init: #z = @init oldz = 0 a = #pixel loop: oldz = #z #z = (2*#z*#z*#z/5 + #z*#z - a) / (3*#z*#z/5 + 2*#z) bailout: |#z - oldz| >= @bailout default: title = "FrameRobert Roots-Mandel" maxiter = 1000 center = (5.25, 0) method = multipass periodicity = 0 magn = 6.5 heading caption = "FrameRobert Roots-Mandel" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal that \ has Mandelbrot-like regions." endheading $else heading caption = "This is a 'convergent' fractal" endheading heading caption = "that has Mandelbrot-like regions" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout value" default = 0.000001 endparam param init caption = "Iteration Initialization" default = (0.945,0) endparam switch: type = "FrameRobertRoots-Julia" bailout = @bailout p1 = #pixel init = @init } FrameRobertRoots-Julia { ; Ron Barnett, September 2000 ; Another Newton with mini-julia like regions ; Based on the FrameRobert formula init: #z = @init + #pixel oldz = 0 a = @p1 loop: oldz = #z #z = (2*#z*#z*#z/5 + #z*#z - a) / (3*#z*#z/5 + 2*#z) bailout: |#z - oldz| >= @bailout default: title = "FrameRobert Roots-Julia" maxiter = 1000 center = (-2.625, 0) magn = 4.5 method = multipass periodicity = 0 heading caption = "FrameRobert Roots-Julia" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal that \ has Julia-like regions." endheading $else heading caption = "This is a 'convergent' fractal" endheading heading caption = "that has Julia-like regions" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout value" default = 0.000001 endparam param p1 caption = "Parameter 1" default = (5.1885, 0.04) endparam param init caption = "Iteration Initialization" default = (0.945,0) endparam switch: type = "FrameRobertRoots-Mandel" bailout = @bailout p1 = #pixel init = @init } IkenagaRoots-Julia { ; Ron Barnett, September 2000 ; Another Newton with mini-julias ; Based on the Ikenaga formula init: #z = #pixel oldz = 0 a = ((1-@p1)/3)^0.5 loop: oldz = #z #z = (2*#z*#z*#z + a) / (3*#z*#z + a - 1) bailout: |#z - oldz| >= @bailout default: title = "Ikenaga Roots-Julia" maxiter = 1000 center = (0, 0) magn = 40 periodicity = 0 method = multipass heading caption = "Ikenaga Roots-Julia" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal that \ has Julia-like regions." endheading $else heading caption = "This is a 'convergent' fractal" endheading heading caption = "that has Julia-like regions" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout value" default = 0.000001 endparam param p1 caption = "Parameter 1" default = (-0.66, 0.0017) endparam switch: type = "IkenagaRoots-Mandel" bailout = @bailout } SlopeIkenagaRoots-Mandel { ; Ron Barnett, September 2000 ; Another Newton with mini-mandelbrots ; Based on the Ikenaga formula and the slope (Mandelbrot) ; formula of Damien Jones ; init: complex z1 = 0 ; primary iterated point complex z2 = @offset ; horizontally offset point complex z3 = flip(@offset) ; vertically offset point a = ((1-#pixel)/3)^0.5 int done = 2 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: complex oldz1 = z1 z1 = (2*z1*z1*z1 + a) / (3*z1*z1 + a - 1) complex oldz2 = z2 z2 = (2*z2*z2*z2 + a) / (3*z2*z2 + a - 1) complex oldz3 = z3 z3 = (2*z3*z3*z3 + a) / (3*z3*z3 + a - 1) IF (@zmode == 87) iterexp1 = iterexp1 + exp(-1/(cabs(oldz1 - z1))) iterexp2 = iterexp2 + exp(-1/(cabs(oldz2 - z2))) iterexp3 = iterexp3 + exp(-1/(cabs(oldz3 - z3))) ENDIF done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF IF (@p2 > |oldz1-z1| || \ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (@p2 > |oldz1-z1|) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "Slope (IkenagaRoots-Mandel)" maxiter = 1000 center = (-0.663, 0) magn = 140 method = multipass periodicity = 0 heading caption = "Slope Ikenaga Roots-Mandel" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal. Eighty eight different height \ value types are available. Use with Damien's Lighting formula, \ 3D Texturizer Enhanced III or Direct Color Slope." endheading $else heading caption = "This is a 'convergent' fractal." endheading heading caption = "Use with Damien's Lighting" endheading heading caption = "formula or 3D Texturizer III" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p2 caption = "Bailout value" default = 0.000001 max = 0.1 endparam param offset caption = "Orbit Separation" default = 0.001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeIkenagaRoots-Julia" p2 = @p2 p1 = #pixel offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeIkenagaRoots-Julia { ; Ron Barnett, September 2000 ; Another Newton with mini-julias ; Based on the Ikenaga formula and the slope (Mandelbrot) ; formula of Damien Jones ; init: complex z1 = #pixel ; primary iterated point complex z2 = #pixel + @offset ; horizontally offset point complex z3 = #pixel + flip(@offset) ; vertically offset point a = ((1-@p1)/3)^0.5 int done = 2 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: complex oldz1 = z1 z1 = (2*z1*z1*z1 + a) / (3*z1*z1 + a - 1) complex oldz2 = z2 z2 = (2*z2*z2*z2 + a) / (3*z2*z2 + a - 1) complex oldz3 = z3 z3 = (2*z3*z3*z3 + a) / (3*z3*z3 + a - 1) IF (@zmode == 87) iterexp1 = iterexp1 + exp(-1/(cabs(oldz1 - z1))) iterexp2 = iterexp2 + exp(-1/(cabs(oldz2 - z2))) iterexp3 = iterexp3 + exp(-1/(cabs(oldz3 - z3))) ENDIF done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF IF (@p2 > |oldz1-z1| || \ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (@p2 > |oldz1-z1|) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "Slope (IkenagaRoots-Julia)" maxiter = 1000 center = (0, 0) magn = 40 periodicity = 0 method = multipass heading caption = "Slope IkenagaRoots-Julia" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal. Eighty eight different height \ value types are available. Use with Damien's Lighting formula, \ 3D Texturizer Enhanced III or Direct Color Slope." endheading $else heading caption = "This is a 'convergent' fractal." endheading heading caption = "Use with Damien's Lighting" endheading heading caption = "formula or 3D Texturizer III" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p1 caption = "Parameter 1" default = (-0.66, 0.0017) endparam param p2 caption = "Bailout value" default = 0.000001 max = 0.1 endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeIkenagaRoots-Mandel" p2 = @p2 offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeFrameRobertRoots-Mandel { ; Ron Barnett, September 2000 ; Another Newton with mini-mandelbrot like regions ; Based on the FrameRobert formula and the slope (Mandelbrot) ; formula of Damien Jones ; init: complex z1 = @init ; primary iterated point complex z2 = @init + @offset ; horizontally offset point complex z3 = @init + flip(@offset) ; vertically offset point a = #pixel int done = 2 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: complex oldz1 = z1 z1 = (2*z1*z1*z1/5 + z1*z1 - a) / (3*z1*z1/5 + 2*z1) complex oldz2 = z2 z2 = (2*z2*z2*z2/5 + z2*z2 - a) / (3*z2*z2/5 + 2*z2) complex oldz3 = z3 z3 = (2*z3*z3*z3/5 + z3*z3 - a) / (3*z3*z3/5 + 2*z3) IF (@zmode == 87) iterexp1 = iterexp1 + exp(-1/(cabs(oldz1 - z1))) iterexp2 = iterexp2 + exp(-1/(cabs(oldz2 - z2))) iterexp3 = iterexp3 + exp(-1/(cabs(oldz3 - z3))) ENDIF done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF IF (@p2 > |oldz1-z1| || \ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (@p2 > |oldz1-z1|) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "Slope (FrameRobertRoots-Mandel)" maxiter = 1000 center = (5.25, 0) method = multipass periodicity = 0 magn = 6.5 heading caption = "Slope FrameRobertRoots-Mandel" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal. Eighty eight different height \ value types are available. Use with Damien's Lighting formula, \ 3D Texturizer Enhanced III or Direct Color Slope." endheading $else heading caption = "This is a 'convergent' fractal." endheading heading caption = "Use with Damien's Lighting" endheading heading caption = "formula or 3D Texturizer III" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p2 caption = "Bailout value" default = 0.000001 max = 0.1 endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam param init caption = "Iteration Initialization" default = (0.945,0) endparam switch: type = "SlopeFrameRobertRoots-Julia" p2 = @p2 p1 = #pixel offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeFrameRobertRoots-Julia { ; Ron Barnett, September 2000 ; Another Newton with mini-julia like regions ; Based on the FrameRobert formula and the slope (Mandelbrot) ; formula of Damien Jones ; init: complex z1 = @init + #pixel ; primary iterated point complex z2 = @init + #pixel + @offset ; horizontally offset point complex z3 = @init + #pixel + flip(@offset) ; vertically offset point a = @p1 int done = 2 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: complex oldz1 = z1 z1 = (2*z1*z1*z1/5 + z1*z1 - a) / (3*z1*z1/5 + 2*z1) complex oldz2 = z2 z2 = (2*z2*z2*z2/5 + z2*z2 - a) / (3*z2*z2/5 + 2*z2) complex oldz3 = z3 z3 = (2*z3*z3*z3/5 + z3*z3 - a) / (3*z3*z3/5 + 2*z3) IF (@zmode == 87) iterexp1 = iterexp1 + exp(-1/(cabs(oldz1 - z1))) iterexp2 = iterexp2 + exp(-1/(cabs(oldz2 - z2))) iterexp3 = iterexp3 + exp(-1/(cabs(oldz3 - z3))) ENDIF done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF IF (@p2 > |oldz1-z1| || \ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (@p2 > |oldz1-z1|) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "Slope (FrameRobertRoots-Julia)" maxiter = 1000 center = (-2.625, 0) magn = 4.5 method = multipass periodicity = 0 heading caption = "Slope FrameRobertRoots-Julia" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal. Eighty eight different height \ value types are available. Use with Damien's Lighting formula, \ 3D Texturizer Enhanced III or Direct Color Slope." endheading $else heading caption = "This is a 'convergent' fractal." endheading heading caption = "Use with Damien's Lighting" endheading heading caption = "formula or 3D Texturizer III" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p1 caption = "Parameter 1" default = (5.1885, 0.04) endparam param p2 caption = "Bailout value" default = 0.000001 max = 0.1 endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam param init caption = "Iteration Initialization" default = (0.945,0) endparam switch: type = "SlopeFrameRobertRoots-Mandel" p2 = @p2 offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } CubicRoots-Mandel { ; Ron Barnett, September 2000 ; Another Newton with mini-mandelbrot like regions ; Based on the Cubic formula (Ron Barnett circa 1993) init: #z = @init oldz = 0 a = #pixel loop: oldz = #z #z = (2*#z*#z*#z - #z*#z +a -2) / (3*#z*#z - 2*#z - 1) bailout: |#z - oldz| >= @bailout default: title = "Cubic Roots-Mandel" maxiter = 1000 center = (0.51, 0) magn = 50 method = multipass periodicity = 0 heading caption = "Cubic Roots-Mandel" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal that \ has Mandelbrot-like regions." endheading $else heading caption = "This is a 'convergent' fractal" endheading heading caption = "that has Mandelbrot-like regions" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout value" default = 0.000001 endparam param init caption = "Iteration Initialization" default = (0.33,0) endparam switch: type = "CubicRoots-Julia" bailout = @bailout p1 = #pixel init = @init } CubicRoots-Julia { ; Ron Barnett, September 2000 ; Another Newton with mini-mandelbrot like regions ; Based on the Cubic formula (Ron Barnett circa 1993) init: #z = @init + #pixel oldz = 0 a = @p1 loop: oldz = #z #z = (2*#z*#z*#z - #z*#z +a -2) / (3*#z*#z - 2*#z - 1) bailout: |#z - oldz| >= @bailout default: title = "Cubic Roots-Julia" maxiter = 1000 center = (0, 0) magn = 12 method = multipass periodicity = 0 heading caption = "Cubic Roots-Julia" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal that \ has Julia-like regions." endheading $else heading caption = "This is a 'convergent' fractal" endheading heading caption = "that has Julia-like regions" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout value" default = 0.000001 endparam param p1 caption = "Parameter 1" default = (0.522375, -0.002875) endparam param init caption = "Iteration Initialization" default = (0.33,0) endparam switch: type = "CubicRoots-Mandel" bailout = @bailout init = @init } SlopeCubicRoots-Mandel { ; Ron Barnett, September 2000 ; Another Newton with mini-mandelbrot like regions ; Based on the Cubic formula and the slope (Mandelbrot) ; formula of Damien Jones ; init: complex z1 = @init ; primary iterated point complex z2 = @init + @offset ; horizontally offset point complex z3 = @init + flip(@offset) ; vertically offset point a = #pixel int done = 2 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: complex oldz1 = z1 z1 = (2*z1*z1*z1 - z1*z1 +a -2) / (3*z1*z1 - 2*z1 - 1) complex oldz2 = z2 z2 = (2*z2*z2*z2 - z2*z2 +a -2) / (3*z2*z2 - 2*z2 - 1) complex oldz3 = z3 z3 = (2*z3*z3*z3 - z3*z3 +a -2) / (3*z3*z3 - 2*z3 - 1) IF (@zmode == 87) iterexp1 = iterexp1 + exp(-1/(cabs(oldz1 - z1))) iterexp2 = iterexp2 + exp(-1/(cabs(oldz2 - z2))) iterexp3 = iterexp3 + exp(-1/(cabs(oldz3 - z3))) ENDIF done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF IF (@p2 > |oldz1-z1| || \ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (@p2 > |oldz1-z1|) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "Slope (CubicRoots-Mandel)" center = (0.51, 0) magn = 50 method = multipass periodicity = 0 maxiter = 1000 heading caption = "Slope CubicRoots-Mandel" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal. Eighty eight different height \ value types are available. Use with Damien's Lighting formula, \ 3D Texturizer Enhanced III or Direct Color Slope." endheading $else heading caption = "This is a 'convergent' fractal." endheading heading caption = "Use with Damien's Lighting" endheading heading caption = "formula or 3D Texturizer III" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p2 caption = "Bailout value" default = 0.000001 max = 0.1 endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam param init caption = "Iteration Initialization" default = (0.33,0) endparam switch: type = "SlopeCubicRoots-Julia" p2 = @p2 p1 = #pixel offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeCubicRoots-Julia { ; Ron Barnett, September 2000 ; Another Newton with mini-julia like regions ; Based on the Cubic formula and the slope (Mandelbrot) ; formula of Damien Jones ; init: complex z1 = @init + #pixel ; primary iterated point complex z2 = @init + #pixel + @offset ; horizontally offset point complex z3 = @init + #pixel + flip(@offset) ; vertically offset point a = @p1 int done = 2 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: complex oldz1 = z1 z1 = (2*z1*z1*z1 - z1*z1 +a -2) / (3*z1*z1 - 2*z1 - 1) complex oldz2 = z2 z2 = (2*z2*z2*z2 - z2*z2 +a -2) / (3*z2*z2 - 2*z2 - 1) complex oldz3 = z3 z3 = (2*z3*z3*z3 - z3*z3 +a -2) / (3*z3*z3 - 2*z3 - 1) IF (@zmode == 87) iterexp1 = iterexp1 + exp(-1/(cabs(oldz1 - z1))) iterexp2 = iterexp2 + exp(-1/(cabs(oldz2 - z2))) iterexp3 = iterexp3 + exp(-1/(cabs(oldz3 - z3))) ENDIF done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF IF (@p2 > |oldz1-z1| || \ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (@p2 > |oldz1-z1|) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "Slope (CubicRoots-Julia)" maxiter = 1000 center = (0, 0) magn = 12 method = multipass periodicity = 0 heading caption = "Slope CubicRoots-Julia" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal. Eighty eight different height \ value types are available. Use with Damien's Lighting formula, \ 3D Texturizer Enhanced III or Direct Color Slope." endheading $else heading caption = "This is a 'convergent' fractal." endheading heading caption = "Use with Damien's Lighting" endheading heading caption = "formula or 3D Texturizer III" endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p1 caption = "Parameter 1" default = (0.522375, -0.002875) endparam param p2 caption = "Bailout value" default = 0.000001 max = 0.1 endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam param init caption = "Iteration Initialization" default = (0.33,0) endparam switch: type = "SlopeCubicRoots-Mandel" p2 = @p2 offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } JuliaMix4_UF {; Ron Barnett, December 2000 ; This is the Julia version of the MandelbrotMix4 formula ; created by Jim Muth. init: float a = real(@p1) float b = imag(@p1) float d = real(@p2) float f = imag(@p2) #z = #pixel float k = real(p3) + 1 float l = imag(p3) + 100 complex c = @fn1(@seed) loop: #z = k*(a*#z^b + d*#z^f) + c bailout: (@test == 0 && |#z| <= l) || \ (@test == 1 && sqr(real(#z)) <= l) || \ (@test == 2 && sqr(imag(#z)) <= l) || \ (@test == 3 && (sqr(real(#z)) <= l && sqr(imag(#z)) < l)) || \ (@test == 4 && (sqr(real(#z)) <= l || sqr(imag(#z)) < l)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= l)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= l)) default: title = "JuliaMix4_UF" maxiter = 255 center = (0, 0) periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p1 caption = "Parameter 1" default = (1,4) endparam param p2 caption = "Parameter 2" default = (2,2) endparam param p3 caption = "Parameter 3" default = (-0.5,0) endparam param seed caption = "Julia Seed" default = (0.43,0.16) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam func fn1 caption = "Function 1" default = abs() endfunc switch: type = "MandelbrotMix4_UF" p1 = @p1 p2 = @p2 p3 = @p3 fn1 = @fn1 test = @test } SlopeExpJuliaMix4_UF {; Ron Barnett, December 2000 ; This is the Julia version of the MandelbrotMix4 formula ; created by Jim Muth. ; Some of the code based upon the slope (Mandelbrot) ; formula of Damien Jones init: float a = real(@p1) float b = imag(@p1) float d = real(@p2) float f = imag(@p2) float k = real(@p3) + 1 complex c1 = @fn1(@seed) ; primary iterated point complex c2 = @fn1(@seed) + @offset ; horizontally offset point complex c3 = @fn1(@seed) + flip(@offset) ; vertically offset point complex z1 = #pixel ; primary iterated point complex z2 = #pixel + @offset ; horizontally offset point complex z3 = #pixel + flip(@offset) ; vertically offset point int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: z1 = k*(a*z1^b + d*z1^f) + c1 ; iterate each point z2 = k*(a*z2^b + d*z2^f) + c2 z3 = k*(a*z3^b + d*z3^f) + c3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout) ; we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (JuliaMix4_UF)" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam float param bailout caption = "bailout" default = 1e5 endparam param p1 caption = "Parameter 1" default = (1,4) endparam param p2 caption = "Parameter 2" default = (2,2) endparam param p3 caption = "Parameter 3" default = (-0.5,0) endparam param seed caption = "Julia Seed" default = (0.43,0.16) endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam func fn1 caption = "Function 1" default = ident() endfunc switch: type = "SlopeMandelbrotJuliaMix4_UF" p1 = @p1 p2 = @p2 p3 = @p3 test = @test fn1 = @fn1 offset = @offset zmode = @zmode xfer = @xfer zscale = @zscale zsacale2 = @zscale2 everyiter = @everyiter } fun_barnsleyj1 { init: #z = #pixel loop: IF real(#z) >= 0 #z = @fn1(#z) #z = (#z - 1) * @seed ELSE #z = @fn1(#z) #z = (#z + 1) * @seed ENDIF bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Fun Barnsley 1 (Julia)" maxiter = 1000 method = multipass periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param seed caption = "Seed" default = (0.9, 1.0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10000.0 min = 1.0 endparam func fn1 caption = "Function" default = ident() endfunc switch: type = "fun_barnsleym1" bailout = bailout test = test fn1 = fn1 } fun_barnsleyj2 { init: #z = #pixel loop: IF real(#z) * imag(@start) + real(@start) * imag(#z) >= 0 #z = @fn1(#z) #z = (#z - 1) * @start ELSE #z = @fn1(#z) #z = (#z + 1) * @start ENDIF bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Fun Barnsley 2 (Julia)" maxiter = 149 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Parameter" default = (0.6, 1.1) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1.0 endparam func fn1 caption = "Function" default = ident() endfunc switch: type = "fun_barnsleym2" bailout = bailout test = test fn1 = fn1 } fun_barnsleyj3 { init: #z = #pixel loop: IF real(#z) > 0 #z = @fn1(#z) #z = sqr(#z) - 1 ELSE #z = @fn1(#z) #z = sqr(#z) - 1 + @start * real(#z) ENDIF bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Fun Barnsley 3 (Julia)" maxiter = 149 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Parameter" default = (0.1, 0.36) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1.0 endparam func fn1 caption = "Function" default = ident() endfunc switch: type = "fun_barnsleym3" bailout = bailout test = test fn1 = fn1 } fun_barnsleym1 { init: #z = #pixel + @start loop: IF real(#z) >= 0 #z = @fn1(#z) #z = (#z - 1) * #pixel ELSE #z = @fn1(#z) #z = (#z + 1) * #pixel ENDIF bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Fun Barnsley 1 (Mandelbrot)" maxiter = 1000 method = multipass periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0, 0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10000.0 min = 1.0 endparam func fn1 caption = "Function" default = ident() endfunc switch: type = "fun_barnsleyj1" seed = #pixel bailout = bailout test = test fn1 = fn1 } fun_barnsleym2 { init: #z = #pixel + @start loop: IF real(#z) * imag(#pixel) + real(#pixel) * imag(#z) >= 0 #z = @fn1(#z) #z = (#z - 1) * #pixel ELSE #z = @fn1(#z) #z = (#z + 1) * #pixel ENDIF bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Fun Barnsley 2 (Mandelbrot)" maxiter = 149 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0, 0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1.0 endparam func fn1 caption = "Function" default = ident() endfunc switch: type = "fun_barnsleyj2" start = #pixel bailout = bailout test = test fn1 = fn1 } fun_barnsleym3 { init: #z = #pixel + @start loop: IF real(#z) > 0 #z = @fn1(#z) #z = sqr(#z) - 1 ELSE #z = @fn1(#z) #z = sqr(#z) - 1 + #pixel * real(#z) ENDIF bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Fun Barnsley 3 (Mandelbrot)" maxiter = 149 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0, 0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1.0 endparam func fn1 caption = "Function" default = ident() endfunc switch: type = "fun_barnsleyj3" start = #pixel bailout = bailout test = test fn1 = fn1 } SlopeExpFun_BarnsleyM1 { ; Ron Barnett, April 2001 ; init: complex c1 = #pixel; primary iterated point complex c2 = #pixel + @offset; horizontally offset point complex c3 = #pixel + flip(@offset); vertically offset point complex z1 = 0 complex z2 = 0 complex z3 = 0 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0 ; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20 ; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: IF real(z1) >= 0 z1 = @fn1(z1) z1 = (z1 - 1) * c1 ELSE z1 = @fn1(z1) z1 = (z1 + 1) * c1 ENDIF IF real(z2) >= 0 z2 = @fn1(z2) z2 = (z2 - 1) * c2 ELSE z2 = @fn1(z2) z2 = (z2 + 1) * c2 ENDIF IF real(z3) >= 0 z3 = @fn1(z3) z3 = (z3 - 1) * c3 ELSE z3 = @fn1(z3) z3 = (z3 + 1) * c3 ENDIF iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter z1 = fn2(z1) z2 = fn2(z2) z3 = fn2(z3) IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (Fun_BarnsleyM1)" maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam func fn1 caption = "Input Function" default = ident() endfunc func fn2 caption = "Scaling Function" default = ident() endfunc switch: type = "SlopeExpFun_BarnsleyJ1" seed = #pixel bailout = @bailout zmode = @zmode offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter fn1 = @fn1 fn2 = @fn2 } SlopeExpFun_BarnsleyJ1 { ; Ron Barnett, April 2001 ; init: complex z1 = #pixel; primary iterated point complex z2 = #pixel + @offset; horizontally offset point complex z3 = #pixel + flip(@offset); vertically offset point int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0 ; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20 ; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: IF real(z1) >= 0 z1 = @fn1(z1) z1 = (z1 - 1) * @seed ELSE z1 = @fn1(z1) z1 = (z1 + 1) * @seed ENDIF IF real(z2) >= 0 z2 = @fn1(z2) z2 = (z2 - 1) * @seed ELSE z2 = @fn1(z2) z2 = (z2 + 1) * @seed ENDIF IF real(z3) >= 0 z3 = @fn1(z3) z3 = (z3 - 1) * @seed ELSE z3 = @fn1(z3) z3 = (z3 + 1) * @seed ENDIF iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter z1 = fn2(z1) z2 = fn2(z2) z3 = fn2(z3) IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 4) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 5) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (Fun_BarnsleyJ1)" center = (0.0, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param seed caption = "Julia Seed" default = (0.9,1.0) hint = "This is the Julia seed, a constant parameter which \ defines the shape of the fractal." endparam param bailout caption = "Bail-out Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam param zmode caption = "Height Value" default = 5 enum = "smallest |z|" "smallest |real(z)|" \ "smallest |imag(z)|" "smallest summ(z)" "smallest |atan(z)|" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam func fn1 caption = "Input Function" default = ident() endfunc func fn2 caption = "Scaling Function" default = ident() endfunc switch: type = "SlopeExpFun_BarnsleyM1" bailout = @bailout zmode = @amode offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter fn1 = @fn1 fn2 = @fn2 } SlopeExpFun_BarnsleyM2 { ; Ron Barnett, April 2001 ; Modified with more Height Values July 2004 ; init: complex c1 = #pixel; primary iterated point complex c2 = #pixel + @offset; horizontally offset point complex c3 = #pixel + flip(@offset); vertically offset point complex z1 = 0 complex z2 = 0 complex z3 = 0 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0 ; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20 ; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: IF real(z1) * imag(c1) + real(c1) * imag(z1) >= 0 z1 = @fn1(z1) z1 = (z1 - 1) * c1 ELSE z1 = @fn1(z1) z1 = (z1 + 1) * c1 ENDIF IF real(z2) * imag(c2) + real(c2) * imag(z2) >= 0 z2 = @fn1(z2) z2 = (z2 - 1) * c2 ELSE z2 = @fn1(z2) z2 = (z2 + 1) * c2 ENDIF IF real(z3) * imag(c3) + real(c3) * imag(z3) >= 0 z3 = @fn1(z3) z3 = (z3 - 1) * c3 ELSE z3 = @fn1(z3) z3 = (z3 + 1) * c3 ENDIF iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter z1 = fn2(z1) z2 = fn2(z2) z3 = fn2(z3) IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(@fn3(z1))) + abs(imag(@fn3(z1))) ; get current distances d2 = abs(real(@fn3(z2))) + abs(imag(@fn3(z2))) d3 = abs(real(@fn3(z3))) + abs(imag(@fn3(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(@fn3(z1)) ; get current distances d2 = cabs(@fn3(z2)) d3 = cabs(@fn3(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 57) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 58) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (Fun_BarnsleyM2)" maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 58 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn3 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 endfunc param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam func fn1 caption = "Input Function" default = ident() endfunc func fn2 caption = "Scaling Function" default = ident() endfunc switch: type = "SlopeExpFun_BarnsleyJ2" seed = #pixel bailout = @bailout offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter fn1 = @fn1 fn2 = @fn2 a = @a b = @b pn = @pn afn1 = @afn1 afn2 = @afn2 fn3 = @fn3 } SlopeExpFun_BarnsleyJ2 { ; Ron Barnett, April 2001 ; Modified with more Height Values July 2004 ; init: complex z1 = #pixel; primary iterated point complex z2 = #pixel + @offset; horizontally offset point complex z3 = #pixel + flip(@offset); vertically offset point int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0 ; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20 ; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 loop: IF real(z1) * imag(@seed) + real(@seed) * imag(z1) >= 0 z1 = @fn1(z1) z1 = (z1 - 1) * @seed ELSE z1 = @fn1(z1) z1 = (z1 + 1) * @seed ENDIF IF real(z2) * imag(@seed) + real(@seed) * imag(z2) >= 0 z2 = @fn1(z2) z2 = (z2 - 1) * @seed ELSE z2 = @fn1(z2) z2 = (z2 + 1) * @seed ENDIF IF real(z3) * imag(@seed) + real(@seed) * imag(z3) >= 0 z3 = @fn1(z3) z3 = (z3 - 1) * @seed ELSE z3 = @fn1(z3) z3 = (z3 + 1) * @seed ENDIF iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter z1 = fn2(z1) z2 = fn2(z2) z3 = fn2(z3) IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(@fn3(z1))) + abs(imag(@fn3(z1))) ; get current distances d2 = abs(real(@fn3(z2))) + abs(imag(@fn3(z2))) d3 = abs(real(@fn3(z3))) + abs(imag(@fn3(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(@fn3(z1)) ; get current distances d2 = cabs(@fn3(z2)) d3 = cabs(@fn3(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 57) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 58) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (Fun_BarnsleyJ2)" center = (0.0, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param seed caption = "Julia Seed" default = (0.6,1.1) hint = "This is the Julia seed, a constant parameter which \ defines the shape of the fractal." endparam param bailout caption = "Bail-out Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 58 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn3 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 endfunc param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam func fn1 caption = "Input Function" default = ident() endfunc func fn2 caption = "Scaling Function" default = ident() endfunc switch: type = "SlopeExpFun_BarnsleyM2" bailout = @bailout zmode = @zmode offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter fn1 = @fn1 fn2 = @fn2 a = @a b = @b pn = @pn afn1 = @afn1 afn2 = @afn2 fn3 = @fn3 } SlopeExpPolyGenM { ; Ron Barnett, 2002 ; init: complex c1 = #pixel; primary iterated point complex c2 = #pixel + @offset; horizontally offset point complex c3 = #pixel + flip(@offset); vertically offset point complex z1=(-@p2+(@p2*@p2+(1-c1)*3*@p1)^0.5)/(3*@p1) complex z2=(-@p2+(@p2*@p2+(1-c2)*3*@p1)^0.5)/(3*@p1) complex z3=(-@p2+(@p2*@p2+(1-c3)*3*@p1)^0.5)/(3*@p1) int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float px = 0.0 float py = 0.0 float r = 0.0 float theta = 0.0 loop: px = real(#pixel) py = imag(#pixel) theta = atan2(py/px) z1=@p1*z1*z1*z1+@p2*z1*z1+(c1-1)* z1-c1 z2=@p1*z2*z2*z2+@p2*z2*z2+(c2-1)* z2-c2 z3=@p1*z3*z3*z3+@p2*z3*z3+(c3-1)* z3-c3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|*|imag(z)| / |real(z)|+|imag(z)| d1 = abs(real(z1))*abs(imag(z1))/(abs(real(z1))+abs(imag(z1))) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2))/(abs(real(z2))+abs(imag(z2))) d3 = abs(real(z3))*abs(imag(z3))/(abs(real(z3))+abs(imag(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |imag(z)|/|real(z)| d1 = abs(imag(z1))/abs(real(z1)) ; get current distances from i axis d2 = abs(imag(z2))/abs(real(z2)) d3 = abs(imag(z3))/abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; distance between z and point d1 = |z1-@point| d2 = |z2-@point| d3 = |z3-@point| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; distance between z and function IF @df == 0 r = @a*sqrt(cos(2*theta)) ELSEIF @df == 1 r = @a*(1-cos(theta)) ELSEIF @df == 2 r = (@a + @b*cos(theta))/cos(theta) ELSEIF @df == 3 r = @a*theta ELSEIF @df == 4 r = exp(@a*theta) ELSEIF @df == 5 r = @a*cos(theta) ENDIF pf = r*cos(theta) + flip(r*sin(theta)) d1 = |z1-pf| d2 = |z2-pf| d3 = |z3-pf| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 10) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 11) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (PolyGenM)" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Starting Point" default = (0,0) hint = "Starting value for each point. You can use this to \ 'perturb' the fractal." endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam param p1 caption = "Parameter 1" default = (1.0, 0.0) endparam param p2 caption = "Parameter 2" default = (1.0, 0.0) endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 11 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest summ(z)" "smallest prod(z)" "scaled prod(z)" \ "smallest ratio1(z)" "smallest ratio2(z)" "smallest |atan(z)|" \ "distance to point" "distance to function" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin"\ "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param point caption = "Point" default = (-1.0, 1.0) hint = "Point for distance calculation" endparam param df caption = "Polar function" default = 0 enum = "lemniscate" "cardiod" "conchoid" \ "archimedes" "log spiral" "rose" endparam param a caption = "Polar parameter" default = 1.0 hint = "Affects spread and scale" endparam param b caption = "Conchoid parameter" default = 1.0 hint = "Affects shape and scale. \ Use only with conchoid function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpPolyGenJ" bailout = @bailout zmode = @zmode offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter p1 = @p1 p2 = @p2 p3 = #pixel } SlopeExpPolyGenJ { ; Ron Barnett, 2002 ; init: complex z1 = #pixel; primary iterated point complex z2 = #pixel + @offset; horizontally offset point complex z3 = #pixel + flip(@offset); vertically offset point int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float px = 0.0 float py = 0.0 float r = 0.0 float theta = 0.0 loop: px = real(#pixel) py = imag(#pixel) theta = atan2(py/px) z1=@p1*z1*z1*z1+@p2*z1*z1+(@p3-1)* z1-@p3 z2=@p1*z2*z2*z2+@p2*z2*z2+(@p3-1)* z2-@p3 z3=@p1*z3*z3*z3+@p2*z3*z3+(@p3-1)* z3-@p3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|*|imag(z)| / |real(z)|+|imag(z)| d1 = abs(real(z1))*abs(imag(z1))/(abs(real(z1))+abs(imag(z1))) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2))/(abs(real(z2))+abs(imag(z2))) d3 = abs(real(z3))*abs(imag(z3))/(abs(real(z3))+abs(imag(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |imag(z)|/|real(z)| d1 = abs(imag(z1))/abs(real(z1)) ; get current distances from i axis d2 = abs(imag(z2))/abs(real(z2)) d3 = abs(imag(z3))/abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; distance between z and point d1 = |z1-@point| d2 = |z2-@point| d3 = |z3-@point| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; distance between z and function IF @df == 0 r = @a*sqrt(cos(2*theta)) ELSEIF @df == 1 r = @a*(1-cos(theta)) ELSEIF @df == 2 r = (@a + @b*cos(theta))/cos(theta) ELSEIF @df == 3 r = @a*theta ELSEIF @df == 4 r = exp(@a*theta) ELSEIF @df == 5 r = @a*cos(theta) ENDIF pf = r*cos(theta) + flip(r*sin(theta)) d1 = |z1-pf| d2 = |z2-pf| d3 = |z3-pf| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 10) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 11) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (PolyGenJ)" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Starting Point" default = (0,0) hint = "Starting value for each point. You can use this to \ 'perturb' the fractal." endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam param p1 caption = "Parameter 1" default = (1.0, 0.0) endparam param p2 caption = "Parameter 2" default = (1.0, 0.0) endparam param p3 caption = "Julia Seed" default = (0.3375, -0.325) endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 11 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest summ(z)" "smallest prod(z)" "scaled prod(z)" \ "smallest ratio1(z)" "smallest ratio2(z)" "smallest |atan(z)|" \ "distance to point" "distance to function" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin"\ "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param point caption = "Point" default = (-1.0, 1.0) hint = "Point for distance calculation" endparam param df caption = "Polar function" default = 0 enum = "lemniscate" "cardiod" "conchoid" \ "archimedes" "log spiral" "rose" endparam param a caption = "Polar parameter" default = 1.0 hint = "Affects spread and scale" endparam param b caption = "Conchoid parameter" default = 1.0 hint = "Affects shape and scale. \ Use only with conchoid function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpPolyGenM" bailout = @bailout zmode = @zmode offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter p1 = @p1 p2 = @p2 } SlopeExpMandelPhoenix {; Ron Barnett, January 2002 ; Old formula from Stevens Turbo Pascal book ; Modified and tweaked March 2000 init: complex x1 = 0 complex x2 = 0 complex x3 = 0 complex y1 = 0 complex y2 = 0 complex y3 = 0 complex c1 = #pixel; primary iterated point complex c2 = #pixel + @offset; horizontally offset point complex c3 = #pixel + flip(@offset); vertically offset point complex z1 = @start; starting value complex z2 = @start complex z3 = @start int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float px = 0.0 float py = 0.0 float r = 0.0 float theta = 0.0 loop: px = real(#pixel) py = imag(#pixel) theta = atan2(py/px) x1 = z1*z1 + real(c1) + imag(c1)*y1 y1 = z1 z1 = x1 x2 = z2*z2 + real(c2) + imag(c2)*y2 y2 = z2 z2 = x2 x3 = z3*z3 + real(c3) + imag(c3)*y3 y3 = z3 z3 = x3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|*|imag(z)| / |real(z)|+|imag(z)| d1 = abs(real(z1))*abs(imag(z1))/(abs(real(z1))+abs(imag(z1))) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2))/(abs(real(z2))+abs(imag(z2))) d3 = abs(real(z3))*abs(imag(z3))/(abs(real(z3))+abs(imag(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |imag(z)|/|real(z)| d1 = abs(imag(z1))/abs(real(z1)) ; get current distances from i axis d2 = abs(imag(z2))/abs(real(z2)) d3 = abs(imag(z3))/abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; distance between z and point d1 = |z1-@point| d2 = |z2-@point| d3 = |z3-@point| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; distance between z and function IF @df == 0 r = @a*sqrt(cos(2*theta)) ELSEIF @df == 1 r = @a*(1-cos(theta)) ELSEIF @df == 2 r = (@a + @b*cos(theta))/cos(theta) ELSEIF @df == 3 r = @a*theta ELSEIF @df == 4 r = exp(@a*theta) ELSEIF @df == 5 r = @a*cos(theta) ENDIF pf = r*cos(theta) + flip(r*sin(theta)) d1 = |z1-pf| d2 = |z2-pf| d3 = |z3-pf| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 10) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 11) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (MandelPhoenix)" center = (-0.75, 0.0) maxiter = 1000 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam param start caption = "Starting Point" default = (0,0) hint = "Starting value for each point. You can use this to \ 'perturb' the fractal." endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 11 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest summ(z)" "smallest prod(z)" "scaled prod(z)" \ "smallest ratio1(z)" "smallest ratio2(z)" "smallest |atan(z)|" \ "distance to point" "distance to function" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin"\ "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param point caption = "Point" default = (-1.0, 1.0) hint = "Point for distance calculation" endparam param df caption = "Polar function" default = 0 enum = "lemniscate" "cardiod" "conchoid" \ "archimedes" "log spiral" "rose" endparam param a caption = "Polar parameter" default = 1.0 hint = "Affects spread and scale" endparam param b caption = "Conchoid parameter" default = 1.0 hint = "Affects shape and scale. \ Use only with conchoid function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpPhoenix" bailout = @bailout zmode = @zmode offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter p1 = #pixel } SlopeExpPhoenix {; Ron Barnett, January 2001 ; Old formula from Stevens Turbo Pascal book ; Modified and tweaked March 2000 init: complex x1 = 0 complex x2 = 0 complex x3 = 0 complex y1 = 0 complex y2 = 0 complex y3 = 0 complex c1 = #pixel; primary iterated point complex c2 = #pixel + @offset; horizontally offset point complex c3 = #pixel + flip(@offset); vertically offset point complex z1 = flip(c1); starting value complex z2 = flip(c2) complex z3 = flip(c3) int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float px = 0.0 float py = 0.0 float r = 0.0 float theta = 0.0 loop: px = real(#pixel) py = imag(#pixel) theta = atan2(py/px) x1 = z1*z1 + real(@p1) + imag(@p1)*y1 y1 = z1 z1 = x1 x2 = z2*z2 + real(@p1) + imag(@p1)*y2 y2 = z2 z2 = x2 x3 = z3*z3 + real(@p1) + imag(@p1)*y3 y3 = z3 z3 = x3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|*|imag(z)| / |real(z)|+|imag(z)| d1 = abs(real(z1))*abs(imag(z1))/(abs(real(z1))+abs(imag(z1))) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2))/(abs(real(z2))+abs(imag(z2))) d3 = abs(real(z3))*abs(imag(z3))/(abs(real(z3))+abs(imag(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |imag(z)|/|real(z)| d1 = abs(imag(z1))/abs(real(z1)) ; get current distances from i axis d2 = abs(imag(z2))/abs(real(z2)) d3 = abs(imag(z3))/abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; distance between z and point d1 = |z1-@point| d2 = |z2-@point| d3 = |z3-@point| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; distance between z and function IF @df == 0 r = @a*sqrt(cos(2*theta)) ELSEIF @df == 1 r = @a*(1-cos(theta)) ELSEIF @df == 2 r = (@a + @b*cos(theta))/cos(theta) ELSEIF @df == 3 r = @a*theta ELSEIF @df == 4 r = exp(@a*theta) ELSEIF @df == 5 r = @a*cos(theta) ENDIF pf = r*cos(theta) + flip(r*sin(theta)) d1 = |z1-pf| d2 = |z2-pf| d3 = |z3-pf| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 10) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 11) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (Phoenix)" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam param p1 caption = "Phoenix seed" default = (0.56667, -0.5) endparam param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 11 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest summ(z)" "smallest prod(z)" "scaled prod(z)" \ "smallest ratio1(z)" "smallest ratio2(z)" "smallest |atan(z)|" \ "distance to point" "distance to function" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin"\ "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param point caption = "Point" default = (-1.0, 1.0) hint = "Point for distance calculation" endparam param df caption = "Polar function" default = 0 enum = "lemniscate" "cardiod" "conchoid" \ "archimedes" "log spiral" "rose" endparam param a caption = "Polar parameter" default = 1.0 hint = "Affects spread and scale" endparam param b caption = "Conchoid parameter" default = 1.0 hint = "Affects shape and scale. \ Use only with conchoid function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpMandelPhoenix" bailout = @bailout zmode = @zmode offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 everyiter = @everyiter } MandelbrotCrossOrbitLambda {; Ron Barnett, November 2003 ; Cross orbit boost when crossing Lambda init: #z = #pixel w = (1/(@p3+1))^(1/@p3) float d = 0 float r = 0 loop: #z = #z^@p1 + #pixel w = #pixel*w*(1 - w^@p3) d = cabs(#z-w) r = d/@thresh if d < @thresh if @cross == 0 #z = #z + w*r elseif @cross == 1 #z = #z - w*r elseif @cross == 2 #z = #z*w*r elseif @cross == 3 #z = #z/w/r elseif @cross == 4 #z = #z + @fn1(w)*r elseif @cross == 5 #z = #z - @fn1(w)*r elseif @cross == 6 #z = #z*@fn1(w)*r elseif @cross == 7 #z = #z/@fn1(w)*r elseif @cross == 8 #z = #z^w*r endif endif bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mandelbrot Cross Orbit Lambda" maxiter = 255 center = (-0.5, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1 endparam param p1 caption = "Power" default = (2.0,0) endparam param p3 caption = "Lambda Power" default = (2.0,0) endparam param thresh caption = "Threshold" default = 0.5 endparam param cross caption = "Cross Type" enum = "Add" "Subtract" "Multiply" "Divide" "Func Add" "Func Subtract" \ "Func Multiply" "Func Divide" "Exponential" default = 0 endparam func fn1 caption = "Function" default = cabs() endfunc switch: type = "JuliaCrossOrbitLambda" bailout = bailout thresh = thresh cross = cross p1 = p1 p2 = #pixel p3 = p3 test = test fn1 = fn1 } JuliaCrossOrbitLambda {; Ron Barnett, Movember 2003 ; Cross orbit boost when crossing Lambda init: #z = #pixel w = #z float d = 0 loop: #z = #z^@p1 + @p2 w = @p2*w*(1 - w^@p3) d = cabs(#z-w) r = d/@thresh if d < @thresh if @cross == 0 #z = #z + w*r elseif @cross == 1 #z = #z - w*r elseif @cross == 2 #z = #z*w*r elseif @cross == 3 #z = #z/w/r elseif @cross == 4 #z = #z + @fn1(w)*r elseif @cross == 5 #z = #z - @fn1(w)*r elseif @cross == 6 #z = #z*@fn1(w)*r elseif @cross == 7 #z = #z/@fn1(w)*r elseif @cross == 8 #z = #z^w*r endif endif bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Julia Cross Orbit Lambda" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1 endparam param p1 caption = "Power" default = (2.0, 0) endparam param p3 caption = "Lambda Power" default = (2.0,0) endparam param p2 caption = "Seed" default = (-0.75, 0.2) endparam param thresh caption = "Threshold" default = 0.5 endparam param cross caption = "Cross Type" enum = "Add" "Subtract" "Multiply" "Divide" "Func Add" "Func Subtract" \ "Func Multiply" "Func Divide" "Exponential" default = 0 endparam func fn1 caption = "Function" default = cabs() endfunc switch: type = "MandelbrotCrossOrbitLambda" bailout = bailout p1 = p1 p3 = p3 thresh = thresh cross = cross test = test fn1 = fn1 } newt-mand { ; Ron Barnett, May 2004 init: #z = 0 oldz = 0 a = #pixel loop: oldz = #z #z = (2*#z*#z*#z - a) / (3*#z*#z + 1) bailout: |#z - oldz| >= @bailout default: title = "Newton Mandel" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout value" default = 0.000001 endparam switch: type = "Newt-jul" bailout = @bailout p1 = #pixel } Newt-jul { ; Ron Barnett, May 2004 init: #z = #pixel oldz = 0 a = @p1 loop: oldz = #z #z = (2*#z*#z*#z - a) / (3*#z*#z + 1) bailout: |#z - oldz| >= @bailout default: title = "Newton Julia" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout value" default = 0.000001 endparam param p1 caption = "Parameter 1" default = (0.360968017578125,0.00074462890625) endparam switch: type = "newt-mand" bailout = @bailout } OnlyBrots { ; Ron Barnett ;Based upon the formulas of Stig Pettersson ;more formula types added and code optimized July 8, 2005 init: bool setflag=true bool tflag=false int iter=0 int m=0 int mm=0 int count2=0 complex y = 0 complex x1 = 0 complex z1=0 complex z2 = 0 complex z2h = 0 complex oldz = 0 complex zh=0 float color1=-1.23456789e20 float color2=1.23456789e20 float temp0=0 float lightdx=0 float lightdy=0 float lightdz=0 float lightlength=0 float flength=0 float fx=0 float fy=0 float fz=0 float tangle=0 float buff0=0 float buff1=0 float buff2=0 float buff3=0 float buff4=0 float diffx=0 float diffy=0 float count=0 float count0=0 float xx=0 float yy=0 float zz=0 float ww=0 float length=0.0 float length2=0.0 float xscreen=real(#screenmax) float yscreen=imag(#screenmax) float zscreen=@zscreen float xmin=0 float ymin=0 float xmax=0 float ymax=0 complex a = 0 complex b = 0 complex c = 0 complex d = 0 complex cc = 0 complex ch = 0 float t = 0 float n = 0 float fx = 0 float fy = 0 float len = 0 if xscreen/yscreen>4/3 temp0=3/#magn float temp0=-3/#magn ymin=imag(#center)-temp0/2 ymax=ymin+temp0 temp0=-xscreen/yscreen*temp0 xmin=real(#center)-temp0/2 xmax=xmin+temp0 else temp0=4/#magn xmin=real(#center)-temp0/2 xmax=xmin+temp0 temp0=-yscreen/xscreen*temp0 ymin=imag(#center)-temp0/2 ymax=ymin+temp0 endif float zmax=@zorig+@zdist/2 float zmin=zmax-@zdist if @view==1 zmax=@zorig zmin=@zorig elseif @view==2 zmax=@zorig-@zdist/2 zmin=zmax endif if @zmagn==true zmax=@zorig+@zdist/2/#magn zmin=zmax-@zdist/#magn endif if (@autoscale==true)&&(@view==0) zscreen=xscreen/(xmax-xmin)*(zmax-zmin) endif float dx=(xmax-xmin)/xscreen float dy=(ymax-ymin)/yscreen float dz=(zmax-zmin)/zscreen float origx=real(#center) float origy=imag(#center) float origz=@zorig float vx=@xrot/180.0*#pi float vy=@yrot/180.0*#pi float vz=@zrot/180.0*#pi float cosx=0 float cosy=0 float cosz=0 float sinx=0 float siny=0 float sinz=0 if @xrot==90.0 sinx=1.0 cosx=0 elseif @xrot==-90 sinx=-1.0 cosx=0 elseif abs(@xrot)==180 sinx=0 cosx=-1 else cosx=cos(vx) sinx=sin(vx) endif if @yrot==90.0 siny=1.0 cosy=0 elseif @yrot==-90 siny=-1.0 cosy=0 elseif abs(@yrot)==180 siny=0 cosy=-1 else cosy=cos(vy) siny=sin(vy) endif if @zrot==90.0 sinz=1.0 cosz=0 elseif @zrot==-90 sinz=-1.0 cosz=0 elseif abs(@zrot)==180 sinz=0 cosz=-1 else cosz=cos(vz) sinz=sin(vz) endif float rminx=0 float rminy=0 float rminz=0 float xy=0 float xz=0 float yx=0 float yz=0 float zx=0 float zy=0 float tempx=0 float tempy=0 float tempz=0 float dxx=0 float dxy=0 float dxz=0 float dyx=0 float dyy=0 float dyz=0 float dzx=0 float dzy=0 float dzz=0 float dzx=0 float dzy=0 float dzz=0 float dzx1=0 float dzy1=0 float dzz1=0 ; rotating the space and creation of unit-vectors xx=rminx=xmin yy=rminy=ymin zz=rminz=zmin if @local==true xx=xx-origx yy=yy-origy zz=zz-origz endif xy=yy*cosx-zz*sinx xz=yy*sinx+zz*cosx yy=xy zz=xz yx=xx*cosy+zz*siny yz=-xx*siny+zz*cosy xx=yx zz=yz zx=xx*cosz-yy*sinz zy=xx*sinz+yy*cosz xx=zx yy=zy if @local==true xx=xx+origx yy=yy+origy zz=zz+origz endif rminx=xx rminy=yy rminz=zz xx=tempx=xmax yy=tempy=ymin zz=tempz=zmin if @local==true xx=xx-origx yy=yy-origy zz=zz-origz endif xy=yy*cosx-zz*sinx xz=yy*sinx+zz*cosx yy=xy zz=xz yx=xx*cosy+zz*siny yz=-xx*siny+zz*cosy xx=yx zz=yz zx=xx*cosz-yy*sinz zy=xx*sinz+yy*cosz xx=zx yy=zy if @local==true xx=xx+origx yy=yy+origy zz=zz+origz endif tempx=xx tempy=yy tempz=zz dxx=(tempx-rminx)/xscreen dxy=(tempy-rminy)/xscreen dxz=(tempz-rminz)/xscreen xx=tempx=xmin yy=tempy=ymax zz=tempz=zmin if @local==true xx=xx-origx yy=yy-origy zz=zz-origz endif xy=yy*cosx-zz*sinx xz=yy*sinx+zz*cosx yy=xy zz=xz yx=xx*cosy+zz*siny yz=-xx*siny+zz*cosy xx=yx zz=yz zx=xx*cosz-yy*sinz zy=xx*sinz+yy*cosz xx=zx yy=zy if @local==true xx=xx+origx yy=yy+origy zz=zz+origz endif tempx=xx tempy=yy tempz=zz dyx=(tempx-rminx)/yscreen dyy=(tempy-rminy)/yscreen dyz=(tempz-rminz)/yscreen xx=tempx=xmin yy=tempy=ymin zz=tempz=zmax if @local==true xx=xx-origx yy=yy-origy zz=zz-origz endif xy=yy*cosx-zz*sinx xz=yy*sinx+zz*cosx yy=xy zz=xz yx=xx*cosy+zz*siny yz=-xx*siny+zz*cosy xx=yx zz=yz zx=xx*cosz-yy*sinz zy=xx*sinz+yy*cosz xx=zx yy=zy if @local==true xx=xx+origx yy=yy+origy zz=zz+origz endif tempx=xx tempy=yy tempz=zz dzx=(tempx-rminx)/zscreen dzy=(tempy-rminy)/zscreen dzz=(tempz-rminz)/zscreen dzx1=dzx/@prec dzy1=dzy/@prec dzz1=dzz/@prec ; end rotation and creating unit-vectors 'puuh' ; ordinary fractals if @formula=="Barnsley1"||@formula=="Barnsley2"||@formula=="Barnsley3"||@formula=="Frame-Robert" \ ||@formula=="LambdaPower"||@formula=="Phoenix"||@formula=="MandelPower" \ ||@formula=="Manowar"||@formula=="Spider"||@formula=="Gopalsamy" \ ||@formula=="Pokorny"||@formula=="Ikenaga" count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz if @fourthdim==3 xx=tempx yy=tempy zz=tempz ww=@fourthvalue elseif @fourthdim==2 xx=tempx yy=tempy zz=@fourthvalue ww=tempz elseif @fourthdim==1 xx=tempz yy=@fourthvalue zz=tempx ww=tempy else xx=@fourthvalue yy=tempz zz=tempx ww=tempy endif count=0.0 repeat if @fourthdim==3 xx=xx+dzx yy=yy+dzy zz=zz+dzz elseif @fourthdim==2 xx=xx+dzx yy=yy+dzy ww=ww+dzz elseif @fourthdim==1 xx=xx+dzz zz=zz+dzx ww=ww+dzy else yy=yy+dzz zz=zz+dzx ww=ww+dzy endif z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 y = z1 z2 = z1 repeat if @formula=="Barnsley1" if real(z) >= 0 z = (z - 1) * zh else z = (z + 1) * zh endif elseif @formula=="Barnsley2" if real(z) * imag(zh) + real(zh) * imag(z) >= 0 z = (z - 1) * zh else z = (z + 1) * zh endif elseif @formula=="Barnsley3" if real(z) > 0 z = sqr(z) - 1 else z = sqr(z) - 1 + zh * real(z) endif elseif @formula=="Frame-Robert" z = z*z*z/5 + z*z + zh elseif @formula=="LambdaPower" z = zh*(z - z^@power) elseif @formula=="Phoenix" x1 = z*z + real(zh) + imag(zh)*y y = z z = x1 elseif @formula=="MandelPower" z = z^@power + zh elseif @formula=="Manowar" oldz = z z = z*z + z2 + zh z2 = oldz elseif @formula=="Spider" z = z*z + zh zh = z + zh/2 elseif @formula=="Gopalsamy" ; x = real(z) ; y = imag(z) ; x1 = -2*x*y + zh ; y = y*y - x*x ; z = x1 + flip(y) z = -(0,1)*conj(z)^2 + zh elseif @formula=="Pokorny" z = 1/(z*z + zh) elseif @formula=="Ikenaga" z = z*z*z + (zh-1)*z - zh endif length=|z| m=m+1 until m>=#maxiter || length>=@bailout mm=m count=count+1 until (count>=zscreen || length<@bailout)||(@view>0) if count==1 if m>=#maxiter&&@view==0&&@touchscreen==true tflag=true endif endif if @view>0 count0=6 elseif (length<@bailout)&&(count>1) count2=0 repeat if @fourthdim==3 xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 elseif @fourthdim==2 xx=xx-dzx1 yy=yy-dzy1 ww=ww-dzz1 elseif @fourthdim==1 xx=xx-dzz1 zz=zz-dzx1 ww=ww-dzy1 else yy=yy-dzz1 zz=zz-dzx1 ww=ww-dzy1 endif m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 y = z1 z2 = z1 repeat if @formula=="Barnsley1" if real(z) >= 0 z = (z - 1) * zh else z = (z + 1) * zh endif elseif @formula=="Barnsley2" if real(z) * imag(zh) + real(zh) * imag(z) >= 0 z = (z - 1) * zh else z = (z + 1) * zh endif elseif @formula=="Barnsley3" if real(z) > 0 z = sqr(z) - 1 else z = sqr(z) - 1 + zh * real(z) endif elseif @formula=="Frame-Robert" z = z*z*z/5 + z*z + zh elseif @formula=="LambdaPower" z = zh*(z - z^@power) elseif @formula=="Phoenix" x1 = z*z + real(zh) + imag(zh)*y y = z z = x1 elseif @formula=="MandelPower" z = z^@power + zh elseif @formula=="Manowar" oldz = z z = z*z + z2 + zh z2 = oldz elseif @formula=="Spider" z = z*z + zh zh = z + zh/2 elseif @formula=="Gopalsamy" ; x = real(z) ; y = imag(z) ; x1 = -2*x*y + zh ; y = y*y - x*x ; z = x1 + flip(y) z = -(0,1)*conj(z)^2 + zh elseif @formula=="Pokorny" z = 1/(z*z + zh) elseif @formula=="Ikenaga" z = z*z*z + (zh-1)*z - zh endif length=|z| m = m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 ; fractals with both convergent and divergent bailouts elseif @formula=="Magnet1"||@formula=="Magnet2" count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz if @fourthdim==3 xx=tempx yy=tempy zz=tempz ww=@fourthvalue elseif @fourthdim==2 xx=tempx yy=tempy zz=@fourthvalue ww=tempz elseif @fourthdim==1 xx=tempz yy=@fourthvalue zz=tempx ww=tempy else xx=@fourthvalue yy=tempz zz=tempx ww=tempy endif count=0.0 repeat if @fourthdim==3 xx=xx+dzx yy=yy+dzy zz=zz+dzz elseif @fourthdim==2 xx=xx+dzx yy=yy+dzy ww=ww+dzz elseif @fourthdim==1 xx=xx+dzz zz=zz+dzx ww=ww+dzy else yy=yy+dzz zz=zz+dzx ww=ww+dzy endif z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat if @formula=="Magnet1" z = ( (z^2 + zh-1) / (2*z + zh-2) ) ^2 elseif @formula=="Magnet2" z = ( (z^3 + 3*(zh-1)*z + (zh-1)*(zh-2)) \ / (3*z^2 + 3*(zh-2)*z + (zh-1)*(zh-2) + 1) ) ^2 endif length=|z| length2=|z-1| m=m+1 until m>=#maxiter || (length>=@bailout || length2<=@bailout2) mm=m count=count+1 until (count>=zscreen || (length<@bailout && length2>@bailout2))||(@view>0) if count==1 if m>=#maxiter&&@view==0&&@touchscreen==true tflag=true endif endif if @view>0 count0=6 elseif (length<@bailout && length2>@bailout2)&&(count>1) count2=0 repeat if @fourthdim==3 xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 elseif @fourthdim==2 xx=xx-dzx1 yy=yy-dzy1 ww=ww-dzz1 elseif @fourthdim==1 xx=xx-dzz1 zz=zz-dzx1 ww=ww-dzy1 else yy=yy-dzz1 zz=zz-dzx1 ww=ww-dzy1 endif m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat if @formula =="Magnet1" z = ( (z^2 + zh-1) / (2*z + zh-2) ) ^2 elseif @formula=="Magnet2" z = ( (z^3 + 3*(zh-1)*z + (zh-1)*(zh-2)) \ / (3*z^2 + 3*(zh-2)*z + (zh-1)*(zh-2) + 1) ) ^2 endif length=|z| length2=|z-1| m=m+1 until m>=#maxiter || (length>@bailout && length2<@bailout2) count2=count2+1 until (length>=@bailout || length2<=@bailout2) if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 ; fractals with divergent bailouts elseif @formula=="Cayley" count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz if @fourthdim==3 xx=tempx yy=tempy zz=tempz ww=@fourthvalue elseif @fourthdim==2 xx=tempx yy=tempy zz=@fourthvalue ww=tempz elseif @fourthdim==1 xx=tempz yy=@fourthvalue zz=tempx ww=tempy else xx=@fourthvalue yy=tempz zz=tempx ww=tempy endif count=0.0 repeat if @fourthdim==3 xx=xx+dzx yy=yy+dzy zz=zz+dzz elseif @fourthdim==2 xx=xx+dzx yy=yy+dzy ww=ww+dzz elseif @fourthdim==1 xx=xx+dzz zz=zz+dzx ww=ww+dzy else yy=yy+dzz zz=zz+dzx ww=ww+dzy endif z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat oldz = z z = (2*z*z*z - (1-zh)) / (3*z*z-zh) length2=|z-oldz| m=m+1 until m>=#maxiter || (length2<=@bailout2) mm=m count=count+1 until (count>=zscreen || (length2>@bailout2))||(@view>0) if count==1 if m>=#maxiter&&@view==0&&@touchscreen==true tflag=true endif endif if @view>0 count0=6 elseif (length2>@bailout2)&&(count>1) count2=0 repeat if @fourthdim==3 xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 elseif @fourthdim==2 xx=xx-dzx1 yy=yy-dzy1 ww=ww-dzz1 elseif @fourthdim==1 xx=xx-dzz1 zz=zz-dzx1 ww=ww-dzy1 else yy=yy-dzz1 zz=zz-dzx1 ww=ww-dzy1 endif m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat oldz = z z = (2*z*z*z - (1-zh)) / (3*z*z-zh) length2=|z-oldz| m=m+1 until m>=#maxiter || (length2<@bailout2) count2=count2+1 until (length2<=@bailout2) if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 ; hypercomplex and quaternion fractals elseif @formula=="HyperFnJulia"||@formula=="HyperFrame-Robert"||@formula=="HyperIkenaga" \ ||@formula=="HyperSpider"||@formula=="HyperManowar"||@formula=="QuatFrame-Robert" \ ||@formula=="QuatIkenaga"||@formula=="QuatManowar"||@formula=="QuatSpider" \ ||@formula=="QuatExpJulia"||@formula=="QuatPowerJulia"||@formula=="QuatSinJulia" \ ||@formula=="QuatCosJulia"||@formula=="HyperPowerJulia"||@formula=="QuatLambdaPower" count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz if @fourthdim==3 xx=tempx yy=tempy zz=tempz ww=@fourthvalue elseif @fourthdim==2 xx=tempx yy=tempy zz=@fourthvalue ww=tempz elseif @fourthdim==1 xx=tempz yy=@fourthvalue zz=tempx ww=tempy else xx=@fourthvalue yy=tempz zz=tempx ww=tempy endif count=0.0 repeat if @fourthdim==3 xx=xx+dzx yy=yy+dzy zz=zz+dzz elseif @fourthdim==2 xx=xx+dzx yy=yy+dzy ww=ww+dzz elseif @fourthdim==1 xx=xx+dzz zz=zz+dzx ww=ww+dzy else yy=yy+dzz zz=zz+dzx ww=ww+dzy endif z1=xx+flip(yy) zh=zz+flip(ww) cri=@cr+flip(@ci) cjk=@cj+flip(@ck) z2 = z1 z2h = zh m=0 repeat if @formula=="HyperFnJulia" a = real(z1)-imag(zh) + flip(imag(z1) + real(zh)) b = real(z1)+imag(zh) + flip(imag(z1) - real(zh)) c = @hyperfun(a) d = @hyperfun(b) z1 = (real(c) + real(d))/2 + flip(imag(c) + imag(d))/2 + cri zh = (imag(c) - imag(d))/2 + flip(real(d) - real(c))/2 + cjk elseif @formula=="HyperFrame-Robert" a = real(z1)-imag(zh) + flip(imag(z1) + real(zh)) b = real(z1)+imag(zh) + flip(imag(z1) - real(zh)) c = a*a*a/5 + a*a d = b*b*b/5 + b*b z1 = (real(c) + real(d))/2 + flip(imag(c) + imag(d))/2 + cri zh = (imag(c) - imag(d))/2 + flip(real(d) - real(c))/2 + cjk elseif @formula=="HyperIkenaga" a = real(z1)-imag(zh) + flip(imag(z1) + real(zh)) b = real(z1)+imag(zh) + flip(imag(z1) - real(zh)) cc = real(cri)-imag(cjk) + flip(imag(cri) + real(cjk)) ch = real(cri)+imag(cjk) + flip(imag(cri) - real(cjk)) c = a*a*a + cc*a d = b*b*b + ch*b z1 = (real(c) + real(d))/2 + flip(imag(c) + imag(d))/2 - z1 - cri zh = (imag(c) - imag(d))/2 + flip(real(d) - real(c))/2 - zh - cjk elseif @formula=="HyperSpider" a = real(z1)-imag(zh) + flip(imag(z1) + real(zh)) b = real(z1)+imag(zh) + flip(imag(z1) - real(zh)) c = a*a d = b*b z1 = (real(c) + real(d))/2 + flip(imag(c) + imag(d))/2 + cri zh = (imag(c) - imag(d))/2 + flip(real(d) - real(c))/2 + cjk cri = cri/2 + z1 cjk = cjk/2 + zh elseif @formula=="HyperManowar" z2 = z1 z2h = zh a = real(z1)-imag(zh) + flip(imag(z1) + real(zh)) b = real(z1)+imag(zh) + flip(imag(z1) - real(zh)) a2 = real(z2)-imag(z2h) + flip(imag(z2) + real(z2h)) b2 = real(z2)+imag(z2h) + flip(imag(z2) - real(z2h)) c = a*a + a2 d = b*b + b2 z1 = (real(c) + real(d))/2 + flip(imag(c) + imag(d))/2 + cri zh = (imag(c) - imag(d))/2 + flip(real(d) - real(c))/2 + cjk elseif @formula=="HyperPowerJulia" a = real(z1)-imag(zh) + flip(imag(z1) + real(zh)) b = real(z1)+imag(zh) + flip(imag(z1) - real(zh)) c = a^@power d = b^@power z1 = (real(c) + real(d))/2 + flip(imag(c) + imag(d))/2 + cri zh = (imag(c) - imag(d))/2 + flip(real(d) - real(c))/2 + cjk elseif @formula=="QuatFrame-Robert" a = z1*z1 - zh*conj(zh) ; z*z b = (z1 + conj(z1))*zh ; z*z c = (z1*a - zh*conj(b))/5 ; z*z*z/5 d = (z1*b + conj(a)*zh)/5 ; z*z*z/5 z1 = c + a + cri zh = d + b + cjk elseif @formula=="QuatIkenaga" a = z1*z1 - zh*conj(zh) ; z*z b = (z1 + conj(z1))*zh ; z*z c = z1*a - zh*conj(b) ; z*z*z d = z1*b + conj(a)*zh ; z*z*z cc = cri*z1 - cjk*conj(zh) ; c*z cr = cri*zh + conj(z1)*cjk ; c*z z1 = c + cc -z1 - cri zh = d + cr - zh - cjk elseif @formula=="QuatManowar" z2 = z1 z2h = zh a = z1*z1 - zh*conj(zh) + z2 + cri ; z*z + oldz + c b = (z1 + conj(z1))*zh + z2h + cjk ; z*z + oldz + c z1 = a zh = b elseif @formula=="QuatSpider" a = z1*z1 - zh*conj(zh) + cri ; z*z + c b = (z1 + conj(z1))*zh + cjk ; z*z + c z1 = a zh = b cri = cri/2 + a ; c = c/2 + z cjk = cjk/2 + b ; c = c/2 + z elseif @formula=="QuatExpJulia" n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif fx = exp(real(z1)) fy = sin(n)/n a = fx*cos(n) + fx*fy*flip(imag(z1)) b = fx*fy*zh z1 = a + cri zh = b + cjk elseif @formula=="QuatPowerJulia" n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif z2 = real(z1) + flip(n) t = atan2(z2)/n len = |z1|+|zh| if len == 0 len = 1e-20 endif a = @power*(0.5*log(len) + t*flip(imag(z1))) b = @power*t*zh z1 = a zh = b n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif fx = exp(real(z1)) fy = sin(n)/n a = fx*cos(n) + fx*fy*flip(imag(z1)) b = fx*fy*zh z1 = a + cri zh = b + cjk elseif @formula=="QuatSinJulia" n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif a = sin(real(z1))*cosh(n) + cos(real(z1))*sinh(n)/n*flip(imag(z1)) b = cos(real(z1))*sinh(n)/n*zh z1 = a + cri zh = b + cjk elseif @formula=="QuatCosJulia" n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif a = cos(real(z1))*cosh(n) - sin(real(z1))*sinh(n)/n*flip(imag(z1)) b = -sin(real(z1))*sinh(n)/n*zh z1 = a + cri zh = b + cjk elseif @formula=="QuatLambdaPower" z2h = zh n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif z2 = real(z1) + flip(n) t = atan2(z2)/n z2 = z1 len = |z1|+|zh| if len == 0 len = 1e-20 endif a = @power*(0.5*log(len) + t*flip(imag(z1))) b = @power*t*zh z1 = a zh = b n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif fx = exp(real(z1)) fy = sin(n)/n a = fx*cos(n) + fx*fy*flip(imag(z1)) ; z^@power b = fx*fy*zh ; z^@power c = z2 - a ; z - z^@power d = z2h - b ; z - z^@power z1 = cri*c - cjk*conj(d) ; c*(z - z^@power) zh = cri*d + conj(a)*cjk ; c*(z - z^@power) endif length=|z1|+|zh| m=m+1 until m>=#maxiter || length>=@bailout mm=m count=count+1 until (count>=zscreen || length<@bailout)||(@view>0) if count==1 if m>=#maxiter&&@view==0&&@touchscreen==true tflag=true endif endif if @view>0 count0=6 elseif (length<@bailout)&&(count>1) count2=0 repeat if @fourthdim==3 xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 elseif @fourthdim==2 xx=xx-dzx1 yy=yy-dzy1 ww=ww-dzz1 elseif @fourthdim==1 xx=xx-dzz1 zz=zz-dzx1 ww=ww-dzy1 else yy=yy-dzz1 zz=zz-dzx1 ww=ww-dzy1 endif m=0 z1=xx+flip(yy) zh=zz+flip(ww) cri=@cr+flip(@ci) cjk=@cj+flip(@ck) z2 = z1 z2h = zh repeat if @formula=="HyperFnJulia" a = real(z1)-imag(zh) + flip(imag(z1) + real(zh)) b = real(z1)+imag(zh) + flip(imag(z1) - real(zh)) c = @hyperfun(a) d = @hyperfun(b) z1 = (real(c) + real(d))/2 + flip(imag(c) + imag(d))/2 + cri zh = (imag(c) - imag(d))/2 + flip(real(d) - real(c))/2 + cjk elseif @formula=="HyperFrame-Robert" a = real(z1)-imag(zh) + flip(imag(z1) + real(zh)) b = real(z1)+imag(zh) + flip(imag(z1) - real(zh)) c = a*a*a/5 + a*a d = b*b*b/5 + b*b z1 = (real(c) + real(d))/2 + flip(imag(c) + imag(d))/2 + cri zh = (imag(c) - imag(d))/2 + flip(real(d) - real(c))/2 + cjk elseif @formula=="HyperIkenaga" a = real(z1)-imag(zh) + flip(imag(z1) + real(zh)) b = real(z1)+imag(zh) + flip(imag(z1) - real(zh)) cc = real(cri)-imag(cjk) + flip(imag(cri) + real(cjk)) ch = real(cri)+imag(cjk) + flip(imag(cri) - real(cjk)) c = a*a*a + cc*a d = b*b*b + ch*b z1 = (real(c) + real(d))/2 + flip(imag(c) + imag(d))/2 - z1 - cri zh = (imag(c) - imag(d))/2 + flip(real(d) - real(c))/2 - zh - cjk elseif @formula=="HyperSpider" a = real(z1)-imag(zh) + flip(imag(z1) + real(zh)) b = real(z1)+imag(zh) + flip(imag(z1) - real(zh)) c = a*a d = b*b z1 = (real(c) + real(d))/2 + flip(imag(c) + imag(d))/2 + cri zh = (imag(c) - imag(d))/2 + flip(real(d) - real(c))/2 + cjk cri = cri/2 + z1 cjk = cjk/2 + zh elseif @formula=="HyperManowar" z2 = z1 z2h = zh a = real(z1)-imag(zh) + flip(imag(z1) + real(zh)) b = real(z1)+imag(zh) + flip(imag(z1) - real(zh)) a2 = real(z2)-imag(z2h) + flip(imag(z2) + real(z2h)) b2 = real(z2)+imag(z2h) + flip(imag(z2) - real(z2h)) c = a*a + a2 d = b*b + b2 z1 = (real(c) + real(d))/2 + flip(imag(c) + imag(d))/2 + cri zh = (imag(c) - imag(d))/2 + flip(real(d) - real(c))/2 + cjk elseif @formula=="HyperPowerJulia" a = real(z1)-imag(zh) + flip(imag(z1) + real(zh)) b = real(z1)+imag(zh) + flip(imag(z1) - real(zh)) c = a^@power d = b^@power z1 = (real(c) + real(d))/2 + flip(imag(c) + imag(d))/2 + cri zh = (imag(c) - imag(d))/2 + flip(real(d) - real(c))/2 + cjk elseif @formula=="QuatFrame-Robert" a = z1*z1 - zh*conj(zh) ; z*z b = (z1 + conj(z1))*zh ; z*z c = (z1*a - zh*conj(b))/5 ; z*z*z/5 d = (z1*b + conj(a)*zh)/5 ; z*z*z/5 z1 = c + a + cri zh = d + b + cjk elseif @formula=="QuatIkenaga" a = z1*z1 - zh*conj(zh) ; z*z b = (z1 + conj(z1))*zh ; z*z c = z1*a - zh*conj(b) ; z*z*z d = z1*b + conj(a)*zh ; z*z*z cc = cri*z1 - cjk*conj(zh) ; c*z cr = cri*zh + conj(z1)*cjk ; c*z z1 = c + cc -z1 - cri zh = d + cr - zh - cjk elseif @formula=="QuatManowar" z2 = z1 z2h = zh a = z1*z1 - zh*conj(zh) + z2 + cri ; z*z + oldz + c b = (z1 + conj(z1))*zh + z2h + cjk ; z*z + oldz + c z1 = a zh = b elseif @formula=="QuatSpider" a = z1*z1 - zh*conj(zh) + cri ; z*z + c b = (z1 + conj(z1))*zh + cjk ; z*z + c z1 = a zh = b cri = cri/2 + a ; c = c/2 + z cjk = cjk/2 + b ; c = c/2 + z elseif @formula=="QuatExpJulia" n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif fx = exp(real(z1)) fy = sin(n)/n a = fx*cos(n) + fx*fy*flip(imag(z1)) b = fx*fy*zh z1 = a + cri zh = b + cjk elseif @formula=="QuatPowerJulia" n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif z2 = real(z1) + flip(n) t = atan2(z2)/n len = |z1|+|zh| if len == 0 len = 1e-20 endif a = @power*(0.5*log(len) + t*flip(imag(z1))) b = @power*t*zh z1 = a zh = b n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif fx = exp(real(z1)) fy = sin(n)/n a = fx*cos(n) + fx*fy*flip(imag(z1)) b = fx*fy*zh z1 = a + cri zh = b + cjk elseif @formula=="QuatSinJulia" n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif a = sin(real(z1))*cosh(n) + cos(real(z1))*sinh(n)/n*flip(imag(z1)) b = cos(real(z1))*sinh(n)/n*zh z1 = a + cri zh = b + cjk elseif @formula=="QuatCosJulia" n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif a = cos(real(z1))*cosh(n) - sin(real(z1))*sinh(n)/n*flip(imag(z1)) b = -sin(real(z1))*sinh(n)/n*zh z1 = a + cri zh = b + cjk elseif @formula=="QuatLambdaPower" z2h = zh n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif z2 = real(z1) + flip(n) t = atan2(z2)/n z2 = z1 len = |z1|+|zh| if len == 0 len = 1e-20 endif a = @power*(0.5*log(len) + t*flip(imag(z1))) b = @power*t*zh z1 = a zh = b n = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if n == 0 n = 1e-20 endif fx = exp(real(z1)) fy = sin(n)/n a = fx*cos(n) + fx*fy*flip(imag(z1)) ; z^@power b = fx*fy*zh ; z^@power c = z2 - a ; z - z^@power d = z2h - b ; z - z^@power z1 = cri*c - cjk*conj(d) ; c*(z - z^@power) zh = cri*d + conj(a)*cjk ; c*(z - z^@power) endif length=|z1|+|zh| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 z=z1 endif ; tracing if @view>0 setflag=false elseif buff0>zmax&&@background>0 setflag=false else lightdx=real(#screenpixel)*dx+xmin-@lightx lightdy=imag(#screenpixel)*dy+ymin-@lighty lightdz=buff0-@lightz lightlength=sqrt(lightdx*lightdx+lightdy*lightdy+lightdz*lightdz) fx=(buff2-buff1)*2*dy fy=-2*dx*(buff4-buff3) fz=-4*dx*dy flength=sqrt(fx*fx+fy*fy+fz*fz) tangle=(fx*lightdx+fy*lightdy+fz*lightdz)/(flength*lightlength) endif if tflag==true&&@view==0 setflag=false endif loop: if @view>0 iter=iter+1 elseif buff0>zmax if @background==0 z=tangle+flip(color2) elseif @background==1 setflag=false endif elseif tflag==true setflag=false else z=tangle+flip(color1) endif bailout: (setflag==false&&@view==0)|| \ (iter0) default: param version caption = "Formula Version" default = 200 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam heading caption="Barnsley 1" visible=@formula=="Barnsley1" endheading heading caption="Barnsley 2" visible=@formula=="Barnsley2" endheading heading caption="Barnsley 3" visible=@formula=="Barnsley3" endheading heading caption="Frame-Robert" visible=@formula=="Frame-Robert" endheading heading caption="Ikenaga" visible=@formula=="Ikenaga" endheading heading caption="LambdaPower" visible=@formula=="LambdaPower" endheading heading caption="Phoenix" visible=@formula=="Phoenix" endheading heading caption="MandelPower" visible=@formula=="MandelPower" endheading heading caption="Manowar" visible=@formula=="Manowar" endheading heading caption="Spider" visible=@formula=="Spider" endheading heading caption="Gopalsamy" visible=@formula=="Gopalsamy" endheading heading caption="Pokorny" visible=@formula=="Pokorny" endheading heading caption="Magnet 1" visible=@formula=="Magnet1" endheading heading caption="Magnet 2" visible=@formula=="Magnet2" endheading heading caption="Cayley" visible=@formula=="Cayley" endheading heading caption="Hypercomplex Function Julia" visible=@formula=="HyperFnJulia" endheading heading caption="the hypercomplex MandelJulia set" visible=@formula=="HyperFnJulia" endheading heading caption="Hypercomplex Frame-Robert" visible=@formula=="HyperFrame-Robert" endheading heading caption="Hypercomplex Ikenaga" visible=@formula=="HyperIkenaga" endheading heading caption="Quat Frame-Robert" visible=@formula=="QuatFrame-Robert" endheading heading caption="Quat Manowar" visible=@formula=="QuatManowar" endheading heading caption="Quat Ikenaga" visible=@formula=="QuatIkenaga" endheading heading caption="Quat Spider" visible=@formula=="QuatSpider" endheading heading caption="Hypercomplex Manowar" visible=@formula=="HyperManowar" endheading heading caption="Hypercomplex Spider" visible=@formula=="HyperSpider" endheading heading caption="Quat ExponentialJulia" visible=@formula=="QuatExpJulia" endheading heading caption="Quat PowerJulia" visible=@formula=="QuatPowerJulia" endheading heading caption="Quat SinJulia" visible=@formula=="QuatSinJulia" endheading heading caption="Quat CosJulia" visible=@formula=="QuatCosJulia" endheading heading caption="Hyper PowerJulia" visible=@formula=="HyperPowerJulia" endheading heading caption="Quat LambdaPower" visible=@formula=="QuatLambdaPower" endheading $ifdef VER40 heading text="Use Bailout=100" visible=@formula=="Frame-Robert" endheading heading text="Use Bailout=100" visible=@formula=="LambdaPower" endheading heading text="Use Bailout=100" visible=@formula=="Phoenix" endheading heading text="Use Bailout=10" visible=@formula=="Gopalsamy" endheading heading text ="Use Bailout=128 and Convergent Bailout=0.000001." visible=@formula=="Magnet1" endheading heading text="Use Bailout=128 and Convergent Bailout=0.000001." visible=@formula=="Magnet2" endheading heading text="Use Bailout=100" visible=@formula=="HyperFnJulia" endheading heading text="h[n+1] -> fn(h[n]) + hc where fn() can be any standard function. If \ fn()= sqr() the standard HyperJulia is produced." visible=@formula=="HyperFnJulia" endheading heading text="Use Bailout=100" visible=@formula=="HyperFrame-Robert" endheading heading text="Use Bailout=100" visible=@formula=="HyperIkenaga" endheading heading text="Use Bailout=100" visible=@formula=="QuatFrame-Robert" endheading heading text="Use Bailout=100" visible=@formula=="QuatIkenaga" endheading heading text="Use Bailout=100" visible=@formula=="QuatManowar" endheading heading text="Use Bailout=100" visible=@formula=="QuatSpider" endheading heading text="Use Bailout=100" visible=@formula=="HyperManowar" endheading heading text="Use Bailout=100" visible=@formula=="HyperSpider" endheading heading text="Use Bailout=100" visible=@formula=="QuatExpJulia" endheading heading text="Use Bailout=100" visible=@formula=="QuatPowerJulia" endheading heading text="Use Bailout=100" visible=@formula=="QuatSinJulia" endheading heading text="Use Bailout=100" visible=@formula=="QuatCosJulia" endheading heading text="Use Bailout=100" visible=@formula=="HyperPowerJulia" endheading heading text="Use Bailout=100" visible=@formula=="QuatLambdaPower" endheading heading text="Requires Raytrace in spr.ucl or Texture Raytrace in reb.ucl. \ Based upon the formulas of Stig Pettersson." endheading $else heading caption="Use Bailout=100" visible=@formula=="Frame-Robert" endheading heading caption="Use Bailout=100" visible=@formula=="LambdaPower" endheading heading caption="Use Bailout=100" visible=@formula=="Phoenix" endheading heading caption="Use Bailout=10" visible=@formula=="Gopalsamy" endheading heading caption="Use Bailout=128" visible=@formula=="Magnet1" endheading heading caption="Use Convergent Bailout=0.000001" visible=@formula=="Magnet1" endheading heading caption="Use Bailout=128" visible=@formula=="Magnet2" endheading heading caption="Use Convergent Bailout=0.000001" visible=@formula=="Magnet2" endheading heading caption="Use Bailout=100" visible=@formula=="HyperFnJulia" endheading heading caption="h[n+1] -> fn(h[n]) + hc" visible=@formula=="HyperFnJulia" endheading heading caption="fn() can be any standard function" visible=@formula=="HyperFnJulia" endheading heading caption="fn()= sqr() produces" visible=@formula=="HyperFnJulia" endheading heading caption="Use Bailout=100" visible=@formula=="HyperFrame-Robert" endheading heading caption="Use Bailout=100" visible=@formula=="HyperIkenaga" endheading heading caption="Use Bailout=100" visible=@formula=="QuatFrame-Robert" endheading heading caption="Use Bailout=100" visible=@formula=="QuatIkenaga" endheading heading caption="Use Bailout=100" visible=@formula=="QuatManowar" endheading heading caption="Use Bailout=100" visible=@formula=="QuatSpider" endheading heading caption="Use Bailout=100" visible=@formula=="HyperManowar" endheading heading caption="Use Bailout=100" visible=@formula=="HyperSpider" endheading heading caption="Use Bailout=100" visible=@formula=="QuatExpJulia" endheading heading caption="Use Bailout=100" visible=@formula=="QuatPowerJulia" endheading heading caption="Use Bailout=100" visible=@formula=="QuatSinJulia" endheading heading caption="Use Bailout=100" visible=@formula=="QuatCosJulia" endheading heading caption="Use Bailout=100" visible=@formula=="HyperPowerJulia" endheading heading caption="Use Bailout=100" visible=@formula=="QuatLambdaPower" endheading heading caption="Requires Raytrace in spr.ucl" endheading heading caption="or Texture Raytrace in reb.ucl" endheading heading caption = "Based upon the formulas of" endheading heading caption = "Stig Pettersson" endheading $endif title = "Only Brots" method=onepass periodicity=0 maxiter=10 param formula enum= "Barnsley1" "Barnsley2" "Barnsley3" "Cayley" "Frame-Robert" "Gopalsamy" \ "HyperFnJulia" "HyperFrame-Robert" "HyperIkenaga" "HyperManowar" "HyperPowerJulia" \ "HyperSpider" "Ikenaga" "LambdaPower" "Magnet1" "Magnet2" "MandelPower" "Manowar" \ "Phoenix" "Pokorny" "QuatCosJulia" "QuatExpJulia" "QuatFrame-Robert" "QuatIkenaga" \ "QuatManowar" "QuatPowerJulia" "QuatLambdaPower" "QuatSinJulia" "QuatSpider" "Spider" default=4 hint="type of formula for raytracing." endparam param power caption = "power" default = (2.0, 0) visible=@formula=="LambdaPower"||@formula=="MandelPower"||@formula=="QuatPowerJulia"||@formula=="HyperPowerJulia"||@formula=="QuatLambdaPower" endparam param bailout caption="Divergent Bailout" default=100.0 hint="Breakvalue for iterations." min=0.0 visible=@formula=="Barnsley1"||@formula=="Barnsley2"||@formula=="Barnsley3"||@formula=="Frame-Robert"||@formula=="Ikenaga"||@formula=="LambdaPower" \ ||@formula=="Phoenix"||@formula=="MandelPower"||@formula=="Manowar"||@formula=="Spider"||@formula=="Gopalsamy"||@formula=="Pokorny" \ ||@formula=="Magnet1"||@formula=="Magnet2"||@formula=="HyperFnJulia"||@formula=="HyperFrame-Robert"||@formula=="HyperIkenaga" \ ||@formula=="QuatFrame-Robert"||@formula=="QuatIkenaga"||@formula=="QuatManowar"||@formula=="QuatSpider"||@formula=="HyperManowar" \ ||@formula=="HyperSpider"||@formula=="QuatExpJulia"||@formula=="QuatPowerJulia"||@formula=="QuatSinJulia"||@formula=="QuatCosJulia" \ ||@formula=="HyperPowerJulia"||@formula=="QuatLambdaPower" endparam param bailout2 caption="Convergent Bailout" default=0.000001 hint="Breakvalue for iterations." max=0.10 min=1e-12 visible=@formula=="Magnet1"||@formula=="Magnet2"||@formula=="Cayley" endparam func hyperfun caption="HyperFunction" default = sqr() visible=@formula=="HyperFnJulia" endfunc param fourthdim enum="a-real or zr" "a-imag or zi" "b-real or zj" "b-imag or zk" default=3 hint=" axis that points into the fourth dimension." endparam param fourthvalue caption="4-dim-value" default=0.0 hint="value for the fourth axis." endparam param zorig caption="z-center" default=0.0 hint="Center of z-axis." endparam param view enum="3-dim" "2-dim-center" "2-dim-screen" default=0 hint="View-system. 3d or 2d from center or 2d from 'screentouch'." endparam param background enum="outside" "inside" default=1 hint="What type of background-coloring you want. With inside only one colour or inside \ coloring filter" endparam param touchscreen caption="Screen-touch" default=false hint="Those structures that goes out of the screen, or touches it, is colored with \ inside colouring." endparam heading caption="Hypercomplex Constant" visible=@formula=="HyperFnJulia"||@formula=="HyperFrame-Robert"||@formula=="HyperIkenaga" ||@formula=="HyperManowar"||@formula=="HyperSpider" \ ||@formula=="HyperPowerJulia" endheading heading caption="Quaternion Constant" visible=@formula=="QuatFrame-Robert"||@formula=="QuatIkenaga"||@formula=="QuatManowar"||@formula=="QuatSpider"||@formula=="QuatExpJulia" \ ||@formula=="QuatPowerJulia"||@formula=="QuatSinJulia"||@formula=="QuatCosJulia"||@formula=="QuatLambdaPower" endheading param cr caption="cr" default=0.0 hint="real constant for quaternions and hypercomplex calculations. In cubic quaternions \ this corresponds to a-real." visible=@formula=="HyperFnJulia"||@formula=="HyperFrame-Robert"||@formula=="HyperIkenaga"||@formula=="QuatFrame-Robert"||@formula=="QuatIkenaga" \ ||@formula=="QuatManowar"||@formula=="QuatSpider"||@formula=="HyperManowar"||@formula=="HyperSpider"||@formula=="QuatExpJulia" \ ||@formula=="QuatPowerJulia"||@formula=="QuatSinJulia"||@formula=="QuatCosJulia"||@formula=="HyperPowerJulia"||@formula=="QuatLambdaPower" endparam param ci caption="ci" default=0.0 hint="imaginary constant for quaternions and hypercomplex calculations. In cubic \ aternions this corresponds to a-imag." visible=@formula=="HyperFnJulia"||@formula=="HyperFrame-Robert"||@formula=="HyperIkenaga"||@formula=="QuatFrame-Robert"||@formula=="QuatIkenaga" \ ||@formula=="QuatManowar"||@formula=="QuatSpider"||@formula=="HyperManowar"||@formula=="HyperSpider"||@formula=="QuatExpJulia" \ ||@formula=="QuatPowerJulia"||@formula=="QuatSinJulia"||@formula=="QuatCosJulia"||@formula=="HyperPowerJulia"||@formula=="QuatLambdaPower" endparam param cj caption="cj" default=0.0 hint="Second imaginary constant for quaternions and hypercomplex calculations. In cubic \ quaternions this corresponds to a-jmag." visible=@formula=="HyperFnJulia"||@formula=="HyperFrame-Robert"||@formula=="HyperIkenaga"||@formula=="QuatFrame-Robert"||@formula=="QuatIkenaga" \ ||@formula=="QuatManowar"||@formula=="QuatSpider"||@formula=="HyperManowar"||@formula=="HyperSpider"||@formula=="QuatExpJulia" \ ||@formula=="QuatPowerJulia"||@formula=="QuatSinJulia"||@formula=="QuatCosJulia"||@formula=="HyperPowerJulia"||@formula=="QuatLambdaPower" endparam param ck caption="ck" default=0.0 hint="Third imaginary constant for quaternions and hypercomplex calculations. In cubic \ quaternions this corresponds to a-kmag." visible=@formula=="HyperFnJulia"||@formula=="HyperFrame-Robert"||@formula=="HyperIkenaga"||@formula=="QuatFrame-Robert"||@formula=="QuatIkenaga" \ ||@formula=="QuatManowar"||@formula=="QuatSpider"||@formula=="HyperManowar"||@formula=="HyperSpider"||@formula=="QuatExpJulia" \ ||@formula=="QuatPowerJulia"||@formula=="QuatSinJulia"||@formula=="QuatCosJulia"||@formula=="HyperPowerJulia"||@formula=="QuatLambdaPower" endparam heading caption = "" endheading param xrot caption="x-rotation" default=0.0 hint="Rotates the system through the x-axis." endparam param yrot caption="y-rotation" default=0.0 hint="Rotates the system through the y-axis." endparam param zrot caption="z-rotation" default=0.0 hint="Rotates the system through the z-axis." endparam param local caption="Local rotation" default=true hint="Sets local rotation. Otherwise location around zero." endparam param lightx caption="Light-x" default=0.0 hint="x-coord of lightsource" endparam param lighty caption="Light-y" default=0.0 hint="y-coord of lightsource" endparam param lightz caption="Light-z" default=-6.0 hint="z-coord of lightsource" endparam param zscreen caption="Screen-depth" default=320.0 hint="Screendepth in virtual pixels." min=0 endparam param zdist caption="z-distance" default=4.0 hint="Length of z-axis." endparam param zmagn caption="z-magnify" default=false hint="If set then the fractal will be magnified in the third dimension too." endparam param autoscale caption="Auto scaling" default=false hint="If set then the screendepth in virtual pixels will be set to hold the same scalar \ proportions as the x-axis. Take it easy with this as you don´t have to \ magnify the screensurface very much to get a very long z-axis in pixels. If \ z-magnify is set too then there is no danger in overproportions." endparam param prec caption="Precision" default=10.0 min=1.0 hint="Precision for the fine tracing. The lower, the faster but with less precision. \ Smallest value allowed is 1.0" endparam param delta caption="Delta" default=1.0 hint="The difference between the points that builds the normal-plane to the lightsource. \ Should normally be 1.0" endparam } ComplexNewton { ; Newton with ability to set conversion limit ; modified 10/2/2004 to add convergence method ; for equation z = z^p1 - p2 init: complex fz = 0 complex fzp = 0 complex fzp2 = 0 float pwrtest = 10^(100/cabs(@p1)) bool bTest = false float isnear = @p3*cabs(@p2)^cabs(@p1) #z = #pixel complex oldz = 0 float cz = 0 loop: oldz = #z fz = #z^@p1 - @p2 fzp = @p1*z^(@p1-1) fzp2 = @p1*(@p1-1)*z^(@p1-2) if @converge == 0 ; Newton #z = #z - fz/fzp elseif @converge == 1 ; Householder #z = #z - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) elseif @converge == 2 ; Halley #z = #z - 2*fz*fzp/(2*fzp^2 - fz*fzp2) elseif @converge == 3 ; Schroder #z = #z - fz*fzp/(fzp^2 - fz*fzp2) elseif @converge == 4 ; Ho custom #z = #z - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2)) elseif @converge == 5 ; Ha custom #z = #z - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 6 ; H_S custom #z = #z - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) endif if @oldver btest = (cabs(oldz-#z) < isnear) cz = cabs(#z) else btest = (|oldz-#z| < isnear) cz = |#z| endif bailout: !btest && (cz < pwrtest) default: title = "Complex Newton" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam bool param oldver caption = "Use old version" default = false endparam param p1 caption = "Power" default = (3,0) endparam param p2 caption = "Root" default = (1,0) endparam param p3 caption = "Bailout value" default = 1e-12 max = 0.1 endparam heading caption = "Convergence Methods" endheading param converge caption = "Convergence Method" default = 0 enum = "Newton" "Householder" "Halley" "Schroder" "Ho Custom" \ "Ha Custom" "H_S Custom" endparam float param custom caption = "H_S Constant" default = 1.5 visible = @converge==4 || @converge==5 || @converge==6 endparam } Cayley-jul { ; Ron Barnett, February 1999 ; based upon the formula of Mark Townsend init: complex fz = 0 complex fzp = 0 complex fzp2 = 0 #z = #pixel oldz = 0 a = @p1 float iterate = 0 loop: iterate = iterate + 1 oldz = #z fz = #z^3 - a*z - a + 1 fzp = 3*#z^2 - a fzp2 = 6*#z if @converge == 0 ; Newton #z = #z - fz/fzp elseif @converge == 1 ; Householder #z = #z - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) elseif @converge == 2 ; Halley #z = #z - 2*fz*fzp/(2*fzp^2 - fz*fzp2) elseif @converge == 3 ; Schroder #z = #z - fz*fzp/(fzp^2 - fz*fzp2) elseif @converge == 4 ; Ho custom #z = #z - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2)) elseif @converge == 5 ; Ha custom #z = #z - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 6 ; H_S custom #z = #z - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 7 ; Mixed1 if iterate % 2 == 0 #z = #z - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) else #z = #z - fz/fzp endif elseif @converge == 8 ; Mixed2 if iterate % 2 == 0 #z = #z - 2*fz*fzp/(2*fzp^2 - fz*fzp2) else #z = #z - fz/fzp endif elseif @converge == 9 ; Mixed3 if iterate % 2 == 0 #z = #z - fz*fzp/(fzp^2 - fz*fzp2) else #z = #z - fz/fzp endif elseif @converge == 10 ; Mixed4 if iterate % 2 == 0 #z = #z - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) else #z = #z - fz/fzp endif endif bailout: |#z - oldz| >= @bailout default: title = "Cayley Julia" maxiter = 1000 center = (0, 0) magn = 32 method = multipass periodicity = 0 heading caption = "Cayley Julia" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal that uses multiple convergence \ methods and has Julia-like regions for several convergence methods." endheading $else heading caption = "This is a 'convergent' fractal" endheading heading caption = "that uses multiple convergence" endheading heading caption = "methods and has Julia-like regions" endheading heading caption = "for several convergence methods." endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout value" default = 0.000001 endparam param p1 caption = "Parameter 1" default = (0.360968017578125,0.00074462890625) endparam heading caption = "Convergence Methods" endheading param converge caption = "Convergence Method" default = 0 enum = "Newton" "Householder" "Halley" "Schroder" "Ho Custom" \ "Ha Custom" "H_S Custom" "Mixed1" "Mixed2" "Mixed3" "Mixed4" endparam float param custom caption = "H_S Constant" default = 1.5 visible = @converge==4 || @converge==5 || @converge==6 || @converge==10 endparam switch: type = "Cayley-mand" bailout = @bailout converge = @converge custom = @custom } Cayley-mand { ; Ron Barnett, February 1999 ; based upon the formula z = z^3 - az - c + 1 ; convergence methods added 10/2/2004 init: complex fz = 0 complex fzp = 0 complex fzp2 = 0 #z = 0 complex oldz = 0 complex a = #pixel float iterate = 0 loop: iterate = iterate + 1 oldz = #z fz = #z^3 - a*z - a + 1 fzp = 3*#z^2 - a fzp2 = 6*#z if @converge == 0 ; Newton #z = #z - fz/fzp elseif @converge == 1 ; Householder #z = #z - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) elseif @converge == 2 ; Halley #z = #z - 2*fz*fzp/(2*fzp^2 - fz*fzp2) elseif @converge == 3 ; Schroder #z = #z - fz*fzp/(fzp^2 - fz*fzp2) elseif @converge == 4 ; Ho custom #z = #z - fz/fzp*(1 + fz*fzp2/(@custom*fzp^2)) elseif @converge == 5 ; Ha custom #z = #z - 2*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 6 ; H_S custom #z = #z - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) elseif @converge == 7 ; Mixed1 if iterate % 2 == 0 #z = #z - fz/fzp*(1 + fz*fzp2/(2*fzp^2)) else #z = #z - fz/fzp endif elseif @converge == 8 ; Mixed2 if iterate % 2 == 0 #z = #z - 2*fz*fzp/(2*fzp^2 - fz*fzp2) else #z = #z - fz/fzp endif elseif @converge == 9 ; Mixed3 if iterate % 2 == 0 #z = #z - fz*fzp/(fzp^2 - fz*fzp2) else #z = #z - fz/fzp endif elseif @converge == 10 ; Mixed4 if iterate % 2 == 0 #z = #z - @custom*fz*fzp/(@custom*fzp^2 - fz*fzp2) else #z = #z - fz/fzp endif endif bailout: |#z - oldz| >= @bailout default: title = "Cayley Mandel" maxiter = 1000 center = (0.3593516980975, 0) magn = 360 method = multipass periodicity = 0 heading caption = "Cayley Mandelbrot" endheading $ifdef VER40 heading text = "This is a 'convergent' fractal that uses multiple convergence \ methods and has Mandelbrot-like regions for several convergence methods." endheading $else heading caption = "This is a 'convergent' fractal" endheading heading caption = "that uses multiple convergence" endheading heading caption = "methods and has Mandelbrot-like regions" endheading heading caption = "for several convergence methods." endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout value" default = 0.000001 endparam heading caption = "Convergence Methods" endheading param converge caption = "Convergence Method" default = 0 enum = "Newton" "Householder" "Halley" "Schroder" "Ho Custom" \ "Ha Custom" "H_S Custom" "Mixed1" "Mixed2" "Mixed3" "Mixed4" endparam float param custom caption = "H_S Constant" default = 1.5 visible = @converge==4 || @converge==5 || @converge==6 || @converge==10 endparam switch: type = "Cayley-jul" bailout = @bailout converge = @converge p1 = #pixel custom = @custom } ProgressiveMandelbrot {; Ron Barnett, November 2004 init: complex pix = (0,0) complex pwr = (0,0) float rot = 0; int iter = 0 #z = #pixel pix = #pixel float px = 0 float py = 0 loop: if iter == 0 rot = @rotation*180/(2*#pi) pwr = @power endif if @progress == true rot = rot + @seedrot*180/(2*#pi) pwr = pwr + @incpwr pix = pix + @incseed endif px = real(pix)*cos(rot) - imag(pix)*sin(rot) py = imag(pix)*cos(rot) + real(pix)*sin(rot) pix = px + flip(py) #z = #z^pwr + pix iter = iter + 1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Progressive Mandelbrot" periodicity = 0 method = multipass maxiter = 255 center = (-0.5, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1 endparam param power caption = "Mandelbrot power" default = (2,0) endparam param rotation caption = "Seed rotation" default = 0.0 endparam param progress caption = "Progressive parameters" default = false endparam param seedrot caption = "Inc seed rotation" default = 0.0 visible=@progress == true endparam param incpwr caption = "Inc power" default = (0.0,0.0) visible=@progress == true endparam param incseed caption = "Inc seed" default = (0.0,0.0) visible=@progress == true endparam switch: type = "ProgressiveJulia" bailout = @bailout p1 = #pixel test = @test power = @power progress = @progress seedrot = @seedrot incseed = @incseed incpwr = @incpwr rotation = @rotation } ProgressiveJulia {; Ron Barnett, November 2004 init: complex pix = (0,0) complex pwr = (0,0) float rot = 0; int iter = 0 #z = #pixel pix = @p1 float px = 0 float py = 0 loop: if iter == 0 rot = @rotation*180/(2*#pi) pwr = @power endif if @progress == true rot = rot + @seedrot*180/(2*#pi) pwr = pwr + @incpwr pix = pix + @incseed endif px = real(pix)*cos(rot) - imag(pix)*sin(rot) py = imag(pix)*cos(rot) + real(pix)*sin(rot) pix = px + flip(py) #z = #z^pwr + pix iter = iter + 1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Progressive Julia" periodicity = 0 method = multipass maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 4.0 min = 1 endparam param power caption = "Julia power" default = (2,0) endparam param p1 caption = "seed" default = (-0.75, 0.2) endparam param rotation caption = "Seed rotation" default = 0.0 endparam param progress caption = "Progressive parameters" default = false endparam param seedrot caption = "Inc seed rotation" default = 0.0 visible=@progress == true endparam param incpwr caption = "Inc power" default = (0.0,0.0) visible=@progress == true endparam param incseed caption = "Inc seed" default = (0.0,0.0) visible=@progress == true endparam switch: type = "ProgressiveMandelbrot" bailout = @bailout test = @test power = @power progress = @progress seedrot = @seedrot incseed = @incseed incpwr = @incpwr rotation = @rotation } ExponentialMand {; Ron Barnett, November 2004 ; init: #z = #pixel loop: #z = exp(#z) + #pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Exponential Mand" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10000.0 min = 1 endparam switch: type = "ExponentialJulia" bailout = @bailout p1 = #pixel test = @test } ExponentialJulia {; Ron Barnett, November 2004 ; init: #z = #pixel loop: #z = exp(#z) + @p1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Exponential Julia" maxiter = 1000 center = (0, 0) method = multipass periodicity = 0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 10000.0 min = 1 endparam param p1 caption = "seed" default = (-0.65, 0.05) endparam switch: type = "ExponentialMand" bailout = @bailout test = @test } Slope_2D_Quadratic_G_Attractor { ; Ron Barnett December 8, 2004 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III global: int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] int count[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float s[305,13] float fx = 0.1 float ffx = 0.0 float xx = 0.0 float fy = 0.1 float ffy = 0.0 float b1=0,float b2=0,float b3=0,float b4=0,float b5=0,float b6=0,float b7=0,float b8=0,float b9=0,float b10=0,float b11=0,float b12=0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float xmin = cx - txmax/2 float ymin = cy - tymax/2 float iterate = @density*10000000 float maxhit = 0 float maxx = 0 float maxy = 0 ; ; initialize presets ; s[1,1]=0.9,s[1,2]=-0.1,s[1,3]=0.2,s[1,4]=0.5,s[1,5]=-0.6,s[1,6]=-1.0,s[1,7]=-0.9,s[1,8]=-0.8,s[1,9]=1.0,s[1,10]=-0.2,s[1,11]=0.4,s[1,12]=-0.2 s[2,1]=-0.8,s[2,2]=1.1,s[2,3]=0.5,s[2,4]=1.1,s[2,5]=1.1,s[2,6]=1.1,s[2,7]=-0.6,s[2,8]=-0.1,s[2,9]=-0.6,s[2,10]=-0.1,s[2,11]=0.2,s[2,12]=0.5 s[3,1]=-0.8,s[3,2]=-0.7,s[3,3]=0.4,s[3,4]=-0.8,s[3,5]=0.4,s[3,6]=1.1,s[3,7]=0.9,s[3,8]=-0.9,s[3,9]=0.4,s[3,10]=0.6,s[3,11]=-0.9,s[3,12]=0.1 s[4,1]=0.9,s[4,2]=0.5,s[4,3]=-1.2,s[4,4]=0.0,s[4,5]=-0.3,s[4,6]=0.0,s[4,7]=0.2,s[4,8]=0.4,s[4,9]=0.9,s[4,10]=-0.1,s[4,11]=-1.1,s[4,12]=-0.1 s[5,1]=0.6,s[5,2]=-0.1,s[5,3]=-0.5,s[5,4]=-1.2,s[5,5]=-0.3,s[5,6]=-0.6,s[5,7]=0.8,s[5,8]=0.4,s[5,9]=-0.1,s[5,10]=1.0,s[5,11]=-0.8,s[5,12]=-1.0 s[6,1]=-0.8,s[6,2]=0.5,s[6,3]=0.5,s[6,4]=-0.7,s[6,5]=-0.9,s[6,6]=1.0,s[6,7]=-0.1,s[6,8]=-0.4,s[6,9]=1.1,s[6,10]=-0.4,s[6,11]=0.0,s[6,12]=-0.3 s[7,1]=-0.6,s[7,2]=0.8,s[7,3]=0.4,s[7,4]=-0.8,s[7,5]=-1.0,s[7,6]=-1.1,s[7,7]=-0.8,s[7,8]=1.0,s[7,9]=0.3,s[7,10]=1.0,s[7,11]=0.8,s[7,12]=0.4 s[8,1]=-0.9,s[8,2]=-0.4,s[8,3]=-1.1,s[8,4]=-0.4,s[8,5]=0.8,s[8,6]=0.9,s[8,7]=0.9,s[8,8]=-0.2,s[8,9]=-1.1,s[8,10]=-0.7,s[8,11]=-0.2,s[8,12]=0.1 s[9,1]=-0.2,s[9,2]=0.8,s[9,3]=-0.4,s[9,4]=-0.3,s[9,5]=-0.8,s[9,6]=1.0,s[9,7]=0.5,s[9,8]=-0.9,s[9,9]=0.9,s[9,10]=-0.6,s[9,11]=0.4,s[9,12]=-0.3 s[10,1]=0.7,s[10,2]=-0.3,s[10,3]=-1.1,s[10,4]=0.5,s[10,5]=0.3,s[10,6]=-0.7,s[10,7]=0.0,s[10,8]=0.9,s[10,9]=-0.4,s[10,10]=0.3,s[10,11]=0.7,s[10,12]=0.2 s[11,1]=1.1,s[11,2]=-0.4,s[11,3]=-0.1,s[11,4]=-1.1,s[11,5]=-0.8,s[11,6]=-0.9,s[11,7]=-0.7,s[11,8]=-0.7,s[11,9]=0.7,s[11,10]=0.4,s[11,11]=0.0,s[11,12]=-0.1 s[12,1]=-1.2,s[12,2]=-0.1,s[12,3]=-0.5,s[12,4]=0.6,s[12,5]=-1.0,s[12,6]=-0.3,s[12,7]=-0.6,s[12,8]=-0.2,s[12,9]=-0.8,s[12,10]=-0.7,s[12,11]=-0.4,s[12,12]=0.1 s[13,1]=0.2,s[13,2]=1.0,s[13,3]=-0.3,s[13,4]=0.9,s[13,5]=0.6,s[13,6]=-0.5,s[13,7]=0.6,s[13,8]=1.0,s[13,9]=-1.0,s[13,10]=-0.1,s[13,11]=-1.2,s[13,12]=0.8 s[14,1]=-0.6,s[14,2]=-0.5,s[14,3]=0.7,s[14,4]=0.4,s[14,5]=-0.7,s[14,6]=-0.1,s[14,7]=0.7,s[14,8]=0.4,s[14,9]=-0.7,s[14,10]=1.0,s[14,11]=0.1,s[14,12]=-0.1 s[15,1]=0.6,s[15,2]=-0.3,s[15,3]=-0.1,s[15,4]=-1.1,s[15,5]=-1.1,s[15,6]=0.5,s[15,7]=-0.1,s[15,8]=0.1,s[15,9]=0.7,s[15,10]=0.9,s[15,11]=-0.8,s[15,12]=1.0 s[16,1]=-0.4,s[16,2]=-1.0,s[16,3]=-0.7,s[16,4]=-0.7,s[16,5]=-1.1,s[16,6]=-0.1,s[16,7]=1.2,s[16,8]=-0.5,s[16,9]=-0.7,s[16,10]=0.3,s[16,11]=0.5,s[16,12]=-0.6 s[17,1]=-0.7,s[17,2]=0.7,s[17,3]=1.0,s[17,4]=-0.5,s[17,5]=0.7,s[17,6]=0.3,s[17,7]=0.8,s[17,8]=-0.9,s[17,9]=-0.8,s[17,10]=-1.0,s[17,11]=-0.6,s[17,12]=-1.1 s[18,1]=0.8,s[18,2]=0.3,s[18,3]=0.0,s[18,4]=0.2,s[18,5]=0.3,s[18,6]=-0.8,s[18,7]=-0.4,s[18,8]=-1.2,s[18,9]=-0.9,s[18,10]=-1.1,s[18,11]=-0.2,s[18,12]=0.2 s[19,1]=0.3,s[19,2]=1.0,s[19,3]=-0.4,s[19,4]=0.9,s[19,5]=0.3,s[19,6]=-0.5,s[19,7]=0.0,s[19,8]=-1.0,s[19,9]=-1.2,s[19,10]=0.1,s[19,11]=-0.9,s[19,12]=0.0 s[20,1]=1.2,s[20,2]=-0.2,s[20,3]=-0.9,s[20,4]=1.1,s[20,5]=0.5,s[20,6]=-0.5,s[20,7]=0.3,s[20,8]=-0.5,s[20,9]=-1.2,s[20,10]=0.6,s[20,11]=-0.1,s[20,12]=-0.4 s[21,1]=0.2,s[21,2]=0.3,s[21,3]=0.4,s[21,4]=-0.1,s[21,5]=1.2,s[21,6]=-0.5,s[21,7]=-0.4,s[21,8]=-1.1,s[21,9]=0.5,s[21,10]=-1.2,s[21,11]=1.2,s[21,12]=0.3 s[22,1]=1.1,s[22,2]=0.4,s[22,3]=-0.3,s[22,4]=-0.2,s[22,5]=0.4,s[22,6]=-1.0,s[22,7]=0.6,s[22,8]=-0.4,s[22,9]=-0.5,s[22,10]=1.2,s[22,11]=-0.9,s[22,12]=1.0 s[23,1]=-1.1,s[23,2]=0.9,s[23,3]=1.1,s[23,4]=0.4,s[23,5]=-1.2,s[23,6]=1.0,s[23,7]=0.3,s[23,8]=0.3,s[23,9]=0.3,s[23,10]=-0.7,s[23,11]=0.6,s[23,12]=-0.9 s[24,1]=-0.1,s[24,2]=-0.4,s[24,3]=-0.8,s[24,4]=-0.8,s[24,5]=0.9,s[24,6]=-0.2,s[24,7]=0.9,s[24,8]=-0.2,s[24,9]=-0.9,s[24,10]=-0.9,s[24,11]=-0.4,s[24,12]=-1.2 s[25,1]=-0.7,s[25,2]=-0.2,s[25,3]=-0.4,s[25,4]=0.4,s[25,5]=-0.9,s[25,6]=0.9,s[25,7]=0.3,s[25,8]=-0.3,s[25,9]=-1.1,s[25,10]=-0.2,s[25,11]=0.0,s[25,12]=-0.4 s[26,1]=-0.6,s[26,2]=1.1,s[26,3]=-0.2,s[26,4]=0.7,s[26,5]=-0.1,s[26,6]=1.1,s[26,7]=-1.2,s[26,8]=0.0,s[26,9]=1.1,s[26,10]=0.3,s[26,11]=0.7,s[26,12]=0.8 s[27,1]=0.1,s[27,2]=-0.7,s[27,3]=0.2,s[27,4]=-0.2,s[27,5]=0.1,s[27,6]=1.2,s[27,7]=-0.5,s[27,8]=-0.9,s[27,9]=0.5,s[27,10]=0.4,s[27,11]=-1.0,s[27,12]=0.2 s[28,1]=0.7,s[28,2]=-0.6,s[28,3]=-0.2,s[28,4]=0.1,s[28,5]=0.2,s[28,6]=-0.2,s[28,7]=-0.8,s[28,8]=-0.7,s[28,9]=0.6,s[28,10]=1.2,s[28,11]=0.4,s[28,12]=1.2 s[29,1]=-0.4,s[29,2]=-0.1,s[29,3]=-0.2,s[29,4]=-0.4,s[29,5]=-1.2,s[29,6]=0.8,s[29,7]=-0.7,s[29,8]=-0.1,s[29,9]=0.6,s[29,10]=0.5,s[29,11]=-0.9,s[29,12]=0.7 s[29,1]=-0.2,s[29,2]=0.1,s[29,3]=1.0,s[29,4]=-0.9,s[29,5]=-0.6,s[29,6]=0.7,s[29,7]=1.0,s[29,8]=-0.8,s[29,9]=-0.9,s[29,10]=-1.0,s[29,11]=0.5,s[29,12]=-0.5 s[30,1]=-0.9,s[30,2]=0.4,s[30,3]=-0.6,s[30,4]=-0.7,s[30,5]=1.1,s[30,6]=0.9,s[30,7]=0.2,s[30,8]=-1.0,s[30,9]=0.3,s[30,10]=1.1,s[30,11]=0.3,s[30,12]=0.0 s[31,1]=-0.6,s[31,2]=-0.4,s[31,3]=1.1,s[31,4]=-1.0,s[31,5]=-0.6,s[31,6]=1.2,s[31,7]=0.4,s[31,8]=0.3,s[31,9]=-0.1,s[31,10]=-0.8,s[31,11]=0.9,s[31,12]=0.1 s[32,1]=0.2,s[32,2]=-0.2,s[32,3]=-0.3,s[32,4]=-1.1,s[32,5]=-0.3,s[32,6]=-0.9,s[32,7]=0.4,s[32,8]=1.0,s[32,9]=0.5,s[32,10]=1.1,s[32,11]=-0.7,s[32,12]=-1.2 s[33,1]=1.0,s[33,2]=-0.8,s[33,3]=-0.9,s[33,4]=-0.3,s[33,5]=-0.8,s[33,6]=-0.1,s[33,7]=0.3,s[33,8]=-0.3,s[33,9]=0.1,s[33,10]=-0.1,s[33,11]=0.1,s[33,12]=-1.1 s[34,1]=0.0,s[34,2]=-0.9,s[34,3]=0.0,s[34,4]=-0.8,s[34,5]=0.6,s[34,6]=0.9,s[34,7]=0.2,s[34,8]=-0.9,s[34,9]=-1.0,s[34,10]=-1.2,s[34,11]=-0.8,s[34,12]=-1.2 s[35,1]=0.2,s[35,2]=0.4,s[35,3]=-1.2,s[35,4]=-0.6,s[35,5]=-1.2,s[35,6]=0.6,s[35,7]=0.4,s[35,8]=-1.1,s[35,9]=1.2,s[35,10]=-0.9,s[35,11]=-0.4,s[35,12]=-0.1 s[36,1]=0.7,s[36,2]=0.5,s[36,3]=-1.2,s[36,4]=-0.6,s[36,5]=0.3,s[36,6]=0.2,s[36,7]=-1.2,s[36,8]=-0.6,s[36,9]=0.2,s[36,10]=-0.7,s[36,11]=-0.1,s[36,12]=0.8 s[37,1]=0.3,s[37,2]=-0.3,s[37,3]=-1.1,s[37,4]=-1.0,s[37,5]=0.5,s[37,6]=-0.8,s[37,7]=0.8,s[37,8]=1.1,s[37,9]=0.8,s[37,10]=0.1,s[37,11]=-0.9,s[37,12]=0.1 s[38,1]=-0.8,s[38,2]=-1.1,s[38,3]=-0.1,s[38,4]=-0.5,s[38,5]=-0.2,s[38,6]=0.6,s[38,7]=0.0,s[38,8]=-0.8,s[38,9]=-0.3,s[38,10]=1.2,s[38,11]=-1.0,s[38,12]=1.1 s[39,1]=0.5,s[39,2]=0.3,s[39,3]=-0.7,s[39,4]=-0.2,s[39,5]=-0.3,s[39,6]=1.1,s[39,7]=0.8,s[39,8]=1.1,s[39,9]=-1.0,s[39,10]=-0.1,s[39,11]=0.4,s[39,12]=-0.6 s[40,1]=-0.5,s[40,2]=0.4,s[40,3]=0.6,s[40,4]=0.8,s[40,5]=-0.3,s[40,6]=-1.2,s[40,7]=0.7,s[40,8]=-0.5,s[40,9]=-0.7,s[40,10]=-1.0,s[40,11]=0.1,s[40,12]=-0.5 s[41,1]=1.1,s[41,2]=0.3,s[41,3]=-1.2,s[41,4]=1.0,s[41,5]=0.7,s[41,6]=-1.2,s[41,7]=0.8,s[41,8]=-0.7,s[41,9]=0.1,s[41,10]=-0.2,s[41,11]=-1.0,s[41,12]=1.0 s[42,1]=-0.6,s[42,2]=-0.2,s[42,3]=1.0,s[42,4]=0.9,s[42,5]=-1.1,s[42,6]=-0.6,s[42,7]=0.3,s[42,8]=0.7,s[42,9]=-0.7,s[42,10]=0.0,s[42,11]=0.1,s[42,12]=-0.6 s[43,1]=0.6,s[43,2]=-0.6,s[43,3]=-0.5,s[43,4]=0.2,s[43,5]=-0.7,s[43,6]=0.3,s[43,7]=-0.5,s[43,8]=0.8,s[43,9]=-0.5,s[43,10]=-1.1,s[43,11]=-0.2,s[43,12]=1.2 s[44,1]=0.0,s[44,2]=0.2,s[44,3]=0.1,s[44,4]=-0.9,s[44,5]=-0.9,s[44,6]=-1.2,s[44,7]=-0.8,s[44,8]=-1.0,s[44,9]=0.4,s[44,10]=0.1,s[44,11]=0.6,s[44,12]=0.4 s[45,1]=-1.2,s[45,2]=1.0,s[45,3]=1.2,s[45,4]=-0.8,s[45,5]=-1.1,s[45,6]=0.4,s[45,7]=-0.2,s[45,8]=0.6,s[45,9]=-0.2,s[45,10]=0.5,s[45,11]=-1.0,s[45,12]=-0.2 s[46,1]=-0.2,s[46,2]=-1.1,s[46,3]=-0.5,s[46,4]=0.1,s[46,5]=0.9,s[46,6]=0.3,s[46,7]=0.5,s[46,8]=-0.6,s[46,9]=-1.0,s[46,10]=0.8,s[46,11]=-0.7,s[46,12]=-0.7 s[47,1]=-0.3,s[47,2]=-0.3,s[47,3]=0.7,s[47,4]=-0.9,s[47,5]=1.0,s[47,6]=0.8,s[47,7]=-0.7,s[47,8]=-0.9,s[47,9]=0.5,s[47,10]=0.8,s[47,11]=0.1,s[47,12]=0.2 s[48,1]=-0.8,s[48,2]=-0.8,s[48,3]=1.2,s[48,4]=0.7,s[48,5]=-0.7,s[48,6]=0.1,s[48,7]=1.0,s[48,8]=-0.8,s[48,9]=-0.6,s[48,10]=0.5,s[48,11]=1.0,s[48,12]=-0.5 s[49,1]=-0.3,s[49,2]=-0.9,s[49,3]=0.6,s[49,4]=-0.2,s[49,5]=-0.1,s[49,6]=0.4,s[49,7]=0.5,s[49,8]=-1.1,s[49,9]=1.0,s[49,10]=-1.2,s[49,11]=0.0,s[49,12]=-1.0 s[50,1]=-0.9,s[50,2]=-0.2,s[50,3]=1.1,s[50,4]=0.5,s[50,5]=0.5,s[50,6]=-0.8,s[50,7]=0.3,s[50,8]=0.2,s[50,9]=0.0,s[50,10]=0.3,s[50,11]=-0.6,s[50,12]=-1.1 s[51,1]=-1.1,s[51,2]=0.0,s[51,3]=1.0,s[51,4]=0.0,s[51,5]=0.4,s[51,6]=0.1,s[51,7]=-0.3,s[51,8]=-0.7,s[51,9]=-0.6,s[51,10]=0.7,s[51,11]=-0.8,s[51,12]=0.9 s[52,1]=0.0,s[52,2]=-0.5,s[52,3]=-0.2,s[52,4]=-1.0,s[52,5]=-1.2,s[52,6]=-1.0,s[52,7]=0.7,s[52,8]=-0.3,s[52,9]=-0.8,s[52,10]=0.4,s[52,11]=0.0,s[52,12]=-0.5 s[53,1]=-0.1,s[53,2]=0.5,s[53,3]=-0.1,s[53,4]=-1.0,s[53,5]=-0.6,s[53,6]=-0.5,s[53,7]=-0.6,s[53,8]=-0.4,s[53,9]=0.4,s[53,10]=-0.8,s[53,11]=-1.2,s[53,12]=0.5 s[54,1]=0.1,s[54,2]=-0.8,s[54,3]=0.6,s[54,4]=0.1,s[54,5]=1.1,s[54,6]=0.6,s[54,7]=0.3,s[54,8]=-0.8,s[54,9]=-1.0,s[54,10]=-0.5,s[54,11]=-0.5,s[54,12]=-1.1 s[55,1]=-1.1,s[55,2]=0.1,s[55,3]=1.1,s[55,4]=0.9,s[55,5]=0.3,s[55,6]=-0.3,s[55,7]=0.9,s[55,8]=-1.1,s[55,9]=-0.5,s[55,10]=0.7,s[55,11]=0.6,s[55,12]=-0.2 s[56,1]=-0.9,s[56,2]=0.4,s[56,3]=1.2,s[56,4]=-1.2,s[56,5]=0.8,s[56,6]=0.5,s[56,7]=-0.5,s[56,8]=0.5,s[56,9]=0.8,s[56,10]=-0.4,s[56,11]=-1.0,s[56,12]=-1.1 s[57,1]=0.8,s[57,2]=-0.3,s[57,3]=0.4,s[57,4]=-1.0,s[57,5]=-0.5,s[57,6]=0.3,s[57,7]=-1.1,s[57,8]=0.0,s[57,9]=0.3,s[57,10]=0.1,s[57,11]=-0.8,s[57,12]=0.7 s[58,1]=-0.2,s[58,2]=-1.2,s[58,3]=1.2,s[58,4]=1.1,s[58,5]=-1.0,s[58,6]=0.9,s[58,7]=0.1,s[58,8]=-0.5,s[58,9]=0.7,s[58,10]=-1.2,s[58,11]=-0.6,s[58,12]=1.2 s[59,1]=-0.1,s[59,2]=-1.0,s[59,3]=-0.7,s[59,4]=0.9,s[59,5]=0.4,s[59,6]=-0.1,s[59,7]=-0.6,s[59,8]=0.4,s[59,9]=0.6,s[59,10]=1.0,s[59,11]=-0.7,s[59,12]=1.1 s[60,1]=-0.4,s[60,2]=-0.3,s[60,3]=0.1,s[60,4]=0.7,s[60,5]=1.0,s[60,6]=0.6,s[60,7]=-0.3,s[60,8]=1.0,s[60,9]=-0.8,s[60,10]=-0.5,s[60,11]=0.5,s[60,12]=0.8 s[61,1]=0.4,s[61,2]=-0.7,s[61,3]=0.7,s[61,4]=0.0,s[61,5]=1.1,s[61,6]=0.9,s[61,7]=0.2,s[61,8]=-0.9,s[61,9]=-1.1,s[61,10]=-0.4,s[61,11]=-0.1,s[61,12]=0.1 s[62,1]=0.7,s[62,2]=-0.2,s[62,3]=-0.6,s[62,4]=0.9,s[62,5]=0.0,s[62,6]=0.3,s[62,7]=1.2,s[62,8]=0.3,s[62,9]=-0.6,s[62,10]=-0.6,s[62,11]=0.3,s[62,12]=-1.0 s[63,1]=1.0,s[63,2]=0.7,s[63,3]=-0.7,s[63,4]=-0.2,s[63,5]=0.9,s[63,6]=0.1,s[63,7]=0.9,s[63,8]=1.0,s[63,9]=-0.9,s[63,10]=1.0,s[63,11]=-0.2,s[63,12]=-0.3 s[64,1]=-0.7,s[64,2]=1.1,s[64,3]=0.9,s[64,4]=1.1,s[64,5]=0.3,s[64,6]=-0.2,s[64,7]=0.3,s[64,8]=-1.1,s[64,9]=-1.0,s[64,10]=0.4,s[64,11]=-0.6,s[64,12]=-0.5 s[65,1]=0.5,s[65,2]=-0.2,s[65,3]=-0.1,s[65,4]=-0.6,s[65,5]=0.3,s[65,6]=0.7,s[65,7]=1.0,s[65,8]=0.6,s[65,9]=-0.2,s[65,10]=-1.2,s[65,11]=0.3,s[65,12]=-0.6 s[66,1]=1.0,s[66,2]=-0.8,s[66,3]=-0.5,s[66,4]=0.2,s[66,5]=0.1,s[66,6]=-0.4,s[66,7]=-0.7,s[66,8]=-0.4,s[66,9]=1.1,s[66,10]=-1.1,s[66,11]=-0.5,s[66,12]=-0.5 s[67,1]=1.1,s[67,2]=-0.4,s[67,3]=-0.2,s[67,4]=-0.6,s[67,5]=0.4,s[67,6]=-0.8,s[67,7]=0.5,s[67,8]=-0.9,s[67,9]=-0.6,s[67,10]=0.1,s[67,11]=1.2,s[67,12]=0.7 s[68,1]=-0.2,s[68,2]=-0.5,s[68,3]=-0.1,s[68,4]=-0.1,s[68,5]=0.7,s[68,6]=0.3,s[68,7]=1.1,s[68,8]=0.9,s[68,9]=-0.8,s[68,10]=0.2,s[68,11]=0.2,s[68,12]=-0.5 s[69,1]=1.1,s[69,2]=-0.9,s[69,3]=0.4,s[69,4]=-0.7,s[69,5]=0.2,s[69,6]=0.0,s[69,7]=0.4,s[69,8]=1.2,s[69,9]=0.8,s[69,10]=-0.7,s[69,11]=-0.8,s[69,12]=0.1 s[70,1]=-0.8,s[70,2]=0.3,s[70,3]=0.4,s[70,4]=-1.1,s[70,5]=-0.1,s[70,6]=1.2,s[70,7]=-0.9,s[70,8]=-0.7,s[70,9]=1.2,s[70,10]=-1.1,s[70,11]=-0.2,s[70,12]=0.3 s[71,1]=-0.3,s[71,2]=-1.2,s[71,3]=0.5,s[71,4]=-0.8,s[71,5]=0.2,s[71,6]=1.1,s[71,7]=1.2,s[71,8]=-0.8,s[71,9]=0.9,s[71,10]=-1.1,s[71,11]=-1.1,s[71,12]=1.2 s[72,1]=-0.3,s[72,2]=-1.2,s[72,3]=0.7,s[72,4]=0.3,s[72,5]=0.4,s[72,6]=0.6,s[72,7]=0.1,s[72,8]=0.7,s[72,9]=-0.6,s[72,10]=-0.6,s[72,11]=0.7,s[72,12]=0.8 s[73,1]=-1.1,s[73,2]=0.2,s[73,3]=0.2,s[73,4]=-1.1,s[73,5]=-0.6,s[73,6]=1.1,s[73,7]=-0.1,s[73,8]=0.5,s[73,9]=1.2,s[73,10]=0.9,s[73,11]=0.8,s[73,12]=-0.7 s[74,1]=0.9,s[74,2]=0.5,s[74,3]=-1.1,s[74,4]=-0.5,s[74,5]=0.0,s[74,6]=-1.2,s[74,7]=0.2,s[74,8]=1.2,s[74,9]=-0.5,s[74,10]=-0.3,s[74,11]=-0.3,s[74,12]=-0.8 s[75,1]=0.8,s[75,2]=0.7,s[75,3]=-1.2,s[75,4]=0.4,s[75,5]=-0.1,s[75,6]=-1.2,s[75,7]=-0.7,s[75,8]=-0.1,s[75,9]=-1.0,s[75,10]=0.0,s[75,11]=-1.0,s[75,12]=-0.3 s[76,1]=-0.8,s[76,2]=1.0,s[76,3]=0.9,s[76,4]=-1.1,s[76,5]=-0.9,s[76,6]=0.4,s[76,7]=0.6,s[76,8]=-0.1,s[76,9]=0.8,s[76,10]=-0.5,s[76,11]=-0.2,s[76,12]=-0.3 s[77,1]=-0.7,s[77,2]=-1.1,s[77,3]=0.5,s[77,4]=0.1,s[77,5]=-0.6,s[77,6]=0.6,s[77,7]=-0.1,s[77,8]=1.1,s[77,9]=0.0,s[77,10]=-1.2,s[77,11]=-0.1,s[77,12]=0.4 s[78,1]=0.5,s[78,2]=-1.1,s[78,3]=-1.1,s[78,4]=0.0,s[78,5]=-0.5,s[78,6]=0.0,s[78,7]=0.7,s[78,8]=1.2,s[78,9]=-0.9,s[78,10]=-0.2,s[78,11]=0.5,s[78,12]=-1.0 s[79,1]=-0.4,s[79,2]=-0.3,s[79,3]=0.3,s[79,4]=-0.1,s[79,5]=-1.0,s[79,6]=1.0,s[79,7]=-0.7,s[79,8]=-0.7,s[79,9]=1.0,s[79,10]=-1.2,s[79,11]=0.5,s[79,12]=0.8 s[80,1]=0.6,s[80,2]=-0.3,s[80,3]=0.0,s[80,4]=0.4,s[80,5]=-0.8,s[80,6]=-0.3,s[80,7]=-0.7,s[80,8]=-0.9,s[80,9]=-0.3,s[80,10]=0.2,s[80,11]=1.1,s[80,12]=1.1 s[81,1]=-0.3,s[81,2]=-0.7,s[81,3]=0.2,s[81,4]=-0.7,s[81,5]=-0.3,s[81,6]=0.5,s[81,7]=1.2,s[81,8]=-0.1,s[81,9]=-0.8,s[81,10]=-1.1,s[81,11]=-0.1,s[81,12]=-0.8 s[82,1]=0.2,s[82,2]=-0.4,s[82,3]=-0.9,s[82,4]=-0.2,s[82,5]=1.2,s[82,6]=1.2,s[82,7]=0.3,s[82,8]=-0.7,s[82,9]=-1.1,s[82,10]=-0.2,s[82,11]=-0.2,s[82,12]=-0.7 s[83,1]=1.2,s[83,2]=-0.7,s[83,3]=-0.5,s[83,4]=0.1,s[83,5]=0.2,s[83,6]=-1.1,s[83,7]=0.3,s[83,8]=-1.0,s[83,9]=0.6,s[83,10]=-0.3,s[83,11]=0.2,s[83,12]=-1.1 s[84,1]=0.7,s[84,2]=-1.2,s[84,3]=0.9,s[84,4]=0.0,s[84,5]=-0.7,s[84,6]=0.2,s[84,7]=-0.7,s[84,8]=1.2,s[84,9]=0.5,s[84,10]=1.0,s[84,11]=-0.4,s[84,12]=1.2 s[85,1]=1.1,s[85,2]=-0.4,s[85,3]=-0.7,s[85,4]=0.4,s[85,5]=0.7,s[85,6]=-0.4,s[85,7]=-0.3,s[85,8]=0.5,s[85,9]=-0.2,s[85,10]=0.6,s[85,11]=0.0,s[85,12]=0.8 s[86,1]=1.2,s[86,2]=-0.3,s[86,3]=-0.1,s[86,4]=-0.9,s[86,5]=0.6,s[86,6]=0.0,s[86,7]=0.6,s[86,8]=0.6,s[86,9]=0.9,s[86,10]=-0.6,s[86,11]=-1.2,s[86,12]=0.4 s[87,1]=0.3,s[87,2]=-1.0,s[87,3]=0.3,s[87,4]=-0.1,s[87,5]=-1.0,s[87,6]=1.1,s[87,7]=-0.8,s[87,8]=-0.4,s[87,9]=0.6,s[87,10]=0.0,s[87,11]=0.6,s[87,12]=1.0 s[88,1]=-0.3,s[88,2]=0.0,s[88,3]=-0.3,s[88,4]=0.8,s[88,5]=-0.8,s[88,6]=0.8,s[88,7]=0.7,s[88,8]=1.1,s[88,9]=-0.5,s[88,10]=0.0,s[88,11]=0.6,s[88,12]=-1.0 s[89,1]=0.4,s[89,2]=0.8,s[89,3]=-0.3,s[89,4]=-0.2,s[89,5]=-1.2,s[89,6]=-0.2,s[89,7]=0.0,s[89,8]=0.0,s[89,9]=1.2,s[89,10]=1.2,s[89,11]=0.5,s[89,12]=-1.1 s[90,1]=0.5,s[90,2]=-0.4,s[90,3]=-0.8,s[90,4]=-1.0,s[90,5]=0.0,s[90,6]=-0.7,s[90,7]=0.0,s[90,8]=-0.5,s[90,9]=-1.1,s[90,10]=1.0,s[90,11]=0.8,s[90,12]=0.1 s[91,1]=-0.6,s[91,2]=0.1,s[91,3]=-0.3,s[91,4]=-0.8,s[91,5]=-0.5,s[91,6]=0.2,s[91,7]=-1.1,s[91,8]=0.3,s[91,9]=0.6,s[91,10]=1.0,s[91,11]=-0.2,s[91,12]=0.9 s[92,1]=1.0,s[92,2]=0.3,s[92,3]=-0.5,s[92,4]=0.6,s[92,5]=-1.2,s[92,6]=-0.1,s[92,7]=-1.0,s[92,8]=-0.3,s[92,9]=0.0,s[92,10]=-1.2,s[92,11]=0.4,s[92,12]=0.1 s[93,1]=-0.1,s[93,2]=-1.2,s[93,3]=-1.1,s[93,4]=-0.3,s[93,5]=0.9,s[93,6]=-0.7,s[93,7]=1.0,s[93,8]=0.1,s[93,9]=0.3,s[93,10]=-0.6,s[93,11]=0.4,s[93,12]=-0.5 s[94,1]=-1.2,s[94,2]=0.8,s[94,3]=0.1,s[94,4]=1.1,s[94,5]=-0.7,s[94,6]=1.2,s[94,7]=-0.5,s[94,8]=0.7,s[94,9]=-0.4,s[94,10]=0.9,s[94,11]=-1.2,s[94,12]=-0.3 s[95,1]=0.2,s[95,2]=-0.4,s[95,3]=-0.9,s[95,4]=0.0,s[95,5]=0.6,s[95,6]=0.4,s[95,7]=0.5,s[95,8]=0.7,s[95,9]=-1.1,s[95,10]=0.4,s[95,11]=-0.2,s[95,12]=-1.1 s[96,1]=0.8,s[96,2]=0.2,s[96,3]=-1.1,s[96,4]=0.7,s[96,5]=-1.2,s[96,6]=-1.0,s[96,7]=0.0,s[96,8]=-0.3,s[96,9]=1.1,s[96,10]=-0.8,s[96,11]=-0.5,s[96,12]=0.9 s[97,1]=0.7,s[97,2]=-0.7,s[97,3]=1.2,s[97,4]=0.1,s[97,5]=-1.0,s[97,6]=0.1,s[97,7]=0.5,s[97,8]=1.1,s[97,9]=-0.9,s[97,10]=0.9,s[97,11]=0.6,s[97,12]=-1.2 s[98,1]=1.0,s[98,2]=-0.1,s[98,3]=-0.8,s[98,4]=0.0,s[98,5]=0.7,s[98,6]=-0.6,s[98,7]=0.6,s[98,8]=0.2,s[98,9]=-0.2,s[98,10]=0.8,s[98,11]=1.0,s[98,12]=-0.4 s[99,1]=0.2,s[99,2]=-0.9,s[99,3]=0.1,s[99,4]=0.5,s[99,5]=0.0,s[99,6]=0.8,s[99,7]=-1.0,s[99,8]=-0.4,s[99,9]=0.9,s[99,10]=-0.2,s[99,11]=0.6,s[99,12]=0.0 s[100,1]=-1.0,s[100,2]=-0.4,s[100,3]=-0.3,s[100,4]=0.9,s[100,5]=0.8,s[100,6]=1.0,s[100,7]=-1.2,s[100,8]=0.5,s[100,9]=0.3,s[100,10]=-0.4,s[100,11]=0.1,s[100,12]=0.1 s[101,1]=0.1,s[101,2]=1.2,s[101,3]=0.7,s[101,4]=-0.3,s[101,5]=0.8,s[101,6]=-0.7,s[101,7]=-0.6,s[101,8]=-0.9,s[101,9]=1.0,s[101,10]=-0.7,s[101,11]=-0.1,s[101,12]=1.2 s[102,1]=-0.6,s[102,2]=-0.2,s[102,3]=0.1,s[102,4]=0.2,s[102,5]=-0.4,s[102,6]=1.1,s[102,7]=0.8,s[102,8]=-1.1,s[102,9]=-0.2,s[102,10]=-0.6,s[102,11]=-0.3,s[102,12]=-0.9 s[103,1]=0.7,s[103,2]=-0.1,s[103,3]=-0.9,s[103,4]=0.2,s[103,5]=0.8,s[103,6]=-0.6,s[103,7]=-0.4,s[103,8]=-1.2,s[103,9]=1.0,s[103,10]=0.8,s[103,11]=0.3,s[103,12]=0.4 s[104,1]=0.1,s[104,2]=-1.2,s[104,3]=-0.6,s[104,4]=0.9,s[104,5]=1.1,s[104,6]=-0.6,s[104,7]=0.3,s[104,8]=-0.7,s[104,9]=-0.8,s[104,10]=-0.7,s[104,11]=0.0,s[104,12]=-0.8 s[105,1]=1.0,s[105,2]=0.0,s[105,3]=-0.1,s[105,4]=0.0,s[105,5]=-0.3,s[105,6]=-0.2,s[105,7]=0.7,s[105,8]=0.3,s[105,9]=0.4,s[105,10]=1.1,s[105,11]=0.3,s[105,12]=-0.3 s[106,1]=-0.4,s[106,2]=-1.2,s[106,3]=-0.1,s[106,4]=-0.5,s[106,5]=-0.6,s[106,6]=0.0,s[106,7]=-0.3,s[106,8]=1.1,s[106,9]=0.7,s[106,10]=0.3,s[106,11]=-0.6,s[106,12]=0.5 s[107,1]=0.1,s[107,2]=0.2,s[107,3]=-0.3,s[107,4]=1.2,s[107,5]=1.1,s[107,6]=0.5,s[107,7]=0.7,s[107,8]=0.5,s[107,9]=-1.1,s[107,10]=0.4,s[107,11]=-0.2,s[107,12]=-1.2 s[108,1]=0.2,s[108,2]=-0.1,s[108,3]=-0.2,s[108,4]=0.3,s[108,5]=0.4,s[108,6]=-0.8,s[108,7]=-0.7,s[108,8]=-1.2,s[108,9]=-0.1,s[108,10]=-0.6,s[108,11]=-0.7,s[108,12]=1.0 s[109,1]=0.3,s[109,2]=0.5,s[109,3]=-0.5,s[109,4]=-1.0,s[109,5]=0.4,s[109,6]=1.2,s[109,7]=-0.8,s[109,8]=-1.0,s[109,9]=0.5,s[109,10]=0.2,s[109,11]=-0.3,s[109,12]=0.5 s[110,1]=0.2,s[110,2]=-0.1,s[110,3]=-0.3,s[110,4]=1.0,s[110,5]=0.9,s[110,6]=-1.1,s[110,7]=1.2,s[110,8]=0.6,s[110,9]=-0.3,s[110,10]=-0.3,s[110,11]=-0.6,s[110,12]=-0.7 s[111,1]=0.1,s[111,2]=0.5,s[111,3]=-0.5,s[111,4]=0.9,s[111,5]=0.2,s[111,6]=0.7,s[111,7]=-0.9,s[111,8]=-0.7,s[111,9]=0.6,s[111,10]=0.0,s[111,11]=1.2,s[111,12]=0.8 s[112,1]=-0.7,s[112,2]=-0.6,s[112,3]=0.1,s[112,4]=1.1,s[112,5]=-0.4,s[112,6]=0.4,s[112,7]=-0.4,s[112,8]=0.8,s[112,9]=1.2,s[112,10]=-0.9,s[112,11]=0.9,s[112,12]=0.5 s[113,1]=0.0,s[113,2]=1.1,s[113,3]=0.7,s[113,4]=1.1,s[113,5]=-0.1,s[113,6]=-0.9,s[113,7]=0.5,s[113,8]=-0.9,s[113,9]=-0.1,s[113,10]=1.1,s[113,11]=0.8,s[113,12]=-0.4 s[114,1]=-0.6,s[114,2]=0.9,s[114,3]=0.3,s[114,4]=-0.3,s[114,5]=0.0,s[114,6]=0.4,s[114,7]=0.4,s[114,8]=-0.4,s[114,9]=1.1,s[114,10]=-0.8,s[114,11]=-0.7,s[114,12]=-0.2 s[115,1]=-1.1,s[115,2]=0.9,s[115,3]=0.5,s[115,4]=-0.2,s[115,5]=0.7,s[115,6]=0.2,s[115,7]=1.2,s[115,8]=-0.9,s[115,9]=-0.6,s[115,10]=-1.1,s[115,11]=-0.6,s[115,12]=-0.4 s[116,1]=-0.1,s[116,2]=-0.7,s[116,3]=0.8,s[116,4]=-0.4,s[116,5]=0.5,s[116,6]=-1.1,s[116,7]=1.0,s[116,8]=0.7,s[116,9]=-1.2,s[116,10]=-0.9,s[116,11]=-0.4,s[116,12]=-1.0 s[117,1]=-0.2,s[117,2]=-0.7,s[117,3]=-0.4,s[117,4]=0.6,s[117,5]=-1.2,s[117,6]=-0.9,s[117,7]=-0.4,s[117,8]=-0.4,s[117,9]=-0.2,s[117,10]=0.8,s[117,11]=1.1,s[117,12]=1.2 s[118,1]=0.6,s[118,2]=-0.9,s[118,3]=-0.8,s[118,4]=0.7,s[118,5]=-0.3,s[118,6]=-0.2,s[118,7]=-1.0,s[118,8]=0.5,s[118,9]=0.0,s[118,10]=1.0,s[118,11]=-0.7,s[118,12]=-0.1 s[119,1]=-0.2,s[119,2]=0.9,s[119,3]=1.1,s[119,4]=-1.0,s[119,5]=0.6,s[119,6]=-0.4,s[119,7]=-0.4,s[119,8]=-0.6,s[119,9]=0.9,s[119,10]=-0.5,s[119,11]=-0.6,s[119,12]=-0.6 s[120,1]=-0.3,s[120,2]=-0.6,s[120,3]=0.7,s[120,4]=-0.9,s[120,5]=-0.2,s[120,6]=0.7,s[120,7]=1.1,s[120,8]=-0.5,s[120,9]=0.6,s[120,10]=-0.4,s[120,11]=-0.2,s[120,12]=-0.5 s[121,1]=-1.1,s[121,2]=-0.8,s[121,3]=0.0,s[121,4]=0.7,s[121,5]=0.5,s[121,6]=0.8,s[121,7]=-0.8,s[121,8]=0.8,s[121,9]=0.2,s[121,10]=-0.2,s[121,11]=-0.1,s[121,12]=0.6 s[122,1]=-0.8,s[122,2]=0.6,s[122,3]=0.0,s[122,4]=0.7,s[122,5]=-0.2,s[122,6]=-0.2,s[122,7]=0.9,s[122,8]=-0.3,s[122,9]=-0.8,s[122,10]=0.7,s[122,11]=0.1,s[122,12]=-0.1 s[123,1]=-0.3,s[123,2]=-1.0,s[123,3]=0.8,s[123,4]=0.3,s[123,5]=0.9,s[123,6]=0.4,s[123,7]=-1.2,s[123,8]=-0.4,s[123,9]=-0.7,s[123,10]=-1.1,s[123,11]=-0.6,s[123,12]=-0.3 s[124,1]=-1.1,s[124,2]=-1.0,s[124,3]=-0.4,s[124,4]=-0.3,s[124,5]=0.8,s[124,6]=0.6,s[124,7]=-0.5,s[124,8]=0.6,s[124,9]=-0.3,s[124,10]=-0.8,s[124,11]=0.2,s[124,12]=0.4 s[125,1]=0.5,s[125,2]=0.4,s[125,3]=-0.9,s[125,4]=1.2,s[125,5]=0.7,s[125,6]=0.1,s[125,7]=0.0,s[125,8]=-1.0,s[125,9]=-0.6,s[125,10]=0.6,s[125,11]=-0.6,s[125,12]=-0.7 s[126,1]=-0.1,s[126,2]=0.0,s[126,3]=0.5,s[126,4]=-0.8,s[126,5]=-0.1,s[126,6]=0.6,s[126,7]=-0.4,s[126,8]=-0.6,s[126,9]=1.0,s[126,10]=-0.8,s[126,11]=0.6,s[126,12]=-0.2 s[127,1]=0.6,s[127,2]=-0.3,s[127,3]=0.0,s[127,4]=1.2,s[127,5]=-1.2,s[127,6]=-0.8,s[127,7]=0.4,s[127,8]=1.2,s[127,9]=-1.1,s[127,10]=-0.1,s[127,11]=-0.3,s[127,12]=0.1 s[128,1]=-1.2,s[128,2]=0.2,s[128,3]=0.5,s[128,4]=-0.6,s[128,5]=0.1,s[128,6]=1.0,s[128,7]=0.0,s[128,8]=0.1,s[128,9]=0.7,s[128,10]=-1.0,s[128,11]=0.9,s[128,12]=-0.5 s[129,1]=-0.6,s[129,2]=0.3,s[129,3]=0.7,s[129,4]=-1.0,s[129,5]=0.7,s[129,6]=0.6,s[129,7]=-0.5,s[129,8]=0.2,s[129,9]=1.1,s[129,10]=-0.9,s[129,11]=-0.8,s[129,12]=0.3 s[130,1]=0.8,s[130,2]=-0.7,s[130,3]=-0.9,s[130,4]=0.0,s[130,5]=0.2,s[130,6]=0.1,s[130,7]=1.0,s[130,8]=-0.8,s[130,9]=-0.4,s[130,10]=-0.9,s[130,11]=-1.1,s[130,12]=1.1 s[131,1]=0.8,s[131,2]=-0.5,s[131,3]=0.2,s[131,4]=-0.6,s[131,5]=0.2,s[131,6]=-1.0,s[131,7]=0.8,s[131,8]=-0.2,s[131,9]=-0.6,s[131,10]=0.4,s[131,11]=-1.1,s[131,12]=1.1 s[132,1]=0.1,s[132,2]=-0.6,s[132,3]=-0.9,s[132,4]=0.7,s[132,5]=-0.3,s[132,6]=1.1,s[132,7]=-0.3,s[132,8]=0.4,s[132,9]=1.1,s[132,10]=0.3,s[132,11]=-1.2,s[132,12]=1.0 s[133,1]=-0.6,s[133,2]=-0.3,s[133,3]=0.5,s[133,4]=-0.1,s[133,5]=0.8,s[133,6]=-1.0,s[133,7]=-0.8,s[133,8]=-0.7,s[133,9]=0.1,s[133,10]=0.5,s[133,11]=0.7,s[133,12]=0.4 s[134,1]=-0.1,s[134,2]=-0.3,s[134,3]=0.1,s[134,4]=-1.0,s[134,5]=0.0,s[134,6]=0.9,s[134,7]=-0.3,s[134,8]=-0.8,s[134,9]=0.8,s[134,10]=-0.3,s[134,11]=-1.2,s[134,12]=0.9 s[135,1]=-0.1,s[135,2]=0.0,s[135,3]=0.9,s[135,4]=0.4,s[135,5]=-0.2,s[135,6]=-0.9,s[135,7]=0.8,s[135,8]=0.2,s[135,9]=-0.5,s[135,10]=-1.2,s[135,11]=0.9,s[135,12]=-1.0 s[136,1]=1.1,s[136,2]=-0.8,s[136,3]=-0.4,s[136,4]=0.3,s[136,5]=1.1,s[136,6]=-0.7,s[136,7]=1.0,s[136,8]=1.0,s[136,9]=0.3,s[136,10]=-1.0,s[136,11]=1.0,s[136,12]=-0.7 s[137,1]=-0.6,s[137,2]=-0.8,s[137,3]=-1.0,s[137,4]=0.7,s[137,5]=-0.1,s[137,6]=0.4,s[137,7]=0.2,s[137,8]=-0.6,s[137,9]=0.5,s[137,10]=-0.4,s[137,11]=-0.6,s[137,12]=0.6 s[138,1]=0.3,s[138,2]=-1.0,s[138,3]=-0.7,s[138,4]=-0.4,s[138,5]=0.5,s[138,6]=-0.6,s[138,7]=0.9,s[138,8]=1.2,s[138,9]=0.8,s[138,10]=-0.9,s[138,11]=-0.9,s[138,12]=-0.1 s[139,1]=0.1,s[139,2]=-0.9,s[139,3]=-0.6,s[139,4]=-0.9,s[139,5]=-1.1,s[139,6]=-1.2,s[139,7]=-0.5,s[139,8]=1.2,s[139,9]=-0.4,s[139,10]=-1.2,s[139,11]=-0.6,s[139,12]=-0.9 s[140,1]=1.2,s[140,2]=-0.2,s[140,3]=-0.6,s[140,4]=0.8,s[140,5]=0.3,s[140,6]=-0.8,s[140,7]=0.1,s[140,8]=0.2,s[140,9]=0.2,s[140,10]=-1.1,s[140,11]=-0.5,s[140,12]=-0.7 s[141,1]=0.2,s[141,2]=-0.6,s[141,3]=-0.7,s[141,4]=-1.2,s[141,5]=-1.0,s[141,6]=-0.4,s[141,7]=-0.4,s[141,8]=-0.7,s[141,9]=0.2,s[141,10]=0.3,s[141,11]=-0.2,s[141,12]=0.8 s[142,1]=-0.1,s[142,2]=1.1,s[142,3]=0.0,s[142,4]=0.8,s[142,5]=0.8,s[142,6]=1.0,s[142,7]=-0.3,s[142,8]=-0.9,s[142,9]=0.0,s[142,10]=-0.9,s[142,11]=0.6,s[142,12]=-0.5 s[143,1]=-0.4,s[143,2]=0.2,s[143,3]=0.0,s[143,4]=-0.7,s[143,5]=-1.0,s[143,6]=-0.8,s[143,7]=-0.4,s[143,8]=1.2,s[143,9]=0.2,s[143,10]=0.3,s[143,11]=0.9,s[143,12]=0.3 s[144,1]=-0.1,s[144,2]=0.1,s[144,3]=0.9,s[144,4]=0.6,s[144,5]=-0.9,s[144,6]=0.5,s[144,7]=0.6,s[144,8]=-0.8,s[144,9]=1.0,s[144,10]=-1.0,s[144,11]=-0.1,s[144,12]=0.0 s[145,1]=-1.0,s[145,2]=-1.2,s[145,3]=-0.1,s[145,4]=-0.5,s[145,5]=-0.2,s[145,6]=0.8,s[145,7]=0.5,s[145,8]=-0.2,s[145,9]=1.0,s[145,10]=0.6,s[145,11]=-0.3,s[145,12]=-0.4 s[146,1]=0.5,s[146,2]=-0.3,s[146,3]=0.5,s[146,4]=1.1,s[146,5]=-1.0,s[146,6]=-0.9,s[146,7]=0.4,s[146,8]=0.8,s[146,9]=0.9,s[146,10]=-0.1,s[146,11]=-0.3,s[146,12]=0.5 s[147,1]=0.2,s[147,2]=-1.2,s[147,3]=0.7,s[147,4]=0.0,s[147,5]=0.4,s[147,6]=0.3,s[147,7]=1.2,s[147,8]=0.2,s[147,9]=-0.6,s[147,10]=-1.2,s[147,11]=0.0,s[147,12]=-0.9 s[148,1]=-0.5,s[148,2]=1.0,s[148,3]=0.4,s[148,4]=-1.1,s[148,5]=-0.6,s[148,6]=0.6,s[148,7]=0.2,s[148,8]=-0.5,s[148,9]=-0.3,s[148,10]=0.9,s[148,11]=-1.1,s[148,12]=0.9 s[149,1]=-1.1,s[149,2]=0.3,s[149,3]=0.8,s[149,4]=0.0,s[149,5]=-0.3,s[149,6]=1.2,s[149,7]=-0.6,s[149,8]=-0.4,s[149,9]=-0.5,s[149,10]=-1.0,s[149,11]=-0.4,s[149,12]=0.8 s[150,1]=1.2,s[150,2]=0.4,s[150,3]=-1.2,s[150,4]=0.9,s[150,5]=0.6,s[150,6]=-0.3,s[150,7]=-0.2,s[150,8]=0.0,s[150,9]=-0.5,s[150,10]=-1.0,s[150,11]=0.4,s[150,12]=1.1 s[151,1]=-1.0,s[151,2]=0.8,s[151,3]=0.5,s[151,4]=-0.8,s[151,5]=-0.1,s[151,6]=0.4,s[151,7]=-0.2,s[151,8]=-1.1,s[151,9]=-0.2,s[151,10]=-0.5,s[151,11]=-0.7,s[151,12]=-1.2 s[152,1]=-0.8,s[152,2]=-0.8,s[152,3]=-0.8,s[152,4]=-1.0,s[152,5]=0.0,s[152,6]=0.3,s[152,7]=-0.1,s[152,8]=0.9,s[152,9]=1.0,s[152,10]=-0.4,s[152,11]=0.0,s[152,12]=-0.7 s[153,1]=-1.0,s[153,2]=-0.9,s[153,3]=0.1,s[153,4]=0.3,s[153,5]=-0.8,s[153,6]=0.8,s[153,7]=0.3,s[153,8]=0.8,s[153,9]=0.2,s[153,10]=-0.7,s[153,11]=-1.2,s[153,12]=1.0 s[154,1]=-0.4,s[154,2]=-0.4,s[154,3]=0.1,s[154,4]=-0.7,s[154,5]=0.5,s[154,6]=-0.2,s[154,7]=-0.9,s[154,8]=-0.9,s[154,9]=0.0,s[154,10]=0.5,s[154,11]=1.2,s[154,12]=0.3 s[155,1]=-0.4,s[155,2]=0.8,s[155,3]=-0.8,s[155,4]=-0.3,s[155,5]=0.1,s[155,6]=1.2,s[155,7]=-0.7,s[155,8]=0.7,s[155,9]=-0.9,s[155,10]=-0.9,s[155,11]=-0.3,s[155,12]=0.2 s[156,1]=0.2,s[156,2]=0.0,s[156,3]=0.7,s[156,4]=-0.1,s[156,5]=-0.6,s[156,6]=-0.9,s[156,7]=0.3,s[156,8]=0.8,s[156,9]=-1.2,s[156,10]=-0.5,s[156,11]=0.9,s[156,12]=0.5 s[157,1]=0.2,s[157,2]=-0.7,s[157,3]=0.9,s[157,4]=-0.7,s[157,5]=0.8,s[157,6]=-0.3,s[157,7]=1.2,s[157,8]=0.6,s[157,9]=0.2,s[157,10]=-0.1,s[157,11]=1.2,s[157,12]=-0.8 s[158,1]=-1.0,s[158,2]=-0.3,s[158,3]=0.8,s[158,4]=-1.0,s[158,5]=0.3,s[158,6]=0.5,s[158,7]=-0.5,s[158,8]=0.1,s[158,9]=-1.1,s[158,10]=-1.1,s[158,11]=-1.2,s[158,12]=-0.4 s[159,1]=1.0,s[159,2]=0.0,s[159,3]=-0.2,s[159,4]=-0.6,s[159,5]=1.2,s[159,6]=0.8,s[159,7]=1.0,s[159,8]=0.2,s[159,9]=-0.2,s[159,10]=-0.7,s[159,11]=0.6,s[159,12]=-0.7 s[160,1]=0.3,s[160,2]=-0.9,s[160,3]=-1.1,s[160,4]=-0.2,s[160,5]=-0.3,s[160,6]=1.2,s[160,7]=-0.4,s[160,8]=1.0,s[160,9]=0.7,s[160,10]=-0.1,s[160,11]=-0.4,s[160,12]=0.3 s[161,1]=-0.5,s[161,2]=-0.8,s[161,3]=0.6,s[161,4]=0.0,s[161,5]=-0.5,s[161,6]=0.6,s[161,7]=-0.9,s[161,8]=-0.6,s[161,9]=0.9,s[161,10]=-0.7,s[161,11]=0.6,s[161,12]=0.1 s[162,1]=0.1,s[162,2]=-0.7,s[162,3]=0.1,s[162,4]=1.0,s[162,5]=0.0,s[162,6]=0.1,s[162,7]=-0.9,s[162,8]=0.5,s[162,9]=-0.2,s[162,10]=-0.5,s[162,11]=0.3,s[162,12]=1.1 s[163,1]=0.7,s[163,2]=0.5,s[163,3]=-0.8,s[163,4]=-0.1,s[163,5]=1.0,s[163,6]=-1.1,s[163,7]=0.3,s[163,8]=-0.6,s[163,9]=-0.6,s[163,10]=1.2,s[163,11]=-0.8,s[163,12]=0.9 s[164,1]=0.9,s[164,2]=0.3,s[164,3]=-0.5,s[164,4]=-0.9,s[164,5]=-0.4,s[164,6]=-0.2,s[164,7]=-0.5,s[164,8]=0.3,s[164,9]=0.8,s[164,10]=-0.9,s[164,11]=0.6,s[164,12]=0.3 s[165,1]=0.2,s[165,2]=0.1,s[165,3]=-1.0,s[165,4]=0.4,s[165,5]=0.1,s[165,6]=0.7,s[165,7]=-1.1,s[165,8]=0.0,s[165,9]=0.6,s[165,10]=-1.2,s[165,11]=-0.4,s[165,12]=0.6 s[166,1]=0.4,s[166,2]=-1.2,s[166,3]=0.5,s[166,4]=0.8,s[166,5]=1.1,s[166,6]=0.0,s[166,7]=0.3,s[166,8]=-0.1,s[166,9]=-0.8,s[166,10]=-0.2,s[166,11]=-0.1,s[166,12]=-0.9 s[167,1]=-0.1,s[167,2]=0.1,s[167,3]=0.1,s[167,4]=0.5,s[167,5]=1.0,s[167,6]=-0.9,s[167,7]=-0.4,s[167,8]=-0.6,s[167,9]=0.6,s[167,10]=0.9,s[167,11]=0.9,s[167,12]=-0.5 s[168,1]=1.2,s[168,2]=-0.8,s[168,3]=-1.2,s[168,4]=-0.7,s[168,5]=0.0,s[168,6]=-0.2,s[168,7]=-0.5,s[168,8]=-0.8,s[168,9]=0.8,s[168,10]=1.1,s[168,11]=-0.9,s[168,12]=0.6 s[169,1]=1.1,s[169,2]=-0.5,s[169,3]=-0.5,s[169,4]=0.8,s[169,5]=0.0,s[169,6]=-0.7,s[169,7]=-0.5,s[169,8]=-0.3,s[169,9]=-0.2,s[169,10]=-0.3,s[169,11]=-0.6,s[169,12]=0.6 s[170,1]=0.2,s[170,2]=-1.1,s[170,3]=1.2,s[170,4]=-0.3,s[170,5]=-0.3,s[170,6]=0.8,s[170,7]=-0.9,s[170,8]=0.5,s[170,9]=1.2,s[170,10]=-0.2,s[170,11]=0.1,s[170,12]=0.5 s[171,1]=0.3,s[171,2]=-0.4,s[171,3]=-0.2,s[171,4]=0.8,s[171,5]=0.7,s[171,6]=-0.6,s[171,7]=0.7,s[171,8]=-1.1,s[171,9]=-0.3,s[171,10]=0.2,s[171,11]=-0.4,s[171,12]=-0.5 s[172,1]=-0.8,s[172,2]=-0.6,s[172,3]=0.7,s[172,4]=0.4,s[172,5]=1.1,s[172,6]=0.8,s[172,7]=-0.1,s[172,8]=0.6,s[172,9]=1.1,s[172,10]=-0.9,s[172,11]=-1.2,s[172,12]=1.1 s[173,1]=-1.0,s[173,2]=0.1,s[173,3]=0.4,s[173,4]=-0.2,s[173,5]=-0.8,s[173,6]=0.5,s[173,7]=-1.0,s[173,8]=1.1,s[173,9]=-0.5,s[173,10]=0.3,s[173,11]=-1.1,s[173,12]=-0.1 s[174,1]=-1.1,s[174,2]=-0.1,s[174,3]=1.0,s[174,4]=0.9,s[174,5]=-0.2,s[174,6]=0.8,s[174,7]=0.8,s[174,8]=0.1,s[174,9]=-1.2,s[174,10]=0.0,s[174,11]=-0.5,s[174,12]=0.6 s[175,1]=1.0,s[175,2]=0.5,s[175,3]=-1.0,s[175,4]=-0.8,s[175,5]=-0.3,s[175,6]=-0.4,s[175,7]=-0.7,s[175,8]=0.8,s[175,9]=-1.1,s[175,10]=1.1,s[175,11]=0.8,s[175,12]=0.9 s[176,1]=-0.1,s[176,2]=0.1,s[176,3]=-0.8,s[176,4]=-1.2,s[176,5]=0.4,s[176,6]=1.0,s[176,7]=-0.3,s[176,8]=0.9,s[176,9]=0.0,s[176,10]=-1.1,s[176,11]=0.7,s[176,12]=0.2 s[177,1]=0.5,s[177,2]=0.6,s[177,3]=-0.8,s[177,4]=1.1,s[177,5]=1.1,s[177,6]=-0.5,s[177,7]=0.3,s[177,8]=0.3,s[177,9]=-0.8,s[177,10]=-0.5,s[177,11]=-0.7,s[177,12]=-0.4 s[178,1]=0.1,s[178,2]=-0.4,s[178,3]=-0.2,s[178,4]=1.1,s[178,5]=-1.1,s[178,6]=0.6,s[178,7]=-0.7,s[178,8]=0.3,s[178,9]=0.6,s[178,10]=-0.8,s[178,11]=-1.0,s[178,12]=1.1 s[179,1]=-1.2,s[179,2]=0.4,s[179,3]=0.5,s[179,4]=-1.2,s[179,5]=-1.0,s[179,6]=0.6,s[179,7]=0.6,s[179,8]=0.0,s[179,9]=0.2,s[179,10]=0.0,s[179,11]=-0.1,s[179,12]=-1.1 s[180,1]=0.6,s[180,2]=0.8,s[180,3]=-1.2,s[180,4]=0.0,s[180,5]=-1.0,s[180,6]=-0.6,s[180,7]=-0.4,s[180,8]=-0.1,s[180,9]=-1.0,s[180,10]=-0.1,s[180,11]=0.8,s[180,12]=0.7 s[181,1]=1.0,s[181,2]=-0.6,s[181,3]=-0.7,s[181,4]=-0.1,s[181,5]=-0.1,s[181,6]=-0.4,s[181,7]=-0.8,s[181,8]=0.3,s[181,9]=-0.8,s[181,10]=-0.7,s[181,11]=-0.2,s[181,12]=0.9 s[182,1]=-0.9,s[182,2]=-0.8,s[182,3]=0.2,s[182,4]=-1.0,s[182,5]=-0.5,s[182,6]=-1.2,s[182,7]=1.1,s[182,8]=0.1,s[182,9]=-0.1,s[182,10]=-0.2,s[182,11]=-0.9,s[182,12]=-0.3 s[183,1]=0.4,s[183,2]=-0.7,s[183,3]=-0.4,s[183,4]=-0.5,s[183,5]=-0.9,s[183,6]=-1.1,s[183,7]=-0.7,s[183,8]=0.7,s[183,9]=0.7,s[183,10]=1.1,s[183,11]=0.3,s[183,12]=-0.2 s[184,1]=-0.9,s[184,2]=0.3,s[184,3]=1.1,s[184,4]=0.8,s[184,5]=-0.1,s[184,6]=0.0,s[184,7]=0.0,s[184,8]=-0.2,s[184,9]=-0.8,s[184,10]=0.5,s[184,11]=-0.6,s[184,12]=0.4 s[185,1]=0.0,s[185,2]=0.9,s[185,3]=0.5,s[185,4]=0.3,s[185,5]=-1.2,s[185,6]=0.8,s[185,7]=0.6,s[185,8]=0.3,s[185,9]=-1.2,s[185,10]=-0.5,s[185,11]=-0.1,s[185,12]=-0.7 s[186,1]=0.1,s[186,2]=-0.1,s[186,3]=-0.3,s[186,4]=-1.0,s[186,5]=-0.1,s[186,6]=-1.0,s[186,7]=0.8,s[186,8]=1.2,s[186,9]=-0.3,s[186,10]=-0.6,s[186,11]=0.0,s[186,12]=-1.0 s[187,1]=-0.3,s[187,2]=0.6,s[187,3]=-0.1,s[187,4]=1.1,s[187,5]=-0.4,s[187,6]=1.0,s[187,7]=-0.5,s[187,8]=1.0,s[187,9]=-0.5,s[187,10]=-1.1,s[187,11]=-0.3,s[187,12]=0.1 s[188,1]=0.0,s[188,2]=-0.3,s[188,3]=-0.8,s[188,4]=-0.5,s[188,5]=0.8,s[188,6]=-0.7,s[188,7]=0.9,s[188,8]=0.3,s[188,9]=0.1,s[188,10]=-1.2,s[188,11]=-1.0,s[188,12]=-0.8 s[189,1]=-0.7,s[189,2]=0.5,s[189,3]=-0.1,s[189,4]=-0.6,s[189,5]=-1.0,s[189,6]=0.0,s[189,7]=-1.0,s[189,8]=-1.2,s[189,9]=1.1,s[189,10]=0.5,s[189,11]=1.2,s[189,12]=-0.2 s[190,1]=0.6,s[190,2]=0.1,s[190,3]=-0.8,s[190,4]=-1.0,s[190,5]=-0.5,s[190,6]=-1.2,s[190,7]=0.0,s[190,8]=0.9,s[190,9]=1.0,s[190,10]=0.0,s[190,11]=-0.3,s[190,12]=-0.2 s[191,1]=0.7,s[191,2]=-1.1,s[191,3]=-1.0,s[191,4]=-0.3,s[191,5]=-0.4,s[191,6]=-1.0,s[191,7]=-0.6,s[191,8]=-0.2,s[191,9]=0.2,s[191,10]=-1.1,s[191,11]=-0.5,s[191,12]=0.2 s[192,1]=0.9,s[192,2]=-0.6,s[192,3]=0.0,s[192,4]=1.2,s[192,5]=0.6,s[192,6]=0.1,s[192,7]=0.3,s[192,8]=1.1,s[192,9]=-1.1,s[192,10]=-0.8,s[192,11]=0.3,s[192,12]=-0.7 s[193,1]=1.0,s[193,2]=0.5,s[193,3]=0.3,s[193,4]=0.6,s[193,5]=0.3,s[193,6]=0.0,s[193,7]=-0.2,s[193,8]=0.5,s[193,9]=-0.9,s[193,10]=-0.3,s[193,11]=-1.0,s[193,12]=-0.2 s[194,1]=-0.3,s[194,2]=-0.6,s[194,3]=-0.9,s[194,4]=-0.3,s[194,5]=-0.6,s[194,6]=0.3,s[194,7]=-0.9,s[194,8]=-0.7,s[194,9]=0.6,s[194,10]=-1.0,s[194,11]=0.3,s[194,12]=-0.5 s[195,1]=0.6,s[195,2]=-0.5,s[195,3]=-0.5,s[195,4]=-0.3,s[195,5]=-0.8,s[195,6]=-0.5,s[195,7]=0.5,s[195,8]=1.0,s[195,9]=-0.2,s[195,10]=0.0,s[195,11]=-0.5,s[195,12]=-0.3 s[196,1]=-0.4,s[196,2]=0.4,s[196,3]=0.8,s[196,4]=-1.0,s[196,5]=0.1,s[196,6]=-0.6,s[196,7]=-0.8,s[196,8]=-0.7,s[196,9]=0.6,s[196,10]=1.1,s[196,11]=0.3,s[196,12]=0.6 s[197,1]=0.4,s[197,2]=0.6,s[197,3]=-0.2,s[197,4]=1.2,s[197,5]=-0.6,s[197,6]=0.2,s[197,7]=0.3,s[197,8]=0.4,s[197,9]=0.1,s[197,10]=-0.9,s[197,11]=0.5,s[197,12]=-0.8 s[198,1]=-0.2,s[198,2]=-0.2,s[198,3]=0.1,s[198,4]=-1.1,s[198,5]=0.5,s[198,6]=-1.0,s[198,7]=-0.6,s[198,8]=-0.6,s[198,9]=0.8,s[198,10]=0.9,s[198,11]=-1.0,s[198,12]=0.7 s[199,1]=0.4,s[199,2]=-0.9,s[199,3]=-0.5,s[199,4]=0.2,s[199,5]=0.2,s[199,6]=-0.6,s[199,7]=0.8,s[199,8]=0.8,s[199,9]=0.0,s[199,10]=0.3,s[199,11]=1.0,s[199,12]=-0.3 s[200,1]=1.0,s[200,2]=1.1,s[200,3]=-1.0,s[200,4]=-0.6,s[200,5]=0.4,s[200,6]=-0.1,s[200,7]=1.1,s[200,8]=-1.0,s[200,9]=0.9,s[200,10]=-0.3,s[200,11]=-0.4,s[200,12]=-0.8 s[201,1]=-1.0,s[201,2]=-0.7,s[201,3]=-0.1,s[201,4]=0.6,s[201,5]=0.9,s[201,6]=-1.2,s[201,7]=-0.8,s[201,8]=0.0,s[201,9]=0.3,s[201,10]=0.3,s[201,11]=-0.3,s[201,12]=1.2 s[202,1]=0.2,s[202,2]=-0.8,s[202,3]=-0.4,s[202,4]=-0.6,s[202,5]=-0.1,s[202,6]=-1.2,s[202,7]=-0.3,s[202,8]=-0.4,s[202,9]=0.1,s[202,10]=1.0,s[202,11]=1.0,s[202,12]=0.0 s[203,1]=-0.6,s[203,2]=-0.1,s[203,3]=0.4,s[203,4]=-0.1,s[203,5]=0.9,s[203,6]=0.8,s[203,7]=0.5,s[203,8]=0.3,s[203,9]=-0.9,s[203,10]=-0.3,s[203,11]=0.5,s[203,12]=0.3 s[204,1]=0.9,s[204,2]=-1.1,s[204,3]=-0.2,s[204,4]=-1.2,s[204,5]=0.4,s[204,6]=1.1,s[204,7]=-0.7,s[204,8]=0.4,s[204,9]=0.9,s[204,10]=-0.2,s[204,11]=0.6,s[204,12]=-0.5 s[205,1]=-0.3,s[205,2]=1.2,s[205,3]=1.2,s[205,4]=-0.5,s[205,5]=0.2,s[205,6]=-0.9,s[205,7]=-0.6,s[205,8]=0.5,s[205,9]=1.0,s[205,10]=0.3,s[205,11]=0.6,s[205,12]=0.6 s[206,1]=0.4,s[206,2]=0.5,s[206,3]=0.0,s[206,4]=-0.9,s[206,5]=-0.8,s[206,6]=-0.9,s[206,7]=-0.2,s[206,8]=-0.9,s[206,9]=0.8,s[206,10]=0.5,s[206,11]=-0.4,s[206,12]=1.2 s[207,1]=0.1,s[207,2]=-0.1,s[207,3]=0.4,s[207,4]=-0.5,s[207,5]=-0.5,s[207,6]=-0.6,s[207,7]=1.1,s[207,8]=0.6,s[207,9]=-0.7,s[207,10]=-0.7,s[207,11]=1.1,s[207,12]=-0.9 s[208,1]=-0.3,s[208,2]=-0.7,s[208,3]=-0.5,s[208,4]=-0.4,s[208,5]=-1.1,s[208,6]=-1.1,s[208,7]=0.5,s[208,8]=0.6,s[208,9]=-0.9,s[208,10]=0.3,s[208,11]=0.2,s[208,12]=0.3 s[209,1]=-1.1,s[209,2]=0.4,s[209,3]=0.2,s[209,4]=0.2,s[209,5]=-0.4,s[209,6]=1.0,s[209,7]=1.2,s[209,8]=1.2,s[209,9]=-0.2,s[209,10]=0.4,s[209,11]=-0.1,s[209,12]=0.5 s[210,1]=-1.0,s[210,2]=0.9,s[210,3]=0.2,s[210,4]=0.9,s[210,5]=0.0,s[210,6]=0.4,s[210,7]=-0.1,s[210,8]=-0.1,s[210,9]=-0.4,s[210,10]=-0.8,s[210,11]=-0.4,s[210,12]=-0.1 s[211,1]=1.0,s[211,2]=0.3,s[211,3]=-0.8,s[211,4]=0.0,s[211,5]=-0.5,s[211,6]=0.1,s[211,7]=-1.1,s[211,8]=-0.2,s[211,9]=0.8,s[211,10]=0.4,s[211,11]=-0.4,s[211,12]=1.2 s[212,1]=-0.5,s[212,2]=0.6,s[212,3]=0.0,s[212,4]=1.2,s[212,5]=0.9,s[212,6]=0.7,s[212,7]=-1.0,s[212,8]=-1.2,s[212,9]=0.4,s[212,10]=0.0,s[212,11]=-1.2,s[212,12]=-1.0 s[213,1]=1.1,s[213,2]=0.2,s[213,3]=-0.9,s[213,4]=-1.1,s[213,5]=-0.2,s[213,6]=-0.8,s[213,7]=-0.8,s[213,8]=0.0,s[213,9]=0.4,s[213,10]=-0.5,s[213,11]=-1.0,s[213,12]=-1.0 s[214,1]=-0.8,s[214,2]=-1.1,s[214,3]=0.5,s[214,4]=-0.7,s[214,5]=0.9,s[214,6]=1.1,s[214,7]=-1.1,s[214,8]=0.9,s[214,9]=-0.1,s[214,10]=0.0,s[214,11]=-1.0,s[214,12]=0.0 s[215,1]=0.7,s[215,2]=-0.8,s[215,3]=-0.1,s[215,4]=-0.1,s[215,5]=0.2,s[215,6]=-0.7,s[215,7]=-0.7,s[215,8]=-0.6,s[215,9]=0.0,s[215,10]=0.7,s[215,11]=0.6,s[215,12]=0.4 s[216,1]=-0.5,s[216,2]=0.0,s[216,3]=-0.4,s[216,4]=-0.7,s[216,5]=-0.8,s[216,6]=1.2,s[216,7]=0.2,s[216,8]=-1.1,s[216,9]=-0.2,s[216,10]=-0.9,s[216,11]=0.3,s[216,12]=-0.6 s[217,1]=-0.4,s[217,2]=-0.6,s[217,3]=0.6,s[217,4]=-0.9,s[217,5]=-1.2,s[217,6]=-0.4,s[217,7]=0.7,s[217,8]=0.2,s[217,9]=-0.2,s[217,10]=-0.1,s[217,11]=-0.3,s[217,12]=-0.6 s[218,1]=-0.8,s[218,2]=0.4,s[218,3]=-0.1,s[218,4]=0.4,s[218,5]=-0.4,s[218,6]=1.2,s[218,7]=-0.1,s[218,8]=0.1,s[218,9]=-1.0,s[218,10]=0.6,s[218,11]=-0.1,s[218,12]=1.0 s[219,1]=0.9,s[219,2]=-0.6,s[219,3]=-0.2,s[219,4]=-0.8,s[219,5]=-1.2,s[219,6]=-1.2,s[219,7]=-0.2,s[219,8]=-0.5,s[219,9]=-0.1,s[219,10]=1.0,s[219,11]=0.9,s[219,12]=1.2 s[220,1]=1.0,s[220,2]=-1.0,s[220,3]=-0.6,s[220,4]=0.1,s[220,5]=-1.0,s[220,6]=1.1,s[220,7]=0.3,s[220,8]=0.0,s[220,9]=-0.1,s[220,10]=-1.2,s[220,11]=1.2,s[220,12]=-0.2 s[221,1]=-0.8,s[221,2]=0.6,s[221,3]=0.8,s[221,4]=-0.3,s[221,5]=0.9,s[221,6]=0.6,s[221,7]=-0.4,s[221,8]=0.1,s[221,9]=-0.1,s[221,10]=1.1,s[221,11]=-0.4,s[221,12]=0.5 s[222,1]=-1.2,s[222,2]=0.6,s[222,3]=0.6,s[222,4]=-0.1,s[222,5]=1.2,s[222,6]=0.9,s[222,7]=0.0,s[222,8]=-0.8,s[222,9]=-0.4,s[222,10]=0.0,s[222,11]=0.6,s[222,12]=0.2 s[223,1]=0.6,s[223,2]=-0.7,s[223,3]=0.4,s[223,4]=-0.4,s[223,5]=0.7,s[223,6]=0.0,s[223,7]=-0.9,s[223,8]=-0.6,s[223,9]=1.1,s[223,10]=-0.4,s[223,11]=-0.8,s[223,12]=0.5 s[224,1]=-0.3,s[224,2]=-0.2,s[224,3]=0.8,s[224,4]=0.4,s[224,5]=0.4,s[224,6]=-0.9,s[224,7]=-0.4,s[224,8]=0.9,s[224,9]=1.0,s[224,10]=-0.6,s[224,11]=0.2,s[224,12]=0.4 s[225,1]=-1.1,s[225,2]=0.5,s[225,3]=0.3,s[225,4]=-0.1,s[225,5]=1.2,s[225,6]=0.4,s[225,7]=-0.4,s[225,8]=-0.3,s[225,9]=0.3,s[225,10]=0.5,s[225,11]=-1.0,s[225,12]=0.5 s[226,1]=1.1,s[226,2]=-1.0,s[226,3]=0.5,s[226,4]=-1.0,s[226,5]=0.8,s[226,6]=-1.1,s[226,7]=-0.8,s[226,8]=-0.7,s[226,9]=0.8,s[226,10]=0.9,s[226,11]=-0.3,s[226,12]=0.5 s[227,1]=-0.1,s[227,2]=-1.2,s[227,3]=-0.4,s[227,4]=-0.4,s[227,5]=0.4,s[227,6]=1.0,s[227,7]=-0.7,s[227,8]=0.6,s[227,9]=0.7,s[227,10]=-1.0,s[227,11]=0.5,s[227,12]=0.8 s[228,1]=-0.9,s[228,2]=0.2,s[228,3]=1.0,s[228,4]=1.1,s[228,5]=1.1,s[228,6]=-0.7,s[228,7]=1.0,s[228,8]=0.3,s[228,9]=-0.2,s[228,10]=0.9,s[228,11]=1.1,s[228,12]=-0.1 s[229,1]=0.6,s[229,2]=-0.3,s[229,3]=0.1,s[229,4]=-0.8,s[229,5]=-0.6,s[229,6]=0.5,s[229,7]=-0.6,s[229,8]=0.5,s[229,9]=0.5,s[229,10]=-0.6,s[229,11]=0.6,s[229,12]=0.2 s[230,1]=-0.7,s[230,2]=-1.1,s[230,3]=-0.8,s[230,4]=-0.7,s[230,5]=1.1,s[230,6]=0.0,s[230,7]=0.4,s[230,8]=-0.8,s[230,9]=-0.6,s[230,10]=0.8,s[230,11]=-0.3,s[230,12]=-0.9 s[231,1]=-0.2,s[231,2]=-1.2,s[231,3]=0.3,s[231,4]=-0.6,s[231,5]=-0.1,s[231,6]=-0.6,s[231,7]=-1.0,s[231,8]=-0.5,s[231,9]=1.1,s[231,10]=0.5,s[231,11]=0.1,s[231,12]=-0.2 s[232,1]=-0.5,s[232,2]=-1.1,s[232,3]=0.5,s[232,4]=-0.4,s[232,5]=0.0,s[232,6]=1.1,s[232,7]=0.7,s[232,8]=0.1,s[232,9]=-1.1,s[232,10]=-0.4,s[232,11]=-0.9,s[232,12]=0.1 s[233,1]=-0.2,s[233,2]=1.2,s[233,3]=-0.8,s[233,4]=-0.9,s[233,5]=1.1,s[233,6]=0.9,s[233,7]=0.4,s[233,8]=0.0,s[233,9]=0.1,s[233,10]=1.0,s[233,11]=0.2,s[233,12]=-1.2 s[234,1]=-0.5,s[234,2]=-0.1,s[234,3]=0.3,s[234,4]=0.4,s[234,5]=-1.0,s[234,6]=0.3,s[234,7]=0.1,s[234,8]=0.5,s[234,9]=-1.0,s[234,10]=0.3,s[234,11]=-0.2,s[234,12]=0.4 s[235,1]=0.0,s[235,2]=-1.1,s[235,3]=1.0,s[235,4]=0.1,s[235,5]=-0.1,s[235,6]=1.2,s[235,7]=-0.2,s[235,8]=1.1,s[235,9]=0.4,s[235,10]=1.2,s[235,11]=-0.9,s[235,12]=0.3 s[236,1]=-0.1,s[236,2]=-0.6,s[236,3]=0.6,s[236,4]=-1.1,s[236,5]=-0.7,s[236,6]=0.8,s[236,7]=1.0,s[236,8]=-0.2,s[236,9]=-0.9,s[236,10]=0.6,s[236,11]=-0.4,s[236,12]=-0.8 s[237,1]=-1.2,s[237,2]=0.5,s[237,3]=0.4,s[237,4]=-1.1,s[237,5]=-1.1,s[237,6]=1.2,s[237,7]=0.7,s[237,8]=-0.2,s[237,9]=-1.0,s[237,10]=0.7,s[237,11]=1.1,s[237,12]=0.1 s[238,1]=-1.1,s[238,2]=0.2,s[238,3]=0.7,s[238,4]=-1.1,s[238,5]=-0.5,s[238,6]=-1.2,s[238,7]=-0.5,s[238,8]=0.7,s[238,9]=0.2,s[238,10]=0.8,s[238,11]=0.9,s[238,12]=0.6 s[239,1]=0.0,s[239,2]=-0.9,s[239,3]=1.1,s[239,4]=0.3,s[239,5]=-1.1,s[239,6]=0.5,s[239,7]=0.8,s[239,8]=-0.2,s[239,9]=0.1,s[239,10]=-0.5,s[239,11]=0.1,s[239,12]=-1.1 s[240,1]=-0.1,s[240,2]=-0.2,s[240,3]=-0.3,s[240,4]=-1.1,s[240,5]=0.5,s[240,6]=-0.5,s[240,7]=-0.6,s[240,8]=-0.1,s[240,9]=0.3,s[240,10]=0.5,s[240,11]=0.7,s[240,12]=0.2 s[241,1]=0.6,s[241,2]=0.1,s[241,3]=-0.2,s[241,4]=0.5,s[241,5]=-1.1,s[241,6]=-0.2,s[241,7]=-0.5,s[241,8]=0.5,s[241,9]=0.7,s[241,10]=-0.2,s[241,11]=-1.1,s[241,12]=0.6 s[242,1]=0.3,s[242,2]=0.6,s[242,3]=-0.2,s[242,4]=-1.2,s[242,5]=-0.5,s[242,6]=-1.2,s[242,7]=-0.8,s[242,8]=0.0,s[242,9]=0.2,s[242,10]=-1.0,s[242,11]=-0.6,s[242,12]=0.5 s[243,1]=0.7,s[243,2]=0.1,s[243,3]=-0.2,s[243,4]=0.8,s[243,5]=0.4,s[243,6]=-0.8,s[243,7]=1.0,s[243,8]=-1.0,s[243,9]=-0.5,s[243,10]=-1.0,s[243,11]=0.2,s[243,12]=0.6 s[244,1]=-0.2,s[244,2]=-0.3,s[244,3]=0.1,s[244,4]=0.3,s[244,5]=-1.0,s[244,6]=0.0,s[244,7]=-0.7,s[244,8]=0.9,s[244,9]=1.1,s[244,10]=-0.6,s[244,11]=0.5,s[244,12]=-0.3 s[245,1]=-0.5,s[245,2]=-1.0,s[245,3]=0.0,s[245,4]=0.5,s[245,5]=0.1,s[245,6]=0.0,s[245,7]=0.4,s[245,8]=-0.3,s[245,9]=0.9,s[245,10]=1.2,s[245,11]=-0.7,s[245,12]=-1.1 s[246,1]=0.1,s[246,2]=-1.1,s[246,3]=0.0,s[246,4]=-0.5,s[246,5]=-0.2,s[246,6]=1.2,s[246,7]=-0.7,s[246,8]=0.0,s[246,9]=0.7,s[246,10]=-0.7,s[246,11]=0.6,s[246,12]=0.8 s[247,1]=-0.8,s[247,2]=-1.0,s[247,3]=0.9,s[247,4]=-0.9,s[247,5]=0.8,s[247,6]=0.6,s[247,7]=-0.7,s[247,8]=-0.6,s[247,9]=0.2,s[247,10]=0.1,s[247,11]=0.2,s[247,12]=1.1 s[248,1]=-0.7,s[248,2]=0.4,s[248,3]=0.2,s[248,4]=-0.9,s[248,5]=-0.8,s[248,6]=0.7,s[248,7]=1.2,s[248,8]=-0.5,s[248,9]=-0.7,s[248,10]=-0.7,s[248,11]=0.6,s[248,12]=-0.9 s[249,1]=-0.8,s[249,2]=-0.4,s[249,3]=0.4,s[249,4]=-0.8,s[249,5]=-1.1,s[249,6]=1.2,s[249,7]=-0.8,s[249,8]=-0.5,s[249,9]=0.5,s[249,10]=0.0,s[249,11]=-0.3,s[249,12]=-0.1 s[250,1]=-1.0,s[250,2]=0.7,s[250,3]=0.2,s[250,4]=1.1,s[250,5]=0.8,s[250,6]=0.3,s[250,7]=-1.0,s[250,8]=0.8,s[250,9]=-0.4,s[250,10]=1.0,s[250,11]=0.1,s[250,12]=0.2 s[251,1]=0.1,s[251,2]=-0.9,s[251,3]=-0.8,s[251,4]=0.5,s[251,5]=0.4,s[251,6]=0.9,s[251,7]=0.8,s[251,8]=0.4,s[251,9]=-0.9,s[251,10]=-0.9,s[251,11]=-0.4,s[251,12]=0.3 s[252,1]=0.8,s[252,2]=0.7,s[252,3]=-0.6,s[252,4]=-0.5,s[252,5]=0.7,s[252,6]=-0.1,s[252,7]=0.9,s[252,8]=0.7,s[252,9]=-0.4,s[252,10]=0.8,s[252,11]=0.8,s[252,12]=-0.7 s[253,1]=0.9,s[253,2]=0.0,s[253,3]=-0.8,s[253,4]=-1.2,s[253,5]=0.3,s[253,6]=-0.7,s[253,7]=0.4,s[253,8]=0.3,s[253,9]=0.7,s[253,10]=0.1,s[253,11]=-0.2,s[253,12]=-0.4 s[254,1]=0.2,s[254,2]=-0.4,s[254,3]=0.4,s[254,4]=0.7,s[254,5]=1.2,s[254,6]=1.0,s[254,7]=-1.1,s[254,8]=0.3,s[254,9]=0.4,s[254,10]=-0.5,s[254,11]=1.0,s[254,12]=0.8 s[255,1]=-0.8,s[255,2]=0.4,s[255,3]=0.6,s[255,4]=-1.0,s[255,5]=-0.9,s[255,6]=-0.5,s[255,7]=0.9,s[255,8]=0.0,s[255,9]=-0.2,s[255,10]=1.1,s[255,11]=1.0,s[255,12]=-1.2 s[256,1]=0.2,s[256,2]=-1.1,s[256,3]=0.4,s[256,4]=0.6,s[256,5]=-0.9,s[256,6]=0.8,s[256,7]=0.0,s[256,8]=0.5,s[256,9]=0.9,s[256,10]=0.3,s[256,11]=-1.2,s[256,12]=1.2 s[257,1]=0.8,s[257,2]=-0.6,s[257,3]=-1.2,s[257,4]=-0.2,s[257,5]=-0.6,s[257,6]=-0.4,s[257,7]=-0.9,s[257,8]=0.5,s[257,9]=0.4,s[257,10]=0.3,s[257,11]=-0.5,s[257,12]=0.5 s[258,1]=-1.1,s[258,2]=0.4,s[258,3]=1.2,s[258,4]=0.4,s[258,5]=1.1,s[258,6]=0.5,s[258,7]=-0.6,s[258,8]=-1.1,s[258,9]=0.2,s[258,10]=-0.8,s[258,11]=0.4,s[258,12]=0.0 s[259,1]=-0.7,s[259,2]=0.5,s[259,3]=0.9,s[259,4]=0.0,s[259,5]=-0.2,s[259,6]=-0.7,s[259,7]=0.7,s[259,8]=-0.7,s[259,9]=-0.6,s[259,10]=0.6,s[259,11]=1.2,s[259,12]=-1.2 s[260,1]=-1.2,s[260,2]=0.9,s[260,3]=1.0,s[260,4]=0.5,s[260,5]=-0.8,s[260,6]=-0.3,s[260,7]=0.4,s[260,8]=-0.8,s[260,9]=-1.1,s[260,10]=0.2,s[260,11]=0.1,s[260,12]=-0.5 s[261,1]=-1.2,s[261,2]=-0.3,s[261,3]=0.9,s[261,4]=0.2,s[261,5]=0.6,s[261,6]=0.6,s[261,7]=-0.1,s[261,8]=0.3,s[261,9]=-0.6,s[261,10]=1.0,s[261,11]=0.9,s[261,12]=0.9 s[262,1]=0.4,s[262,2]=-0.7,s[262,3]=0.9,s[262,4]=-1.1,s[262,5]=0.9,s[262,6]=0.3,s[262,7]=-0.9,s[262,8]=0.0,s[262,9]=-0.2,s[262,10]=0.0,s[262,11]=-0.3,s[262,12]=1.2 s[263,1]=0.7,s[263,2]=-0.8,s[263,3]=-0.6,s[263,4]=-0.9,s[263,5]=0.4,s[263,6]=-0.4,s[263,7]=-0.3,s[263,8]=1.0,s[263,9]=0.2,s[263,10]=0.3,s[263,11]=-0.6,s[263,12]=-0.9 s[264,1]=-0.4,s[264,2]=-0.8,s[264,3]=-0.4,s[264,4]=1.0,s[264,5]=-0.4,s[264,6]=-0.2,s[264,7]=0.5,s[264,8]=-1.2,s[264,9]=-1.2,s[264,10]=0.1,s[264,11]=0.5,s[264,12]=-0.5 s[265,1]=-1.0,s[265,2]=0.1,s[265,3]=-0.3,s[265,4]=0.3,s[265,5]=0.0,s[265,6]=0.4,s[265,7]=-0.1,s[265,8]=1.0,s[265,9]=-0.5,s[265,10]=-0.8,s[265,11]=-0.7,s[265,12]=0.8 s[266,1]=0.7,s[266,2]=-0.4,s[266,3]=-0.7,s[266,4]=-0.9,s[266,5]=1.2,s[266,6]=1.0,s[266,7]=0.3,s[266,8]=-0.1,s[266,9]=-0.1,s[266,10]=0.8,s[266,11]=0.4,s[266,12]=-0.7 s[267,1]=0.8,s[267,2]=-0.8,s[267,3]=0.3,s[267,4]=0.5,s[267,5]=1.1,s[267,6]=0.1,s[267,7]=-0.4,s[267,8]=-0.9,s[267,9]=0.9,s[267,10]=0.3,s[267,11]=-0.5,s[267,12]=0.2 s[268,1]=-0.5,s[268,2]=0.6,s[268,3]=0.7,s[268,4]=-1.1,s[268,5]=0.8,s[268,6]=-0.5,s[268,7]=0.0,s[268,8]=0.4,s[268,9]=1.1,s[268,10]=0.8,s[268,11]=-1.0,s[268,12]=-0.6 s[269,1]=0.7,s[269,2]=0.3,s[269,3]=0.6,s[269,4]=-0.3,s[269,5]=-1.1,s[269,6]=-0.1,s[269,7]=0.5,s[269,8]=-0.9,s[269,9]=1.2,s[269,10]=0.9,s[269,11]=-1.1,s[269,12]=1.1 s[270,1]=0.2,s[270,2]=-0.1,s[270,3]=-1.2,s[270,4]=0.6,s[270,5]=0.5,s[270,6]=0.3,s[270,7]=-1.0,s[270,8]=1.1,s[270,9]=0.6,s[270,10]=-1.2,s[270,11]=0.0,s[270,12]=0.7 s[271,1]=1.1,s[271,2]=0.8,s[271,3]=-1.0,s[271,4]=0.7,s[271,5]=-1.1,s[271,6]=0.8,s[271,7]=-0.5,s[271,8]=0.2,s[271,9]=0.5,s[271,10]=-0.7,s[271,11]=-0.5,s[271,12]=1.1 s[272,1]=-0.6,s[272,2]=0.1,s[272,3]=0.8,s[272,4]=-0.3,s[272,5]=0.8,s[272,6]=1.1,s[272,7]=-0.4,s[272,8]=-1.0,s[272,9]=0.7,s[272,10]=0.0,s[272,11]=0.4,s[272,12]=-0.8 s[273,1]=0.6,s[273,2]=-0.7,s[273,3]=-0.5,s[273,4]=0.0,s[273,5]=0.5,s[273,6]=0.7,s[273,7]=0.2,s[273,8]=-1.1,s[273,9]=1.0,s[273,10]=-1.0,s[273,11]=-0.8,s[273,12]=-1.1 s[274,1]=0.5,s[274,2]=0.7,s[274,3]=-0.3,s[274,4]=0.8,s[274,5]=0.7,s[274,6]=-0.9,s[274,7]=1.1,s[274,8]=0.8,s[274,9]=-0.9,s[274,10]=-0.4,s[274,11]=0.9,s[274,12]=-0.9 s[275,1]=-0.5,s[275,2]=-1.1,s[275,3]=-1.1,s[275,4]=-0.8,s[275,5]=-0.5,s[275,6]=0.5,s[275,7]=0.6,s[275,8]=-1.0,s[275,9]=0.7,s[275,10]=-0.7,s[275,11]=-0.4,s[275,12]=-0.4 s[276,1]=-0.3,s[276,2]=-1.0,s[276,3]=-1.0,s[276,4]=-0.4,s[276,5]=-0.4,s[276,6]=0.7,s[276,7]=-0.9,s[276,8]=0.6,s[276,9]=0.5,s[276,10]=0.5,s[276,11]=0.8,s[276,12]=1.2 s[277,1]=-0.2,s[277,2]=0.9,s[277,3]=0.9,s[277,4]=0.6,s[277,5]=0.0,s[277,6]=0.0,s[277,7]=-1.0,s[277,8]=0.6,s[277,9]=-0.2,s[277,10]=0.2,s[277,11]=-1.1,s[277,12]=0.8 s[278,1]=0.0,s[278,2]=-0.7,s[278,3]=-0.6,s[278,4]=1.2,s[278,5]=0.7,s[278,6]=0.1,s[278,7]=-0.8,s[278,8]=-0.5,s[278,9]=0.5,s[278,10]=-0.2,s[278,11]=-0.5,s[278,12]=1.0 s[279,1]=0.6,s[279,2]=0.2,s[279,3]=0.8,s[279,4]=-0.9,s[279,5]=1.1,s[279,6]=-0.2,s[279,7]=-1.0,s[279,8]=0.0,s[279,9]=-0.8,s[279,10]=-0.3,s[279,11]=0.0,s[279,12]=0.8 s[280,1]=-1.0,s[280,2]=0.6,s[280,3]=1.1,s[280,4]=0.0,s[280,5]=0.4,s[280,6]=0.2,s[280,7]=0.6,s[280,8]=0.0,s[280,9]=0.6,s[280,10]=0.1,s[280,11]=-0.3,s[280,12]=-1.1 s[281,1]=0.5,s[281,2]=-1.1,s[281,3]=-0.3,s[281,4]=0.5,s[281,5]=0.2,s[281,6]=0.8,s[281,7]=-0.1,s[281,8]=-0.3,s[281,9]=0.1,s[281,10]=0.9,s[281,11]=-1.2,s[281,12]=0.6 s[282,1]=0.3,s[282,2]=-0.9,s[282,3]=-0.9,s[282,4]=-0.2,s[282,5]=-1.1,s[282,6]=0.6,s[282,7]=0.7,s[282,8]=-0.7,s[282,9]=0.0,s[282,10]=-1.1,s[282,11]=1.2,s[282,12]=-0.6 s[283,1]=-0.4,s[283,2]=0.8,s[283,3]=0.2,s[283,4]=0.5,s[283,5]=-1.0,s[283,6]=1.2,s[283,7]=0.7,s[283,8]=0.3,s[283,9]=-0.5,s[283,10]=-0.1,s[283,11]=-0.8,s[283,12]=-0.3 s[284,1]=-0.8,s[284,2]=0.7,s[284,3]=0.1,s[284,4]=1.0,s[284,5]=0.7,s[284,6]=1.2,s[284,7]=-0.4,s[284,8]=-0.2,s[284,9]=-0.4,s[284,10]=-1.0,s[284,11]=-0.8,s[284,12]=-0.1 s[285,1]=0.8,s[285,2]=-0.8,s[285,3]=-1.1,s[285,4]=0.3,s[285,5]=1.1,s[285,6]=1.0,s[285,7]=-0.2,s[285,8]=0.3,s[285,9]=-0.1,s[285,10]=-0.6,s[285,11]=0.6,s[285,12]=0.7 s[286,1]=0.0,s[286,2]=-0.2,s[286,3]=-0.8,s[286,4]=-0.3,s[286,5]=0.7,s[286,6]=-0.1,s[286,7]=1.0,s[286,8]=0.8,s[286,9]=0.5,s[286,10]=0.1,s[286,11]=0.6,s[286,12]=-0.1 s[287,1]=0.1,s[287,2]=-0.6,s[287,3]=-0.2,s[287,4]=0.2,s[287,5]=-0.1,s[287,6]=-0.2,s[287,7]=1.1,s[287,8]=0.7,s[287,9]=-1.1,s[287,10]=0.3,s[287,11]=-1.2,s[287,12]=-0.9 s[288,1]=0.7,s[288,2]=-0.7,s[288,3]=-0.4,s[288,4]=0.1,s[288,5]=0.2,s[288,6]=0.3,s[288,7]=1.0,s[288,8]=-0.5,s[288,9]=-0.3,s[288,10]=-0.5,s[288,11]=1.2,s[288,12]=0.3 s[289,1]=0.0,s[289,2]=1.0,s[289,3]=0.1,s[289,4]=-0.3,s[289,5]=0.9,s[289,6]=0.0,s[289,7]=-1.0,s[289,8]=-1.2,s[289,9]=0.8,s[289,10]=-0.1,s[289,11]=-0.7,s[289,12]=0.5 s[290,1]=-0.3,s[290,2]=-0.4,s[290,3]=0.5,s[290,4]=0.0,s[290,5]=-1.2,s[290,6]=-0.6,s[290,7]=0.1,s[290,8]=1.0,s[290,9]=-0.7,s[290,10]=1.0,s[290,11]=-1.2,s[290,12]=-0.8 s[291,1]=-0.4,s[291,2]=0.8,s[291,3]=-0.2,s[291,4]=-0.1,s[291,5]=-0.8,s[291,6]=0.4,s[291,7]=0.1,s[291,8]=0.1,s[291,9]=-1.0,s[291,10]=-0.3,s[291,11]=0.9,s[291,12]=1.1 s[292,1]=0.7,s[292,2]=0.1,s[292,3]=0.3,s[292,4]=-0.3,s[292,5]=-0.2,s[292,6]=-0.2,s[292,7]=-1.0,s[292,8]=0.1,s[292,9]=0.0,s[292,10]=0.1,s[292,11]=-0.9,s[292,12]=1.0 s[293,1]=-0.3,s[293,2]=0.3,s[293,3]=0.7,s[293,4]=-0.5,s[293,5]=1.0,s[293,6]=0.2,s[293,7]=-0.4,s[293,8]=0.3,s[293,9]=1.0,s[293,10]=0.8,s[293,11]=0.8,s[293,12]=-0.9 s[294,1]=-1.0,s[294,2]=-1.0,s[294,3]=0.1,s[294,4]=1.1,s[294,5]=0.4,s[294,6]=0.2,s[294,7]=0.4,s[294,8]=1.2,s[294,9]=0.5,s[294,10]=0.6,s[294,11]=-1.1,s[294,12]=1.0 s[295,1]=1.0,s[295,2]=-1.2,s[295,3]=-0.8,s[295,4]=-0.6,s[295,5]=-1.2,s[295,6]=-1.0,s[295,7]=-0.7,s[295,8]=-0.5,s[295,9]=1.1,s[295,10]=-1.1,s[295,11]=-0.5,s[295,12]=-1.0 s[296,1]=0.5,s[296,2]=0.2,s[296,3]=0.4,s[296,4]=1.2,s[296,5]=0.2,s[296,6]=0.0,s[296,7]=0.7,s[296,8]=-0.4,s[296,9]=-1.1,s[296,10]=-0.3,s[296,11]=-0.4,s[296,12]=-0.8 s[297,1]=1.2,s[297,2]=-0.9,s[297,3]=0.3,s[297,4]=-1.0,s[297,5]=-0.1,s[297,6]=0.2,s[297,7]=-0.8,s[297,8]=-1.2,s[297,9]=0.8,s[297,10]=0.8,s[297,11]=-0.6,s[297,12]=1.1 s[298,1]=-0.3,s[298,2]=-0.3,s[298,3]=-0.4,s[298,4]=-0.4,s[298,5]=0.1,s[298,6]=0.8,s[298,7]=1.2,s[298,8]=0.0,s[298,9]=-0.4,s[298,10]=-0.2,s[298,11]=0.7,s[298,12]=-1.2 s[299,1]=-0.2,s[299,2]=-0.5,s[299,3]=-0.9,s[299,4]=0.8,s[299,5]=-0.7,s[299,6]=-0.6,s[299,7]=-0.3,s[299,8]=0.9,s[299,9]=-1.2,s[299,10]=0.4,s[299,11]=-1.2,s[299,12]=-0.1 s[300,1]=-0.5,s[300,2]=0.6,s[300,3]=1.2,s[300,4]=-0.2,s[300,5]=-0.6,s[300,6]=0.0,s[300,7]=1.2,s[300,8]=-0.5,s[300,9]=-0.5,s[300,10]=0.2,s[300,11]=0.1,s[300,12]=-0.8 s[301,1]=1.1,s[301,2]=-1.1,s[301,3]=0.4,s[301,4]=0.1,s[301,5]=0.1,s[301,6]=-0.8,s[301,7]=-0.5,s[301,8]=-0.6,s[301,9]=1.0,s[301,10]=-1.2,s[301,11]=0.9,s[301,12]=0.4 s[302,1]=0.4,s[302,2]=-1.1,s[302,3]=-0.7,s[302,4]=0.4,s[302,5]=0.0,s[302,6]=-1.1,s[302,7]=0.7,s[302,8]=0.0,s[302,9]=-0.5,s[302,10]=-1.1,s[302,11]=-0.7,s[302,12]=-1.0 s[303,1]=-0.7,s[303,2]=0.3,s[303,3]=1.1,s[303,4]=0.0,s[303,5]=0.5,s[303,6]=0.3,s[303,7]=-0.5,s[303,8]=-1.2,s[303,9]=0.3,s[303,10]=0.7,s[303,11]=-0.2,s[303,12]=-0.5 s[304,1]=0.3,s[304,2]=0.2,s[304,3]=-0.8,s[304,4]=0.5,s[304,5]=-0.3,s[304,6]=0.6,s[304,7]=1.1,s[304,8]=-1.2,s[304,9]=-0.6,s[304,10]=-0.6,s[304,11]=0.4,s[304,12]=0.2 ; ; initialize coefficients ; if @sel > 0 b1=s[@sel,1],b2=s[@sel,2],b3=s[@sel,3],b4=s[@sel,4],b5=s[@sel,5],b6=s[@sel,6],b7=s[@sel,7],b8=s[@sel,8],b9=s[@sel,9],b10=s[@sel,10],b11=s[@sel,11],b12=s[@sel,12] endif ; ; initialize hit array ; while(h < #height+wd) while(w < #width+ht) hits[w,h] = 0 count[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; fill the hit array ; while (iter < (iterate*sqr(#width*#magn/400))) xx = fx if @sel == 0 fx = @a1 + @a2*fx + @a3*fx*fx + @a4*fx*fy + @a5*fy + @a6*fy*fy fy = @a7 + @a8*xx + @a9*xx*xx + @a10*xx*fy + @a11*fy + @a12*fy*fy else fx = b1 + b2*fx + b3*fx*fx + b4*fx*fy + b5*fy + b6*fy*fy fy = b7 + b8*xx + b9*xx*xx + b10*xx*fy + b11*fy + b12*fy*fy endif ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax xx = ffx ffx = (0.5*#width + (ffx - 0.5)*cos(#angle)*#width - (ffy - 0.5)*sin(#angle)*#height) ffy = (0.5*#height + (ffy - 0.5)*cos(#angle)*#height + (xx - 0.5)*sin(#angle)*#width) px = round(ffx)+wd2 py = round(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+ffx+flip(ffy) if real(hits[px,py]) > maxx maxx = real(hits[px,py]) endif if imag(hits[px,py]) > maxy maxy = imag(hits[px,py]) endif count[px,py] = count[px,py] + 1 if count[px,py] > maxhit maxhit = count[px,py] endif endif iter = iter + 1 endwhile ; ; init: float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 complex z1 = 0 complex z2 = 0 complex z3 = 0 float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float nhit=0 float nhitx=0 float nhity=0 float xhit=0 float xhitx=0 float yhit=0 float yhity=0 bool done = false float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 int i = 0 ;loop: int delta = round(@closeness) int xcrd = #x int ycrd = #y bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true && count[xcrd,ycrd] > @thresh if xcrd+delta < #width+wd && ycrd+delta < #height+ht if @filter == 0 nhit=count[xcrd,ycrd] nhitx=count[xcrd+delta,ycrd] nhity=count[xcrd,ycrd+delta] xhit=real(hits[xcrd,ycrd]) xhitx=real(hits[xcrd+delta,ycrd]) yhit=imag(hits[xcrd,ycrd]) yhity=imag(hits[xcrd,ycrd+delta]) else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 xhit=0 xhitx=0 yhit=0 yhity=0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter nhit = nhit + gauss[gx+@filter,gy+@filter]*count[xcrd+gx,ycrd+gy] xhit = xhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) yhit = yhit + gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*count[xcrd+gx+delta,ycrd+gy] xhitx = xhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*count[xcrd+gx,ycrd+gy+delta+delta] yhity = yhity + gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta]) gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile nhit = nhit/gweight xhit = xhit/gweight yhit = yhit/gweight nhitx = nhitx/gweight xhitx = xhitx/gweight nhity = nhity/gweight yhity = yhity/gweight endif endif z1 = xhit + flip(yhit) z2 = xhitx + flip(yhit) z3 = xhit + flip(yhity) d1 = |z1| d2 = |z2| d3 = |z3| endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = d1 cenx = d2 ceny = d3 endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxhit else #z = |xhit/maxx + flip(yhit/maxy)| endif endif if @oldver if done == false done = true endif endif loop: i = i + 1 if !@oldver if nhit < i if done == false done = true endif endif endif bailout: done == false default: heading caption="Sprott 2D Quadratic Attractors" endheading $ifdef VER40 heading text=" x -> Quadratic in x and y" endheading heading text=" y -> Quadratic in x and y" endheading heading text="Color with Damien's Lighting, 3D Texturizer Enhanced III or \ Direct Color Slope." endheading $endif title="Slope 2D Quadratic G Attractor" maxiter=1000 periodicity=0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param oldver caption = "Use old version" default = false endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 0.1 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 1 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param pass caption = "Pass slope values" default = true endparam param value caption = "Hit Value" enum = "Count" "X Y Surface" default = 0 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible=@pass==true endparam heading caption = "Attractor Parameters" endheading param hideparam caption = "Hide Parameters" default = true endparam param sel caption = "select preset coeffs" enum = "no preset" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" \ "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" \ "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42" "43" "44" \ "45" "46" "47" "48" "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" \ "60" "61" "62" "63" "64" "65" "66" "67" "69" "69" "70" "71" "72" "73" "74" \ "75" "76" "77" "78" "79" "80" "81" "82" "83" "84" "85" "86" "87" "88" "89" \ "90" "91" "92" "93" "94" "95" "96" "97" "98" "99" "100" "101" "102" "103" \ "104" "105" "106" "107" "108" "109" "110" "111" "112" "113" "114" "115" \ "116" "117" "118" "119" "120" "121" "122" "123" "124" "125" "126" "127" \ "128" "129" "130" "131" "132" "133" "134" "135" "136" "137" "138" "139" \ "140" "141" "142" "143" "144" "145" "146" "147" "148" "149" "150" "151" "152" \ "153" "154" "155" "156" "157" "158" "159" "160" "161" "162" "163" "164" \ "165" "166" "167" "168" "169" "170" "171" "172" "173" "174" "175" "176" \ "177" "178" "179" "180" "181" "182" "183" "184" "185" "186" "187" "188" \ "189" "190" "191" "192" "193" "194" "195" "196" "197" "198" "199" "200" \ "201" "202" "203" "204" "205" "206" "207" "208" "209" "210" "211" "212" \ "213" "214" "215" "216" "217" "218" "219" "220" "221" "222" "223" "224" \ "225" "226" "227" "228" "229" "230" "231" "232" "233" "234" "235" "236" \ "237" "238" "239" "240" "241" "242" "243" "244" "245" "246" "247" "248" \ "249" "250" "251" "252" "253" "254" "255" "256" "257" "258" "259" "260" \ "261" "262" "263" "264" "265" "266" "267" "268" "269" "270" "271" "272" \ "273" "274" "275" "276" "277" "278" "279" "280" "281" "282" "283" "284" \ "285" "286" "287" "288" "289" "290" "291" "292" "293" "294" "295" "296" \ "297" "298" "299" "300" "301" "302" "303" "304" default = 0 endparam param a1 caption = "coefficient a1" default = 1.0 visible = @hideparam==false endparam param a2 caption = "coefficient a2" default = -1.1 visible = @hideparam==false endparam param a3 caption = "coefficient a3" default = -0.2 visible = @hideparam==false endparam param a4 caption = "coefficient a4" default = -0.1 visible = @hideparam==false endparam param a5 caption = "coefficient a5" default = -0.4 visible = @hideparam==false endparam param a6 caption = "coefficient a6" default = 0.1 visible = @hideparam==false endparam param a7 caption = "coefficient a7" default = -0.3 visible = @hideparam==false endparam param a8 caption = "coefficient a8" default = 0.8 visible = @hideparam==false endparam param a9 caption = "coefficient a9" default = -0.1 visible = @hideparam==false endparam param a10 caption = "coefficient a10" default = 0.3 visible = @hideparam==false endparam param a11 caption = "coefficient a11" default = -1.0 visible = @hideparam==false endparam param a12 caption = "coefficient a12" default = -0.9 visible = @hideparam==false endparam } Slope_3D_Cubic_ODE_G_Attractor { ; Ron Barnett December 8, 2004 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III ; Strange attractors from simultaneous ; ordinary differential equations using ; Euler's finite difference method to ; calculate ; ; global: float zscale2 = 0 float cprojx = 0 float cprojy = 0 float cprojz = 0 float scrsize = sqrt(#width*#width+#height*#height) if !@oldver zscale2 = @zscale2*scrsize cprojx = @cprojx*#width cprojy = @cprojy*#height cprojz = @cprojz*scrsize else zscale2 = @zscale2 cprojx = @cprojx cprojy = @cprojy cprojz = @cprojz endif int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits2[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits3[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float s[132,61] float fx = 0.0 float ffx = 0.0 float xx = 0.0 float fy = 0.0 float ffy = 0.0 float yy = 0.0 float zz = 0.0 float ffz = 0.0 float b1=0,float b2=0,float b3=0,float b4=0,float b5=0,float b6=0,float b7=0,float b8=0,float b9=0,float b10=0,float b11=0,float b12=0,float b13=0,float b14=0,float b15=0 float b16=0,float b17=0,float b18=0,float b19=0,float b20=0,float b21=0,float b22=0,float b23=0,float b24=0,float b25=0,float b26=0,float b27=0,float b28=0,float b29=0,float b30=0 float b31=0,float b32=0,float b33=0,float b34=0,float b35=0,float b36=0,float b37=0,float b38=0,float b39=0,float b40=0,float b41=0,float b42=0,float b43=0,float b44=0,float b45=0 float b46=0,float b47=0,float b48=0,float b49=0,float b50=0,float b51=0,float b52=0,float b53=0,float b54=0,float b55=0,float b56=0,float b57=0,float b58=0,float b59=0,float b60=0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float tzmax = sqrt(txmax^2+tymax^2) float xmin = cx - txmax/2 float ymin = cy - tymax/2 float zmin = sqrt(xmin^2 + ymin^2) float iterate = @density*10000000 float maxnhit = 0 ; ; initialize hit array ; while(h < #height+wd) while(w < #width+ht) hits[w,h] = 0 hits2[w,h] = 0 hits3[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; initialize presets ; s[1,1]=0.7,s[1,2]=0.0,s[1,3]=0.0,s[1,4]=-1.0,s[1,5]=0.6,s[1,6]=0.3,s[1,7]=0.0,s[1,8]=0.7,s[1,9]=-0.4,s[1,10]=0.5,s[1,11]=1.0,s[1,12]=-0.2,s[1,13]=0.8,s[1,14]=0.5,s[1,15]=0.3 s[1,16]=-0.8,s[1,17]=0.4,s[1,18]=0.8,s[1,19]=0.8,s[1,20]=-1.2,s[1,21]=-0.2,s[1,22]=0.6,s[1,23]=-1.1,s[1,24]=-0.9,s[1,25]=0.7,s[1,26]=0.2,s[1,27]=0.9,s[1,28]=1.1,s[1,29]=-0.2,s[1,30]=0.8 s[1,31]=0.8,s[1,32]=-0.1,s[1,33]=-0.1,s[1,34]=-0.7,s[1,35]=-0.8,s[1,36]=1.0,s[1,37]=0.8,s[1,38]=-0.7,s[1,39]=-1.1,s[1,40]=0.1,s[1,41]=-0.2,s[1,42]=0.8,s[1,43]=0.8,s[1,44]=-0.2,s[1,45]=-0.5 s[1,46]=-0.4,s[1,47]=-0.8,s[1,48]=0.1,s[1,49]=0.3,s[1,50]=0.6,s[1,51]=0.1,s[1,52]=-0.7,s[1,53]=-0.5,s[1,54]=0.5,s[1,55]=-0.3,s[1,56]=-0.1,s[1,57]=-0.3,s[1,58]=-0.6,s[1,59]=0.2,s[1,60]=-0.2 s[2,1]=-0.2,s[2,2]=0.5,s[2,3]=-1.1,s[2,4]=-1.1,s[2,5]=0.6,s[2,6]=-1.0,s[2,7]=0.0,s[2,8]=-0.2,s[2,9]=1.0,s[2,10]=-0.8,s[2,11]=0.7,s[2,12]=0.3,s[2,13]=0.8,s[2,14]=0.0,s[2,15]=-0.1 s[2,16]=0.7,s[2,17]=-0.1,s[2,18]=-0.2,s[2,19]=1.1,s[2,20]=-0.7,s[2,21]=0.1,s[2,22]=-0.8,s[2,23]=-0.1,s[2,24]=-0.7,s[2,25]=0.3,s[2,26]=-0.9,s[2,27]=1.1,s[2,28]=-0.5,s[2,29]=0.6,s[2,30]=-0.4 s[2,31]=-0.4,s[2,32]=-0.9,s[2,33]=0.3,s[2,34]=-1.2,s[2,35]=0.2,s[2,36]=-0.6,s[2,37]=0.1,s[2,38]=0.2,s[2,39]=1.2,s[2,40]=0.1,s[2,41]=1.0,s[2,42]=-0.6,s[2,43]=0.5,s[2,44]=0.6,s[2,45]=-0.1 s[2,46]=1.0,s[2,47]=-1.1,s[2,48]=-0.6,s[2,49]=-1.2,s[2,50]=0.9,s[2,51]=0.6,s[2,52]=0.5,s[2,53]=-0.6,s[2,54]=0.8,s[2,55]=0.2,s[2,56]=0.9,s[2,57]=-0.7,s[2,58]=0.6,s[2,59]=-0.1,s[2,60]=-0.2 s[3,1]=1.0,s[3,2]=-0.7,s[3,3]=0.6,s[3,4]=-0.3,s[3,5]=-0.5,s[3,6]=-0.2,s[3,7]=-0.4,s[3,8]=-0.1,s[3,9]=-0.9,s[3,10]=-0.6,s[3,11]=1.0,s[3,12]=-0.1,s[3,13]=-0.6,s[3,14]=1.2,s[3,15]=-0.4 s[3,16]=-0.5,s[3,17]=-0.2,s[3,18]=0.5,s[3,19]=0.0,s[3,20]=0.7,s[3,21]=0.5,s[3,22]=0.4,s[3,23]=-0.4,s[3,24]=-0.2,s[3,25]=0.9,s[3,26]=-0.7,s[3,27]=0.6,s[3,28]=0.1,s[3,29]=1.0,s[3,30]=-0.6 s[3,31]=-1.1,s[3,32]=-1.0,s[3,33]=0.2,s[3,34]=-1.0,s[3,35]=0.4,s[3,36]=0.0,s[3,37]=-0.3,s[3,38]=-0.5,s[3,39]=-1.1,s[3,40]=1.2,s[3,41]=0.6,s[3,42]=-0.3,s[3,43]=-1.1,s[3,44]=-0.6,s[3,45]=-0.1 s[3,46]=-0.9,s[3,47]=-0.8,s[3,48]=-0.1,s[3,49]=0.5,s[3,50]=0.5,s[3,51]=-0.4,s[3,52]=-0.2,s[3,53]=0.8,s[3,54]=0.4,s[3,55]=-0.5,s[3,56]=0.4,s[3,57]=0.6,s[3,58]=0.7,s[3,59]=-0.6,s[3,60]=-0.6 s[4,1]=0.9,s[4,2]=-0.2,s[4,3]=-1.1,s[4,4]=-1.1,s[4,5]=0.9,s[4,6]=-0.4,s[4,7]=-0.1,s[4,8]=-0.4,s[4,9]=-1.0,s[4,10]=0.0,s[4,11]=0.1,s[4,12]=-0.7,s[4,13]=-0.8,s[4,14]=-0.6,s[4,15]=-1.2 s[4,16]=0.0,s[4,17]=0.1,s[4,18]=-0.1,s[4,19]=0.9,s[4,20]=1.2,s[4,21]=-0.2,s[4,22]=-0.8,s[4,23]=-0.6,s[4,24]=0.2,s[4,25]=-0.6,s[4,26]=0.7,s[4,27]=0.1,s[4,28]=1.2,s[4,29]=-0.1,s[4,30]=-0.3 s[4,31]=-0.8,s[4,32]=-0.1,s[4,33]=-1.2,s[4,34]=-1.2,s[4,35]=1.1,s[4,36]=-0.8,s[4,37]=0.1,s[4,38]=-0.9,s[4,39]=-0.3,s[4,40]=0.5,s[4,41]=0.6,s[4,42]=0.6,s[4,43]=0.6,s[4,44]=-1.1,s[4,45]=-0.4 s[4,46]=-0.4,s[4,47]=-0.4,s[4,48]=-0.7,s[4,49]=0.1,s[4,50]=0.8,s[4,51]=0.3,s[4,52]=-0.6,s[4,53]=-0.4,s[4,54]=-1.2,s[4,55]=0.6,s[4,56]=-0.7,s[4,57]=-0.7,s[4,58]=0.8,s[4,59]=0.3,s[4,60]=-0.3 s[5,1]=1.0,s[5,2]=0.4,s[5,3]=0.7,s[5,4]=-1.1,s[5,5]=-0.3,s[5,6]=-0.9,s[5,7]=0.9,s[5,8]=-0.3,s[5,9]=-0.3,s[5,10]=-0.6,s[5,11]=-0.1,s[5,12]=0.6,s[5,13]=0.7,s[5,14]=0.6,s[5,15]=-0.3 s[5,16]=-0.8,s[5,17]=-1.1,s[5,18]=0.2,s[5,19]=0.0,s[5,20]=-0.3,s[5,21]=-0.5,s[5,22]=-0.9,s[5,23]=1.0,s[5,24]=-0.4,s[5,25]=-1.0,s[5,26]=0.4,s[5,27]=0.5,s[5,28]=1.1,s[5,29]=0.6,s[5,30]=-1.2 s[5,31]=-0.2,s[5,32]=1.1,s[5,33]=1.0,s[5,34]=-0.9,s[5,35]=-0.2,s[5,36]=-0.5,s[5,37]=-0.8,s[5,38]=0.2,s[5,39]=-1.0,s[5,40]=-1.1,s[5,41]=0.6,s[5,42]=0.9,s[5,43]=0.3,s[5,44]=-0.2,s[5,45]=-0.9 s[5,46]=0.2,s[5,47]=-0.8,s[5,48]=0.2,s[5,49]=-1.2,s[5,50]=0.3,s[5,51]=0.4,s[5,52]=0.6,s[5,53]=-0.1,s[5,54]=1.1,s[5,55]=0.0,s[5,56]=0.5,s[5,57]=0.7,s[5,58]=0.7,s[5,59]=0.3,s[5,60]=0.1 s[6,1]=0.3,s[6,2]=-0.8,s[6,3]=1.1,s[6,4]=-0.7,s[6,5]=-0.7,s[6,6]=-1.2,s[6,7]=0.3,s[6,8]=-0.9,s[6,9]=0.2,s[6,10]=1.2,s[6,11]=-1.1,s[6,12]=-0.7,s[6,13]=-1.2,s[6,14]=-0.4,s[6,15]=-0.5 s[6,16]=-0.7,s[6,17]=-0.6,s[6,18]=-1.1,s[6,19]=-0.8,s[6,20]=0.8,s[6,21]=0.2,s[6,22]=0.7,s[6,23]=-0.7,s[6,24]=-0.4,s[6,25]=-1.0,s[6,26]=0.5,s[6,27]=0.2,s[6,28]=-1.1,s[6,29]=0.7,s[6,30]=1.1 s[6,31]=1.1,s[6,32]=-0.1,s[6,33]=-0.9,s[6,34]=0.1,s[6,35]=-0.9,s[6,36]=0.0,s[6,37]=0.3,s[6,38]=-1.0,s[6,39]=-0.5,s[6,40]=0.2,s[6,41]=-0.3,s[6,42]=-0.1,s[6,43]=0.4,s[6,44]=0.1,s[6,45]=-0.9 s[6,46]=0.2,s[6,47]=-1.0,s[6,48]=-0.4,s[6,49]=0.9,s[6,50]=-0.1,s[6,51]=-1.2,s[6,52]=-0.5,s[6,53]=-0.9,s[6,54]=0.4,s[6,55]=0.5,s[6,56]=0.3,s[6,57]=0.3,s[6,58]=-0.8,s[6,59]=-0.8,s[6,60]=-1.1 s[7,1]=-0.3,s[7,2]=0.6,s[7,3]=-1.0,s[7,4]=0.7,s[7,5]=-0.3,s[7,6]=-0.9,s[7,7]=1.2,s[7,8]=1.0,s[7,9]=-0.2,s[7,10]=0.1,s[7,11]=-0.8,s[7,12]=-0.9,s[7,13]=0.1,s[7,14]=-1.0,s[7,15]=0.9 s[7,16]=-1.0,s[7,17]=-0.3,s[7,18]=-0.1,s[7,19]=-0.5,s[7,20]=-0.2,s[7,21]=-0.4,s[7,22]=0.4,s[7,23]=-1.1,s[7,24]=0.7,s[7,25]=0.4,s[7,26]=0.7,s[7,27]=0.2,s[7,28]=0.7,s[7,29]=-0.2,s[7,30]=0.3 s[7,31]=0.6,s[7,32]=-0.3,s[7,33]=1.2,s[7,34]=0.9,s[7,35]=0.2,s[7,36]=-0.2,s[7,37]=-0.2,s[7,38]=1.1,s[7,39]=-0.6,s[7,40]=-0.5,s[7,41]=-0.8,s[7,42]=-0.5,s[7,43]=-1.0,s[7,44]=-0.4,s[7,45]=-0.8 s[7,46]=-0.7,s[7,47]=-0.8,s[7,48]=0.8,s[7,49]=-1.1,s[7,50]=0.5,s[7,51]=-0.9,s[7,52]=0.7,s[7,53]=0.2,s[7,54]=0.6,s[7,55]=1.1,s[7,56]=0.6,s[7,57]=0.7,s[7,58]=0.4,s[7,59]=0.8,s[7,60]=-0.9 s[8,1]=-0.1,s[8,2]=1.0,s[8,3]=0.4,s[8,4]=-0.6,s[8,5]=0.2,s[8,6]=1.2,s[8,7]=0.2,s[8,8]=-0.5,s[8,9]=1.0,s[8,10]=0.6,s[8,11]=0.3,s[8,12]=0.9,s[8,13]=0.2,s[8,14]=-0.2,s[8,15]=0.1 s[8,16]=-0.6,s[8,17]=-1.0,s[8,18]=0.6,s[8,19]=0.8,s[8,20]=-1.0,s[8,21]=-0.2,s[8,22]=1.1,s[8,23]=0.6,s[8,24]=-0.7,s[8,25]=-0.7,s[8,26]=-0.7,s[8,27]=0.7,s[8,28]=-0.1,s[8,29]=-0.2,s[8,30]=-1.1 s[8,31]=0.1,s[8,32]=1.1,s[8,33]=0.5,s[8,34]=0.1,s[8,35]=0.8,s[8,36]=-0.4,s[8,37]=-0.4,s[8,38]=-1.0,s[8,39]=1.2,s[8,40]=0.5,s[8,41]=-1.0,s[8,42]=-1.1,s[8,43]=-0.8,s[8,44]=0.8,s[8,45]=0.0 s[8,46]=-1.2,s[8,47]=-1.0,s[8,48]=-0.9,s[8,49]=0.8,s[8,50]=-0.4,s[8,51]=-0.9,s[8,52]=1.0,s[8,53]=0.8,s[8,54]=-0.9,s[8,55]=-0.9,s[8,56]=1.1,s[8,57]=-0.8,s[8,58]=0.9,s[8,59]=0.7,s[8,60]=-1.1 s[9,1]=-0.3,s[9,2]=0.8,s[9,3]=0.4,s[9,4]=-1.0,s[9,5]=0.7,s[9,6]=1.1,s[9,7]=1.1,s[9,8]=1.1,s[9,9]=0.1,s[9,10]=0.6,s[9,11]=0.3,s[9,12]=0.0,s[9,13]=0.6,s[9,14]=0.1,s[9,15]=0.0 s[9,16]=-0.3,s[9,17]=-1.0,s[9,18]=-1.0,s[9,19]=0.0,s[9,20]=-0.8,s[9,21]=-0.5,s[9,22]=0.9,s[9,23]=-0.6,s[9,24]=0.6,s[9,25]=-0.6,s[9,26]=0.4,s[9,27]=-0.2,s[9,28]=1.2,s[9,29]=-0.5,s[9,30]=0.3 s[9,31]=-0.9,s[9,32]=-1.0,s[9,33]=0.2,s[9,34]=-0.4,s[9,35]=0.0,s[9,36]=0.4,s[9,37]=-0.5,s[9,38]=-0.1,s[9,39]=-0.7,s[9,40]=0.4,s[9,41]=1.2,s[9,42]=-0.3,s[9,43]=0.7,s[9,44]=1.0,s[9,45]=0.8 s[9,46]=-0.1,s[9,47]=-0.9,s[9,48]=-0.2,s[9,49]=-0.9,s[9,50]=0.6,s[9,51]=0.5,s[9,52]=-0.3,s[9,53]=-0.2,s[9,54]=0.3,s[9,55]=-0.2,s[9,56]=-1.0,s[9,57]=0.1,s[9,58]=-0.6,s[9,59]=0.8,s[9,60]=-0.2 s[10,1]=0.9,s[10,2]=0.1,s[10,3]=-1.1,s[10,4]=0.5,s[10,5]=1.2,s[10,6]=-0.9,s[10,7]=-0.4,s[10,8]=-1.0,s[10,9]=-0.1,s[10,10]=0.8,s[10,11]=-0.4,s[10,12]=1.2,s[10,13]=-0.9,s[10,14]=0.0,s[10,15]=0.1 s[10,16]=-0.3,s[10,17]=-0.3,s[10,18]=0.1,s[10,19]=0.2,s[10,20]=1.0,s[10,21]=-0.8,s[10,22]=0.4,s[10,23]=0.9,s[10,24]=0.2,s[10,25]=-0.9,s[10,26]=-0.4,s[10,27]=-0.6,s[10,28]=1.0,s[10,29]=0.4,s[10,30]=0.0 s[10,31]=0.8,s[10,32]=-0.9,s[10,33]=0.3,s[10,34]=-0.2,s[10,35]=-0.3,s[10,36]=0.0,s[10,37]=-0.4,s[10,38]=-0.6,s[10,39]=0.6,s[10,40]=0.9,s[10,41]=-0.1,s[10,42]=1.0,s[10,43]=0.7,s[10,44]=0.2,s[10,45]=0.3 s[10,46]=0.0,s[10,47]=0.7,s[10,48]=-0.8,s[10,49]=1.2,s[10,50]=0.8,s[10,51]=0.0,s[10,52]=-1.1,s[10,53]=0.2,s[10,54]=0.1,s[10,55]=-0.7,s[10,56]=-0.7,s[10,57]=-0.8,s[10,58]=0.3,s[10,59]=0.8,s[10,60]=-0.6 s[11,1]=-0.3,s[11,2]=-0.3,s[11,3]=-0.9,s[11,4]=-1.2,s[11,5]=-0.6,s[11,6]=1.2,s[11,7]=0.9,s[11,8]=-0.5,s[11,9]=-0.5,s[11,10]=-0.9,s[11,11]=-0.9,s[11,12]=0.0,s[11,13]=-0.7,s[11,14]=0.0,s[11,15]=0.1 s[11,16]=-0.5,s[11,17]=0.1,s[11,18]=1.2,s[11,19]=-1.2,s[11,20]=-0.7,s[11,21]=-0.4,s[11,22]=-0.6,s[11,23]=0.3,s[11,24]=-1.2,s[11,25]=-1.2,s[11,26]=-0.2,s[11,27]=1.2,s[11,28]=1.1,s[11,29]=0.0,s[11,30]=0.4 s[11,31]=-1.2,s[11,32]=-0.2,s[11,33]=-1.1,s[11,34]=-1.1,s[11,35]=0.5,s[11,36]=-0.2,s[11,37]=0.0,s[11,38]=0.9,s[11,39]=-0.9,s[11,40]=0.9,s[11,41]=-0.4,s[11,42]=-0.5,s[11,43]=-0.9,s[11,44]=-0.6,s[11,45]=1.1 s[11,46]=-0.2,s[11,47]=0.7,s[11,48]=0.7,s[11,49]=-0.9,s[11,50]=-0.9,s[11,51]=-1.1,s[11,52]=0.9,s[11,53]=-0.8,s[11,54]=-1.0,s[11,55]=-0.6,s[11,56]=-0.8,s[11,57]=0.3,s[11,58]=0.8,s[11,59]=0.7,s[11,60]=-0.3 s[12,1]=0.5,s[12,2]=-1.0,s[12,3]=-0.4,s[12,4]=-0.7,s[12,5]=0.9,s[12,6]=0.9,s[12,7]=-0.9,s[12,8]=0.7,s[12,9]=0.9,s[12,10]=-1.2,s[12,11]=0.8,s[12,12]=0.2,s[12,13]=-0.4,s[12,14]=-1.0,s[12,15]=-0.9 s[12,16]=0.5,s[12,17]=-0.5,s[12,18]=0.0,s[12,19]=0.9,s[12,20]=-1.0,s[12,21]=0.8,s[12,22]=-0.9,s[12,23]=-0.9,s[12,24]=0.2,s[12,25]=0.4,s[12,26]=1.2,s[12,27]=0.8,s[12,28]=1.0,s[12,29]=-1.0,s[12,30]=0.3 s[12,31]=0.2,s[12,32]=-1.2,s[12,33]=-0.2,s[12,34]=-1.0,s[12,35]=-0.5,s[12,36]=-0.4,s[12,37]=-0.3,s[12,38]=-0.9,s[12,39]=-0.2,s[12,40]=0.2,s[12,41]=-0.9,s[12,42]=-0.3,s[12,43]=-1.2,s[12,44]=0.8,s[12,45]=1.1 s[12,46]=1.1,s[12,47]=-0.9,s[12,48]=0.1,s[12,49]=0.6,s[12,50]=-0.5,s[12,51]=-0.2,s[12,52]=0.2,s[12,53]=-0.3,s[12,54]=-0.9,s[12,55]=-0.6,s[12,56]=0.3,s[12,57]=0.6,s[12,58]=-0.1,s[12,59]=0.7,s[12,60]=-0.9 s[13,1]=-0.9,s[13,2]=-0.9,s[13,3]=-0.8,s[13,4]=0.3,s[13,5]=-0.9,s[13,6]=-1.1,s[13,7]=1.0,s[13,8]=0.0,s[13,9]=0.7,s[13,10]=-0.8,s[13,11]=1.0,s[13,12]=0.0,s[13,13]=-0.7,s[13,14]=-1.1,s[13,15]=-1.1 s[13,16]=-1.2,s[13,17]=0.7,s[13,18]=-0.7,s[13,19]=-0.1,s[13,20]=-1.1,s[13,21]=-1.0,s[13,22]=0.6,s[13,23]=-1.0,s[13,24]=0.5,s[13,25]=-0.7,s[13,26]=0.2,s[13,27]=-0.9,s[13,28]=-1.1,s[13,29]=0.6,s[13,30]=0.9 s[13,31]=0.6,s[13,32]=-1.1,s[13,33]=-0.1,s[13,34]=-0.5,s[13,35]=1.0,s[13,36]=-1.1,s[13,37]=-1.2,s[13,38]=-0.8,s[13,39]=0.7,s[13,40]=-0.8,s[13,41]=-0.7,s[13,42]=-0.8,s[13,43]=-0.8,s[13,44]=0.5,s[13,45]=0.6 s[13,46]=0.2,s[13,47]=-0.2,s[13,48]=0.7,s[13,49]=0.8,s[13,50]=0.0,s[13,51]=-1.2,s[13,52]=-0.3,s[13,53]=1.1,s[13,54]=-0.9,s[13,55]=0.1,s[13,56]=0.3,s[13,57]=-0.6,s[13,58]=-0.8,s[13,59]=0.1,s[13,60]=0.3 s[14,1]=-0.4,s[14,2]=-0.2,s[14,3]=0.5,s[14,4]=-1.0,s[14,5]=-0.2,s[14,6]=0.8,s[14,7]=-0.1,s[14,8]=0.7,s[14,9]=0.7,s[14,10]=-0.4,s[14,11]=0.4,s[14,12]=0.0,s[14,13]=0.7,s[14,14]=-0.1,s[14,15]=0.3 s[14,16]=-0.4,s[14,17]=-0.1,s[14,18]=-1.0,s[14,19]=0.3,s[14,20]=1.1,s[14,21]=1.2,s[14,22]=0.8,s[14,23]=0.2,s[14,24]=0.1,s[14,25]=-0.7,s[14,26]=-0.9,s[14,27]=-0.5,s[14,28]=1.1,s[14,29]=-1.1,s[14,30]=-0.2 s[14,31]=0.2,s[14,32]=0.5,s[14,33]=-0.8,s[14,34]=-1.1,s[14,35]=-1.1,s[14,36]=-0.2,s[14,37]=0.7,s[14,38]=0.8,s[14,39]=0.2,s[14,40]=0.0,s[14,41]=-0.4,s[14,42]=0.7,s[14,43]=0.6,s[14,44]=-0.3,s[14,45]=0.9 s[14,46]=-1.1,s[14,47]=-0.7,s[14,48]=0.3,s[14,49]=1.0,s[14,50]=0.3,s[14,51]=-0.7,s[14,52]=0.0,s[14,53]=0.6,s[14,54]=0.0,s[14,55]=0.8,s[14,56]=0.5,s[14,57]=0.4,s[14,58]=1.2,s[14,59]=1.0,s[14,60]=-0.7 s[15,1]=0.1,s[15,2]=0.0,s[15,3]=-0.7,s[15,4]=-0.8,s[15,5]=0.5,s[15,6]=1.0,s[15,7]=-0.6,s[15,8]=-0.8,s[15,9]=-0.7,s[15,10]=0.8,s[15,11]=1.0,s[15,12]=0.0,s[15,13]=0.2,s[15,14]=0.7,s[15,15]=0.6 s[15,16]=-0.3,s[15,17]=-1.0,s[15,18]=-1.0,s[15,19]=-0.1,s[15,20]=-0.5,s[15,21]=0.4,s[15,22]=-1.1,s[15,23]=-0.2,s[15,24]=0.3,s[15,25]=-1.1,s[15,26]=0.6,s[15,27]=0.4,s[15,28]=0.1,s[15,29]=-0.7,s[15,30]=-0.2 s[15,31]=-0.4,s[15,32]=-0.9,s[15,33]=0.0,s[15,34]=-0.1,s[15,35]=-0.1,s[15,36]=1.1,s[15,37]=0.2,s[15,38]=-0.5,s[15,39]=-0.5,s[15,40]=-0.7,s[15,41]=-1.0,s[15,42]=-0.5,s[15,43]=0.9,s[15,44]=0.8,s[15,45]=0.6 s[15,46]=0.1,s[15,47]=-0.2,s[15,48]=-1.0,s[15,49]=-0.5,s[15,50]=0.5,s[15,51]=-0.9,s[15,52]=0.7,s[15,53]=0.8,s[15,54]=-0.5,s[15,55]=-0.5,s[15,56]=-0.3,s[15,57]=1.1,s[15,58]=0.5,s[15,59]=0.9,s[15,60]=0.1 s[16,1]=-1.1,s[16,2]=0.2,s[16,3]=0.6,s[16,4]=-0.4,s[16,5]=-0.2,s[16,6]=1.0,s[16,7]=0.8,s[16,8]=-0.6,s[16,9]=-1.2,s[16,10]=-1.0,s[16,11]=0.1,s[16,12]=-0.5,s[16,13]=0.0,s[16,14]=0.1,s[16,15]=1.1 s[16,16]=1.2,s[16,17]=0.3,s[16,18]=1.1,s[16,19]=-0.7,s[16,20]=-0.6,s[16,21]=0.5,s[16,22]=-0.5,s[16,23]=-1.0,s[16,24]=0.9,s[16,25]=-1.0,s[16,26]=0.4,s[16,27]=1.2,s[16,28]=-0.2,s[16,29]=0.7,s[16,30]=0.5 s[16,31]=-1.0,s[16,32]=1.1,s[16,33]=1.1,s[16,34]=0.6,s[16,35]=0.0,s[16,36]=1.2,s[16,37]=0.1,s[16,38]=0.5,s[16,39]=0.9,s[16,40]=0.6,s[16,41]=0.5,s[16,42]=0.2,s[16,43]=0.2,s[16,44]=1.1,s[16,45]=-0.1 s[16,46]=-0.3,s[16,47]=-0.4,s[16,48]=0.9,s[16,49]=0.5,s[16,50]=0.8,s[16,51]=0.3,s[16,52]=-0.2,s[16,53]=-1.2,s[16,54]=1.1,s[16,55]=0.3,s[16,56]=0.5,s[16,57]=0.0,s[16,58]=-1.1,s[16,59]=0.2,s[16,60]=-0.5 s[17,1]=0.1,s[17,2]=0.9,s[17,3]=0.0,s[17,4]=-1.0,s[17,5]=0.2,s[17,6]=-0.7,s[17,7]=0.3,s[17,8]=1.0,s[17,9]=-0.5,s[17,10]=0.4,s[17,11]=0.4,s[17,12]=0.8,s[17,13]=-0.7,s[17,14]=-0.5,s[17,15]=-0.9 s[17,16]=0.2,s[17,17]=0.0,s[17,18]=0.1,s[17,19]=1.0,s[17,20]=0.9,s[17,21]=-0.4,s[17,22]=-0.2,s[17,23]=0.7,s[17,24]=-1.1,s[17,25]=-0.8,s[17,26]=-0.7,s[17,27]=0.3,s[17,28]=-0.7,s[17,29]=-0.7,s[17,30]=0.3 s[17,31]=1.2,s[17,32]=0.7,s[17,33]=0.6,s[17,34]=-1.2,s[17,35]=-0.1,s[17,36]=0.3,s[17,37]=0.1,s[17,38]=-0.1,s[17,39]=-0.1,s[17,40]=-1.0,s[17,41]=0.2,s[17,42]=0.4,s[17,43]=-0.8,s[17,44]=-0.1,s[17,45]=0.7 s[17,46]=-0.8,s[17,47]=-0.6,s[17,48]=-0.4,s[17,49]=-0.8,s[17,50]=0.7,s[17,51]=0.3,s[17,52]=1.1,s[17,53]=-0.5,s[17,54]=0.9,s[17,55]=0.9,s[17,56]=-1.0,s[17,57]=-0.9,s[17,58]=-1.0,s[17,59]=0.8,s[17,60]=-1.2 s[18,1]=0.0,s[18,2]=-0.7,s[18,3]=-0.1,s[18,4]=1.1,s[18,5]=-1.2,s[18,6]=0.8,s[18,7]=1.0,s[18,8]=-0.1,s[18,9]=0.2,s[18,10]=0.0,s[18,11]=-0.5,s[18,12]=-0.3,s[18,13]=0.1,s[18,14]=0.9,s[18,15]=1.2 s[18,16]=0.8,s[18,17]=0.6,s[18,18]=-1.2,s[18,19]=-0.8,s[18,20]=1.0,s[18,21]=0.4,s[18,22]=-0.6,s[18,23]=-0.7,s[18,24]=-0.2,s[18,25]=0.7,s[18,26]=0.0,s[18,27]=-0.6,s[18,28]=1.1,s[18,29]=1.2,s[18,30]=-0.6 s[18,31]=0.9,s[18,32]=1.1,s[18,33]=-0.2,s[18,34]=-1.2,s[18,35]=0.2,s[18,36]=0.5,s[18,37]=-0.2,s[18,38]=-1.1,s[18,39]=-0.5,s[18,40]=0.9,s[18,41]=0.5,s[18,42]=0.0,s[18,43]=1.0,s[18,44]=-0.7,s[18,45]=0.6 s[18,46]=-0.4,s[18,47]=0.0,s[18,48]=-0.9,s[18,49]=1.0,s[18,50]=-0.6,s[18,51]=-0.3,s[18,52]=-0.4,s[18,53]=0.0,s[18,54]=-0.9,s[18,55]=0.9,s[18,56]=0.5,s[18,57]=-0.3,s[18,58]=-1.2,s[18,59]=-0.1,s[18,60]=-1.1 s[19,1]=-1.1,s[19,2]=0.6,s[19,3]=0.6,s[19,4]=0.0,s[19,5]=-0.4,s[19,6]=-0.4,s[19,7]=-0.1,s[19,8]=-1.2,s[19,9]=-1.0,s[19,10]=1.2,s[19,11]=0.1,s[19,12]=-1.2,s[19,13]=-1.1,s[19,14]=0.6,s[19,15]=1.1 s[19,16]=1.1,s[19,17]=-0.6,s[19,18]=0.3,s[19,19]=0.4,s[19,20]=0.3,s[19,21]=1.1,s[19,22]=0.9,s[19,23]=-0.4,s[19,24]=1.1,s[19,25]=-0.3,s[19,26]=-1.1,s[19,27]=-0.9,s[19,28]=-1.2,s[19,29]=0.3,s[19,30]=0.3 s[19,31]=-1.1,s[19,32]=0.2,s[19,33]=-0.2,s[19,34]=-1.0,s[19,35]=-1.1,s[19,36]=0.9,s[19,37]=0.4,s[19,38]=-0.6,s[19,39]=1.1,s[19,40]=-0.1,s[19,41]=-0.7,s[19,42]=0.9,s[19,43]=-0.4,s[19,44]=-0.3,s[19,45]=0.7 s[19,46]=-0.8,s[19,47]=-1.2,s[19,48]=-0.1,s[19,49]=-0.3,s[19,50]=-0.6,s[19,51]=-1.1,s[19,52]=-0.2,s[19,53]=-1.2,s[19,54]=-1.1,s[19,55]=1.1,s[19,56]=-0.5,s[19,57]=0.9,s[19,58]=-0.3,s[19,59]=0.9,s[19,60]=-1.2 s[20,1]=-0.2,s[20,2]=-0.1,s[20,3]=0.6,s[20,4]=-0.1,s[20,5]=0.7,s[20,6]=0.2,s[20,7]=0.8,s[20,8]=-0.3,s[20,9]=0.7,s[20,10]=-0.9,s[20,11]=-0.1,s[20,12]=0.6,s[20,13]=-0.4,s[20,14]=-1.1,s[20,15]=0.8 s[20,16]=1.0,s[20,17]=-0.7,s[20,18]=-0.1,s[20,19]=-0.3,s[20,20]=-0.1,s[20,21]=-0.6,s[20,22]=0.1,s[20,23]=-0.5,s[20,24]=-0.4,s[20,25]=-1.2,s[20,26]=-1.2,s[20,27]=0.6,s[20,28]=-0.9,s[20,29]=0.8,s[20,30]=0.4 s[20,31]=1.1,s[20,32]=-0.9,s[20,33]=0.9,s[20,34]=-0.8,s[20,35]=0.5,s[20,36]=0.1,s[20,37]=0.3,s[20,38]=-1.2,s[20,39]=0.2,s[20,40]=-0.9,s[20,41]=-0.5,s[20,42]=-0.3,s[20,43]=1.1,s[20,44]=1.1,s[20,45]=0.8 s[20,46]=-0.4,s[20,47]=0.1,s[20,48]=-0.6,s[20,49]=0.7,s[20,50]=-0.8,s[20,51]=1.0,s[20,52]=-0.4,s[20,53]=-0.4,s[20,54]=0.9,s[20,55]=-0.1,s[20,56]=0.3,s[20,57]=-0.4,s[20,58]=-0.1,s[20,59]=-0.3,s[20,60]=-0.3 s[21,1]=-0.2,s[21,2]=-0.3,s[21,3]=-0.2,s[21,4]=0.9,s[21,5]=1.0,s[21,6]=-0.1,s[21,7]=0.0,s[21,8]=0.0,s[21,9]=0.6,s[21,10]=-1.0,s[21,11]=-1.2,s[21,12]=-0.7,s[21,13]=-0.5,s[21,14]=-0.1,s[21,15]=-0.6 s[21,16]=-0.6,s[21,17]=-0.2,s[21,18]=0.6,s[21,19]=-0.9,s[21,20]=-0.2,s[21,21]=-0.6,s[21,22]=0.7,s[21,23]=1.1,s[21,24]=-0.3,s[21,25]=0.6,s[21,26]=-1.1,s[21,27]=-0.9,s[21,28]=0.3,s[21,29]=0.2,s[21,30]=0.7 s[21,31]=0.3,s[21,32]=-1.2,s[21,33]=-0.9,s[21,34]=-0.1,s[21,35]=0.1,s[21,36]=1.2,s[21,37]=-1.2,s[21,38]=-1.1,s[21,39]=0.4,s[21,40]=0.3,s[21,41]=0.8,s[21,42]=-0.8,s[21,43]=1.1,s[21,44]=-0.4,s[21,45]=-1.2 s[21,46]=-0.5,s[21,47]=-0.3,s[21,48]=0.9,s[21,49]=0.5,s[21,50]=0.6,s[21,51]=-1.2,s[21,52]=-0.8,s[21,53]=0.4,s[21,54]=0.9,s[21,55]=0.4,s[21,56]=1.1,s[21,57]=0.2,s[21,58]=1.2,s[21,59]=0.3,s[21,60]=-1.1 s[22,1]=0.1,s[22,2]=0.7,s[22,3]=-0.9,s[22,4]=0.0,s[22,5]=0.3,s[22,6]=-0.8,s[22,7]=-1.1,s[22,8]=-0.5,s[22,9]=0.4,s[22,10]=-1.0,s[22,11]=0.2,s[22,12]=-0.3,s[22,13]=-1.0,s[22,14]=1.0,s[22,15]=-0.5 s[22,16]=-1.1,s[22,17]=0.4,s[22,18]=-0.9,s[22,19]=0.6,s[22,20]=0.5,s[22,21]=1.0,s[22,22]=-0.2,s[22,23]=-0.4,s[22,24]=0.4,s[22,25]=0.5,s[22,26]=0.1,s[22,27]=0.0,s[22,28]=-0.7,s[22,29]=-0.9,s[22,30]=-0.9 s[22,31]=-0.1,s[22,32]=0.6,s[22,33]=-0.8,s[22,34]=-0.4,s[22,35]=-1.1,s[22,36]=-1.0,s[22,37]=-1.2,s[22,38]=0.1,s[22,39]=-0.1,s[22,40]=-1.2,s[22,41]=-0.4,s[22,42]=0.8,s[22,43]=0.5,s[22,44]=0.2,s[22,45]=-1.1 s[22,46]=0.7,s[22,47]=0.2,s[22,48]=-0.7,s[22,49]=-0.2,s[22,50]=-1.2,s[22,51]=1.2,s[22,52]=0.5,s[22,53]=-0.8,s[22,54]=0.8,s[22,55]=-0.7,s[22,56]=0.7,s[22,57]=-1.2,s[22,58]=0.4,s[22,59]=1.2,s[22,60]=-1.1 s[23,1]=0.7,s[23,2]=-0.6,s[23,3]=-0.3,s[23,4]=-0.5,s[23,5]=-0.1,s[23,6]=1.2,s[23,7]=-0.2,s[23,8]=0.4,s[23,9]=0.7,s[23,10]=-1.2,s[23,11]=-0.4,s[23,12]=0.1,s[23,13]=0.0,s[23,14]=-0.5,s[23,15]=0.4 s[23,16]=-0.4,s[23,17]=-0.6,s[23,18]=-0.9,s[23,19]=1.1,s[23,20]=-1.1,s[23,21]=0.8,s[23,22]=-1.0,s[23,23]=-0.1,s[23,24]=-0.3,s[23,25]=0.9,s[23,26]=-0.4,s[23,27]=0.5,s[23,28]=-1.0,s[23,29]=1.1,s[23,30]=-0.4 s[23,31]=-0.1,s[23,32]=0.1,s[23,33]=0.2,s[23,34]=-0.2,s[23,35]=-1.2,s[23,36]=0.8,s[23,37]=-0.9,s[23,38]=0.1,s[23,39]=-0.3,s[23,40]=-0.7,s[23,41]=-0.1,s[23,42]=-1.0,s[23,43]=0.5,s[23,44]=-0.8,s[23,45]=1.1 s[23,46]=0.4,s[23,47]=-0.9,s[23,48]=-0.2,s[23,49]=-0.7,s[23,50]=1.0,s[23,51]=-1.2,s[23,52]=-0.3,s[23,53]=-0.7,s[23,54]=1.2,s[23,55]=0.5,s[23,56]=-0.1,s[23,57]=0.6,s[23,58]=-0.7,s[23,59]=0.9,s[23,60]=-1.2 s[24,1]=0.3,s[24,2]=0.9,s[24,3]=-0.9,s[24,4]=-0.7,s[24,5]=-1.1,s[24,6]=1.2,s[24,7]=-1.1,s[24,8]=1.0,s[24,9]=0.7,s[24,10]=1.2,s[24,11]=-0.7,s[24,12]=0.3,s[24,13]=1.2,s[24,14]=1.2,s[24,15]=0.3 s[24,16]=-0.1,s[24,17]=-0.6,s[24,18]=-1.2,s[24,19]=1.2,s[24,20]=1.2,s[24,21]=-0.9,s[24,22]=-0.2,s[24,23]=0.2,s[24,24]=-0.5,s[24,25]=-1.1,s[24,26]=-1.0,s[24,27]=-1.2,s[24,28]=-0.5,s[24,29]=0.2,s[24,30]=-0.2 s[24,31]=0.3,s[24,32]=-0.9,s[24,33]=0.4,s[24,34]=-0.9,s[24,35]=-0.5,s[24,36]=-1.0,s[24,37]=0.3,s[24,38]=0.6,s[24,39]=-0.5,s[24,40]=-1.0,s[24,41]=-0.8,s[24,42]=-0.1,s[24,43]=-1.0,s[24,44]=1.1,s[24,45]=-0.3 s[24,46]=-0.1,s[24,47]=0.2,s[24,48]=0.7,s[24,49]=-0.6,s[24,50]=1.0,s[24,51]=0.0,s[24,52]=-1.0,s[24,53]=0.5,s[24,54]=-0.4,s[24,55]=-0.9,s[24,56]=-0.8,s[24,57]=-0.2,s[24,58]=0.3,s[24,59]=-0.7,s[24,60]=-0.5 s[25,1]=1.2,s[25,2]=-0.9,s[25,3]=-0.5,s[25,4]=0.1,s[25,5]=0.2,s[25,6]=-0.8,s[25,7]=0.0,s[25,8]=1.2,s[25,9]=-0.5,s[25,10]=-0.1,s[25,11]=0.9,s[25,12]=-0.9,s[25,13]=-0.8,s[25,14]=0.1,s[25,15]=-0.9 s[25,16]=0.3,s[25,17]=-0.9,s[25,18]=-0.4,s[25,19]=-0.5,s[25,20]=-0.6,s[25,21]=-1.1,s[25,22]=-0.9,s[25,23]=-0.9,s[25,24]=0.9,s[25,25]=1.1,s[25,26]=0.6,s[25,27]=-0.3,s[25,28]=-0.1,s[25,29]=-1.2,s[25,30]=-1.1 s[25,31]=0.0,s[25,32]=0.1,s[25,33]=-0.7,s[25,34]=-0.7,s[25,35]=0.5,s[25,36]=-0.4,s[25,37]=1.0,s[25,38]=0.2,s[25,39]=0.7,s[25,40]=-0.5,s[25,41]=-0.4,s[25,42]=-0.1,s[25,43]=-0.1,s[25,44]=0.2,s[25,45]=0.2 s[25,46]=-0.7,s[25,47]=0.8,s[25,48]=1.1,s[25,49]=-0.1,s[25,50]=-0.6,s[25,51]=0.1,s[25,52]=0.5,s[25,53]=-0.5,s[25,54]=-0.4,s[25,55]=0.2,s[25,56]=1.0,s[25,57]=1.1,s[25,58]=0.0,s[25,59]=-0.1,s[25,60]=-1.2 s[26,1]=-0.6,s[26,2]=0.1,s[26,3]=-0.4,s[26,4]=-1.1,s[26,5]=-0.6,s[26,6]=0.1,s[26,7]=-1.0,s[26,8]=-1.0,s[26,9]=-0.6,s[26,10]=0.1,s[26,11]=-0.7,s[26,12]=0.9,s[26,13]=-0.4,s[26,14]=-0.1,s[26,15]=-1.0 s[26,16]=0.7,s[26,17]=0.9,s[26,18]=0.9,s[26,19]=0.7,s[26,20]=0.9,s[26,21]=1.2,s[26,22]=0.8,s[26,23]=0.1,s[26,24]=-1.2,s[26,25]=0.4,s[26,26]=0.8,s[26,27]=-0.8,s[26,28]=-0.2,s[26,29]=-0.7,s[26,30]=-0.8 s[26,31]=-1.2,s[26,32]=0.5,s[26,33]=0.3,s[26,34]=-0.4,s[26,35]=-0.6,s[26,36]=1.2,s[26,37]=-1.1,s[26,38]=0.1,s[26,39]=-0.6,s[26,40]=1.0,s[26,41]=-1.1,s[26,42]=-0.3,s[26,43]=0.2,s[26,44]=-0.6,s[26,45]=0.4 s[26,46]=-1.1,s[26,47]=-0.6,s[26,48]=0.9,s[26,49]=0.1,s[26,50]=-0.2,s[26,51]=-0.8,s[26,52]=-0.3,s[26,53]=-0.5,s[26,54]=0.0,s[26,55]=-1.2,s[26,56]=1.0,s[26,57]=-0.3,s[26,58]=-0.6,s[26,59]=0.3,s[26,60]=1.0 s[27,1]=0.1,s[27,2]=1.1,s[27,3]=0.1,s[27,4]=-0.9,s[27,5]=-0.4,s[27,6]=0.7,s[27,7]=0.1,s[27,8]=0.6,s[27,9]=0.9,s[27,10]=0.1,s[27,11]=0.9,s[27,12]=-0.1,s[27,13]=-0.9,s[27,14]=-0.6,s[27,15]=1.2 s[27,16]=0.1,s[27,17]=-0.6,s[27,18]=-0.5,s[27,19]=0.4,s[27,20]=-0.8,s[27,21]=-0.5,s[27,22]=0.7,s[27,23]=-0.8,s[27,24]=0.6,s[27,25]=-1.1,s[27,26]=-0.1,s[27,27]=-0.3,s[27,28]=-1.1,s[27,29]=-0.1,s[27,30]=0.3 s[27,31]=0.2,s[27,32]=-1.1,s[27,33]=-0.5,s[27,34]=1.1,s[27,35]=-0.1,s[27,36]=-0.6,s[27,37]=-0.6,s[27,38]=-1.1,s[27,39]=0.0,s[27,40]=-0.2,s[27,41]=-0.8,s[27,42]=0.1,s[27,43]=-0.6,s[27,44]=-0.4,s[27,45]=1.2 s[27,46]=0.9,s[27,47]=1.2,s[27,48]=0.3,s[27,49]=0.5,s[27,50]=0.7,s[27,51]=0.9,s[27,52]=-1.1,s[27,53]=0.1,s[27,54]=1.2,s[27,55]=-0.5,s[27,56]=-0.3,s[27,57]=-0.8,s[27,58]=0.1,s[27,59]=-1.2,s[27,60]=-0.7 s[28,1]=0.4,s[28,2]=-0.8,s[28,3]=-0.4,s[28,4]=0.1,s[28,5]=-0.2,s[28,6]=0.2,s[28,7]=1.0,s[28,8]=-0.5,s[28,9]=1.0,s[28,10]=0.5,s[28,11]=-0.7,s[28,12]=-0.5,s[28,13]=-0.8,s[28,14]=0.1,s[28,15]=0.7 s[28,16]=-0.8,s[28,17]=1.1,s[28,18]=1.0,s[28,19]=0.3,s[28,20]=0.0,s[28,21]=1.2,s[28,22]=-0.5,s[28,23]=-1.1,s[28,24]=-0.2,s[28,25]=0.2,s[28,26]=-0.8,s[28,27]=0.4,s[28,28]=-0.7,s[28,29]=0.7,s[28,30]=-1.1 s[28,31]=-1.1,s[28,32]=1.1,s[28,33]=-1.2,s[28,34]=-1.1,s[28,35]=-0.7,s[28,36]=0.6,s[28,37]=-1.2,s[28,38]=0.5,s[28,39]=0.9,s[28,40]=-1.0,s[28,41]=-0.4,s[28,42]=0.2,s[28,43]=-0.9,s[28,44]=0.5,s[28,45]=-1.2 s[28,46]=-0.2,s[28,47]=-0.4,s[28,48]=-0.8,s[28,49]=0.4,s[28,50]=-0.6,s[28,51]=0.0,s[28,52]=0.7,s[28,53]=-0.7,s[28,54]=1.2,s[28,55]=-0.1,s[28,56]=-0.7,s[28,57]=-1.1,s[28,58]=-0.3,s[28,59]=0.9,s[28,60]=-1.1 s[29,1]=-0.4,s[29,2]=-0.9,s[29,3]=-0.1,s[29,4]=0.0,s[29,5]=-0.9,s[29,6]=-0.2,s[29,7]=-0.3,s[29,8]=-0.4,s[29,9]=-0.3,s[29,10]=-0.9,s[29,11]=0.9,s[29,12]=-1.0,s[29,13]=0.8,s[29,14]=0.5,s[29,15]=-0.2 s[29,16]=0.4,s[29,17]=-0.9,s[29,18]=-0.1,s[29,19]=-1.2,s[29,20]=-0.8,s[29,21]=0.1,s[29,22]=0.5,s[29,23]=0.6,s[29,24]=0.6,s[29,25]=1.0,s[29,26]=-0.2,s[29,27]=-0.2,s[29,28]=0.1,s[29,29]=0.3,s[29,30]=-0.3 s[29,31]=-0.7,s[29,32]=-1.0,s[29,33]=-0.2,s[29,34]=-0.5,s[29,35]=-0.6,s[29,36]=0.7,s[29,37]=-1.1,s[29,38]=1.2,s[29,39]=-0.6,s[29,40]=0.4,s[29,41]=0.5,s[29,42]=-0.5,s[29,43]=-0.8,s[29,44]=0.4,s[29,45]=1.1 s[29,46]=0.1,s[29,47]=-0.3,s[29,48]=-0.2,s[29,49]=0.0,s[29,50]=-0.8,s[29,51]=-1.2,s[29,52]=0.1,s[29,53]=-0.4,s[29,54]=-1.2,s[29,55]=-1.1,s[29,56]=0.0,s[29,57]=-0.8,s[29,58]=-0.3,s[29,59]=-0.5,s[29,60]=-1.2 s[30,1]=0.3,s[30,2]=-0.8,s[30,3]=-0.8,s[30,4]=-1.0,s[30,5]=0.9,s[30,6]=1.2,s[30,7]=-1.0,s[30,8]=-0.3,s[30,9]=-1.0,s[30,10]=-0.8,s[30,11]=-1.0,s[30,12]=0.6,s[30,13]=0.8,s[30,14]=0.6,s[30,15]=0.8 s[30,16]=-0.4,s[30,17]=0.2,s[30,18]=0.7,s[30,19]=-1.1,s[30,20]=0.0,s[30,21]=-1.1,s[30,22]=-0.2,s[30,23]=0.1,s[30,24]=1.0,s[30,25]=-0.8,s[30,26]=-0.5,s[30,27]=1.0,s[30,28]=-0.5,s[30,29]=0.0,s[30,30]=-0.5 s[30,31]=0.2,s[30,32]=0.4,s[30,33]=-0.3,s[30,34]=-0.2,s[30,35]=-1.2,s[30,36]=1.2,s[30,37]=-1.0,s[30,38]=0.2,s[30,39]=1.0,s[30,40]=0.4,s[30,41]=0.0,s[30,42]=-0.7,s[30,43]=1.1,s[30,44]=-0.8,s[30,45]=0.2 s[30,46]=-0.8,s[30,47]=-1.2,s[30,48]=1.0,s[30,49]=0.9,s[30,50]=0.9,s[30,51]=0.7,s[30,52]=0.8,s[30,53]=0.9,s[30,54]=-1.2,s[30,55]=0.6,s[30,56]=-1.0,s[30,57]=0.5,s[30,58]=-1.1,s[30,59]=-0.5,s[30,60]=-0.8 s[31,1]=-0.3,s[31,2]=-0.2,s[31,3]=0.8,s[31,4]=-1.1,s[31,5]=-0.8,s[31,6]=0.0,s[31,7]=-1.0,s[31,8]=-0.9,s[31,9]=-1.0,s[31,10]=0.4,s[31,11]=-0.6,s[31,12]=-0.9,s[31,13]=-0.9,s[31,14]=0.0,s[31,15]=0.0 s[31,16]=-0.3,s[31,17]=0.6,s[31,18]=0.2,s[31,19]=0.1,s[31,20]=1.1,s[31,21]=1.1,s[31,22]=-1.0,s[31,23]=0.6,s[31,24]=1.2,s[31,25]=0.8,s[31,26]=1.2,s[31,27]=0.6,s[31,28]=0.4,s[31,29]=0.9,s[31,30]=0.1 s[31,31]=-1.0,s[31,32]=-1.0,s[31,33]=-0.4,s[31,34]=0.1,s[31,35]=0.2,s[31,36]=0.9,s[31,37]=0.4,s[31,38]=-0.8,s[31,39]=-0.8,s[31,40]=-0.3,s[31,41]=0.9,s[31,42]=-0.3,s[31,43]=-0.5,s[31,44]=0.0,s[31,45]=0.6 s[31,46]=0.1,s[31,47]=-1.0,s[31,48]=0.3,s[31,49]=-1.2,s[31,50]=-1.1,s[31,51]=-0.8,s[31,52]=0.3,s[31,53]=0.0,s[31,54]=0.8,s[31,55]=-0.9,s[31,56]=-0.6,s[31,57]=-0.1,s[31,58]=0.4,s[31,59]=0.9,s[31,60]=-0.7 s[32,1]=-0.2,s[32,2]=-0.5,s[32,3]=-0.7,s[32,4]=-0.6,s[32,5]=0.9,s[32,6]=0.0,s[32,7]=-0.2,s[32,8]=1.1,s[32,9]=1.0,s[32,10]=-0.5,s[32,11]=-1.2,s[32,12]=0.8,s[32,13]=-0.1,s[32,14]=-1.2,s[32,15]=-0.1 s[32,16]=0.2,s[32,17]=-1.0,s[32,18]=-0.6,s[32,19]=-0.9,s[32,20]=0.7,s[32,21]=-0.6,s[32,22]=0.8,s[32,23]=-0.6,s[32,24]=-0.5,s[32,25]=-1.0,s[32,26]=-1.0,s[32,27]=1.1,s[32,28]=1.0,s[32,29]=-0.6,s[32,30]=0.0 s[32,31]=-0.2,s[32,32]=1.0,s[32,33]=0.3,s[32,34]=-1.2,s[32,35]=0.1,s[32,36]=0.2,s[32,37]=-1.2,s[32,38]=1.1,s[32,39]=-1.1,s[32,40]=0.6,s[32,41]=-0.6,s[32,42]=0.4,s[32,43]=-0.3,s[32,44]=-1.2,s[32,45]=0.1 s[32,46]=-1.0,s[32,47]=0.5,s[32,48]=-0.5,s[32,49]=0.8,s[32,50]=0.0,s[32,51]=-1.1,s[32,52]=-0.7,s[32,53]=-0.7,s[32,54]=-0.8,s[32,55]=0.6,s[32,56]=0.1,s[32,57]=-0.9,s[32,58]=-0.6,s[32,59]=-0.7,s[32,60]=0.2 s[33,1]=0.9,s[33,2]=-0.2,s[33,3]=-1.1,s[33,4]=0.2,s[33,5]=0.6,s[33,6]=0.8,s[33,7]=0.0,s[33,8]=1.0,s[33,9]=0.2,s[33,10]=-0.5,s[33,11]=-0.1,s[33,12]=-0.7,s[33,13]=-0.4,s[33,14]=0.6,s[33,15]=-0.6 s[33,16]=0.4,s[33,17]=-0.6,s[33,18]=0.0,s[33,19]=1.1,s[33,20]=-0.9,s[33,21]=-0.7,s[33,22]=-0.8,s[33,23]=0.3,s[33,24]=-0.2,s[33,25]=1.0,s[33,26]=-0.6,s[33,27]=-0.2,s[33,28]=1.0,s[33,29]=-0.5,s[33,30]=0.6 s[33,31]=0.6,s[33,32]=-0.1,s[33,33]=-0.7,s[33,34]=-0.2,s[33,35]=1.1,s[33,36]=1.1,s[33,37]=0.4,s[33,38]=-0.9,s[33,39]=0.1,s[33,40]=1.2,s[33,41]=1.0,s[33,42]=-1.1,s[33,43]=0.0,s[33,44]=0.0,s[33,45]=-1.0 s[33,46]=-1.1,s[33,47]=0.7,s[33,48]=-0.7,s[33,49]=1.0,s[33,50]=-1.0,s[33,51]=-0.2,s[33,52]=-1.0,s[33,53]=-0.7,s[33,54]=-0.7,s[33,55]=0.9,s[33,56]=-0.9,s[33,57]=0.0,s[33,58]=0.2,s[33,59]=0.6,s[33,60]=-1.1 s[34,1]=0.3,s[34,2]=-0.5,s[34,3]=1.1,s[34,4]=0.2,s[34,5]=-1.1,s[34,6]=-0.1,s[34,7]=1.0,s[34,8]=0.7,s[34,9]=-0.4,s[34,10]=-1.0,s[34,11]=0.6,s[34,12]=-0.6,s[34,13]=0.2,s[34,14]=-1.0,s[34,15]=0.1 s[34,16]=-0.5,s[34,17]=-0.7,s[34,18]=-0.6,s[34,19]=0.5,s[34,20]=-0.7,s[34,21]=0.6,s[34,22]=0.3,s[34,23]=1.0,s[34,24]=0.8,s[34,25]=-0.5,s[34,26]=-0.8,s[34,27]=-1.2,s[34,28]=1.1,s[34,29]=0.7,s[34,30]=0.5 s[34,31]=0.7,s[34,32]=0.3,s[34,33]=-0.7,s[34,34]=-0.5,s[34,35]=1.0,s[34,36]=-1.2,s[34,37]=-0.2,s[34,38]=0.0,s[34,39]=-0.5,s[34,40]=1.0,s[34,41]=0.3,s[34,42]=-0.1,s[34,43]=-0.1,s[34,44]=-0.7,s[34,45]=0.0 s[34,46]=-1.0,s[34,47]=0.1,s[34,48]=0.3,s[34,49]=-1.1,s[34,50]=1.0,s[34,51]=0.5,s[34,52]=-0.5,s[34,53]=-0.5,s[34,54]=-0.4,s[34,55]=-0.9,s[34,56]=-0.8,s[34,57]=0.6,s[34,58]=0.2,s[34,59]=-0.8,s[34,60]=-0.6 s[35,1]=1.1,s[35,2]=-0.5,s[35,3]=-0.2,s[35,4]=-0.8,s[35,5]=0.6,s[35,6]=-1.2,s[35,7]=1.2,s[35,8]=-0.7,s[35,9]=-0.9,s[35,10]=-0.1,s[35,11]=0.5,s[35,12]=-0.5,s[35,13]=-0.5,s[35,14]=-0.1,s[35,15]=-0.6 s[35,16]=-0.9,s[35,17]=-0.1,s[35,18]=0.2,s[35,19]=-0.8,s[35,20]=-0.7,s[35,21]=0.5,s[35,22]=0.6,s[35,23]=-0.2,s[35,24]=0.0,s[35,25]=-0.8,s[35,26]=-0.8,s[35,27]=0.7,s[35,28]=0.7,s[35,29]=0.5,s[35,30]=-0.1 s[35,31]=-1.1,s[35,32]=-0.8,s[35,33]=-0.4,s[35,34]=0.0,s[35,35]=-0.8,s[35,36]=-1.1,s[35,37]=0.1,s[35,38]=-0.1,s[35,39]=-0.5,s[35,40]=-0.4,s[35,41]=-0.9,s[35,42]=0.4,s[35,43]=0.6,s[35,44]=1.2,s[35,45]=1.1 s[35,46]=0.8,s[35,47]=-1.1,s[35,48]=0.3,s[35,49]=-1.0,s[35,50]=0.7,s[35,51]=0.2,s[35,52]=-0.2,s[35,53]=-1.1,s[35,54]=1.0,s[35,55]=-1.0,s[35,56]=0.3,s[35,57]=-0.4,s[35,58]=-0.5,s[35,59]=0.1,s[35,60]=0.2 s[36,1]=-0.7,s[36,2]=1.0,s[36,3]=0.7,s[36,4]=0.0,s[36,5]=0.7,s[36,6]=-0.4,s[36,7]=0.8,s[36,8]=0.9,s[36,9]=-0.8,s[36,10]=-1.1,s[36,11]=1.0,s[36,12]=0.3,s[36,13]=0.2,s[36,14]=-0.3,s[36,15]=0.8 s[36,16]=-1.2,s[36,17]=-0.1,s[36,18]=1.0,s[36,19]=-0.7,s[36,20]=0.9,s[36,21]=0.1,s[36,22]=0.8,s[36,23]=0.1,s[36,24]=0.1,s[36,25]=-1.2,s[36,26]=-0.5,s[36,27]=0.8,s[36,28]=-0.6,s[36,29]=1.0,s[36,30]=-1.0 s[36,31]=0.2,s[36,32]=1.1,s[36,33]=-0.5,s[36,34]=0.3,s[36,35]=-1.2,s[36,36]=0.9,s[36,37]=0.3,s[36,38]=-1.1,s[36,39]=0.4,s[36,40]=-1.2,s[36,41]=-0.2,s[36,42]=-0.2,s[36,43]=-0.2,s[36,44]=-0.1,s[36,45]=0.9 s[36,46]=0.7,s[36,47]=-0.5,s[36,48]=0.2,s[36,49]=0.8,s[36,50]=0.3,s[36,51]=-1.2,s[36,52]=0.3,s[36,53]=-0.3,s[36,54]=-0.9,s[36,55]=-0.4,s[36,56]=-0.9,s[36,57]=0.0,s[36,58]=-0.7,s[36,59]=0.0,s[36,60]=-1.2 s[37,1]=-1.0,s[37,2]=0.7,s[37,3]=-0.8,s[37,4]=-0.5,s[37,5]=1.0,s[37,6]=-1.0,s[37,7]=0.8,s[37,8]=0.6,s[37,9]=0.3,s[37,10]=0.0,s[37,11]=0.9,s[37,12]=0.5,s[37,13]=0.0,s[37,14]=0.6,s[37,15]=1.2 s[37,16]=-0.6,s[37,17]=0.6,s[37,18]=-1.0,s[37,19]=0.8,s[37,20]=-0.9,s[37,21]=-1.0,s[37,22]=1.2,s[37,23]=-0.8,s[37,24]=-0.1,s[37,25]=0.4,s[37,26]=-1.0,s[37,27]=0.1,s[37,28]=-0.7,s[37,29]=-0.5,s[37,30]=-0.8 s[37,31]=0.8,s[37,32]=0.4,s[37,33]=-0.4,s[37,34]=-0.6,s[37,35]=-0.9,s[37,36]=1.2,s[37,37]=-0.1,s[37,38]=-0.5,s[37,39]=-0.4,s[37,40]=0.6,s[37,41]=-1.2,s[37,42]=-0.6,s[37,43]=0.1,s[37,44]=0.1,s[37,45]=0.8 s[37,46]=-1.1,s[37,47]=0.4,s[37,48]=0.2,s[37,49]=-0.2,s[37,50]=0.9,s[37,51]=-0.3,s[37,52]=0.0,s[37,53]=0.6,s[37,54]=0.7,s[37,55]=-1.1,s[37,56]=0.1,s[37,57]=0.0,s[37,58]=0.2,s[37,59]=-0.6,s[37,60]=0.4 s[38,1]=0.3,s[38,2]=0.0,s[38,3]=-0.4,s[38,4]=-0.6,s[38,5]=1.1,s[38,6]=0.4,s[38,7]=1.2,s[38,8]=0.1,s[38,9]=-0.6,s[38,10]=0.5,s[38,11]=-0.8,s[38,12]=-0.9,s[38,13]=0.2,s[38,14]=-0.7,s[38,15]=-0.7 s[38,16]=0.2,s[38,17]=0.0,s[38,18]=1.0,s[38,19]=1.0,s[38,20]=1.2,s[38,21]=0.8,s[38,22]=0.4,s[38,23]=-1.0,s[38,24]=-0.1,s[38,25]=-0.2,s[38,26]=0.6,s[38,27]=0.5,s[38,28]=0.2,s[38,29]=-0.8,s[38,30]=1.0 s[38,31]=-0.5,s[38,32]=1.1,s[38,33]=-0.9,s[38,34]=-0.2,s[38,35]=0.4,s[38,36]=0.0,s[38,37]=-0.3,s[38,38]=-0.6,s[38,39]=-0.8,s[38,40]=-1.2,s[38,41]=-0.2,s[38,42]=-0.7,s[38,43]=-0.6,s[38,44]=-0.2,s[38,45]=-0.7 s[38,46]=0.0,s[38,47]=-1.2,s[38,48]=-0.4,s[38,49]=-0.2,s[38,50]=0.6,s[38,51]=0.1,s[38,52]=0.8,s[38,53]=-0.3,s[38,54]=0.4,s[38,55]=-0.7,s[38,56]=-1.0,s[38,57]=-0.5,s[38,58]=0.8,s[38,59]=-0.8,s[38,60]=-0.2 s[39,1]=-0.6,s[39,2]=0.8,s[39,3]=-0.9,s[39,4]=0.1,s[39,5]=0.0,s[39,6]=0.8,s[39,7]=0.3,s[39,8]=-0.8,s[39,9]=0.2,s[39,10]=0.7,s[39,11]=0.0,s[39,12]=0.7,s[39,13]=1.2,s[39,14]=-1.1,s[39,15]=0.4 s[39,16]=0.9,s[39,17]=-1.0,s[39,18]=1.2,s[39,19]=-0.5,s[39,20]=-0.8,s[39,21]=0.1,s[39,22]=-1.1,s[39,23]=0.6,s[39,24]=0.8,s[39,25]=-0.6,s[39,26]=-0.6,s[39,27]=1.0,s[39,28]=-0.6,s[39,29]=0.8,s[39,30]=0.2 s[39,31]=0.9,s[39,32]=-0.9,s[39,33]=0.5,s[39,34]=-1.2,s[39,35]=1.1,s[39,36]=0.1,s[39,37]=1.2,s[39,38]=1.2,s[39,39]=-0.5,s[39,40]=0.7,s[39,41]=1.0,s[39,42]=0.9,s[39,43]=-0.4,s[39,44]=-0.6,s[39,45]=0.5 s[39,46]=0.4,s[39,47]=-0.8,s[39,48]=0.5,s[39,49]=-0.8,s[39,50]=-0.2,s[39,51]=1.1,s[39,52]=1.1,s[39,53]=-0.8,s[39,54]=-1.2,s[39,55]=-0.5,s[39,56]=-0.4,s[39,57]=0.1,s[39,58]=0.8,s[39,59]=-0.9,s[39,60]=0.1 s[40,1]=0.0,s[40,2]=0.8,s[40,3]=0.3,s[40,4]=-0.7,s[40,5]=0.3,s[40,6]=0.0,s[40,7]=-1.2,s[40,8]=0.3,s[40,9]=-0.8,s[40,10]=-0.2,s[40,11]=0.4,s[40,12]=-0.6,s[40,13]=-0.9,s[40,14]=-0.2,s[40,15]=-0.9 s[40,16]=-0.4,s[40,17]=-0.4,s[40,18]=-0.9,s[40,19]=0.1,s[40,20]=-1.2,s[40,21]=1.2,s[40,22]=-0.3,s[40,23]=-0.4,s[40,24]=-0.1,s[40,25]=-0.9,s[40,26]=-1.0,s[40,27]=0.8,s[40,28]=0.8,s[40,29]=-0.6,s[40,30]=-0.9 s[40,31]=0.9,s[40,32]=-1.1,s[40,33]=-0.5,s[40,34]=-0.3,s[40,35]=-0.9,s[40,36]=0.6,s[40,37]=0.9,s[40,38]=0.9,s[40,39]=-0.9,s[40,40]=1.2,s[40,41]=-0.9,s[40,42]=-1.2,s[40,43]=0.5,s[40,44]=-0.1,s[40,45]=0.9 s[40,46]=-1.0,s[40,47]=1.2,s[40,48]=-0.7,s[40,49]=-0.9,s[40,50]=1.1,s[40,51]=0.1,s[40,52]=-0.6,s[40,53]=0.9,s[40,54]=0.7,s[40,55]=0.0,s[40,56]=-0.2,s[40,57]=-1.0,s[40,58]=0.6,s[40,59]=1.1,s[40,60]=-0.7 s[41,1]=-0.6,s[41,2]=-0.9,s[41,3]=-0.9,s[41,4]=-0.3,s[41,5]=-0.6,s[41,6]=-0.4,s[41,7]=0.8,s[41,8]=0.4,s[41,9]=0.8,s[41,10]=-0.7,s[41,11]=-0.4,s[41,12]=-0.4,s[41,13]=-0.1,s[41,14]=0.6,s[41,15]=0.3 s[41,16]=0.2,s[41,17]=-1.0,s[41,18]=0.7,s[41,19]=-1.1,s[41,20]=0.8,s[41,21]=-0.1,s[41,22]=-0.1,s[41,23]=-0.8,s[41,24]=-0.4,s[41,25]=0.7,s[41,26]=-1.1,s[41,27]=0.6,s[41,28]=-0.3,s[41,29]=0.1,s[41,30]=0.3 s[41,31]=1.2,s[41,32]=-0.4,s[41,33]=0.6,s[41,34]=-1.2,s[41,35]=-0.2,s[41,36]=0.4,s[41,37]=-0.7,s[41,38]=0.6,s[41,39]=0.7,s[41,40]=0.8,s[41,41]=0.7,s[41,42]=-0.6,s[41,43]=-0.2,s[41,44]=0.1,s[41,45]=-0.3 s[41,46]=0.4,s[41,47]=1.2,s[41,48]=-1.1,s[41,49]=-0.1,s[41,50]=-0.7,s[41,51]=0.4,s[41,52]=-0.3,s[41,53]=-0.2,s[41,54]=-0.2,s[41,55]=-0.7,s[41,56]=-1.1,s[41,57]=0.2,s[41,58]=0.5,s[41,59]=0.5,s[41,60]=-0.2 s[42,1]=0.1,s[42,2]=-0.2,s[42,3]=-0.2,s[42,4]=-0.6,s[42,5]=0.6,s[42,6]=-1.0,s[42,7]=1.0,s[42,8]=0.7,s[42,9]=-1.1,s[42,10]=-1.2,s[42,11]=-0.3,s[42,12]=-1.1,s[42,13]=-0.7,s[42,14]=0.3,s[42,15]=-0.1 s[42,16]=-0.5,s[42,17]=-1.2,s[42,18]=0.6,s[42,19]=0.9,s[42,20]=-0.5,s[42,21]=0.3,s[42,22]=-1.1,s[42,23]=-0.9,s[42,24]=-0.1,s[42,25]=-0.1,s[42,26]=0.9,s[42,27]=0.7,s[42,28]=0.4,s[42,29]=-0.4,s[42,30]=-0.3 s[42,31]=-0.9,s[42,32]=1.1,s[42,33]=0.3,s[42,34]=-0.1,s[42,35]=-1.0,s[42,36]=0.7,s[42,37]=-0.5,s[42,38]=1.2,s[42,39]=-0.6,s[42,40]=1.2,s[42,41]=-1.0,s[42,42]=-0.8,s[42,43]=-0.9,s[42,44]=0.1,s[42,45]=-0.3 s[42,46]=-0.4,s[42,47]=1.1,s[42,48]=0.6,s[42,49]=-1.2,s[42,50]=-0.3,s[42,51]=0.0,s[42,52]=-0.2,s[42,53]=0.1,s[42,54]=-0.9,s[42,55]=0.5,s[42,56]=0.1,s[42,57]=0.0,s[42,58]=-1.1,s[42,59]=-0.1,s[42,60]=-1.2 s[43,1]=1.0,s[43,2]=-0.9,s[43,3]=-0.9,s[43,4]=0.5,s[43,5]=-0.8,s[43,6]=-1.1,s[43,7]=-1.1,s[43,8]=-1.2,s[43,9]=0.9,s[43,10]=1.2,s[43,11]=1.0,s[43,12]=-0.9,s[43,13]=-1.1,s[43,14]=-0.9,s[43,15]=0.1 s[43,16]=0.5,s[43,17]=0.2,s[43,18]=-0.6,s[43,19]=0.6,s[43,20]=-1.1,s[43,21]=-0.1,s[43,22]=0.0,s[43,23]=-1.0,s[43,24]=-0.7,s[43,25]=1.1,s[43,26]=-0.6,s[43,27]=0.1,s[43,28]=0.9,s[43,29]=1.1,s[43,30]=0.9 s[43,31]=1.1,s[43,32]=0.4,s[43,33]=1.1,s[43,34]=-0.1,s[43,35]=-0.7,s[43,36]=-0.4,s[43,37]=-0.6,s[43,38]=0.1,s[43,39]=0.6,s[43,40]=-0.6,s[43,41]=-0.2,s[43,42]=0.1,s[43,43]=-0.8,s[43,44]=0.3,s[43,45]=1.2 s[43,46]=0.6,s[43,47]=-1.0,s[43,48]=1.1,s[43,49]=0.3,s[43,50]=-0.7,s[43,51]=0.0,s[43,52]=-0.1,s[43,53]=1.2,s[43,54]=-0.2,s[43,55]=-1.0,s[43,56]=-0.2,s[43,57]=0.1,s[43,58]=0.9,s[43,59]=-1.2,s[43,60]=0.1 s[44,1]=1.0,s[44,2]=-1.0,s[44,3]=0.9,s[44,4]=-1.2,s[44,5]=0.5,s[44,6]=0.3,s[44,7]=-0.1,s[44,8]=-0.1,s[44,9]=-0.8,s[44,10]=1.0,s[44,11]=-0.3,s[44,12]=1.0,s[44,13]=-0.2,s[44,14]=1.1,s[44,15]=-0.7 s[44,16]=-0.8,s[44,17]=-0.6,s[44,18]=-1.0,s[44,19]=0.1,s[44,20]=0.1,s[44,21]=0.3,s[44,22]=1.2,s[44,23]=0.9,s[44,24]=0.5,s[44,25]=0.2,s[44,26]=0.8,s[44,27]=-0.5,s[44,28]=-0.6,s[44,29]=-0.3,s[44,30]=-0.3 s[44,31]=-0.1,s[44,32]=0.7,s[44,33]=0.7,s[44,34]=-0.3,s[44,35]=0.3,s[44,36]=-1.1,s[44,37]=-1.1,s[44,38]=-0.1,s[44,39]=-1.1,s[44,40]=-0.9,s[44,41]=-1.1,s[44,42]=-0.5,s[44,43]=1.0,s[44,44]=0.5,s[44,45]=0.0 s[44,46]=-0.5,s[44,47]=-0.5,s[44,48]=0.6,s[44,49]=-0.8,s[44,50]=-0.3,s[44,51]=1.1,s[44,52]=-0.5,s[44,53]=-0.5,s[44,54]=0.4,s[44,55]=-1.2,s[44,56]=0.1,s[44,57]=0.4,s[44,58]=0.0,s[44,59]=-1.1,s[44,60]=-1.2 s[45,1]=-1.0,s[45,2]=0.5,s[45,3]=1.2,s[45,4]=-0.6,s[45,5]=-0.1,s[45,6]=-0.4,s[45,7]=0.8,s[45,8]=-0.8,s[45,9]=0.6,s[45,10]=-0.2,s[45,11]=0.2,s[45,12]=0.1,s[45,13]=0.2,s[45,14]=0.5,s[45,15]=0.6 s[45,16]=1.1,s[45,17]=0.4,s[45,18]=-0.4,s[45,19]=-0.1,s[45,20]=0.2,s[45,21]=0.8,s[45,22]=0.0,s[45,23]=-0.9,s[45,24]=-0.6,s[45,25]=0.1,s[45,26]=0.1,s[45,27]=-1.0,s[45,28]=1.0,s[45,29]=-0.4,s[45,30]=0.1 s[45,31]=0.0,s[45,32]=-0.4,s[45,33]=1.1,s[45,34]=-1.2,s[45,35]=0.6,s[45,36]=-0.8,s[45,37]=-0.1,s[45,38]=0.5,s[45,39]=1.2,s[45,40]=0.9,s[45,41]=0.9,s[45,42]=0.7,s[45,43]=0.5,s[45,44]=0.2,s[45,45]=-0.3 s[45,46]=0.2,s[45,47]=-1.2,s[45,48]=-1.1,s[45,49]=-0.2,s[45,50]=0.6,s[45,51]=-1.2,s[45,52]=-0.7,s[45,53]=-1.2,s[45,54]=0.4,s[45,55]=0.1,s[45,56]=-0.6,s[45,57]=0.8,s[45,58]=0.4,s[45,59]=1.0,s[45,60]=-0.7 s[46,1]=-0.4,s[46,2]=0.4,s[46,3]=0.6,s[46,4]=-0.6,s[46,5]=-0.4,s[46,6]=-1.1,s[46,7]=-0.2,s[46,8]=-0.9,s[46,9]=0.0,s[46,10]=0.3,s[46,11]=-0.1,s[46,12]=0.8,s[46,13]=-0.9,s[46,14]=0.5,s[46,15]=-0.7 s[46,16]=0.7,s[46,17]=-0.5,s[46,18]=-1.2,s[46,19]=-0.1,s[46,20]=1.1,s[46,21]=-1.2,s[46,22]=-0.6,s[46,23]=1.1,s[46,24]=0.4,s[46,25]=-0.7,s[46,26]=0.4,s[46,27]=1.2,s[46,28]=-1.1,s[46,29]=-0.2,s[46,30]=-0.8 s[46,31]=-0.3,s[46,32]=-0.6,s[46,33]=0.0,s[46,34]=-0.7,s[46,35]=-0.6,s[46,36]=-0.8,s[46,37]=-1.2,s[46,38]=-0.7,s[46,39]=0.2,s[46,40]=0.4,s[46,41]=-0.3,s[46,42]=1.2,s[46,43]=-0.9,s[46,44]=-0.8,s[46,45]=1.0 s[46,46]=-0.6,s[46,47]=-0.1,s[46,48]=-0.9,s[46,49]=0.0,s[46,50]=0.2,s[46,51]=0.5,s[46,52]=-0.8,s[46,53]=-0.7,s[46,54]=0.2,s[46,55]=-0.6,s[46,56]=0.5,s[46,57]=0.3,s[46,58]=-0.3,s[46,59]=-0.2,s[46,60]=-0.1 s[47,1]=0.4,s[47,2]=-0.5,s[47,3]=0.4,s[47,4]=-0.1,s[47,5]=0.8,s[47,6]=-0.1,s[47,7]=-1.1,s[47,8]=0.2,s[47,9]=0.8,s[47,10]=1.1,s[47,11]=-0.1,s[47,12]=-1.2,s[47,13]=0.2,s[47,14]=1.1,s[47,15]=-0.5 s[47,16]=-0.1,s[47,17]=-1.0,s[47,18]=-0.1,s[47,19]=0.3,s[47,20]=0.1,s[47,21]=1.0,s[47,22]=-0.2,s[47,23]=1.1,s[47,24]=0.9,s[47,25]=-0.6,s[47,26]=0.8,s[47,27]=-0.6,s[47,28]=-1.2,s[47,29]=0.3,s[47,30]=0.0 s[47,31]=1.1,s[47,32]=0.2,s[47,33]=1.0,s[47,34]=0.0,s[47,35]=0.6,s[47,36]=0.8,s[47,37]=-0.3,s[47,38]=-0.8,s[47,39]=0.6,s[47,40]=0.1,s[47,41]=-0.7,s[47,42]=-1.0,s[47,43]=-0.5,s[47,44]=-0.5,s[47,45]=-0.3 s[47,46]=-0.5,s[47,47]=-0.6,s[47,48]=0.9,s[47,49]=1.2,s[47,50]=-0.2,s[47,51]=0.0,s[47,52]=-0.1,s[47,53]=-1.1,s[47,54]=0.6,s[47,55]=-0.9,s[47,56]=1.1,s[47,57]=-1.1,s[47,58]=-0.1,s[47,59]=-0.4,s[47,60]=-0.3 s[48,1]=1.2,s[48,2]=-1.2,s[48,3]=-0.7,s[48,4]=-1.0,s[48,5]=-0.1,s[48,6]=0.2,s[48,7]=0.6,s[48,8]=1.2,s[48,9]=1.0,s[48,10]=-0.5,s[48,11]=0.1,s[48,12]=0.6,s[48,13]=0.3,s[48,14]=0.3,s[48,15]=-0.3 s[48,16]=1.0,s[48,17]=0.0,s[48,18]=-1.2,s[48,19]=-0.4,s[48,20]=0.7,s[48,21]=-0.7,s[48,22]=-0.7,s[48,23]=0.4,s[48,24]=0.4,s[48,25]=-0.3,s[48,26]=-1.2,s[48,27]=-0.6,s[48,28]=-0.5,s[48,29]=1.1,s[48,30]=0.5 s[48,31]=-0.1,s[48,32]=-0.8,s[48,33]=-1.2,s[48,34]=-0.5,s[48,35]=0.2,s[48,36]=0.2,s[48,37]=-0.4,s[48,38]=-0.4,s[48,39]=-1.2,s[48,40]=-0.1,s[48,41]=0.3,s[48,42]=0.1,s[48,43]=0.3,s[48,44]=-0.2,s[48,45]=1.0 s[48,46]=-0.6,s[48,47]=0.6,s[48,48]=0.6,s[48,49]=1.2,s[48,50]=-1.2,s[48,51]=-1.1,s[48,52]=-0.7,s[48,53]=-0.4,s[48,54]=-0.1,s[48,55]=-0.7,s[48,56]=-0.9,s[48,57]=0.3,s[48,58]=0.9,s[48,59]=0.6,s[48,60]=-0.5 s[49,1]=-0.2,s[49,2]=-0.3,s[49,3]=0.2,s[49,4]=-0.3,s[49,5]=-0.8,s[49,6]=-0.9,s[49,7]=-0.5,s[49,8]=-0.4,s[49,9]=-1.1,s[49,10]=0.9,s[49,11]=0.3,s[49,12]=-0.3,s[49,13]=-0.7,s[49,14]=-0.5,s[49,15]=0.6 s[49,16]=0.1,s[49,17]=-0.3,s[49,18]=0.0,s[49,19]=-0.5,s[49,20]=0.7,s[49,21]=0.0,s[49,22]=0.6,s[49,23]=-0.7,s[49,24]=1.2,s[49,25]=-1.1,s[49,26]=-0.8,s[49,27]=0.7,s[49,28]=0.9,s[49,29]=-1.2,s[49,30]=-0.2 s[49,31]=0.9,s[49,32]=0.3,s[49,33]=-1.2,s[49,34]=-1.1,s[49,35]=0.7,s[49,36]=1.0,s[49,37]=-1.2,s[49,38]=-1.1,s[49,39]=1.2,s[49,40]=0.0,s[49,41]=-0.9,s[49,42]=0.8,s[49,43]=-0.3,s[49,44]=-1.1,s[49,45]=-0.7 s[49,46]=-0.9,s[49,47]=1.2,s[49,48]=0.4,s[49,49]=0.2,s[49,50]=-1.2,s[49,51]=1.1,s[49,52]=-1.1,s[49,53]=-0.3,s[49,54]=-0.5,s[49,55]=-0.6,s[49,56]=0.2,s[49,57]=-0.5,s[49,58]=-0.6,s[49,59]=-0.8,s[49,60]=-0.2 s[50,1]=0.5,s[50,2]=-0.2,s[50,3]=-0.5,s[50,4]=-0.8,s[50,5]=1.2,s[50,6]=-0.4,s[50,7]=-0.6,s[50,8]=-0.8,s[50,9]=-0.8,s[50,10]=1.2,s[50,11]=0.1,s[50,12]=0.3,s[50,13]=0.4,s[50,14]=0.3,s[50,15]=-0.3 s[50,16]=-1.1,s[50,17]=-0.9,s[50,18]=0.5,s[50,19]=1.1,s[50,20]=-1.2,s[50,21]=0.2,s[50,22]=-0.7,s[50,23]=0.7,s[50,24]=-0.7,s[50,25]=0.1,s[50,26]=-0.4,s[50,27]=-0.5,s[50,28]=1.2,s[50,29]=-0.1,s[50,30]=-1.0 s[50,31]=0.8,s[50,32]=-0.3,s[50,33]=0.0,s[50,34]=-0.5,s[50,35]=-0.6,s[50,36]=-0.2,s[50,37]=0.3,s[50,38]=0.1,s[50,39]=-0.9,s[50,40]=-0.1,s[50,41]=0.6,s[50,42]=0.7,s[50,43]=0.8,s[50,44]=-0.4,s[50,45]=-0.2 s[50,46]=0.6,s[50,47]=-0.5,s[50,48]=1.1,s[50,49]=-0.4,s[50,50]=0.4,s[50,51]=0.9,s[50,52]=-0.2,s[50,53]=-1.2,s[50,54]=-0.2,s[50,55]=0.0,s[50,56]=-0.1,s[50,57]=0.0,s[50,58]=0.5,s[50,59]=0.0,s[50,60]=-1.1 s[51,1]=-0.3,s[51,2]=0.1,s[51,3]=-0.1,s[51,4]=-0.5,s[51,5]=0.4,s[51,6]=-0.5,s[51,7]=0.4,s[51,8]=-0.5,s[51,9]=1.0,s[51,10]=0.4,s[51,11]=0.2,s[51,12]=0.8,s[51,13]=-0.4,s[51,14]=0.7,s[51,15]=-0.7 s[51,16]=-0.6,s[51,17]=-0.1,s[51,18]=-0.1,s[51,19]=-0.3,s[51,20]=-1.0,s[51,21]=-0.8,s[51,22]=1.2,s[51,23]=0.7,s[51,24]=-0.9,s[51,25]=0.4,s[51,26]=1.0,s[51,27]=0.1,s[51,28]=-0.1,s[51,29]=1.2,s[51,30]=0.7 s[51,31]=0.7,s[51,32]=1.0,s[51,33]=1.0,s[51,34]=-0.5,s[51,35]=-1.1,s[51,36]=-0.5,s[51,37]=-0.5,s[51,38]=-0.4,s[51,39]=-0.9,s[51,40]=1.2,s[51,41]=-0.7,s[51,42]=0.6,s[51,43]=0.3,s[51,44]=0.4,s[51,45]=0.1 s[51,46]=-0.2,s[51,47]=-0.5,s[51,48]=1.0,s[51,49]=-0.7,s[51,50]=0.6,s[51,51]=-0.4,s[51,52]=0.9,s[51,53]=0.0,s[51,54]=-0.1,s[51,55]=-0.9,s[51,56]=1.2,s[51,57]=1.1,s[51,58]=0.7,s[51,59]=-0.3,s[51,60]=-0.3 s[52,1]=-0.6,s[52,2]=-0.8,s[52,3]=-1.1,s[52,4]=-0.9,s[52,5]=-1.1,s[52,6]=1.0,s[52,7]=1.0,s[52,8]=-1.1,s[52,9]=0.5,s[52,10]=-1.0,s[52,11]=1.0,s[52,12]=1.2,s[52,13]=-0.7,s[52,14]=-0.1,s[52,15]=0.0 s[52,16]=0.4,s[52,17]=-0.7,s[52,18]=0.4,s[52,19]=-1.2,s[52,20]=0.2,s[52,21]=0.0,s[52,22]=0.9,s[52,23]=-0.3,s[52,24]=1.0,s[52,25]=-1.0,s[52,26]=-0.1,s[52,27]=-0.5,s[52,28]=0.9,s[52,29]=0.6,s[52,30]=0.6 s[52,31]=-0.4,s[52,32]=0.8,s[52,33]=0.5,s[52,34]=-0.4,s[52,35]=0.3,s[52,36]=1.2,s[52,37]=-0.8,s[52,38]=0.2,s[52,39]=0.2,s[52,40]=-0.5,s[52,41]=0.4,s[52,42]=0.6,s[52,43]=-0.8,s[52,44]=-0.2,s[52,45]=-1.2 s[52,46]=-1.2,s[52,47]=-1.1,s[52,48]=0.3,s[52,49]=1.2,s[52,50]=-1.1,s[52,51]=-0.1,s[52,52]=1.1,s[52,53]=0.5,s[52,54]=0.0,s[52,55]=0.0,s[52,56]=0.6,s[52,57]=-0.7,s[52,58]=-0.8,s[52,59]=-0.1,s[52,60]=0.4 s[53,1]=1.0,s[53,2]=0.3,s[53,3]=0.2,s[53,4]=-0.7,s[53,5]=-0.7,s[53,6]=0.9,s[53,7]=-0.7,s[53,8]=-0.1,s[53,9]=-0.8,s[53,10]=0.6,s[53,11]=-0.2,s[53,12]=-0.2,s[53,13]=0.1,s[53,14]=-0.9,s[53,15]=-1.2 s[53,16]=-1.2,s[53,17]=-1.1,s[53,18]=0.2,s[53,19]=-1.0,s[53,20]=0.1,s[53,21]=1.2,s[53,22]=-0.2,s[53,23]=-1.1,s[53,24]=0.7,s[53,25]=0.9,s[53,26]=0.6,s[53,27]=-0.2,s[53,28]=0.6,s[53,29]=0.4,s[53,30]=0.2 s[53,31]=-1.1,s[53,32]=0.1,s[53,33]=1.2,s[53,34]=-0.4,s[53,35]=1.0,s[53,36]=-1.0,s[53,37]=-0.6,s[53,38]=0.3,s[53,39]=-0.7,s[53,40]=0.6,s[53,41]=-0.5,s[53,42]=-1.1,s[53,43]=0.0,s[53,44]=-0.3,s[53,45]=-1.1 s[53,46]=0.6,s[53,47]=-1.1,s[53,48]=0.9,s[53,49]=-0.8,s[53,50]=0.3,s[53,51]=-0.1,s[53,52]=-0.1,s[53,53]=0.7,s[53,54]=-0.8,s[53,55]=-1.0,s[53,56]=0.0,s[53,57]=-0.9,s[53,58]=-1.1,s[53,59]=0.4,s[53,60]=-0.9 s[54,1]=0.1,s[54,2]=-0.1,s[54,3]=0.9,s[54,4]=-1.0,s[54,5]=1.1,s[54,6]=0.1,s[54,7]=0.0,s[54,8]=-1.2,s[54,9]=-1.1,s[54,10]=-0.1,s[54,11]=0.1,s[54,12]=1.2,s[54,13]=-0.4,s[54,14]=0.8,s[54,15]=0.4 s[54,16]=1.2,s[54,17]=0.1,s[54,18]=-0.7,s[54,19]=-0.8,s[54,20]=1.0,s[54,21]=1.0,s[54,22]=-0.7,s[54,23]=-1.2,s[54,24]=0.7,s[54,25]=-1.1,s[54,26]=0.9,s[54,27]=0.9,s[54,28]=0.3,s[54,29]=0.4,s[54,30]=-0.9 s[54,31]=0.4,s[54,32]=1.0,s[54,33]=1.1,s[54,34]=-0.8,s[54,35]=-0.9,s[54,36]=-0.4,s[54,37]=-0.9,s[54,38]=0.6,s[54,39]=1.2,s[54,40]=0.7,s[54,41]=0.7,s[54,42]=1.0,s[54,43]=0.8,s[54,44]=-1.1,s[54,45]=-0.3 s[54,46]=-0.3,s[54,47]=1.0,s[54,48]=-0.9,s[54,49]=0.5,s[54,50]=1.2,s[54,51]=1.0,s[54,52]=0.4,s[54,53]=-1.2,s[54,54]=-0.5,s[54,55]=0.0,s[54,56]=-0.4,s[54,57]=1.2,s[54,58]=-0.5,s[54,59]=-0.4,s[54,60]=-0.1 s[55,1]=-0.3,s[55,2]=1.0,s[55,3]=-0.4,s[55,4]=0.0,s[55,5]=-1.2,s[55,6]=0.2,s[55,7]=-0.9,s[55,8]=0.1,s[55,9]=-0.3,s[55,10]=1.2,s[55,11]=-0.8,s[55,12]=1.2,s[55,13]=1.2,s[55,14]=-0.1,s[55,15]=-0.5 s[55,16]=-1.1,s[55,17]=1.1,s[55,18]=-0.8,s[55,19]=-0.9,s[55,20]=-1.1,s[55,21]=-0.9,s[55,22]=-0.4,s[55,23]=0.6,s[55,24]=0.4,s[55,25]=0.7,s[55,26]=0.2,s[55,27]=-0.9,s[55,28]=1.0,s[55,29]=-0.1,s[55,30]=0.1 s[55,31]=1.0,s[55,32]=-1.0,s[55,33]=0.9,s[55,34]=-0.4,s[55,35]=0.0,s[55,36]=-0.8,s[55,37]=-1.1,s[55,38]=-0.9,s[55,39]=1.1,s[55,40]=-0.1,s[55,41]=0.5,s[55,42]=0.4,s[55,43]=0.5,s[55,44]=0.7,s[55,45]=1.2 s[55,46]=-0.7,s[55,47]=-0.3,s[55,48]=0.1,s[55,49]=0.4,s[55,50]=1.1,s[55,51]=0.6,s[55,52]=0.8,s[55,53]=-0.5,s[55,54]=-0.2,s[55,55]=0.7,s[55,56]=-0.8,s[55,57]=-0.4,s[55,58]=-0.2,s[55,59]=-0.4,s[55,60]=-1.0 s[56,1]=-0.5,s[56,2]=0.5,s[56,3]=0.6,s[56,4]=-1.1,s[56,5]=-0.5,s[56,6]=1.2,s[56,7]=0.6,s[56,8]=-1.0,s[56,9]=0.2,s[56,10]=0.4,s[56,11]=0.1,s[56,12]=-0.6,s[56,13]=-0.4,s[56,14]=-0.8,s[56,15]=-1.2 s[56,16]=0.2,s[56,17]=1.1,s[56,18]=-0.4,s[56,19]=0.0,s[56,20]=-0.8,s[56,21]=1.2,s[56,22]=-0.2,s[56,23]=0.0,s[56,24]=-0.5,s[56,25]=0.2,s[56,26]=0.9,s[56,27]=0.0,s[56,28]=0.6,s[56,29]=0.6,s[56,30]=-0.2 s[56,31]=1.1,s[56,32]=0.4,s[56,33]=1.1,s[56,34]=0.0,s[56,35]=0.6,s[56,36]=1.1,s[56,37]=-0.1,s[56,38]=-0.5,s[56,39]=1.2,s[56,40]=0.3,s[56,41]=-0.5,s[56,42]=-0.5,s[56,43]=0.8,s[56,44]=0.7,s[56,45]=-0.1 s[56,46]=-1.2,s[56,47]=-0.1,s[56,48]=-0.2,s[56,49]=1.1,s[56,50]=0.6,s[56,51]=-0.9,s[56,52]=-0.7,s[56,53]=0.5,s[56,54]=-1.2,s[56,55]=1.0,s[56,56]=1.1,s[56,57]=0.0,s[56,58]=-0.5,s[56,59]=0.0,s[56,60]=-1.2 s[57,1]=-0.5,s[57,2]=-1.2,s[57,3]=-0.7,s[57,4]=-0.4,s[57,5]=0.1,s[57,6]=0.0,s[57,7]=-0.5,s[57,8]=0.9,s[57,9]=0.0,s[57,10]=-0.7,s[57,11]=0.6,s[57,12]=-1.0,s[57,13]=0.2,s[57,14]=-0.5,s[57,15]=0.2 s[57,16]=-0.2,s[57,17]=-1.0,s[57,18]=-0.2,s[57,19]=0.3,s[57,20]=0.4,s[57,21]=-1.0,s[57,22]=0.7,s[57,23]=0.1,s[57,24]=0.1,s[57,25]=-1.0,s[57,26]=0.1,s[57,27]=-0.5,s[57,28]=-0.1,s[57,29]=-0.4,s[57,30]=-0.1 s[57,31]=0.5,s[57,32]=-0.4,s[57,33]=-1.0,s[57,34]=0.0,s[57,35]=0.3,s[57,36]=0.2,s[57,37]=-0.6,s[57,38]=-0.8,s[57,39]=1.1,s[57,40]=1.0,s[57,41]=0.1,s[57,42]=-1.1,s[57,43]=-0.1,s[57,44]=0.6,s[57,45]=-1.1 s[57,46]=-1.1,s[57,47]=-1.1,s[57,48]=1.2,s[57,49]=-0.2,s[57,50]=-0.1,s[57,51]=-0.5,s[57,52]=-1.0,s[57,53]=-0.5,s[57,54]=0.0,s[57,55]=0.9,s[57,56]=0.5,s[57,57]=-0.5,s[57,58]=-1.0,s[57,59]=0.6,s[57,60]=-0.4 s[58,1]=1.2,s[58,2]=0.3,s[58,3]=-0.7,s[58,4]=-1.2,s[58,5]=0.9,s[58,6]=0.6,s[58,7]=-0.3,s[58,8]=0.0,s[58,9]=0.8,s[58,10]=-0.2,s[58,11]=0.6,s[58,12]=-1.1,s[58,13]=-0.9,s[58,14]=-1.0,s[58,15]=-0.4 s[58,16]=0.8,s[58,17]=0.5,s[58,18]=0.1,s[58,19]=0.3,s[58,20]=-1.2,s[58,21]=1.0,s[58,22]=0.4,s[58,23]=0.0,s[58,24]=1.1,s[58,25]=-0.3,s[58,26]=-0.2,s[58,27]=0.3,s[58,28]=1.2,s[58,29]=-0.6,s[58,30]=-0.4 s[58,31]=-0.9,s[58,32]=0.9,s[58,33]=-0.8,s[58,34]=-0.4,s[58,35]=0.2,s[58,36]=1.0,s[58,37]=-0.1,s[58,38]=0.5,s[58,39]=-0.4,s[58,40]=0.1,s[58,41]=-0.7,s[58,42]=-0.6,s[58,43]=0.9,s[58,44]=0.3,s[58,45]=0.8 s[58,46]=-0.6,s[58,47]=1.1,s[58,48]=1.2,s[58,49]=0.0,s[58,50]=0.5,s[58,51]=-0.4,s[58,52]=-0.8,s[58,53]=-1.0,s[58,54]=-1.2,s[58,55]=1.1,s[58,56]=-1.1,s[58,57]=-0.5,s[58,58]=-1.0,s[58,59]=-1.1,s[58,60]=-0.8 s[59,1]=0.4,s[59,2]=-1.2,s[59,3]=0.1,s[59,4]=-1.1,s[59,5]=-0.6,s[59,6]=0.3,s[59,7]=1.1,s[59,8]=-0.8,s[59,9]=-0.1,s[59,10]=0.6,s[59,11]=0.3,s[59,12]=0.2,s[59,13]=0.4,s[59,14]=-0.8,s[59,15]=1.0 s[59,16]=0.7,s[59,17]=0.3,s[59,18]=1.2,s[59,19]=0.3,s[59,20]=-0.4,s[59,21]=-0.2,s[59,22]=-1.1,s[59,23]=0.9,s[59,24]=0.7,s[59,25]=-0.6,s[59,26]=-0.4,s[59,27]=-0.7,s[59,28]=-0.3,s[59,29]=-1.0,s[59,30]=0.5 s[59,31]=1.1,s[59,32]=0.6,s[59,33]=-0.3,s[59,34]=0.1,s[59,35]=-0.8,s[59,36]=0.0,s[59,37]=-0.1,s[59,38]=-0.4,s[59,39]=0.6,s[59,40]=0.4,s[59,41]=-0.8,s[59,42]=-0.3,s[59,43]=-0.6,s[59,44]=0.8,s[59,45]=-0.9 s[59,46]=-1.2,s[59,47]=0.7,s[59,48]=1.0,s[59,49]=0.1,s[59,50]=-0.4,s[59,51]=0.5,s[59,52]=1.1,s[59,53]=-0.7,s[59,54]=-0.4,s[59,55]=-0.8,s[59,56]=0.1,s[59,57]=0.8,s[59,58]=1.1,s[59,59]=0.3,s[59,60]=-0.5 s[60,1]=1.2,s[60,2]=-0.8,s[60,3]=-0.1,s[60,4]=-0.5,s[60,5]=-0.2,s[60,6]=-0.5,s[60,7]=0.8,s[60,8]=-0.7,s[60,9]=0.3,s[60,10]=0.3,s[60,11]=-0.3,s[60,12]=-0.3,s[60,13]=-0.7,s[60,14]=0.8,s[60,15]=-0.5 s[60,16]=0.0,s[60,17]=0.2,s[60,18]=0.0,s[60,19]=-1.1,s[60,20]=0.0,s[60,21]=0.8,s[60,22]=0.7,s[60,23]=0.3,s[60,24]=-1.2,s[60,25]=0.5,s[60,26]=0.9,s[60,27]=0.9,s[60,28]=-0.8,s[60,29]=-0.1,s[60,30]=-1.2 s[60,31]=-0.6,s[60,32]=0.2,s[60,33]=0.0,s[60,34]=-0.6,s[60,35]=-0.3,s[60,36]=0.9,s[60,37]=0.9,s[60,38]=-0.2,s[60,39]=0.8,s[60,40]=-0.8,s[60,41]=0.4,s[60,42]=-0.3,s[60,43]=-0.5,s[60,44]=-0.1,s[60,45]=1.0 s[60,46]=0.6,s[60,47]=0.0,s[60,48]=-0.5,s[60,49]=-1.0,s[60,50]=0.7,s[60,51]=0.5,s[60,52]=-0.5,s[60,53]=0.9,s[60,54]=-1.1,s[60,55]=-0.3,s[60,56]=0.0,s[60,57]=-0.8,s[60,58]=-1.0,s[60,59]=0.0,s[60,60]=-1.2 s[61,1]=0.0,s[61,2]=0.7,s[61,3]=0.9,s[61,4]=0.4,s[61,5]=-1.0,s[61,6]=0.3,s[61,7]=-1.2,s[61,8]=1.1,s[61,9]=-0.3,s[61,10]=0.1,s[61,11]=-0.8,s[61,12]=-0.3,s[61,13]=-0.1,s[61,14]=-1.1,s[61,15]=-0.3 s[61,16]=-0.8,s[61,17]=0.1,s[61,18]=-0.8,s[61,19]=0.2,s[61,20]=0.7,s[61,21]=0.0,s[61,22]=1.1,s[61,23]=-0.5,s[61,24]=0.8,s[61,25]=0.1,s[61,26]=-0.4,s[61,27]=1.0,s[61,28]=-0.5,s[61,29]=-0.8,s[61,30]=-0.2 s[61,31]=1.0,s[61,32]=1.2,s[61,33]=0.3,s[61,34]=-0.1,s[61,35]=0.3,s[61,36]=-1.2,s[61,37]=-1.1,s[61,38]=-0.9,s[61,39]=1.2,s[61,40]=0.4,s[61,41]=-0.8,s[61,42]=-0.9,s[61,43]=-0.6,s[61,44]=-0.9,s[61,45]=1.2 s[61,46]=0.0,s[61,47]=0.3,s[61,48]=-0.3,s[61,49]=0.4,s[61,50]=1.0,s[61,51]=0.1,s[61,52]=0.8,s[61,53]=1.1,s[61,54]=1.2,s[61,55]=0.8,s[61,56]=-0.8,s[61,57]=0.9,s[61,58]=-0.2,s[61,59]=0.5,s[61,60]=-1.1 s[62,1]=0.8,s[62,2]=-1.2,s[62,3]=-0.7,s[62,4]=0.3,s[62,5]=-0.6,s[62,6]=1.1,s[62,7]=-0.4,s[62,8]=-0.3,s[62,9]=-0.8,s[62,10]=0.7,s[62,11]=-0.9,s[62,12]=0.3,s[62,13]=0.7,s[62,14]=1.2,s[62,15]=-0.5 s[62,16]=-1.1,s[62,17]=-0.7,s[62,18]=1.0,s[62,19]=-0.1,s[62,20]=0.0,s[62,21]=-1.2,s[62,22]=-0.9,s[62,23]=-0.3,s[62,24]=-0.3,s[62,25]=-0.1,s[62,26]=1.0,s[62,27]=-1.0,s[62,28]=0.7,s[62,29]=1.1,s[62,30]=-0.4 s[62,31]=0.7,s[62,32]=-0.9,s[62,33]=-0.3,s[62,34]=-0.7,s[62,35]=0.4,s[62,36]=1.0,s[62,37]=0.5,s[62,38]=-0.2,s[62,39]=0.8,s[62,40]=0.9,s[62,41]=-1.2,s[62,42]=1.1,s[62,43]=0.4,s[62,44]=-0.9,s[62,45]=0.7 s[62,46]=-0.5,s[62,47]=-0.5,s[62,48]=-0.6,s[62,49]=-0.7,s[62,50]=0.8,s[62,51]=1.1,s[62,52]=-1.2,s[62,53]=-0.4,s[62,54]=-0.8,s[62,55]=-0.7,s[62,56]=0.2,s[62,57]=-0.2,s[62,58]=0.4,s[62,59]=-1.1,s[62,60]=-0.7 s[63,1]=-1.2,s[63,2]=0.9,s[63,3]=0.6,s[63,4]=-0.6,s[63,5]=-0.6,s[63,6]=0.9,s[63,7]=-0.3,s[63,8]=-0.8,s[63,9]=0.5,s[63,10]=0.5,s[63,11]=0.3,s[63,12]=-0.3,s[63,13]=1.0,s[63,14]=-0.2,s[63,15]=-0.3 s[63,16]=0.2,s[63,17]=-0.9,s[63,18]=0.2,s[63,19]=0.7,s[63,20]=0.4,s[63,21]=-0.8,s[63,22]=-1.0,s[63,23]=0.7,s[63,24]=0.4,s[63,25]=0.9,s[63,26]=0.4,s[63,27]=-0.2,s[63,28]=-0.7,s[63,29]=0.4,s[63,30]=-0.7 s[63,31]=1.0,s[63,32]=0.8,s[63,33]=0.3,s[63,34]=-1.1,s[63,35]=-0.1,s[63,36]=0.0,s[63,37]=0.0,s[63,38]=0.0,s[63,39]=0.0,s[63,40]=-0.4,s[63,41]=0.0,s[63,42]=-0.2,s[63,43]=0.4,s[63,44]=0.6,s[63,45]=0.8 s[63,46]=-0.5,s[63,47]=0.4,s[63,48]=-0.6,s[63,49]=-0.9,s[63,50]=-1.0,s[63,51]=-0.9,s[63,52]=-1.2,s[63,53]=0.1,s[63,54]=0.4,s[63,55]=-0.5,s[63,56]=0.1,s[63,57]=1.1,s[63,58]=-0.8,s[63,59]=-0.5,s[63,60]=-0.6 s[64,1]=-0.2,s[64,2]=0.2,s[64,3]=-0.3,s[64,4]=0.0,s[64,5]=0.4,s[64,6]=-1.0,s[64,7]=-0.1,s[64,8]=-0.9,s[64,9]=1.2,s[64,10]=-0.6,s[64,11]=-0.7,s[64,12]=-0.4,s[64,13]=1.1,s[64,14]=0.6,s[64,15]=-1.0 s[64,16]=0.7,s[64,17]=0.2,s[64,18]=-0.1,s[64,19]=-1.1,s[64,20]=0.8,s[64,21]=-0.7,s[64,22]=1.2,s[64,23]=0.6,s[64,24]=-0.9,s[64,25]=0.0,s[64,26]=-1.0,s[64,27]=-0.4,s[64,28]=-0.6,s[64,29]=0.1,s[64,30]=0.8 s[64,31]=-1.0,s[64,32]=1.2,s[64,33]=-0.2,s[64,34]=-1.1,s[64,35]=0.3,s[64,36]=-0.4,s[64,37]=0.7,s[64,38]=1.2,s[64,39]=0.1,s[64,40]=-0.6,s[64,41]=-0.1,s[64,42]=-0.4,s[64,43]=-0.5,s[64,44]=-1.0,s[64,45]=0.7 s[64,46]=1.1,s[64,47]=-0.1,s[64,48]=-0.1,s[64,49]=-0.7,s[64,50]=0.2,s[64,51]=-0.7,s[64,52]=0.1,s[64,53]=0.9,s[64,54]=0.7,s[64,55]=-1.0,s[64,56]=0.2,s[64,57]=0.0,s[64,58]=0.1,s[64,59]=0.9,s[64,60]=-1.0 s[65,1]=-1.1,s[65,2]=0.7,s[65,3]=-1.0,s[65,4]=-0.3,s[65,5]=-0.7,s[65,6]=0.6,s[65,7]=0.6,s[65,8]=-0.2,s[65,9]=-0.4,s[65,10]=0.5,s[65,11]=-0.9,s[65,12]=0.7,s[65,13]=0.0,s[65,14]=-1.2,s[65,15]=1.0 s[65,16]=-0.9,s[65,17]=-0.8,s[65,18]=0.6,s[65,19]=0.4,s[65,20]=0.4,s[65,21]=-1.2,s[65,22]=0.7,s[65,23]=0.4,s[65,24]=0.1,s[65,25]=-0.9,s[65,26]=0.1,s[65,27]=-0.2,s[65,28]=0.2,s[65,29]=0.4,s[65,30]=-0.2 s[65,31]=-0.1,s[65,32]=0.7,s[65,33]=0.8,s[65,34]=0.1,s[65,35]=-1.1,s[65,36]=0.0,s[65,37]=-0.2,s[65,38]=-1.0,s[65,39]=1.1,s[65,40]=0.7,s[65,41]=0.1,s[65,42]=-1.1,s[65,43]=0.8,s[65,44]=0.3,s[65,45]=-0.1 s[65,46]=-1.1,s[65,47]=0.1,s[65,48]=-0.8,s[65,49]=1.2,s[65,50]=-0.1,s[65,51]=-0.6,s[65,52]=0.8,s[65,53]=-0.1,s[65,54]=0.7,s[65,55]=1.1,s[65,56]=-0.3,s[65,57]=-0.7,s[65,58]=-0.3,s[65,59]=0.0,s[65,60]=-1.0 s[66,1]=0.1,s[66,2]=-0.3,s[66,3]=-0.5,s[66,4]=-0.9,s[66,5]=0.5,s[66,6]=-1.0,s[66,7]=0.3,s[66,8]=-0.7,s[66,9]=-0.7,s[66,10]=-0.4,s[66,11]=-0.4,s[66,12]=-0.4,s[66,13]=1.1,s[66,14]=-0.8,s[66,15]=-0.9 s[66,16]=0.7,s[66,17]=0.9,s[66,18]=-0.1,s[66,19]=0.5,s[66,20]=-0.1,s[66,21]=0.5,s[66,22]=0.8,s[66,23]=-0.6,s[66,24]=-0.4,s[66,25]=-0.1,s[66,26]=-0.7,s[66,27]=-0.7,s[66,28]=1.1,s[66,29]=-0.6,s[66,30]=-0.5 s[66,31]=0.6,s[66,32]=-0.7,s[66,33]=-0.2,s[66,34]=-0.5,s[66,35]=0.2,s[66,36]=0.3,s[66,37]=0.3,s[66,38]=-0.1,s[66,39]=0.8,s[66,40]=1.1,s[66,41]=0.3,s[66,42]=-1.1,s[66,43]=-0.2,s[66,44]=0.8,s[66,45]=-0.7 s[66,46]=0.1,s[66,47]=0.5,s[66,48]=0.4,s[66,49]=0.6,s[66,50]=1.2,s[66,51]=-0.4,s[66,52]=0.5,s[66,53]=-0.6,s[66,54]=0.9,s[66,55]=-0.2,s[66,56]=0.6,s[66,57]=-0.3,s[66,58]=-0.1,s[66,59]=0.0,s[66,60]=-1.2 s[67,1]=-0.3,s[67,2]=0.7,s[67,3]=-0.9,s[67,4]=-1.0,s[67,5]=-1.0,s[67,6]=0.5,s[67,7]=-0.9,s[67,8]=-1.2,s[67,9]=0.3,s[67,10]=0.8,s[67,11]=1.2,s[67,12]=-0.2,s[67,13]=0.1,s[67,14]=-0.6,s[67,15]=-1.1 s[67,16]=0.4,s[67,17]=0.1,s[67,18]=-1.1,s[67,19]=-0.6,s[67,20]=0.8,s[67,21]=-1.2,s[67,22]=-0.4,s[67,23]=-0.8,s[67,24]=1.2,s[67,25]=0.3,s[67,26]=0.3,s[67,27]=0.6,s[67,28]=0.9,s[67,29]=0.1,s[67,30]=-0.9 s[67,31]=1.0,s[67,32]=-0.9,s[67,33]=-0.6,s[67,34]=-1.1,s[67,35]=-0.9,s[67,36]=1.0,s[67,37]=-1.2,s[67,38]=0.2,s[67,39]=-0.7,s[67,40]=0.1,s[67,41]=0.6,s[67,42]=-0.7,s[67,43]=-0.5,s[67,44]=0.4,s[67,45]=-0.9 s[67,46]=-1.2,s[67,47]=-0.2,s[67,48]=-0.9,s[67,49]=1.2,s[67,50]=0.7,s[67,51]=0.3,s[67,52]=-1.2,s[67,53]=0.6,s[67,54]=0.2,s[67,55]=0.5,s[67,56]=1.1,s[67,57]=1.0,s[67,58]=1.2,s[67,59]=-0.1,s[67,60]=0.1 s[68,1]=0.8,s[68,2]=-1.0,s[68,3]=-1.0,s[68,4]=-0.7,s[68,5]=0.2,s[68,6]=0.3,s[68,7]=-0.7,s[68,8]=0.1,s[68,9]=0.9,s[68,10]=-0.8,s[68,11]=1.0,s[68,12]=-0.5,s[68,13]=1.0,s[68,14]=-0.9,s[68,15]=-0.1 s[68,16]=0.8,s[68,17]=1.0,s[68,18]=1.0,s[68,19]=-1.2,s[68,20]=-0.6,s[68,21]=-0.9,s[68,22]=0.6,s[68,23]=0.1,s[68,24]=0.4,s[68,25]=-1.2,s[68,26]=-0.2,s[68,27]=0.4,s[68,28]=-0.3,s[68,29]=1.1,s[68,30]=-1.0 s[68,31]=-1.2,s[68,32]=-0.6,s[68,33]=0.2,s[68,34]=-0.5,s[68,35]=1.0,s[68,36]=-0.6,s[68,37]=0.7,s[68,38]=0.0,s[68,39]=1.1,s[68,40]=0.3,s[68,41]=0.7,s[68,42]=0.7,s[68,43]=0.5,s[68,44]=-0.9,s[68,45]=-0.2 s[68,46]=0.7,s[68,47]=-0.4,s[68,48]=-0.5,s[68,49]=-0.4,s[68,50]=0.8,s[68,51]=1.0,s[68,52]=-1.1,s[68,53]=-1.0,s[68,54]=-0.4,s[68,55]=-0.4,s[68,56]=-1.1,s[68,57]=-0.9,s[68,58]=1.1,s[68,59]=1.1,s[68,60]=-0.9 s[69,1]=0.5,s[69,2]=1.1,s[69,3]=-0.2,s[69,4]=-0.2,s[69,5]=1.1,s[69,6]=-0.2,s[69,7]=-1.2,s[69,8]=-1.0,s[69,9]=-1.0,s[69,10]=-0.2,s[69,11]=0.5,s[69,12]=-1.0,s[69,13]=-0.3,s[69,14]=-0.8,s[69,15]=-1.2 s[69,16]=1.2,s[69,17]=0.2,s[69,18]=-0.7,s[69,19]=-0.5,s[69,20]=-0.7,s[69,21]=-0.5,s[69,22]=0.1,s[69,23]=-0.3,s[69,24]=-0.6,s[69,25]=-0.9,s[69,26]=-0.8,s[69,27]=1.2,s[69,28]=0.1,s[69,29]=0.3,s[69,30]=0.0 s[69,31]=0.8,s[69,32]=-0.2,s[69,33]=-1.2,s[69,34]=-0.3,s[69,35]=1.2,s[69,36]=-0.5,s[69,37]=0.4,s[69,38]=1.1,s[69,39]=-0.3,s[69,40]=0.3,s[69,41]=0.0,s[69,42]=-0.3,s[69,43]=0.4,s[69,44]=0.3,s[69,45]=-0.2 s[69,46]=0.7,s[69,47]=0.8,s[69,48]=0.5,s[69,49]=0.5,s[69,50]=0.2,s[69,51]=-0.2,s[69,52]=1.0,s[69,53]=0.0,s[69,54]=-0.6,s[69,55]=0.8,s[69,56]=0.8,s[69,57]=0.3,s[69,58]=0.7,s[69,59]=-0.4,s[69,60]=-1.1 s[70,1]=-0.3,s[70,2]=0.3,s[70,3]=-0.1,s[70,4]=0.7,s[70,5]=0.0,s[70,6]=-1.0,s[70,7]=-1.2,s[70,8]=-0.1,s[70,9]=0.2,s[70,10]=-1.2,s[70,11]=-0.5,s[70,12]=-1.0,s[70,13]=1.1,s[70,14]=-0.2,s[70,15]=0.1 s[70,16]=1.0,s[70,17]=0.0,s[70,18]=1.0,s[70,19]=-1.1,s[70,20]=0.6,s[70,21]=-1.2,s[70,22]=0.6,s[70,23]=0.7,s[70,24]=-0.6,s[70,25]=0.9,s[70,26]=-0.7,s[70,27]=0.4,s[70,28]=-0.3,s[70,29]=0.8,s[70,30]=0.4 s[70,31]=0.4,s[70,32]=-1.2,s[70,33]=1.0,s[70,34]=-0.3,s[70,35]=-0.7,s[70,36]=-0.3,s[70,37]=0.8,s[70,38]=0.9,s[70,39]=0.2,s[70,40]=-0.1,s[70,41]=1.2,s[70,42]=0.4,s[70,43]=-0.4,s[70,44]=-0.3,s[70,45]=-0.3 s[70,46]=0.6,s[70,47]=-0.7,s[70,48]=-0.9,s[70,49]=0.2,s[70,50]=-0.8,s[70,51]=-0.7,s[70,52]=-0.5,s[70,53]=0.7,s[70,54]=-0.3,s[70,55]=0.6,s[70,56]=-0.6,s[70,57]=-0.6,s[70,58]=0.5,s[70,59]=1.2,s[70,60]=-0.5 s[71,1]=0.9,s[71,2]=0.1,s[71,3]=0.0,s[71,4]=-1.0,s[71,5]=-0.5,s[71,6]=-0.7,s[71,7]=-1.2,s[71,8]=0.2,s[71,9]=0.0,s[71,10]=-0.3,s[71,11]=0.8,s[71,12]=1.0,s[71,13]=-0.9,s[71,14]=-1.0,s[71,15]=-1.2 s[71,16]=-0.2,s[71,17]=-0.7,s[71,18]=-0.9,s[71,19]=-1.2,s[71,20]=-1.1,s[71,21]=-1.1,s[71,22]=0.4,s[71,23]=0.7,s[71,24]=-0.8,s[71,25]=-0.8,s[71,26]=-0.5,s[71,27]=-1.1,s[71,28]=0.7,s[71,29]=0.8,s[71,30]=0.4 s[71,31]=-0.5,s[71,32]=1.2,s[71,33]=-0.7,s[71,34]=-0.9,s[71,35]=0.4,s[71,36]=1.1,s[71,37]=-0.2,s[71,38]=0.9,s[71,39]=1.0,s[71,40]=-0.3,s[71,41]=-1.2,s[71,42]=0.0,s[71,43]=-1.0,s[71,44]=0.5,s[71,45]=-0.5 s[71,46]=0.9,s[71,47]=-1.2,s[71,48]=-0.3,s[71,49]=-0.8,s[71,50]=0.9,s[71,51]=1.2,s[71,52]=-0.3,s[71,53]=0.5,s[71,54]=-0.7,s[71,55]=-0.2,s[71,56]=-0.2,s[71,57]=-0.6,s[71,58]=0.9,s[71,59]=0.1,s[71,60]=-1.0 s[72,1]=-0.5,s[72,2]=-0.3,s[72,3]=-0.1,s[72,4]=0.2,s[72,5]=0.7,s[72,6]=-0.1,s[72,7]=-0.1,s[72,8]=-0.9,s[72,9]=-0.3,s[72,10]=0.3,s[72,11]=1.1,s[72,12]=-1.2,s[72,13]=0.2,s[72,14]=0.7,s[72,15]=-0.2 s[72,16]=-1.2,s[72,17]=1.0,s[72,18]=-1.1,s[72,19]=0.5,s[72,20]=0.4,s[72,21]=0.1,s[72,22]=-0.6,s[72,23]=0.5,s[72,24]=-0.8,s[72,25]=-0.6,s[72,26]=0.9,s[72,27]=-1.0,s[72,28]=0.9,s[72,29]=0.4,s[72,30]=-0.2 s[72,31]=0.5,s[72,32]=-0.8,s[72,33]=-0.8,s[72,34]=-1.0,s[72,35]=-1.2,s[72,36]=-0.1,s[72,37]=0.7,s[72,38]=0.6,s[72,39]=1.1,s[72,40]=0.3,s[72,41]=-1.1,s[72,42]=-0.4,s[72,43]=0.0,s[72,44]=-0.1,s[72,45]=1.2 s[72,46]=-0.7,s[72,47]=0.9,s[72,48]=-1.1,s[72,49]=-0.7,s[72,50]=0.3,s[72,51]=-0.8,s[72,52]=-0.9,s[72,53]=-1.0,s[72,54]=-1.0,s[72,55]=-0.8,s[72,56]=-1.0,s[72,57]=-0.1,s[72,58]=-1.2,s[72,59]=-1.2,s[72,60]=-1.1 s[73,1]=0.9,s[73,2]=-1.2,s[73,3]=0.7,s[73,4]=-0.8,s[73,5]=0.8,s[73,6]=1.1,s[73,7]=-1.1,s[73,8]=-0.3,s[73,9]=0.2,s[73,10]=-0.3,s[73,11]=-1.2,s[73,12]=0.6,s[73,13]=0.3,s[73,14]=-0.9,s[73,15]=1.1 s[73,16]=0.7,s[73,17]=-0.3,s[73,18]=1.1,s[73,19]=-0.8,s[73,20]=1.0,s[73,21]=1.1,s[73,22]=0.9,s[73,23]=-1.2,s[73,24]=0.8,s[73,25]=0.5,s[73,26]=1.2,s[73,27]=-1.1,s[73,28]=0.3,s[73,29]=0.2,s[73,30]=-0.6 s[73,31]=0.4,s[73,32]=-0.5,s[73,33]=0.2,s[73,34]=0.4,s[73,35]=0.6,s[73,36]=-0.3,s[73,37]=1.2,s[73,38]=0.3,s[73,39]=0.0,s[73,40]=0.3,s[73,41]=1.0,s[73,42]=-1.2,s[73,43]=-1.2,s[73,44]=-1.1,s[73,45]=-0.4 s[73,46]=0.7,s[73,47]=-1.2,s[73,48]=-0.6,s[73,49]=0.5,s[73,50]=-0.4,s[73,51]=0.3,s[73,52]=0.8,s[73,53]=-0.4,s[73,54]=-0.9,s[73,55]=-0.4,s[73,56]=-1.1,s[73,57]=-0.5,s[73,58]=0.1,s[73,59]=0.4,s[73,60]=-1.1 s[74,1]=0.6,s[74,2]=0.0,s[74,3]=-0.1,s[74,4]=-0.9,s[74,5]=0.7,s[74,6]=-1.0,s[74,7]=-1.1,s[74,8]=0.3,s[74,9]=-0.3,s[74,10]=-0.6,s[74,11]=-0.2,s[74,12]=-0.7,s[74,13]=-0.3,s[74,14]=-1.1,s[74,15]=-0.8 s[74,16]=-0.2,s[74,17]=0.0,s[74,18]=-0.7,s[74,19]=-0.4,s[74,20]=0.1,s[74,21]=-0.4,s[74,22]=1.1,s[74,23]=0.0,s[74,24]=0.0,s[74,25]=-0.4,s[74,26]=-0.7,s[74,27]=1.2,s[74,28]=-0.8,s[74,29]=0.1,s[74,30]=0.7 s[74,31]=-0.7,s[74,32]=1.2,s[74,33]=0.4,s[74,34]=-0.8,s[74,35]=-0.1,s[74,36]=0.1,s[74,37]=-0.6,s[74,38]=-0.9,s[74,39]=1.2,s[74,40]=0.1,s[74,41]=0.2,s[74,42]=-1.1,s[74,43]=-0.7,s[74,44]=-0.3,s[74,45]=-0.7 s[74,46]=-0.9,s[74,47]=1.1,s[74,48]=0.6,s[74,49]=0.9,s[74,50]=0.0,s[74,51]=-1.2,s[74,52]=-0.5,s[74,53]=0.2,s[74,54]=1.0,s[74,55]=0.2,s[74,56]=-0.3,s[74,57]=-0.6,s[74,58]=-0.6,s[74,59]=-1.0,s[74,60]=-1.2 s[75,1]=0.2,s[75,2]=-1.0,s[75,3]=-1.1,s[75,4]=-0.7,s[75,5]=0.0,s[75,6]=0.7,s[75,7]=-1.1,s[75,8]=0.6,s[75,9]=0.8,s[75,10]=0.7,s[75,11]=1.0,s[75,12]=-0.2,s[75,13]=-1.0,s[75,14]=0.0,s[75,15]=-0.8 s[75,16]=-1.0,s[75,17]=-0.2,s[75,18]=0.4,s[75,19]=0.9,s[75,20]=1.2,s[75,21]=-0.7,s[75,22]=-0.1,s[75,23]=1.2,s[75,24]=0.1,s[75,25]=-0.5,s[75,26]=0.7,s[75,27]=-0.7,s[75,28]=-1.0,s[75,29]=1.1,s[75,30]=1.2 s[75,31]=1.1,s[75,32]=0.1,s[75,33]=0.5,s[75,34]=0.1,s[75,35]=1.1,s[75,36]=-0.3,s[75,37]=0.0,s[75,38]=0.1,s[75,39]=0.4,s[75,40]=-1.0,s[75,41]=0.1,s[75,42]=-0.5,s[75,43]=1.2,s[75,44]=-0.8,s[75,45]=1.1 s[75,46]=0.4,s[75,47]=0.9,s[75,48]=0.3,s[75,49]=-0.3,s[75,50]=0.1,s[75,51]=-1.0,s[75,52]=0.0,s[75,53]=-1.2,s[75,54]=-1.0,s[75,55]=0.5,s[75,56]=0.4,s[75,57]=0.5,s[75,58]=-0.2,s[75,59]=0.3,s[75,60]=-0.6 s[76,1]=0.7,s[76,2]=-0.4,s[76,3]=-0.2,s[76,4]=0.4,s[76,5]=0.2,s[76,6]=0.9,s[76,7]=-0.1,s[76,8]=-1.2,s[76,9]=0.1,s[76,10]=-1.2,s[76,11]=-0.3,s[76,12]=1.1,s[76,13]=-0.7,s[76,14]=0.5,s[76,15]=1.0 s[76,16]=-1.2,s[76,17]=0.2,s[76,18]=1.2,s[76,19]=-1.1,s[76,20]=0.9,s[76,21]=1.2,s[76,22]=-0.2,s[76,23]=1.2,s[76,24]=-0.5,s[76,25]=-0.2,s[76,26]=-0.2,s[76,27]=-0.4,s[76,28]=0.3,s[76,29]=-0.4,s[76,30]=0.5 s[76,31]=0.3,s[76,32]=1.0,s[76,33]=-1.2,s[76,34]=-0.6,s[76,35]=1.1,s[76,36]=-1.1,s[76,37]=-0.5,s[76,38]=-1.2,s[76,39]=-0.1,s[76,40]=-1.0,s[76,41]=0.1,s[76,42]=0.4,s[76,43]=-1.1,s[76,44]=-0.3,s[76,45]=1.2 s[76,46]=0.2,s[76,47]=0.6,s[76,48]=-1.0,s[76,49]=-1.0,s[76,50]=0.5,s[76,51]=-0.9,s[76,52]=1.2,s[76,53]=-0.1,s[76,54]=0.0,s[76,55]=-0.8,s[76,56]=-0.2,s[76,57]=0.3,s[76,58]=-1.2,s[76,59]=-1.1,s[76,60]=-1.0 s[77,1]=-0.1,s[77,2]=0.9,s[77,3]=0.8,s[77,4]=-1.1,s[77,5]=-0.1,s[77,6]=0.6,s[77,7]=-0.5,s[77,8]=0.1,s[77,9]=-0.1,s[77,10]=0.8,s[77,11]=-1.1,s[77,12]=0.3,s[77,13]=1.2,s[77,14]=1.2,s[77,15]=-1.2 s[77,16]=0.5,s[77,17]=0.8,s[77,18]=-0.8,s[77,19]=-1.0,s[77,20]=1.0,s[77,21]=0.9,s[77,22]=1.1,s[77,23]=0.9,s[77,24]=0.6,s[77,25]=-0.1,s[77,26]=1.2,s[77,27]=0.7,s[77,28]=-1.0,s[77,29]=1.0,s[77,30]=0.8 s[77,31]=-0.8,s[77,32]=-0.3,s[77,33]=0.2,s[77,34]=0.0,s[77,35]=-0.7,s[77,36]=0.4,s[77,37]=0.6,s[77,38]=-0.5,s[77,39]=-0.2,s[77,40]=0.5,s[77,41]=-0.7,s[77,42]=0.1,s[77,43]=-0.1,s[77,44]=0.2,s[77,45]=-0.4 s[77,46]=-0.2,s[77,47]=-1.0,s[77,48]=-0.6,s[77,49]=0.6,s[77,50]=1.2,s[77,51]=-0.1,s[77,52]=0.4,s[77,53]=0.0,s[77,54]=-1.2,s[77,55]=1.0,s[77,56]=0.2,s[77,57]=-1.0,s[77,58]=0.1,s[77,59]=0.7,s[77,60]=-0.3 s[78,1]=0.4,s[78,2]=-0.3,s[78,3]=-0.6,s[78,4]=-0.7,s[78,5]=1.0,s[78,6]=-0.8,s[78,7]=-1.1,s[78,8]=0.2,s[78,9]=1.1,s[78,10]=-1.0,s[78,11]=1.0,s[78,12]=-0.8,s[78,13]=0.6,s[78,14]=-0.1,s[78,15]=-1.0 s[78,16]=-0.9,s[78,17]=1.1,s[78,18]=1.2,s[78,19]=-0.7,s[78,20]=0.6,s[78,21]=0.5,s[78,22]=-0.6,s[78,23]=-0.1,s[78,24]=-0.4,s[78,25]=-0.5,s[78,26]=-0.9,s[78,27]=0.1,s[78,28]=0.1,s[78,29]=0.0,s[78,30]=0.4 s[78,31]=0.4,s[78,32]=-1.2,s[78,33]=-0.2,s[78,34]=-1.0,s[78,35]=-0.4,s[78,36]=0.1,s[78,37]=0.1,s[78,38]=0.1,s[78,39]=0.3,s[78,40]=0.8,s[78,41]=-1.2,s[78,42]=0.6,s[78,43]=0.0,s[78,44]=-1.0,s[78,45]=0.5 s[78,46]=0.6,s[78,47]=0.7,s[78,48]=0.2,s[78,49]=0.0,s[78,50]=-0.2,s[78,51]=-0.8,s[78,52]=1.0,s[78,53]=0.1,s[78,54]=-1.1,s[78,55]=-0.3,s[78,56]=0.6,s[78,57]=0.7,s[78,58]=-0.7,s[78,59]=-0.5,s[78,60]=0.5 s[79,1]=-1.0,s[79,2]=-0.2,s[79,3]=0.1,s[79,4]=-0.8,s[79,5]=-0.6,s[79,6]=-0.5,s[79,7]=0.5,s[79,8]=-0.7,s[79,9]=-1.1,s[79,10]=-0.7,s[79,11]=0.4,s[79,12]=1.1,s[79,13]=1.0,s[79,14]=1.2,s[79,15]=-0.5 s[79,16]=0.1,s[79,17]=-0.5,s[79,18]=0.4,s[79,19]=0.8,s[79,20]=-0.8,s[79,21]=-0.6,s[79,22]=-0.3,s[79,23]=-0.7,s[79,24]=-0.5,s[79,25]=1.0,s[79,26]=0.8,s[79,27]=-0.6,s[79,28]=0.3,s[79,29]=-1.0,s[79,30]=1.1 s[79,31]=0.5,s[79,32]=-0.6,s[79,33]=-0.8,s[79,34]=-0.7,s[79,35]=-0.9,s[79,36]=-1.2,s[79,37]=1.0,s[79,38]=0.2,s[79,39]=-0.6,s[79,40]=-0.7,s[79,41]=-1.2,s[79,42]=-1.1,s[79,43]=-0.6,s[79,44]=-0.2,s[79,45]=-0.1 s[79,46]=-0.7,s[79,47]=0.2,s[79,48]=-0.5,s[79,49]=-0.1,s[79,50]=0.6,s[79,51]=0.0,s[79,52]=-1.2,s[79,53]=0.9,s[79,54]=1.1,s[79,55]=-0.3,s[79,56]=0.9,s[79,57]=-0.3,s[79,58]=0.5,s[79,59]=-0.8,s[79,60]=-0.8 s[80,1]=-0.8,s[80,2]=1.2,s[80,3]=0.1,s[80,4]=0.0,s[80,5]=0.7,s[80,6]=-0.9,s[80,7]=0.5,s[80,8]=-1.1,s[80,9]=-0.5,s[80,10]=0.7,s[80,11]=-0.6,s[80,12]=-0.6,s[80,13]=0.1,s[80,14]=-1.1,s[80,15]=0.7 s[80,16]=-0.5,s[80,17]=-0.4,s[80,18]=-0.7,s[80,19]=0.4,s[80,20]=0.5,s[80,21]=0.7,s[80,22]=0.8,s[80,23]=-0.7,s[80,24]=0.8,s[80,25]=-0.9,s[80,26]=0.0,s[80,27]=0.4,s[80,28]=0.0,s[80,29]=-0.4,s[80,30]=0.5 s[80,31]=1.0,s[80,32]=-1.1,s[80,33]=0.8,s[80,34]=0.0,s[80,35]=0.5,s[80,36]=0.3,s[80,37]=0.3,s[80,38]=0.5,s[80,39]=1.1,s[80,40]=-0.2,s[80,41]=1.0,s[80,42]=-0.7,s[80,43]=-1.0,s[80,44]=-0.9,s[80,45]=1.1 s[80,46]=-0.5,s[80,47]=-0.3,s[80,48]=1.0,s[80,49]=-0.2,s[80,50]=1.2,s[80,51]=-0.9,s[80,52]=1.0,s[80,53]=-0.1,s[80,54]=0.5,s[80,55]=0.8,s[80,56]=-0.4,s[80,57]=-0.5,s[80,58]=1.0,s[80,59]=-0.1,s[80,60]=-0.9 s[81,1]=0.6,s[81,2]=0.5,s[81,3]=0.7,s[81,4]=-1.0,s[81,5]=0.3,s[81,6]=0.8,s[81,7]=1.2,s[81,8]=-0.7,s[81,9]=-0.7,s[81,10]=-0.9,s[81,11]=-1.1,s[81,12]=0.0,s[81,13]=-0.6,s[81,14]=0.4,s[81,15]=1.0 s[81,16]=-0.6,s[81,17]=0.8,s[81,18]=0.0,s[81,19]=-1.1,s[81,20]=0.0,s[81,21]=0.1,s[81,22]=-0.5,s[81,23]=-0.2,s[81,24]=0.4,s[81,25]=1.1,s[81,26]=0.0,s[81,27]=0.4,s[81,28]=1.1,s[81,29]=-1.2,s[81,30]=0.7 s[81,31]=0.5,s[81,32]=-0.3,s[81,33]=0.4,s[81,34]=-1.1,s[81,35]=0.3,s[81,36]=0.2,s[81,37]=0.4,s[81,38]=-1.0,s[81,39]=-0.9,s[81,40]=-1.1,s[81,41]=0.2,s[81,42]=-1.2,s[81,43]=0.3,s[81,44]=-1.1,s[81,45]=1.2 s[81,46]=0.1,s[81,47]=0.5,s[81,48]=1.1,s[81,49]=0.9,s[81,50]=-0.7,s[81,51]=-0.5,s[81,52]=0.8,s[81,53]=1.1,s[81,54]=0.8,s[81,55]=-1.0,s[81,56]=0.2,s[81,57]=0.2,s[81,58]=0.3,s[81,59]=-0.4,s[81,60]=0.4 s[82,1]=-0.5,s[82,2]=0.3,s[82,3]=0.6,s[82,4]=-1.1,s[82,5]=0.1,s[82,6]=-1.2,s[82,7]=-0.9,s[82,8]=1.1,s[82,9]=1.1,s[82,10]=1.1,s[82,11]=-0.2,s[82,12]=0.5,s[82,13]=0.7,s[82,14]=-0.7,s[82,15]=-1.2 s[82,16]=-0.7,s[82,17]=0.4,s[82,18]=1.1,s[82,19]=-0.3,s[82,20]=-0.6,s[82,21]=0.2,s[82,22]=-0.4,s[82,23]=-0.8,s[82,24]=0.1,s[82,25]=-0.8,s[82,26]=-0.1,s[82,27]=-0.6,s[82,28]=0.3,s[82,29]=-0.7,s[82,30]=1.0 s[82,31]=0.1,s[82,32]=-0.5,s[82,33]=1.1,s[82,34]=-1.2,s[82,35]=-1.2,s[82,36]=-0.6,s[82,37]=1.2,s[82,38]=0.9,s[82,39]=0.7,s[82,40]=-0.3,s[82,41]=1.2,s[82,42]=0.3,s[82,43]=1.2,s[82,44]=0.8,s[82,45]=0.3 s[82,46]=0.1,s[82,47]=1.0,s[82,48]=-0.8,s[82,49]=-0.9,s[82,50]=0.4,s[82,51]=0.1,s[82,52]=0.2,s[82,53]=-0.1,s[82,54]=-0.2,s[82,55]=0.0,s[82,56]=0.0,s[82,57]=-0.8,s[82,58]=0.1,s[82,59]=1.0,s[82,60]=-0.7 s[83,1]=-0.7,s[83,2]=0.5,s[83,3]=-0.8,s[83,4]=-0.1,s[83,5]=0.4,s[83,6]=1.2,s[83,7]=0.4,s[83,8]=0.1,s[83,9]=0.1,s[83,10]=0.2,s[83,11]=0.6,s[83,12]=0.8,s[83,13]=0.2,s[83,14]=-0.8,s[83,15]=-0.3 s[83,16]=0.2,s[83,17]=0.2,s[83,18]=0.7,s[83,19]=-0.1,s[83,20]=-0.4,s[83,21]=-0.7,s[83,22]=-1.0,s[83,23]=0.5,s[83,24]=1.2,s[83,25]=-0.3,s[83,26]=-1.2,s[83,27]=0.5,s[83,28]=-0.6,s[83,29]=1.2,s[83,30]=0.7 s[83,31]=0.5,s[83,32]=-0.8,s[83,33]=1.1,s[83,34]=-0.4,s[83,35]=-0.6,s[83,36]=-1.1,s[83,37]=0.1,s[83,38]=1.2,s[83,39]=0.1,s[83,40]=-0.7,s[83,41]=-0.4,s[83,42]=-0.9,s[83,43]=1.0,s[83,44]=0.7,s[83,45]=-1.2 s[83,46]=1.0,s[83,47]=0.1,s[83,48]=-0.4,s[83,49]=1.1,s[83,50]=0.0,s[83,51]=-0.4,s[83,52]=0.7,s[83,53]=-0.1,s[83,54]=1.0,s[83,55]=-1.2,s[83,56]=-0.1,s[83,57]=0.2,s[83,58]=-0.5,s[83,59]=-0.3,s[83,60]=-1.1 s[84,1]=0.9,s[84,2]=1.1,s[84,3]=-0.1,s[84,4]=-0.6,s[84,5]=0.8,s[84,6]=0.1,s[84,7]=0.1,s[84,8]=0.1,s[84,9]=-0.6,s[84,10]=0.1,s[84,11]=1.1,s[84,12]=0.2,s[84,13]=-0.5,s[84,14]=-0.3,s[84,15]=-0.1 s[84,16]=-0.2,s[84,17]=1.0,s[84,18]=-0.5,s[84,19]=1.1,s[84,20]=0.1,s[84,21]=-0.9,s[84,22]=-0.5,s[84,23]=0.7,s[84,24]=-0.4,s[84,25]=-1.0,s[84,26]=0.3,s[84,27]=-0.8,s[84,28]=0.6,s[84,29]=-0.4,s[84,30]=0.4 s[84,31]=0.5,s[84,32]=0.1,s[84,33]=0.5,s[84,34]=-0.4,s[84,35]=1.2,s[84,36]=-0.4,s[84,37]=1.0,s[84,38]=-1.1,s[84,39]=0.7,s[84,40]=-0.5,s[84,41]=0.6,s[84,42]=1.1,s[84,43]=0.6,s[84,44]=0.2,s[84,45]=-0.1 s[84,46]=-0.7,s[84,47]=0.1,s[84,48]=0.2,s[84,49]=-0.4,s[84,50]=1.2,s[84,51]=-0.1,s[84,52]=-0.8,s[84,53]=0.3,s[84,54]=0.0,s[84,55]=0.1,s[84,56]=-0.3,s[84,57]=0.2,s[84,58]=1.1,s[84,59]=-0.6,s[84,60]=-1.2 s[85,1]=0.7,s[85,2]=0.2,s[85,3]=0.2,s[85,4]=-0.2,s[85,5]=0.8,s[85,6]=-1.0,s[85,7]=-0.5,s[85,8]=0.2,s[85,9]=-1.2,s[85,10]=0.8,s[85,11]=0.4,s[85,12]=1.0,s[85,13]=1.2,s[85,14]=-0.4,s[85,15]=-1.1 s[85,16]=0.7,s[85,17]=0.2,s[85,18]=-0.3,s[85,19]=0.9,s[85,20]=1.0,s[85,21]=-1.2,s[85,22]=0.0,s[85,23]=-1.2,s[85,24]=0.2,s[85,25]=-0.8,s[85,26]=-0.6,s[85,27]=-1.1,s[85,28]=0.5,s[85,29]=-0.8,s[85,30]=0.0 s[85,31]=0.5,s[85,32]=-0.6,s[85,33]=-0.3,s[85,34]=0.2,s[85,35]=-0.7,s[85,36]=-0.2,s[85,37]=-0.8,s[85,38]=1.0,s[85,39]=-1.1,s[85,40]=1.0,s[85,41]=-0.1,s[85,42]=-0.2,s[85,43]=-0.6,s[85,44]=-1.1,s[85,45]=-0.5 s[85,46]=0.4,s[85,47]=-1.2,s[85,48]=-0.2,s[85,49]=-1.1,s[85,50]=-1.2,s[85,51]=0.9,s[85,52]=0.0,s[85,53]=0.4,s[85,54]=-0.3,s[85,55]=-0.8,s[85,56]=0.9,s[85,57]=-1.0,s[85,58]=-0.2,s[85,59]=0.2,s[85,60]=0.2 s[86,1]=-1.0,s[86,2]=0.1,s[86,3]=-0.9,s[86,4]=0.0,s[86,5]=-0.6,s[86,6]=0.5,s[86,7]=-1.2,s[86,8]=1.1,s[86,9]=-0.3,s[86,10]=0.8,s[86,11]=-1.1,s[86,12]=0.4,s[86,13]=0.0,s[86,14]=0.7,s[86,15]=0.6 s[86,16]=0.1,s[86,17]=0.4,s[86,18]=0.7,s[86,19]=1.1,s[86,20]=0.9,s[86,21]=0.2,s[86,22]=0.5,s[86,23]=1.1,s[86,24]=0.4,s[86,25]=-1.1,s[86,26]=0.8,s[86,27]=1.0,s[86,28]=0.9,s[86,29]=-0.8,s[86,30]=0.2 s[86,31]=-1.2,s[86,32]=0.5,s[86,33]=0.5,s[86,34]=1.2,s[86,35]=0.0,s[86,36]=-1.0,s[86,37]=-0.9,s[86,38]=-0.5,s[86,39]=-1.0,s[86,40]=-0.8,s[86,41]=-0.5,s[86,42]=1.0,s[86,43]=-0.2,s[86,44]=-1.2,s[86,45]=-0.5 s[86,46]=-0.8,s[86,47]=-0.7,s[86,48]=0.6,s[86,49]=-0.1,s[86,50]=-0.7,s[86,51]=0.9,s[86,52]=1.2,s[86,53]=-0.7,s[86,54]=-0.8,s[86,55]=-1.0,s[86,56]=-0.8,s[86,57]=0.0,s[86,58]=-1.2,s[86,59]=0.4,s[86,60]=-0.3 s[87,1]=-0.2,s[87,2]=1.2,s[87,3]=0.1,s[87,4]=-0.6,s[87,5]=-0.2,s[87,6]=0.6,s[87,7]=-1.2,s[87,8]=-0.1,s[87,9]=0.5,s[87,10]=0.9,s[87,11]=-1.2,s[87,12]=-0.6,s[87,13]=-0.3,s[87,14]=0.3,s[87,15]=-0.6 s[87,16]=0.7,s[87,17]=-1.1,s[87,18]=-0.6,s[87,19]=0.0,s[87,20]=0.6,s[87,21]=-0.9,s[87,22]=0.4,s[87,23]=-0.9,s[87,24]=0.9,s[87,25]=-0.9,s[87,26]=-1.2,s[87,27]=0.0,s[87,28]=0.4,s[87,29]=0.5,s[87,30]=-0.8 s[87,31]=-0.5,s[87,32]=0.2,s[87,33]=-0.6,s[87,34]=-0.6,s[87,35]=-0.1,s[87,36]=0.1,s[87,37]=0.9,s[87,38]=1.2,s[87,39]=0.5,s[87,40]=-0.8,s[87,41]=0.3,s[87,42]=0.5,s[87,43]=0.5,s[87,44]=-0.5,s[87,45]=1.2 s[87,46]=0.3,s[87,47]=0.7,s[87,48]=0.6,s[87,49]=0.3,s[87,50]=-0.5,s[87,51]=0.9,s[87,52]=-0.1,s[87,53]=0.5,s[87,54]=0.2,s[87,55]=-1.2,s[87,56]=-0.5,s[87,57]=-0.6,s[87,58]=-0.6,s[87,59]=0.7,s[87,60]=0.0 s[88,1]=0.2,s[88,2]=0.7,s[88,3]=0.0,s[88,4]=-1.2,s[88,5]=-0.6,s[88,6]=0.0,s[88,7]=-0.7,s[88,8]=1.2,s[88,9]=0.7,s[88,10]=0.4,s[88,11]=0.4,s[88,12]=0.6,s[88,13]=-0.2,s[88,14]=0.6,s[88,15]=-1.1 s[88,16]=0.3,s[88,17]=-0.9,s[88,18]=-0.6,s[88,19]=0.6,s[88,20]=0.5,s[88,21]=-0.5,s[88,22]=-0.7,s[88,23]=0.8,s[88,24]=-0.1,s[88,25]=-1.1,s[88,26]=-0.3,s[88,27]=0.6,s[88,28]=0.8,s[88,29]=-0.8,s[88,30]=-0.2 s[88,31]=-0.8,s[88,32]=0.9,s[88,33]=0.6,s[88,34]=-1.1,s[88,35]=0.4,s[88,36]=0.6,s[88,37]=-1.0,s[88,38]=1.1,s[88,39]=0.1,s[88,40]=0.7,s[88,41]=-0.6,s[88,42]=1.0,s[88,43]=-0.7,s[88,44]=1.1,s[88,45]=0.3 s[88,46]=0.5,s[88,47]=0.8,s[88,48]=0.8,s[88,49]=0.1,s[88,50]=1.2,s[88,51]=-1.0,s[88,52]=0.8,s[88,53]=-0.2,s[88,54]=-0.8,s[88,55]=1.1,s[88,56]=1.1,s[88,57]=-0.9,s[88,58]=0.1,s[88,59]=-1.0,s[88,60]=-0.9 s[89,1]=-0.8,s[89,2]=-1.0,s[89,3]=1.2,s[89,4]=0.6,s[89,5]=-0.5,s[89,6]=-0.3,s[89,7]=-0.2,s[89,8]=-1.0,s[89,9]=-0.7,s[89,10]=-0.2,s[89,11]=-0.6,s[89,12]=-0.4,s[89,13]=-0.3,s[89,14]=-1.0,s[89,15]=0.8 s[89,16]=0.5,s[89,17]=-0.2,s[89,18]=-0.4,s[89,19]=-0.6,s[89,20]=1.2,s[89,21]=-0.9,s[89,22]=-1.1,s[89,23]=0.7,s[89,24]=-0.3,s[89,25]=-0.4,s[89,26]=-0.7,s[89,27]=1.0,s[89,28]=0.2,s[89,29]=-0.5,s[89,30]=-0.6 s[89,31]=0.0,s[89,32]=0.6,s[89,33]=1.1,s[89,34]=0.0,s[89,35]=0.1,s[89,36]=0.5,s[89,37]=0.5,s[89,38]=0.9,s[89,39]=-0.9,s[89,40]=-0.1,s[89,41]=-0.5,s[89,42]=-0.6,s[89,43]=0.1,s[89,44]=-0.3,s[89,45]=-0.1 s[89,46]=-0.3,s[89,47]=-1.1,s[89,48]=-0.3,s[89,49]=0.4,s[89,50]=0.9,s[89,51]=-0.5,s[89,52]=-0.1,s[89,53]=-0.1,s[89,54]=0.2,s[89,55]=1.1,s[89,56]=-1.2,s[89,57]=0.4,s[89,58]=-0.8,s[89,59]=-0.3,s[89,60]=-1.2 s[90,1]=0.6,s[90,2]=-1.2,s[90,3]=-0.6,s[90,4]=-0.8,s[90,5]=-0.1,s[90,6]=-1.0,s[90,7]=0.1,s[90,8]=-0.6,s[90,9]=0.8,s[90,10]=0.9,s[90,11]=-0.4,s[90,12]=0.2,s[90,13]=0.3,s[90,14]=0.0,s[90,15]=0.0 s[90,16]=1.2,s[90,17]=0.1,s[90,18]=0.1,s[90,19]=-0.6,s[90,20]=0.2,s[90,21]=0.9,s[90,22]=-0.3,s[90,23]=0.5,s[90,24]=0.0,s[90,25]=-0.3,s[90,26]=-0.4,s[90,27]=-1.0,s[90,28]=-0.8,s[90,29]=-0.6,s[90,30]=0.0 s[90,31]=0.6,s[90,32]=-0.5,s[90,33]=-0.3,s[90,34]=-0.6,s[90,35]=0.4,s[90,36]=-0.9,s[90,37]=1.1,s[90,38]=0.6,s[90,39]=-0.5,s[90,40]=-1.1,s[90,41]=0.4,s[90,42]=-1.1,s[90,43]=1.1,s[90,44]=-1.2,s[90,45]=0.5 s[90,46]=1.0,s[90,47]=0.6,s[90,48]=1.1,s[90,49]=0.2,s[90,50]=0.4,s[90,51]=0.7,s[90,52]=0.0,s[90,53]=0.0,s[90,54]=0.0,s[90,55]=-1.2,s[90,56]=-0.4,s[90,57]=-0.5,s[90,58]=1.2,s[90,59]=0.5,s[90,60]=-0.4 s[91,1]=-0.5,s[91,2]=0.4,s[91,3]=0.6,s[91,4]=0.2,s[91,5]=0.8,s[91,6]=-0.6,s[91,7]=0.1,s[91,8]=1.0,s[91,9]=-1.0,s[91,10]=0.4,s[91,11]=-0.6,s[91,12]=0.4,s[91,13]=1.0,s[91,14]=-0.7,s[91,15]=-0.5,s[91,16]=1.0,s[91,17]=-0.5,s[91,18]=0.7,s[91,19]=-0.2,s[91,20]=0.4,s[91,21]=0.0,s[91,22]=-1.1,s[91,23]=-1.0,s[91,24]=0.6,s[91,25]=-0.6,s[91,26]=-0.6,s[91,27]=0.2,s[91,28]=0.8,s[91,29]=0.7,s[91,30]=-1.1 s[91,31]=0.8,s[91,32]=0.7,s[91,33]=0.2,s[91,34]=-1.1,s[91,35]=0.1,s[91,36]=0.9,s[91,37]=0.4,s[91,38]=0.5,s[91,39]=-0.1,s[91,40]=0.0,s[91,41]=-1.1,s[91,42]=-0.4,s[91,43]=0.6,s[91,44]=0.9,s[91,45]=1.0,s[91,46]=-0.1,s[91,47]=-0.9,s[91,48]=0.1,s[91,49]=0.6,s[91,50]=-0.8,s[91,51]=-0.9,s[91,52]=0.0,s[91,53]=-0.1,s[91,54]=0.6,s[91,55]=-0.5,s[91,56]=-0.7,s[91,57]=-0.9,s[91,58]=-1.0,s[91,59]=0.2,s[91,60]=-1.1 s[92,1]=0.7,s[92,2]=-0.1,s[92,3]=0.5,s[92,4]=-0.7,s[92,5]=1.1,s[92,6]=-1.2,s[92,7]=-1.0,s[92,8]=-1.1,s[92,9]=-1.2,s[92,10]=0.1,s[92,11]=-0.4,s[92,12]=1.0,s[92,13]=0.0,s[92,14]=-0.1,s[92,15]=-0.4,s[92,16]=-0.1,s[92,17]=0.8,s[92,18]=-0.2,s[92,19]=-0.4,s[92,20]=0.7,s[92,21]=0.8,s[92,22]=0.3,s[92,23]=1.2,s[92,24]=-0.7,s[92,25]=-0.2,s[92,26]=-0.5,s[92,27]=-1.1,s[92,28]=-0.5,s[92,29]=0.7,s[92,30]=0.7 s[92,31]=-1.1,s[92,32]=0.7,s[92,33]=0.5,s[92,34]=-0.7,s[92,35]=-0.2,s[92,36]=0.1,s[92,37]=0.8,s[92,38]=-1.1,s[92,39]=-0.3,s[92,40]=0.0,s[92,41]=-0.3,s[92,42]=-1.0,s[92,43]=0.3,s[92,44]=-1.0,s[92,45]=-0.4,s[92,46]=0.6,s[92,47]=1.1,s[92,48]=-0.3,s[92,49]=-0.3,s[92,50]=-1.2,s[92,51]=0.9,s[92,52]=0.5,s[92,53]=-1.1,s[92,54]=-0.1,s[92,55]=0.1,s[92,56]=-1.2,s[92,57]=0.1,s[92,58]=-1.0,s[92,59]=0.2,s[92,60]=-0.9 s[93,1]=0.0,s[93,2]=0.7,s[93,3]=-0.3,s[93,4]=-0.8,s[93,5]=-1.2,s[93,6]=-0.5,s[93,7]=-0.2,s[93,8]=-1.1,s[93,9]=-0.4,s[93,10]=-0.3,s[93,11]=0.6,s[93,12]=-1.2,s[93,13]=0.0,s[93,14]=0.1,s[93,15]=1.2,s[93,16]=0.2,s[93,17]=0.8,s[93,18]=1.2,s[93,19]=-0.6,s[93,20]=0.6,s[93,21]=1.1,s[93,22]=1.0,s[93,23]=0.2,s[93,24]=0.3,s[93,25]=-1.0,s[93,26]=0.9,s[93,27]=-0.4,s[93,28]=-1.1,s[93,29]=1.0,s[93,30]=0.1 s[93,31]=0.3,s[93,32]=0.4,s[93,33]=-0.8,s[93,34]=-0.3,s[93,35]=0.1,s[93,36]=0.9,s[93,37]=-0.9,s[93,38]=-0.6,s[93,39]=-0.6,s[93,40]=0.4,s[93,41]=-0.7,s[93,42]=-0.3,s[93,43]=0.3,s[93,44]=-0.7,s[93,45]=0.3,s[93,46]=-1.2,s[93,47]=-0.6,s[93,48]=0.4,s[93,49]=0.1,s[93,50]=-0.1,s[93,51]=-1.1,s[93,52]=0.1,s[93,53]=-0.7,s[93,54]=0.2,s[93,55]=-1.1,s[93,56]=0.6,s[93,57]=-0.1,s[93,58]=0.9,s[93,59]=0.5,s[93,60]=-0.5 s[94,1]=-1.0,s[94,2]=-1.0,s[94,3]=-1.2,s[94,4]=-1.0,s[94,5]=0.5,s[94,6]=-0.9,s[94,7]=0.2,s[94,8]=1.0,s[94,9]=0.4,s[94,10]=0.7,s[94,11]=-0.2,s[94,12]=0.3,s[94,13]=1.2,s[94,14]=0.4,s[94,15]=1.0,s[94,16]=0.1,s[94,17]=0.1,s[94,18]=-0.8,s[94,19]=1.0,s[94,20]=0.3,s[94,21]=-0.1,s[94,22]=-0.3,s[94,23]=0.5,s[94,24]=0.5,s[94,25]=0.5,s[94,26]=0.1,s[94,27]=-0.2,s[94,28]=-0.8,s[94,29]=-0.9,s[94,30]=1.0 s[94,31]=0.0,s[94,32]=-0.8,s[94,33]=-0.6,s[94,34]=-1.0,s[94,35]=-0.2,s[94,36]=0.3,s[94,37]=0.0,s[94,38]=0.6,s[94,39]=-0.1,s[94,40]=0.4,s[94,41]=-0.4,s[94,42]=0.1,s[94,43]=-1.2,s[94,44]=1.0,s[94,45]=-0.4,s[94,46]=0.1,s[94,47]=-0.4,s[94,48]=-1.0,s[94,49]=-0.1,s[94,50]=0.8,s[94,51]=-1.1,s[94,52]=-0.4,s[94,53]=-0.5,s[94,54]=0.1,s[94,55]=0.8,s[94,56]=0.6,s[94,57]=0.9,s[94,58]=0.1,s[94,59]=0.2,s[94,60]=-0.4 s[95,1]=0.3,s[95,2]=-0.5,s[95,3]=0.8,s[95,4]=-1.1,s[95,5]=-0.4,s[95,6]=-0.6,s[95,7]=0.4,s[95,8]=-0.1,s[95,9]=-0.5,s[95,10]=-0.5,s[95,11]=1.1,s[95,12]=-1.1,s[95,13]=-0.9,s[95,14]=-0.3,s[95,15]=-0.9,s[95,16]=-0.7,s[95,17]=0.6,s[95,18]=-0.9,s[95,19]=-0.4,s[95,20]=-0.3,s[95,21]=-0.3,s[95,22]=0.5,s[95,23]=0.8,s[95,24]=0.8,s[95,25]=1.0,s[95,26]=-0.7,s[95,27]=-1.1,s[95,28]=0.0,s[95,29]=-1.2,s[95,30]=0.2 s[95,31]=0.2,s[95,32]=0.9,s[95,33]=-1.0,s[95,34]=-1.0,s[95,35]=-1.1,s[95,36]=0.4,s[95,37]=0.6,s[95,38]=1.1,s[95,39]=0.9,s[95,40]=-0.1,s[95,41]=0.1,s[95,42]=0.2,s[95,43]=0.4,s[95,44]=0.5,s[95,45]=0.0,s[95,46]=-1.2,s[95,47]=0.2,s[95,48]=0.7,s[95,49]=-0.3,s[95,50]=-0.8,s[95,51]=-0.1,s[95,52]=0.3,s[95,53]=0.3,s[95,54]=-0.9,s[95,55]=-0.4,s[95,56]=0.5,s[95,57]=0.3,s[95,58]=-0.2,s[95,59]=0.7,s[95,60]=-0.2 s[96,1]=0.1,s[96,2]=0.7,s[96,3]=-0.9,s[96,4]=1.0,s[96,5]=0.1,s[96,6]=1.2,s[96,7]=-0.4,s[96,8]=-1.2,s[96,9]=0.7,s[96,10]=1.2,s[96,11]=1.1,s[96,12]=-0.9,s[96,13]=0.7,s[96,14]=0.4,s[96,15]=-1.1,s[96,16]=0.9,s[96,17]=0.9,s[96,18]=-1.1,s[96,19]=-0.6,s[96,20]=0.6,s[96,21]=-1.2,s[96,22]=-0.8,s[96,23]=-1.2,s[96,24]=0.2,s[96,25]=1.2,s[96,26]=1.1,s[96,27]=-0.8,s[96,28]=-0.7,s[96,29]=0.2,s[96,30]=-0.2 s[96,31]=0.6,s[96,32]=-0.7,s[96,33]=1.1,s[96,34]=0.1,s[96,35]=0.7,s[96,36]=0.7,s[96,37]=0.5,s[96,38]=0.4,s[96,39]=0.1,s[96,40]=0.3,s[96,41]=1.0,s[96,42]=0.0,s[96,43]=-0.9,s[96,44]=-0.3,s[96,45]=0.4,s[96,46]=0.7,s[96,47]=-0.2,s[96,48]=0.7,s[96,49]=-0.6,s[96,50]=-0.2,s[96,51]=0.9,s[96,52]=1.2,s[96,53]=-0.9,s[96,54]=-0.4,s[96,55]=-1.0,s[96,56]=0.0,s[96,57]=0.4,s[96,58]=-0.9,s[96,59]=0.6,s[96,60]=-0.5 s[97,1]=-0.2,s[97,2]=-0.4,s[97,3]=-0.2,s[97,4]=-0.6,s[97,5]=0.7,s[97,6]=-0.8,s[97,7]=-1.0,s[97,8]=-0.7,s[97,9]=-1.1,s[97,10]=-0.1,s[97,11]=-0.7,s[97,12]=1.2,s[97,13]=1.0,s[97,14]=-0.3,s[97,15]=0.6,s[97,16]=-0.4,s[97,17]=-0.7,s[97,18]=1.0,s[97,19]=-0.1,s[97,20]=0.9,s[97,21]=1.1,s[97,22]=0.7,s[97,23]=-0.8,s[97,24]=0.8,s[97,25]=0.9,s[97,26]=-0.3,s[97,27]=-0.6,s[97,28]=0.5,s[97,29]=0.8,s[97,30]=-1.2 s[97,31]=-0.1,s[97,32]=-0.3,s[97,33]=0.3,s[97,34]=-1.1,s[97,35]=-0.1,s[97,36]=-0.9,s[97,37]=0.5,s[97,38]=0.9,s[97,39]=-0.8,s[97,40]=0.5,s[97,41]=-0.4,s[97,42]=-0.2,s[97,43]=0.2,s[97,44]=-0.3,s[97,45]=-0.8,s[97,46]=-0.4,s[97,47]=1.2,s[97,48]=-0.3,s[97,49]=0.4,s[97,50]=-0.2,s[97,51]=0.1,s[97,52]=-0.7,s[97,53]=-0.8,s[97,54]=0.3,s[97,55]=-0.5,s[97,56]=0.5,s[97,57]=-0.4,s[97,58]=0.7,s[97,59]=-0.8,s[97,60]=-0.8 s[98,1]=-0.5,s[98,2]=-0.3,s[98,3]=-0.9,s[98,4]=-1.1,s[98,5]=-0.3,s[98,6]=0.9,s[98,7]=1.0,s[98,8]=-0.5,s[98,9]=0.2,s[98,10]=-1.2,s[98,11]=0.0,s[98,12]=-0.8,s[98,13]=-0.3,s[98,14]=0.8,s[98,15]=1.1,s[98,16]=-0.4,s[98,17]=-0.9,s[98,18]=0.0,s[98,19]=0.9,s[98,20]=0.1,s[98,21]=0.6,s[98,22]=-0.5,s[98,23]=0.6,s[98,24]=-1.0,s[98,25]=-1.1,s[98,26]=-1.1,s[98,27]=-0.5,s[98,28]=-0.6,s[98,29]=0.9,s[98,30]=0.3 s[98,31]=-1.2,s[98,32]=-0.4,s[98,33]=-0.3,s[98,34]=-0.6,s[98,35]=-1.1,s[98,36]=0.1,s[98,37]=-0.1,s[98,38]=0.8,s[98,39]=-0.7,s[98,40]=1.0,s[98,41]=-0.1,s[98,42]=0.6,s[98,43]=-1.2,s[98,44]=-0.6,s[98,45]=0.1,s[98,46]=-1.0,s[98,47]=0.7,s[98,48]=-0.6,s[98,49]=0.4,s[98,50]=-1.2,s[98,51]=-0.7,s[98,52]=-0.6,s[98,53]=-0.9,s[98,54]=0.4,s[98,55]=-0.3,s[98,56]=-0.5,s[98,57]=-0.8,s[98,58]=0.1,s[98,59]=0.8,s[98,60]=-1.2 s[99,1]=0.3,s[99,2]=1.0,s[99,3]=0.3,s[99,4]=0.0,s[99,5]=-0.7,s[99,6]=-0.9,s[99,7]=-0.8,s[99,8]=0.5,s[99,9]=0.8,s[99,10]=-0.8,s[99,11]=-0.5,s[99,12]=0.6,s[99,13]=-0.3,s[99,14]=-0.5,s[99,15]=0.4,s[99,16]=1.2,s[99,17]=-0.1,s[99,18]=0.4,s[99,19]=0.6,s[99,20]=0.5,s[99,21]=0.6,s[99,22]=0.2,s[99,23]=-0.2,s[99,24]=0.7,s[99,25]=1.0,s[99,26]=0.9,s[99,27]=0.4,s[99,28]=0.1,s[99,29]=-0.1,s[99,30]=1.0 s[99,31]=-0.2,s[99,32]=-1.0,s[99,33]=0.5,s[99,34]=-0.8,s[99,35]=-0.8,s[99,36]=0.1,s[99,37]=0.5,s[99,38]=-0.2,s[99,39]=1.2,s[99,40]=-1.0,s[99,41]=0.0,s[99,42]=-0.4,s[99,43]=-0.2,s[99,44]=-0.6,s[99,45]=1.2,s[99,46]=0.3,s[99,47]=-0.3,s[99,48]=-1.1,s[99,49]=-0.2,s[99,50]=-0.3,s[99,51]=1.1,s[99,52]=-1.0,s[99,53]=0.0,s[99,54]=0.9,s[99,55]=0.6,s[99,56]=-1.2,s[99,57]=-0.6,s[99,58]=-0.1,s[99,59]=-0.2,s[99,60]=0.3 s[100,1]=-1.1,s[100,2]=0.5,s[100,3]=0.5,s[100,4]=0.0,s[100,5]=0.9,s[100,6]=-0.8,s[100,7]=0.3,s[100,8]=-0.9,s[100,9]=0.9,s[100,10]=-0.7,s[100,11]=-1.2,s[100,12]=0.5,s[100,13]=-1.2,s[100,14]=-0.1,s[100,15]=0.0,s[100,16]=1.1,s[100,17]=-0.9,s[100,18]=-1.1,s[100,19]=-0.9,s[100,20]=0.0,s[100,21]=-0.3,s[100,22]=-0.1,s[100,23]=1.2,s[100,24]=-1.2,s[100,25]=0.8,s[100,26]=0.5,s[100,27]=0.4,s[100,28]=-0.5,s[100,29]=0.6,s[100,30]=0.3 s[100,31]=-0.3,s[100,32]=-0.3,s[100,33]=-0.5,s[100,34]=-0.9,s[100,35]=-0.9,s[100,36]=0.7,s[100,37]=0.3,s[100,38]=-0.3,s[100,39]=-0.2,s[100,40]=-1.0,s[100,41]=-0.7,s[100,42]=0.1,s[100,43]=0.2,s[100,44]=0.4,s[100,45]=0.2,s[100,46]=1.1,s[100,47]=-1.2,s[100,48]=0.3,s[100,49]=-0.3,s[100,50]=0.2,s[100,51]=0.9,s[100,52]=0.7,s[100,53]=-0.6,s[100,54]=0.9,s[100,55]=-1.2,s[100,56]=1.2,s[100,57]=0.6,s[100,58]=0.3,s[100,59]=-0.5,s[100,60]=-0.1 s[101,1]=0.8,s[101,2]=-0.3,s[101,3]=-0.4,s[101,4]=-1.1,s[101,5]=-0.2,s[101,6]=0.4,s[101,7]=0.5,s[101,8]=-0.1,s[101,9]=-0.1,s[101,10]=0.4,s[101,11]=0.6,s[101,12]=0.1,s[101,13]=-1.0,s[101,14]=0.2,s[101,15]=0.8,s[101,16]=0.8,s[101,17]=1.2,s[101,18]=-1.0,s[101,19]=0.1,s[101,20]=0.0,s[101,21]=-0.1,s[101,22]=-0.2,s[101,23]=-1.1,s[101,24]=-0.2,s[101,25]=-0.9,s[101,26]=0.0,s[101,27]=-0.7,s[101,28]=-1.1,s[101,29]=0.8,s[101,30]=0.8 s[101,31]=-0.6,s[101,32]=-1.1,s[101,33]=0.0,s[101,34]=-1.2,s[101,35]=1.2,s[101,36]=-1.2,s[101,37]=-1.0,s[101,38]=1.0,s[101,39]=-0.7,s[101,40]=0.2,s[101,41]=-0.1,s[101,42]=-0.1,s[101,43]=-0.2,s[101,44]=-0.5,s[101,45]=0.0,s[101,46]=0.9,s[101,47]=0.1,s[101,48]=1.0,s[101,49]=0.0,s[101,50]=-0.4,s[101,51]=-0.3,s[101,52]=1.2,s[101,53]=-0.3,s[101,54]=1.0,s[101,55]=1.2,s[101,56]=-0.4,s[101,57]=0.0,s[101,58]=-0.5,s[101,59]=1.1,s[101,60]=-0.6 s[102,1]=0.9,s[102,2]=-0.1,s[102,3]=-1.0,s[102,4]=-0.3,s[102,5]=-0.3,s[102,6]=-0.4,s[102,7]=0.4,s[102,8]=-0.2,s[102,9]=0.8,s[102,10]=-0.1,s[102,11]=-0.7,s[102,12]=0.3,s[102,13]=1.2,s[102,14]=0.3,s[102,15]=0.8,s[102,16]=-0.7,s[102,17]=-0.8,s[102,18]=0.3,s[102,19]=0.7,s[102,20]=-1.2,s[102,21]=-0.7,s[102,22]=-0.9,s[102,23]=-0.7,s[102,24]=-1.0,s[102,25]=0.8,s[102,26]=0.2,s[102,27]=0.4,s[102,28]=-0.9,s[102,29]=0.8,s[102,30]=0.7 s[102,31]=0.1,s[102,32]=0.2,s[102,33]=0.0,s[102,34]=-1.1,s[102,35]=-0.1,s[102,36]=1.1,s[102,37]=-0.6,s[102,38]=0.0,s[102,39]=0.9,s[102,40]=0.1,s[102,41]=-1.0,s[102,42]=1.0,s[102,43]=0.4,s[102,44]=-1.1,s[102,45]=-0.5,s[102,46]=0.7,s[102,47]=-0.9,s[102,48]=0.4,s[102,49]=0.3,s[102,50]=0.0,s[102,51]=0.1,s[102,52]=0.5,s[102,53]=-1.2,s[102,54]=-0.4,s[102,55]=-1.2,s[102,56]=1.2,s[102,57]=-0.8,s[102,58]=-1.2,s[102,59]=-1.2,s[102,60]=0.0 s[103,1]=1.1,s[103,2]=-1.0,s[103,3]=-1.1,s[103,4]=1.1,s[103,5]=0.6,s[103,6]=0.1,s[103,7]=-0.9,s[103,8]=-0.6,s[103,9]=0.4,s[103,10]=0.1,s[103,11]=-0.4,s[103,12]=0.2,s[103,13]=0.0,s[103,14]=0.6,s[103,15]=0.1,s[103,16]=0.7,s[103,17]=-0.7,s[103,18]=0.5,s[103,19]=-1.0,s[103,20]=-0.7,s[103,21]=0.7,s[103,22]=0.7,s[103,23]=0.0,s[103,24]=-0.6,s[103,25]=0.8,s[103,26]=-0.1,s[103,27]=-1.1,s[103,28]=-0.3,s[103,29]=0.6,s[103,30]=0.5 s[103,31]=1.1,s[103,32]=0.9,s[103,33]=0.7,s[103,34]=-0.2,s[103,35]=-0.8,s[103,36]=0.7,s[103,37]=-0.8,s[103,38]=-0.2,s[103,39]=1.0,s[103,40]=0.4,s[103,41]=-0.7,s[103,42]=0.8,s[103,43]=0.4,s[103,44]=0.7,s[103,45]=0.3,s[103,46]=0.1,s[103,47]=-0.4,s[103,48]=-0.2,s[103,49]=0.9,s[103,50]=-1.2,s[103,51]=-0.6,s[103,52]=-0.8,s[103,53]=-0.5,s[103,54]=0.2,s[103,55]=1.1,s[103,56]=-0.9,s[103,57]=0.1,s[103,58]=-1.0,s[103,59]=0.0,s[103,60]=-0.5 s[104,1]=0.2,s[104,2]=-0.5,s[104,3]=0.0,s[104,4]=-0.7,s[104,5]=0.6,s[104,6]=-0.3,s[104,7]=0.6,s[104,8]=-0.4,s[104,9]=0.5,s[104,10]=-0.6,s[104,11]=-1.0,s[104,12]=-0.1,s[104,13]=-1.1,s[104,14]=-0.4,s[104,15]=-1.2,s[104,16]=0.6,s[104,17]=1.0,s[104,18]=0.3,s[104,19]=0.8,s[104,20]=0.7,s[104,21]=0.3,s[104,22]=-0.3,s[104,23]=-0.3,s[104,24]=-1.2,s[104,25]=0.8,s[104,26]=-1.1,s[104,27]=0.4,s[104,28]=1.2,s[104,29]=0.4,s[104,30]=0.3 s[104,31]=-0.4,s[104,32]=0.0,s[104,33]=0.3,s[104,34]=-0.9,s[104,35]=-1.1,s[104,36]=-0.7,s[104,37]=0.7,s[104,38]=-1.1,s[104,39]=-0.8,s[104,40]=-0.6,s[104,41]=-0.1,s[104,42]=1.0,s[104,43]=0.8,s[104,44]=-0.7,s[104,45]=0.3,s[104,46]=1.1,s[104,47]=-0.9,s[104,48]=0.3,s[104,49]=0.6,s[104,50]=-0.8,s[104,51]=-0.3,s[104,52]=0.4,s[104,53]=0.3,s[104,54]=-0.2,s[104,55]=1.2,s[104,56]=0.1,s[104,57]=0.2,s[104,58]=-0.3,s[104,59]=-0.1,s[104,60]=0.0 s[105,1]=-1.1,s[105,2]=-0.4,s[105,3]=-0.9,s[105,4]=-0.6,s[105,5]=-0.3,s[105,6]=0.7,s[105,7]=0.7,s[105,8]=-0.1,s[105,9]=-1.2,s[105,10]=0.9,s[105,11]=-0.2,s[105,12]=0.8,s[105,13]=-0.9,s[105,14]=0.2,s[105,15]=1.2,s[105,16]=-0.7,s[105,17]=0.7,s[105,18]=0.2,s[105,19]=0.2,s[105,20]=-1.1,s[105,21]=0.3,s[105,22]=1.1,s[105,23]=-0.9,s[105,24]=0.5,s[105,25]=0.1,s[105,26]=-0.8,s[105,27]=0.8,s[105,28]=0.0,s[105,29]=-0.6,s[105,30]=0.1 s[105,31]=-1.0,s[105,32]=0.8,s[105,33]=-0.9,s[105,34]=-1.0,s[105,35]=-0.4,s[105,36]=0.6,s[105,37]=-0.3,s[105,38]=1.2,s[105,39]=0.0,s[105,40]=-0.3,s[105,41]=1.2,s[105,42]=1.2,s[105,43]=0.9,s[105,44]=-0.1,s[105,45]=0.0,s[105,46]=-0.8,s[105,47]=-0.7,s[105,48]=-0.9,s[105,49]=-0.4,s[105,50]=0.5,s[105,51]=-0.4,s[105,52]=-0.1,s[105,53]=-1.1,s[105,54]=1.2,s[105,55]=-0.8,s[105,56]=-1.0,s[105,57]=-0.6,s[105,58]=-1.2,s[105,59]=0.3,s[105,60]=-0.4 s[106,1]=0.0,s[106,2]=0.4,s[106,3]=0.9,s[106,4]=0.1,s[106,5]=0.7,s[106,6]=0.0,s[106,7]=1.1,s[106,8]=-1.1,s[106,9]=-0.8,s[106,10]=-1.2,s[106,11]=0.8,s[106,12]=-1.1,s[106,13]=0.6,s[106,14]=1.0,s[106,15]=0.9,s[106,16]=-0.2,s[106,17]=-0.1,s[106,18]=0.1,s[106,19]=0.9,s[106,20]=1.2,s[106,21]=0.3,s[106,22]=0.4,s[106,23]=-0.2,s[106,24]=-0.2,s[106,25]=1.2,s[106,26]=0.6,s[106,27]=-0.8,s[106,28]=-1.2,s[106,29]=0.1,s[106,30]=-1.1 s[106,31]=0.0,s[106,32]=-0.6,s[106,33]=-1.0,s[106,34]=-0.1,s[106,35]=0.8,s[106,36]=1.1,s[106,37]=0.4,s[106,38]=0.6,s[106,39]=-0.5,s[106,40]=-0.2,s[106,41]=-0.1,s[106,42]=-1.0,s[106,43]=0.4,s[106,44]=0.6,s[106,45]=-0.6,s[106,46]=0.3,s[106,47]=0.1,s[106,48]=0.9,s[106,49]=0.4,s[106,50]=1.2,s[106,51]=-1.0,s[106,52]=-0.8,s[106,53]=-0.3,s[106,54]=-0.1,s[106,55]=0.2,s[106,56]=-0.3,s[106,57]=-0.4,s[106,58]=0.0,s[106,59]=0.9,s[106,60]=0.6 s[107,1]=1.0,s[107,2]=-0.9,s[107,3]=0.8,s[107,4]=0.9,s[107,5]=0.0,s[107,6]=0.1,s[107,7]=0.9,s[107,8]=0.4,s[107,9]=-1.1,s[107,10]=-0.6,s[107,11]=-0.3,s[107,12]=1.1,s[107,13]=0.7,s[107,14]=-0.7,s[107,15]=0.8,s[107,16]=-1.2,s[107,17]=0.4,s[107,18]=-0.1,s[107,19]=-1.0,s[107,20]=0.2,s[107,21]=-0.3,s[107,22]=-1.2,s[107,23]=-1.0,s[107,24]=0.9,s[107,25]=-0.7,s[107,26]=-0.8,s[107,27]=0.7,s[107,28]=1.0,s[107,29]=0.2,s[107,30]=0.7 s[107,31]=0.6,s[107,32]=-0.3,s[107,33]=-0.2,s[107,34]=0.8,s[107,35]=0.1,s[107,36]=-0.6,s[107,37]=-0.2,s[107,38]=-0.4,s[107,39]=0.7,s[107,40]=-1.0,s[107,41]=0.4,s[107,42]=-0.7,s[107,43]=-1.2,s[107,44]=-0.4,s[107,45]=-0.2,s[107,46]=1.0,s[107,47]=-1.0,s[107,48]=-0.5,s[107,49]=-1.2,s[107,50]=0.7,s[107,51]=0.7,s[107,52]=0.1,s[107,53]=-1.2,s[107,54]=1.1,s[107,55]=-0.5,s[107,56]=1.0,s[107,57]=-0.9,s[107,58]=0.3,s[107,59]=-0.3,s[107,60]=-0.8 s[108,1]=-0.8,s[108,2]=1.2,s[108,3]=1.1,s[108,4]=-0.9,s[108,5]=1.1,s[108,6]=0.2,s[108,7]=-0.2,s[108,8]=-0.1,s[108,9]=0.5,s[108,10]=-0.7,s[108,11]=-0.3,s[108,12]=-0.3,s[108,13]=0.4,s[108,14]=0.4,s[108,15]=0.1,s[108,16]=0.1,s[108,17]=-0.1,s[108,18]=-0.2,s[108,19]=1.0,s[108,20]=-0.7,s[108,21]=0.2,s[108,22]=0.5,s[108,23]=0.2,s[108,24]=-0.6,s[108,25]=-1.0,s[108,26]=-1.1,s[108,27]=0.2,s[108,28]=-1.0,s[108,29]=-0.2,s[108,30]=-1.1 s[108,31]=0.4,s[108,32]=1.2,s[108,33]=0.0,s[108,34]=-0.9,s[108,35]=-0.6,s[108,36]=-0.7,s[108,37]=0.4,s[108,38]=1.2,s[108,39]=-0.7,s[108,40]=0.6,s[108,41]=-0.1,s[108,42]=1.0,s[108,43]=-0.5,s[108,44]=0.6,s[108,45]=-0.3,s[108,46]=1.0,s[108,47]=-0.1,s[108,48]=1.2,s[108,49]=-0.8,s[108,50]=-0.5,s[108,51]=-0.1,s[108,52]=-1.0,s[108,53]=0.0,s[108,54]=-1.2,s[108,55]=-0.2,s[108,56]=-1.1,s[108,57]=0.1,s[108,58]=0.6,s[108,59]=0.7,s[108,60]=-0.6 s[109,1]=0.3,s[109,2]=0.7,s[109,3]=-0.9,s[109,4]=-1.0,s[109,5]=-0.2,s[109,6]=0.7,s[109,7]=-0.5,s[109,8]=0.7,s[109,9]=0.8,s[109,10]=0.9,s[109,11]=-0.6,s[109,12]=-1.2,s[109,13]=1.1,s[109,14]=-0.4,s[109,15]=0.9,s[109,16]=1.0,s[109,17]=-1.1,s[109,18]=0.3,s[109,19]=0.6,s[109,20]=0.2,s[109,21]=0.9,s[109,22]=-0.1,s[109,23]=-0.7,s[109,24]=-0.4,s[109,25]=-0.8,s[109,26]=-0.4,s[109,27]=-0.1,s[109,28]=-0.6,s[109,29]=0.1,s[109,30]=1.0 s[109,31]=-0.7,s[109,32]=-1.1,s[109,33]=0.8,s[109,34]=0.0,s[109,35]=-0.7,s[109,36]=-0.2,s[109,37]=-1.2,s[109,38]=1.2,s[109,39]=-1.1,s[109,40]=0.1,s[109,41]=1.2,s[109,42]=-0.5,s[109,43]=0.7,s[109,44]=-1.1,s[109,45]=-0.6,s[109,46]=0.1,s[109,47]=-1.0,s[109,48]=-0.3,s[109,49]=0.7,s[109,50]=0.0,s[109,51]=-0.6,s[109,52]=-0.6,s[109,53]=-1.0,s[109,54]=-1.0,s[109,55]=0.5,s[109,56]=0.3,s[109,57]=-1.0,s[109,58]=-0.9,s[109,59]=-1.1,s[109,60]=-0.6 s[110,1]=-0.3,s[110,2]=-1.2,s[110,3]=0.9,s[110,4]=-1.2,s[110,5]=-0.6,s[110,6]=-0.4,s[110,7]=-1.1,s[110,8]=1.0,s[110,9]=0.9,s[110,10]=-0.6,s[110,11]=-0.5,s[110,12]=0.1,s[110,13]=-0.6,s[110,14]=0.2,s[110,15]=0.0,s[110,16]=0.7,s[110,17]=0.7,s[110,18]=0.4,s[110,19]=0.1,s[110,20]=0.0,s[110,21]=0.8,s[110,22]=1.0,s[110,23]=0.9,s[110,24]=0.0,s[110,25]=0.6,s[110,26]=-0.9,s[110,27]=-0.8,s[110,28]=0.1,s[110,29]=0.6,s[110,30]=-0.8 s[110,31]=1.0,s[110,32]=1.1,s[110,33]=-0.2,s[110,34]=-1.1,s[110,35]=0.6,s[110,36]=0.3,s[110,37]=-1.1,s[110,38]=0.7,s[110,39]=-0.8,s[110,40]=-0.8,s[110,41]=-0.3,s[110,42]=-0.1,s[110,43]=-0.3,s[110,44]=-0.4,s[110,45]=0.6,s[110,46]=0.1,s[110,47]=-0.4,s[110,48]=-1.1,s[110,49]=0.8,s[110,50]=-0.5,s[110,51]=-0.5,s[110,52]=-1.1,s[110,53]=-1.2,s[110,54]=-0.1,s[110,55]=0.4,s[110,56]=1.2,s[110,57]=1.1,s[110,58]=0.8,s[110,59]=0.0,s[110,60]=-1.0 s[111,1]=1.2,s[111,2]=0.8,s[111,3]=0.4,s[111,4]=-1.1,s[111,5]=1.0,s[111,6]=-1.2,s[111,7]=-0.4,s[111,8]=-0.9,s[111,9]=-0.3,s[111,10]=-0.4,s[111,11]=1.1,s[111,12]=1.0,s[111,13]=0.7,s[111,14]=0.9,s[111,15]=-0.7,s[111,16]=-0.5,s[111,17]=-0.6,s[111,18]=0.0,s[111,19]=1.2,s[111,20]=-0.9,s[111,21]=-0.6,s[111,22]=-1.0,s[111,23]=1.1,s[111,24]=1.1,s[111,25]=-0.2,s[111,26]=-0.4,s[111,27]=-0.8,s[111,28]=-0.3,s[111,29]=0.2,s[111,30]=0.9 s[111,31]=-0.9,s[111,32]=-1.0,s[111,33]=-0.2,s[111,34]=-0.8,s[111,35]=-0.7,s[111,36]=-0.6,s[111,37]=0.7,s[111,38]=-0.7,s[111,39]=-1.1,s[111,40]=-0.4,s[111,41]=-1.1,s[111,42]=-1.1,s[111,43]=1.2,s[111,44]=1.0,s[111,45]=0.8,s[111,46]=0.8,s[111,47]=-1.0,s[111,48]=-1.1,s[111,49]=0.9,s[111,50]=-0.4,s[111,51]=-0.9,s[111,52]=0.6,s[111,53]=-0.5,s[111,54]=-0.7,s[111,55]=-0.9,s[111,56]=0.5,s[111,57]=0.4,s[111,58]=1.1,s[111,59]=1.2,s[111,60]=-0.8 s[112,1]=1.0,s[112,2]=0.6,s[112,3]=-0.2,s[112,4]=-1.1,s[112,5]=0.3,s[112,6]=-0.8,s[112,7]=0.1,s[112,8]=-0.7,s[112,9]=0.9,s[112,10]=-0.1,s[112,11]=-1.1,s[112,12]=-1.1,s[112,13]=0.7,s[112,14]=0.4,s[112,15]=-0.2,s[112,16]=0.4,s[112,17]=0.7,s[112,18]=0.9,s[112,19]=-0.4,s[112,20]=0.6,s[112,21]=-0.9,s[112,22]=-0.1,s[112,23]=0.6,s[112,24]=-0.8,s[112,25]=0.6,s[112,26]=-0.7,s[112,27]=-1.2,s[112,28]=-0.6,s[112,29]=-0.2,s[112,30]=-0.7 s[112,31]=-0.1,s[112,32]=-0.3,s[112,33]=0.0,s[112,34]=0.3,s[112,35]=1.1,s[112,36]=1.2,s[112,37]=-0.1,s[112,38]=1.1,s[112,39]=0.4,s[112,40]=-0.3,s[112,41]=-1.0,s[112,42]=-1.2,s[112,43]=-0.6,s[112,44]=1.1,s[112,45]=-0.5,s[112,46]=-1.1,s[112,47]=-1.2,s[112,48]=0.2,s[112,49]=1.1,s[112,50]=-0.8,s[112,51]=-1.1,s[112,52]=0.0,s[112,53]=0.7,s[112,54]=0.5,s[112,55]=1.1,s[112,56]=-0.9,s[112,57]=1.0,s[112,58]=-0.7,s[112,59]=-0.6,s[112,60]=-0.2 s[113,1]=0.1,s[113,2]=-0.3,s[113,3]=-0.2,s[113,4]=-0.2,s[113,5]=0.3,s[113,6]=-0.8,s[113,7]=-0.2,s[113,8]=1.2,s[113,9]=-0.8,s[113,10]=0.9,s[113,11]=-0.9,s[113,12]=0.0,s[113,13]=-0.6,s[113,14]=0.0,s[113,15]=0.7,s[113,16]=-0.4,s[113,17]=0.3,s[113,18]=-0.8,s[113,19]=-0.8,s[113,20]=-0.2,s[113,21]=0.8,s[113,22]=0.6,s[113,23]=0.7,s[113,24]=1.1,s[113,25]=-0.2,s[113,26]=-0.4,s[113,27]=0.0,s[113,28]=-1.0,s[113,29]=0.6,s[113,30]=-0.4 s[113,31]=-0.2,s[113,32]=-0.2,s[113,33]=-0.6,s[113,34]=0.7,s[113,35]=0.3,s[113,36]=-0.2,s[113,37]=-1.2,s[113,38]=-0.7,s[113,39]=1.1,s[113,40]=0.2,s[113,41]=-0.5,s[113,42]=0.2,s[113,43]=0.2,s[113,44]=1.1,s[113,45]=0.4,s[113,46]=0.8,s[113,47]=0.4,s[113,48]=-0.5,s[113,49]=-1.0,s[113,50]=1.2,s[113,51]=1.1,s[113,52]=0.8,s[113,53]=0.6,s[113,54]=0.7,s[113,55]=-0.6,s[113,56]=-0.7,s[113,57]=-0.6,s[113,58]=-0.2,s[113,59]=0.9,s[113,60]=-1.0 s[114,1]=-1.1,s[114,2]=0.2,s[114,3]=1.1,s[114,4]=-0.8,s[114,5]=0.3,s[114,6]=0.8,s[114,7]=-1.1,s[114,8]=0.3,s[114,9]=0.2,s[114,10]=0.8,s[114,11]=-1.1,s[114,12]=0.1,s[114,13]=-0.1,s[114,14]=-0.2,s[114,15]=0.4,s[114,16]=-0.1,s[114,17]=-0.7,s[114,18]=0.6,s[114,19]=-0.7,s[114,20]=0.0,s[114,21]=-0.8,s[114,22]=0.9,s[114,23]=0.7,s[114,24]=0.4,s[114,25]=0.2,s[114,26]=-0.4,s[114,27]=0.5,s[114,28]=1.0,s[114,29]=-0.1,s[114,30]=0.4 s[114,31]=0.5,s[114,32]=-0.8,s[114,33]=-0.4,s[114,34]=-1.2,s[114,35]=-0.5,s[114,36]=0.8,s[114,37]=0.5,s[114,38]=1.1,s[114,39]=-0.9,s[114,40]=-0.5,s[114,41]=1.1,s[114,42]=-1.2,s[114,43]=-0.5,s[114,44]=-0.9,s[114,45]=-1.0,s[114,46]=-0.3,s[114,47]=1.1,s[114,48]=-0.3,s[114,49]=0.9,s[114,50]=0.0,s[114,51]=0.2,s[114,52]=0.6,s[114,53]=0.2,s[114,54]=0.9,s[114,55]=0.4,s[114,56]=-0.1,s[114,57]=1.2,s[114,58]=-0.1,s[114,59]=0.7,s[114,60]=-0.4 s[115,1]=1.2,s[115,2]=-0.5,s[115,3]=0.1,s[115,4]=0.3,s[115,5]=0.3,s[115,6]=0.4,s[115,7]=0.9,s[115,8]=1.1,s[115,9]=0.1,s[115,10]=0.0,s[115,11]=-0.2,s[115,12]=0.0,s[115,13]=-1.1,s[115,14]=-0.5,s[115,15]=0.1,s[115,16]=-0.6,s[115,17]=0.6,s[115,18]=-0.9,s[115,19]=-1.1,s[115,20]=-0.2,s[115,21]=-0.8,s[115,22]=-1.2,s[115,23]=-0.1,s[115,24]=-0.1,s[115,25]=-1.0,s[115,26]=0.5,s[115,27]=0.9,s[115,28]=-0.1,s[115,29]=1.1,s[115,30]=-0.1 s[115,31]=0.2,s[115,32]=1.2,s[115,33]=1.1,s[115,34]=0.1,s[115,35]=1.0,s[115,36]=-0.2,s[115,37]=-0.7,s[115,38]=-1.1,s[115,39]=0.2,s[115,40]=0.0,s[115,41]=-0.3,s[115,42]=0.2,s[115,43]=0.4,s[115,44]=-1.2,s[115,45]=-1.2,s[115,46]=-0.2,s[115,47]=0.5,s[115,48]=-1.1,s[115,49]=0.3,s[115,50]=0.0,s[115,51]=0.3,s[115,52]=0.7,s[115,53]=0.5,s[115,54]=-0.1,s[115,55]=-0.6,s[115,56]=0.0,s[115,57]=0.8,s[115,58]=0.1,s[115,59]=0.4,s[115,60]=-1.0 s[116,1]=-0.9,s[116,2]=-0.7,s[116,3]=-0.8,s[116,4]=0.6,s[116,5]=-1.1,s[116,6]=0.1,s[116,7]=0.9,s[116,8]=0.0,s[116,9]=0.8,s[116,10]=0.6,s[116,11]=0.2,s[116,12]=-1.0,s[116,13]=0.2,s[116,14]=-0.7,s[116,15]=-0.2,s[116,16]=1.0,s[116,17]=-0.6,s[116,18]=1.0,s[116,19]=0.1,s[116,20]=0.0,s[116,21]=-0.3,s[116,22]=1.1,s[116,23]=0.5,s[116,24]=0.5,s[116,25]=0.0,s[116,26]=-0.8,s[116,27]=-1.0,s[116,28]=-1.0,s[116,29]=0.7,s[116,30]=0.8 s[116,31]=0.0,s[116,32]=0.3,s[116,33]=0.0,s[116,34]=0.1,s[116,35]=-0.5,s[116,36]=-0.6,s[116,37]=0.2,s[116,38]=-0.1,s[116,39]=-1.0,s[116,40]=-0.7,s[116,41]=0.6,s[116,42]=0.8,s[116,43]=-0.2,s[116,44]=0.2,s[116,45]=0.3,s[116,46]=-1.1,s[116,47]=0.3,s[116,48]=-0.2,s[116,49]=-0.3,s[116,50]=-1.1,s[116,51]=-1.0,s[116,52]=0.3,s[116,53]=-0.7,s[116,54]=0.9,s[116,55]=1.2,s[116,56]=1.1,s[116,57]=-0.7,s[116,58]=0.0,s[116,59]=-0.7,s[116,60]=-0.3 s[117,1]=0.0,s[117,2]=1.2,s[117,3]=-1.0,s[117,4]=-0.6,s[117,5]=0.0,s[117,6]=0.6,s[117,7]=-0.6,s[117,8]=1.2,s[117,9]=0.3,s[117,10]=-0.4,s[117,11]=-1.0,s[117,12]=-0.7,s[117,13]=1.2,s[117,14]=-1.1,s[117,15]=0.9,s[117,16]=-0.4,s[117,17]=-0.3,s[117,18]=0.8,s[117,19]=-1.0,s[117,20]=-0.8,s[117,21]=-1.2,s[117,22]=0.3,s[117,23]=-0.8,s[117,24]=0.0,s[117,25]=-1.2,s[117,26]=-1.0,s[117,27]=1.2,s[117,28]=0.1,s[117,29]=0.2,s[117,30]=0.6 s[117,31]=-0.6,s[117,32]=-0.7,s[117,33]=0.2,s[117,34]=-0.4,s[117,35]=1.0,s[117,36]=0.4,s[117,37]=0.0,s[117,38]=0.0,s[117,39]=-0.3,s[117,40]=-0.3,s[117,41]=-1.2,s[117,42]=-1.2,s[117,43]=-1.0,s[117,44]=0.9,s[117,45]=0.1,s[117,46]=0.0,s[117,47]=0.7,s[117,48]=-0.9,s[117,49]=-0.7,s[117,50]=0.3,s[117,51]=-0.7,s[117,52]=-0.2,s[117,53]=0.0,s[117,54]=0.2,s[117,55]=1.2,s[117,56]=-0.3,s[117,57]=1.1,s[117,58]=-0.7,s[117,59]=0.5,s[117,60]=-1.2 s[118,1]=-0.7,s[118,2]=-0.5,s[118,3]=1.2,s[118,4]=0.1,s[118,5]=-1.1,s[118,6]=0.5,s[118,7]=-0.6,s[118,8]=-0.3,s[118,9]=-0.1,s[118,10]=-1.0,s[118,11]=-0.2,s[118,12]=0.0,s[118,13]=-0.2,s[118,14]=0.9,s[118,15]=-0.9,s[118,16]=-0.9,s[118,17]=-0.9,s[118,18]=1.1,s[118,19]=1.0,s[118,20]=0.1,s[118,21]=-0.3,s[118,22]=-1.2,s[118,23]=0.7,s[118,24]=1.2,s[118,25]=-0.8,s[118,26]=-0.1,s[118,27]=0.4,s[118,28]=-1.2,s[118,29]=-0.3,s[118,30]=0.9 s[118,31]=-0.4,s[118,32]=-1.2,s[118,33]=0.5,s[118,34]=-0.8,s[118,35]=1.0,s[118,36]=0.7,s[118,37]=0.0,s[118,38]=1.1,s[118,39]=-0.7,s[118,40]=0.1,s[118,41]=0.2,s[118,42]=-0.9,s[118,43]=-0.7,s[118,44]=-0.9,s[118,45]=0.3,s[118,46]=-0.3,s[118,47]=1.2,s[118,48]=0.3,s[118,49]=-1.2,s[118,50]=-0.5,s[118,51]=0.8,s[118,52]=0.3,s[118,53]=0.3,s[118,54]=0.2,s[118,55]=-0.4,s[118,56]=0.9,s[118,57]=-0.3,s[118,58]=0.3,s[118,59]=0.4,s[118,60]=-0.5 s[119,1]=0.7,s[119,2]=-1.0,s[119,3]=-0.5,s[119,4]=-1.1,s[119,5]=-0.7,s[119,6]=-0.4,s[119,7]=0.2,s[119,8]=0.1,s[119,9]=0.7,s[119,10]=-0.1,s[119,11]=-0.1,s[119,12]=1.1,s[119,13]=-0.7,s[119,14]=-0.2,s[119,15]=0.1,s[119,16]=0.6,s[119,17]=-1.2,s[119,18]=-1.1,s[119,19]=0.4,s[119,20]=1.1,s[119,21]=-0.6,s[119,22]=-1.2,s[119,23]=-0.4,s[119,24]=1.1,s[119,25]=1.1,s[119,26]=1.2,s[119,27]=0.5,s[119,28]=-0.4,s[119,29]=0.0,s[119,30]=-1.1 s[119,31]=-0.1,s[119,32]=-1.2,s[119,33]=-1.2,s[119,34]=-0.6,s[119,35]=-1.0,s[119,36]=0.5,s[119,37]=-1.1,s[119,38]=-0.2,s[119,39]=0.2,s[119,40]=-0.2,s[119,41]=-0.7,s[119,42]=-0.7,s[119,43]=0.8,s[119,44]=0.0,s[119,45]=-0.1,s[119,46]=-1.0,s[119,47]=0.6,s[119,48]=-1.1,s[119,49]=-1.1,s[119,50]=-0.5,s[119,51]=0.2,s[119,52]=-1.2,s[119,53]=1.2,s[119,54]=0.6,s[119,55]=-0.1,s[119,56]=-0.3,s[119,57]=0.2,s[119,58]=-0.6,s[119,59]=-0.5,s[119,60]=0.0 s[120,1]=-0.8,s[120,2]=-0.4,s[120,3]=0.3,s[120,4]=-1.0,s[120,5]=-1.0,s[120,6]=-1.2,s[120,7]=0.1,s[120,8]=0.4,s[120,9]=-0.2,s[120,10]=0.6,s[120,11]=0.6,s[120,12]=0.8,s[120,13]=-0.3,s[120,14]=-1.0,s[120,15]=-1.2,s[120,16]=0.1,s[120,17]=1.1,s[120,18]=-0.7,s[120,19]=0.6,s[120,20]=-0.8,s[120,21]=-0.9,s[120,22]=-0.8,s[120,23]=-0.2,s[120,24]=-0.3,s[120,25]=-1.2,s[120,26]=1.0,s[120,27]=-0.8,s[120,28]=-0.6,s[120,29]=1.2,s[120,30]=-1.1 s[120,31]=0.9,s[120,32]=1.1,s[120,33]=-0.1,s[120,34]=-0.5,s[120,35]=0.3,s[120,36]=1.2,s[120,37]=-0.4,s[120,38]=0.5,s[120,39]=0.1,s[120,40]=-0.6,s[120,41]=0.7,s[120,42]=0.6,s[120,43]=0.6,s[120,44]=1.1,s[120,45]=-1.2,s[120,46]=-0.7,s[120,47]=-0.6,s[120,48]=0.2,s[120,49]=1.1,s[120,50]=-0.8,s[120,51]=-1.0,s[120,52]=-1.0,s[120,53]=-0.7,s[120,54]=1.2,s[120,55]=-0.8,s[120,56]=0.5,s[120,57]=-0.9,s[120,58]=0.2,s[120,59]=0.7,s[120,60]=-1.1 s[121,1]=-0.6,s[121,2]=-0.1,s[121,3]=-0.4,s[121,4]=-1.0,s[121,5]=-0.2,s[121,6]=-0.9,s[121,7]=0.4,s[121,8]=-1.0,s[121,9]=0.9,s[121,10]=-0.6,s[121,11]=1.0,s[121,12]=1.2,s[121,13]=1.1,s[121,14]=0.9,s[121,15]=-0.8,s[121,16]=-0.8,s[121,17]=-1.2,s[121,18]=-0.3,s[121,19]=0.1,s[121,20]=0.7,s[121,21]=-0.1,s[121,22]=-0.3,s[121,23]=0.0,s[121,24]=0.8,s[121,25]=-1.2,s[121,26]=0.5,s[121,27]=0.9,s[121,28]=1.2,s[121,29]=-0.2,s[121,30]=-0.8 s[121,31]=0.3,s[121,32]=1.0,s[121,33]=0.4,s[121,34]=1.2,s[121,35]=-0.9,s[121,36]=-0.2,s[121,37]=-0.2,s[121,38]=-0.3,s[121,39]=1.1,s[121,40]=0.2,s[121,41]=0.2,s[121,42]=-0.4,s[121,43]=0.9,s[121,44]=-0.8,s[121,45]=0.8,s[121,46]=-1.1,s[121,47]=0.0,s[121,48]=1.0,s[121,49]=-0.6,s[121,50]=-1.0,s[121,51]=0.9,s[121,52]=-0.3,s[121,53]=0.8,s[121,54]=-0.6,s[121,55]=-0.8,s[121,56]=0.1,s[121,57]=0.5,s[121,58]=0.1,s[121,59]=1.2,s[121,60]=-0.9 s[122,1]=0.7,s[122,2]=0.9,s[122,3]=-1.0,s[122,4]=-1.2,s[122,5]=-0.1,s[122,6]=-1.2,s[122,7]=0.4,s[122,8]=0.8,s[122,9]=-1.1,s[122,10]=0.3,s[122,11]=-1.0,s[122,12]=0.6,s[122,13]=-0.1,s[122,14]=0.8,s[122,15]=0.3,s[122,16]=-1.1,s[122,17]=0.0,s[122,18]=-0.7,s[122,19]=1.1,s[122,20]=1.1,s[122,21]=0.8,s[122,22]=-1.2,s[122,23]=-0.8,s[122,24]=-0.5,s[122,25]=0.0,s[122,26]=-0.8,s[122,27]=-0.1,s[122,28]=0.2,s[122,29]=0.5,s[122,30]=-0.1 s[122,31]=0.5,s[122,32]=1.2,s[122,33]=0.7,s[122,34]=-1.0,s[122,35]=-1.1,s[122,36]=-1.1,s[122,37]=0.0,s[122,38]=-0.4,s[122,39]=-0.5,s[122,40]=0.9,s[122,41]=0.7,s[122,42]=-1.0,s[122,43]=0.1,s[122,44]=-0.6,s[122,45]=0.8,s[122,46]=0.4,s[122,47]=-0.3,s[122,48]=0.0,s[122,49]=-0.2,s[122,50]=-0.6,s[122,51]=-0.8,s[122,52]=-0.8,s[122,53]=-0.3,s[122,54]=-0.3,s[122,55]=0.7,s[122,56]=-1.0,s[122,57]=-1.1,s[122,58]=-0.6,s[122,59]=1.2,s[122,60]=-0.1 s[123,1]=0.9,s[123,2]=0.1,s[123,3]=0.1,s[123,4]=-1.2,s[123,5]=0.1,s[123,6]=0.7,s[123,7]=-1.0,s[123,8]=-0.6,s[123,9]=0.1,s[123,10]=0.6,s[123,11]=-1.1,s[123,12]=0.8,s[123,13]=-0.1,s[123,14]=0.1,s[123,15]=0.0,s[123,16]=-0.9,s[123,17]=-0.3,s[123,18]=1.1,s[123,19]=-1.0,s[123,20]=-0.9,s[123,21]=-0.9,s[123,22]=-0.7,s[123,23]=-1.0,s[123,24]=-1.1,s[123,25]=-1.2,s[123,26]=-0.8,s[123,27]=-0.1,s[123,28]=-0.2,s[123,29]=-0.7,s[123,30]=-1.2 s[123,31]=1.2,s[123,32]=-0.2,s[123,33]=-1.2,s[123,34]=-0.7,s[123,35]=-0.2,s[123,36]=-0.1,s[123,37]=0.4,s[123,38]=-0.8,s[123,39]=0.0,s[123,40]=1.1,s[123,41]=0.4,s[123,42]=1.1,s[123,43]=-0.7,s[123,44]=1.2,s[123,45]=-0.8,s[123,46]=-1.2,s[123,47]=0.7,s[123,48]=-0.7,s[123,49]=0.1,s[123,50]=1.1,s[123,51]=0.0,s[123,52]=-0.8,s[123,53]=-0.1,s[123,54]=-1.1,s[123,55]=0.9,s[123,56]=-1.2,s[123,57]=-1.2,s[123,58]=0.4,s[123,59]=-0.4,s[123,60]=-1.0 s[124,1]=-0.7,s[124,2]=0.9,s[124,3]=0.9,s[124,4]=-0.8,s[124,5]=1.0,s[124,6]=-1.1,s[124,7]=0.6,s[124,8]=-0.1,s[124,9]=-0.3,s[124,10]=-0.9,s[124,11]=0.1,s[124,12]=1.0,s[124,13]=-0.3,s[124,14]=0.5,s[124,15]=-0.5,s[124,16]=0.3,s[124,17]=1.2,s[124,18]=-0.2,s[124,19]=1.2,s[124,20]=-0.2,s[124,21]=-1.1,s[124,22]=-0.5,s[124,23]=1.0,s[124,24]=-0.9,s[124,25]=-1.0,s[124,26]=-1.1,s[124,27]=0.8,s[124,28]=0.9,s[124,29]=-0.3,s[124,30]=-1.1 s[124,31]=0.1,s[124,32]=-0.1,s[124,33]=-0.4,s[124,34]=0.6,s[124,35]=0.9,s[124,36]=0.5,s[124,37]=0.4,s[124,38]=-1.0,s[124,39]=0.8,s[124,40]=1.0,s[124,41]=-0.5,s[124,42]=-0.5,s[124,43]=1.2,s[124,44]=-1.1,s[124,45]=-0.4,s[124,46]=0.3,s[124,47]=-1.2,s[124,48]=0.6,s[124,49]=0.3,s[124,50]=-0.4,s[124,51]=-0.5,s[124,52]=1.0,s[124,53]=-0.4,s[124,54]=-0.7,s[124,55]=0.6,s[124,56]=-0.7,s[124,57]=-0.1,s[124,58]=-0.4,s[124,59]=-1.1,s[124,60]=-0.4 s[125,1]=-0.1,s[125,2]=-0.2,s[125,3]=-0.6,s[125,4]=-0.3,s[125,5]=0.7,s[125,6]=-0.2,s[125,7]=-0.5,s[125,8]=-0.1,s[125,9]=-0.5,s[125,10]=0.4,s[125,11]=0.7,s[125,12]=1.1,s[125,13]=0.6,s[125,14]=0.5,s[125,15]=1.1,s[125,16]=-0.9,s[125,17]=0.2,s[125,18]=-0.8,s[125,19]=0.7,s[125,20]=1.2,s[125,21]=-0.1,s[125,22]=0.7,s[125,23]=-1.0,s[125,24]=-1.1,s[125,25]=1.0,s[125,26]=-0.2,s[125,27]=0.4,s[125,28]=-0.9,s[125,29]=0.2,s[125,30]=0.8 s[125,31]=0.3,s[125,32]=-0.3,s[125,33]=-0.4,s[125,34]=-1.0,s[125,35]=0.6,s[125,36]=1.0,s[125,37]=0.3,s[125,38]=0.8,s[125,39]=1.1,s[125,40]=1.1,s[125,41]=-1.0,s[125,42]=0.5,s[125,43]=0.4,s[125,44]=-0.5,s[125,45]=0.3,s[125,46]=-0.4,s[125,47]=-0.3,s[125,48]=1.2,s[125,49]=0.8,s[125,50]=-0.3,s[125,51]=-0.1,s[125,52]=-1.0,s[125,53]=0.6,s[125,54]=-0.4,s[125,55]=-0.9,s[125,56]=-0.6,s[125,57]=0.0,s[125,58]=-1.1,s[125,59]=-1.0,s[125,60]=-0.6 s[126,1]=0.2,s[126,2]=1.1,s[126,3]=-0.9,s[126,4]=-0.1,s[126,5]=0.6,s[126,6]=0.2,s[126,7]=1.1,s[126,8]=-0.6,s[126,9]=-0.8,s[126,10]=0.2,s[126,11]=-1.2,s[126,12]=0.4,s[126,13]=-0.1,s[126,14]=-1.2,s[126,15]=-0.5,s[126,16]=-0.6,s[126,17]=-0.7,s[126,18]=0.0,s[126,19]=-0.5,s[126,20]=0.3,s[126,21]=0.1,s[126,22]=1.2,s[126,23]=-0.2,s[126,24]=-0.5,s[126,25]=-1.0,s[126,26]=0.6,s[126,27]=1.2,s[126,28]=1.1,s[126,29]=0.5,s[126,30]=0.1 s[126,31]=0.0,s[126,32]=-0.2,s[126,33]=-0.6,s[126,34]=1.0,s[126,35]=-1.2,s[126,36]=0.2,s[126,37]=-0.4,s[126,38]=0.4,s[126,39]=0.7,s[126,40]=0.7,s[126,41]=-0.8,s[126,42]=0.4,s[126,43]=0.6,s[126,44]=-0.1,s[126,45]=0.7,s[126,46]=-0.9,s[126,47]=1.2,s[126,48]=-0.2,s[126,49]=0.2,s[126,50]=-0.5,s[126,51]=-0.2,s[126,52]=-1.2,s[126,53]=-0.8,s[126,54]=-0.8,s[126,55]=0.7,s[126,56]=-0.9,s[126,57]=-0.1,s[126,58]=0.9,s[126,59]=-1.2,s[126,60]=-0.7 s[127,1]=-0.1,s[127,2]=-0.1,s[127,3]=-0.3,s[127,4]=-0.3,s[127,5]=-0.6,s[127,6]=1.0,s[127,7]=-0.5,s[127,8]=0.4,s[127,9]=-0.3,s[127,10]=-0.8,s[127,11]=0.3,s[127,12]=0.9,s[127,13]=0.3,s[127,14]=0.6,s[127,15]=1.1,s[127,16]=-0.7,s[127,17]=-0.9,s[127,18]=1.1,s[127,19]=1.1,s[127,20]=0.9,s[127,21]=0.1,s[127,22]=0.1,s[127,23]=0.7,s[127,24]=-1.2,s[127,25]=-0.1,s[127,26]=-0.5,s[127,27]=-0.7,s[127,28]=0.5,s[127,29]=0.0,s[127,30]=1.1 s[127,31]=-1.0,s[127,32]=-0.4,s[127,33]=-0.4,s[127,34]=-1.0,s[127,35]=0.9,s[127,36]=-0.9,s[127,37]=-0.9,s[127,38]=0.8,s[127,39]=0.0,s[127,40]=0.6,s[127,41]=-0.5,s[127,42]=0.4,s[127,43]=0.6,s[127,44]=0.7,s[127,45]=1.1,s[127,46]=-0.9,s[127,47]=0.5,s[127,48]=-0.9,s[127,49]=-0.5,s[127,50]=1.1,s[127,51]=0.3,s[127,52]=0.4,s[127,53]=-0.9,s[127,54]=-0.4,s[127,55]=-0.4,s[127,56]=0.9,s[127,57]=-0.7,s[127,58]=-1.2,s[127,59]=-0.5,s[127,60]=1.1 s[128,1]=-0.5,s[128,2]=-0.3,s[128,3]=1.1,s[128,4]=-1.0,s[128,5]=-0.6,s[128,6]=0.8,s[128,7]=0.6,s[128,8]=0.4,s[128,9]=-1.1,s[128,10]=-1.1,s[128,11]=1.1,s[128,12]=0.2,s[128,13]=-1.2,s[128,14]=0.1,s[128,15]=0.8,s[128,16]=0.3,s[128,17]=-0.4,s[128,18]=-0.1,s[128,19]=0.7,s[128,20]=1.1,s[128,21]=-0.3,s[128,22]=-0.1,s[128,23]=-1.0,s[128,24]=0.2,s[128,25]=0.4,s[128,26]=0.5,s[128,27]=1.0,s[128,28]=-0.4,s[128,29]=-0.7,s[128,30]=1.0 s[128,31]=0.4,s[128,32]=-1.1,s[128,33]=-1.2,s[128,34]=-1.2,s[128,35]=0.2,s[128,36]=-0.4,s[128,37]=-0.9,s[128,38]=0.7,s[128,39]=-0.7,s[128,40]=0.5,s[128,41]=1.1,s[128,42]=-1.0,s[128,43]=0.1,s[128,44]=-0.5,s[128,45]=-1.2,s[128,46]=-0.6,s[128,47]=0.4,s[128,48]=0.8,s[128,49]=0.8,s[128,50]=-0.1,s[128,51]=-0.7,s[128,52]=0.8,s[128,53]=0.3,s[128,54]=1.1,s[128,55]=-0.9,s[128,56]=-0.3,s[128,57]=1.1,s[128,58]=0.4,s[128,59]=1.0,s[128,60]=-0.1 s[129,1]=0.4,s[129,2]=-1.1,s[129,3]=1.2,s[129,4]=-0.5,s[129,5]=0.1,s[129,6]=0.9,s[129,7]=-1.0,s[129,8]=-0.9,s[129,9]=0.5,s[129,10]=-1.1,s[129,11]=-0.2,s[129,12]=-0.2,s[129,13]=0.9,s[129,14]=-0.5,s[129,15]=0.7,s[129,16]=-0.4,s[129,17]=-0.2,s[129,18]=0.4,s[129,19]=0.3,s[129,20]=0.8,s[129,21]=-0.7,s[129,22]=-0.5,s[129,23]=0.5,s[129,24]=-0.4,s[129,25]=0.3,s[129,26]=1.1,s[129,27]=-0.2,s[129,28]=1.0,s[129,29]=-0.7,s[129,30]=-0.5 s[129,31]=-0.2,s[129,32]=1.2,s[129,33]=-1.1,s[129,34]=-1.1,s[129,35]=-1.1,s[129,36]=-1.0,s[129,37]=-0.4,s[129,38]=1.2,s[129,39]=-0.5,s[129,40]=0.2,s[129,41]=0.1,s[129,42]=-0.2,s[129,43]=0.1,s[129,44]=0.8,s[129,45]=-1.0,s[129,46]=-1.2,s[129,47]=-0.4,s[129,48]=-0.4,s[129,49]=0.3,s[129,50]=-1.2,s[129,51]=0.7,s[129,52]=0.4,s[129,53]=-0.7,s[129,54]=-0.8,s[129,55]=-1.1,s[129,56]=-0.7,s[129,57]=-0.3,s[129,58]=-0.8,s[129,59]=0.4,s[129,60]=0.2 s[130,1]=-0.6,s[130,2]=-1.0,s[130,3]=1.2,s[130,4]=1.0,s[130,5]=0.6,s[130,6]=-0.5,s[130,7]=1.0,s[130,8]=0.8,s[130,9]=-0.9,s[130,10]=-0.2,s[130,11]=-1.0,s[130,12]=-0.3,s[130,13]=-1.2,s[130,14]=0.1,s[130,15]=-0.2,s[130,16]=-1.2,s[130,17]=-1.0,s[130,18]=-1.2,s[130,19]=0.4,s[130,20]=0.9,s[130,21]=0.7,s[130,22]=-0.6,s[130,23]=-0.5,s[130,24]=1.1,s[130,25]=0.2,s[130,26]=1.2,s[130,27]=0.1,s[130,28]=1.2,s[130,29]=0.7,s[130,30]=0.1 s[130,31]=-0.6,s[130,32]=-0.2,s[130,33]=0.6,s[130,34]=0.2,s[130,35]=-0.7,s[130,36]=1.2,s[130,37]=-1.1,s[130,38]=-0.1,s[130,39]=0.3,s[130,40]=-1.0,s[130,41]=-0.8,s[130,42]=-1.1,s[130,43]=0.9,s[130,44]=0.0,s[130,45]=-0.9,s[130,46]=-1.2,s[130,47]=0.7,s[130,48]=-0.2,s[130,49]=-0.6,s[130,50]=-0.3,s[130,51]=-0.2,s[130,52]=-1.0,s[130,53]=-0.6,s[130,54]=0.6,s[130,55]=-0.5,s[130,56]=-0.3,s[130,57]=0.4,s[130,58]=-1.0,s[130,59]=1.1,s[130,60]=-0.2 s[131,1]=0.2,s[131,2]=-1.1,s[131,3]=-0.4,s[131,4]=0.6,s[131,5]=0.8,s[131,6]=-1.1,s[131,7]=-0.4,s[131,8]=0.0,s[131,9]=0.1,s[131,10]=-0.3,s[131,11]=0.5,s[131,12]=0.6,s[131,13]=0.4,s[131,14]=-0.1,s[131,15]=-0.6,s[131,16]=0.9,s[131,17]=-1.1,s[131,18]=0.6,s[131,19]=-1.2,s[131,20]=-1.1,s[131,21]=0.2,s[131,22]=0.7,s[131,23]=0.5,s[131,24]=-0.6,s[131,25]=-1.0,s[131,26]=0.1,s[131,27]=0.1,s[131,28]=-0.5,s[131,29]=-0.7,s[131,30]=-0.6 s[131,31]=1.0,s[131,32]=-1.1,s[131,33]=-0.9,s[131,34]=1.1,s[131,35]=0.2,s[131,36]=-0.2,s[131,37]=-0.3,s[131,38]=0.9,s[131,39]=0.6,s[131,40]=0.4,s[131,41]=1.2,s[131,42]=-1.0,s[131,43]=-0.7,s[131,44]=0.6,s[131,45]=0.3,s[131,46]=0.0,s[131,47]=0.9,s[131,48]=-0.4,s[131,49]=0.5,s[131,50]=1.1,s[131,51]=1.0,s[131,52]=-0.2,s[131,53]=-0.9,s[131,54]=-0.7,s[131,55]=-1.1,s[131,56]=-0.4,s[131,57]=0.7,s[131,58]=1.2,s[131,59]=-0.9,s[131,60]=0.4 ; ; initialize coefficients ; if @sel > 0 b1=s[@sel,1],b2=s[@sel,2],b3=s[@sel,3],b4=s[@sel,4],b5=s[@sel,5],b6=s[@sel,6],b7=s[@sel,7],b8=s[@sel,8],b9=s[@sel,9],b10=s[@sel,10] b11=s[@sel,11],b12=s[@sel,12],b13=s[@sel,13],b14=s[@sel,14],b15=s[@sel,15],b16=s[@sel,16],b17=s[@sel,17],b18=s[@sel,18],b19=s[@sel,19],b20=s[@sel,20] b21=s[@sel,21],b22=s[@sel,22],b23=s[@sel,23],b24=s[@sel,24],b25=s[@sel,25],b26=s[@sel,26],b27=s[@sel,27],b28=s[@sel,28],b29=s[@sel,29],b30=s[@sel,30] b31=s[@sel,31],b32=s[@sel,32],b33=s[@sel,33],b34=s[@sel,34],b35=s[@sel,35],b36=s[@sel,36],b37=s[@sel,37],b38=s[@sel,38],b39=s[@sel,39],b40=s[@sel,40] b41=s[@sel,41],b42=s[@sel,42],b43=s[@sel,43],b44=s[@sel,44],b45=s[@sel,45],b46=s[@sel,46],b47=s[@sel,47],b48=s[@sel,48],b49=s[@sel,49],b50=s[@sel,50] b51=s[@sel,51],b52=s[@sel,52],b53=s[@sel,53],b54=s[@sel,54],b55=s[@sel,55],b56=s[@sel,56],b57=s[@sel,57],b58=s[@sel,58],b59=s[@sel,59],b60=s[@sel,60] endif ; ; fill the hit array ; while (iter < (iterate*sqr(#width*#magn/400))) xx = fx yy = fy if @sel == 0 fx = fx + @ed*(@a1 + @a2*fx + @a3*fx*fx + @a4*fx*fx*fx + @a5*fx*fx*fy + @a6*fx*fx*zz + @a7*fx*fy + \ @a8*fx*fy*fy + @a9*fx*fy*zz + @a10*fx*zz + @a11*fx*zz*zz + @a12*fy + @a13*fy*fy + @a14*fy*fy*fy + \ @a15*fy*fy*zz + @a16*fy*zz + @a17*fy*zz*zz + @a18*zz + @a19*zz*zz + @a20*zz*zz*zz) fy = fy + @ed*(@a21 + @a22*xx + @a23*xx*xx + @a24*xx*xx*xx + @a25*xx*xx*fy + @a26*xx*xx*zz + @a27*xx*fy +\ @a28*xx*fy*fy + @a29*xx*fy*zz + @a30*xx*zz + @a31*xx*zz*zz + @a32*fy + @a33*fy*fy + @a34*fy*fy*fy + \ @a35*fy*fy*zz + @a36*fy*zz + @a37*fy*zz*zz + @a38*zz + @a39*zz*zz + @a40*zz*zz*zz) zz = zz + @ed*(@a41 + @a42*xx + @a43*xx*xx + @a44*xx*xx*xx + @a45*xx*xx*yy + @a46*xx*xx*zz + @a47*xx*yy + \ @a48*xx*yy*yy + @a49*xx*yy*zz + @a50*xx*zz + @a51*xx*zz*zz + @a52*yy + @a53*yy*yy + @a54*yy*yy*yy + \ @a55*yy*yy*zz + @a56*yy*zz + @a57*yy*zz*zz + @a58*zz + @a59*zz*zz + @a60*zz*zz*zz) else fx = fx + @ed*(b1 + b2*fx + b3*fx*fx + b4*fx*fx*fx + b5*fx*fx*fy + b6*fx*fx*zz + b7*fx*fy + \ b8*fx*fy*fy + b9*fx*fy*zz + b10*fx*zz + b11*fx*zz*zz + b12*fy + b13*fy*fy + b14*fy*fy*fy + \ b15*fy*fy*zz + b16*fy*zz + b17*fy*zz*zz + b18*zz + b19*zz*zz + b20*zz*zz*zz) fy = fy + @ed*(b21 + b22*xx + b23*xx*xx + b24*xx*xx*xx + b25*xx*xx*fy + b26*xx*xx*zz + b27*xx*fy +\ b28*xx*fy*fy + b29*xx*fy*zz + b30*xx*zz + b31*xx*zz*zz + b32*fy + b33*fy*fy + b34*fy*fy*fy + \ b35*fy*fy*zz + b36*fy*zz + b37*fy*zz*zz + b38*zz + b39*zz*zz + b40*zz*zz*zz) zz = zz + @ed*(b41 + b42*xx + b43*xx*xx + b44*xx*xx*xx + b45*xx*xx*yy + b46*xx*xx*zz + b47*xx*yy + \ b48*xx*yy*yy + b49*xx*yy*zz + b50*xx*zz + b51*xx*zz*zz + b52*yy + b53*yy*yy + b54*yy*yy*yy + \ b55*yy*yy*zz + b56*yy*zz + b57*yy*zz*zz + b58*zz + b59*zz*zz + b60*zz*zz*zz) endif ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax ffz = (zmin-zz)/sqrt(txmax^2+tymax^2) xx = ffx ; ; rotation around the z axis ; xx = ffx ffx = 0.5 + (ffx - 0.5 - @rotoffx/txmax)*cos(#angle) - \ (ffy - 0.5 - @rotoffy/tymax)*sin(#angle)*#height/#width ffy = 0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(#angle) + \ (xx - 0.5 - @rotoffx/txmax)*sin(#angle)*#width/#height; ; rotation around the y axis ; xx = ffx ffx = (0.5 + (ffz - 0.5 - @rotoffz/txmax)*sin(@zangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@zangle*pi/180))*#width ffz = (0.5 + (ffz - 0.5 - @rotoffz/tzmax)*cos(@zangle*pi/180) - \ (xx - 0.5 - @rotoffx/txmax)*sin(@zangle*pi/180)) ; ; rotation around the x axis ; yy = ffy ffy = (0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(@xangle*pi/180) - \ (ffz - 0.5 - @rotoffz/tzmax)*sin(@xangle*pi/180))*#height if @oldver ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*#height/2 else ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*scrsize endif ; ; final translation ; ffx = ffx - @transx*#width ffy = ffy - @transy*#height if @oldver ffz = ffz - @transz*#height/2 else ffz = ffz - @transz*scrsize endif ; ; perspective application ; if @oldver if @useproj ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif else if @useprojn ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif endif px = trunc(ffx)+wd2 py = trunc(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+1+flip(ffz) if real(hits[px,py])>maxnhit maxnhit = real(hits[px,py]) endif if ffz > hits3[px,py] || hits3[px,py] == 0 hits3[px,py] = ffz endif hits2[px,py] = ffz endif iter = iter + 1 endwhile h = 0 w = 0 ; init: float nhit=0 float zave=0 float zlast=0 float zbiggest=0 float nhitx=0 float zavex=0 float zlastx=0 float zbiggestx=0 float nhity=0 float zavey=0 float zlasty=0 float zbiggesty=0 bool done = false float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 int i = 0 ;loop: int delta = ceil(@closeness) int xcrd = #x int ycrd = #y bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true if xcrd+@closeness < #width+wd && ycrd+@closeness < #height+ht && real(hits[xcrd,ycrd]) > @thresh if @filter == 0 if @value == 3 zbiggest = hits3[xcrd,ycrd] zbiggestx = hits3[xcrd+delta,ycrd] zbiggesty = hits3[xcrd,ycrd+delta] elseif @value == 0 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) elseif @value == 1 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) zave = imag(hits[xcrd,ycrd])/(nhit + 1) zavex = imag(hits[xcrd+delta,ycrd])/(nhitx + 1) zavey = imag(hits[xcrd,ycrd+delta])/(nhity + 1) elseif @value == 2 zlast = hits2[xcrd,ycrd] zlastx = hits2[xcrd+delta,ycrd] zlasty = hits2[xcrd,ycrd+delta] endif else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 zbiggest = 0 zbiggestx = 0 zbiggesty = 0 zave = 0 zavex = 0 zavey = 0 zlast = 0 zlastx = 0 zlasty = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter if @value == 0 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) elseif @value == 1 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) zave = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy])/(nhit+1) zavex = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx+delta,ycrd+gy])/(nhitx+1) zavey = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta])/(nhity+1) elseif @value == 2 zlast = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy] zlastx = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx+delta,ycrd+gy] zlasty = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy+delta] elseif @value == 3 zbiggest = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy] zbiggestx = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx+delta,ycrd+gy] zbiggesty = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy+delta] endif gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile if @value == 0 nhit = nhit/gweight nhitx = nhitx/gweight nhity = nhity/gweight elseif @value == 1 zave = zave/gweight zavex = zavex/gweight zavey = zavey/gweight elseif @value == 2 zlast = zlast/gweight zlastx = zlastx/gweight zlasty = zlasty/gweight elseif @value == 3 zbiggest = zbiggest/gweight zbiggestx = zbiggestx/gweight zbiggesty = zbiggesty/gweight endif endif endif endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = zave cenx = zavex ceny = zavey elseif @value == 2 cen = zlast cenx = zlastx ceny = zlasty else cen = zbiggest cenx = zbiggestx ceny = zbiggesty endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * zscale2 e2 = e2 * zscale2 e3 = e3 * zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxnhit elseif @value == 1 #z = (zave/(log(maxnhit)+1))^3 elseif @value == 2 #z = (zlast/(log(maxnhit)+1))^10 elseif @value == 3 #z = (zbiggest/(log(maxnhit)+1))^10 endif endif if @oldver if done == false done = true endif endif loop: i = i + 1 if !@oldver if cen < i if done == false done = true endif endif endif bailout: done == false default: heading caption="Sprott 3D Cubic ODE G Attractors" endheading $ifdef VER40 heading text="Strange attractors from simultaneous ordinary differential \ equations using Euler's finite difference method to calculate." endheading heading text="Color with Damien's Lighting, 3D Texturizer Enhanced III or\ Direct Color Slope." endheading $else heading caption="Strange attractors from simultaneous" endheading heading caption="ordinary differential equations using" endheading heading caption="Euler's finite difference method to" endheading heading caption="calculate." endheading heading caption="Color with Damien's Lighting" endheading heading caption="or one of the 3D Texturizer formulas" endheading heading caption="3D Texturizer III is needed for" endheading heading caption="the non-slope color options." endheading $endif title="Slope 3D Cubic ODE G Attractor" maxiter=1000 method=multipass periodicity=0 float param version caption = "Version number" default = 1.1 hint = "This is for backwards compatibility with old versions \ of the formula." visible = false endparam bool param oldver caption = "Use original version" default = false endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 0.1 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 0 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param value caption = "Hit Value" enum = "Count" "Ave Z" "Last Z" "Largest Z" default = 3 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param pass caption = "Pass slope values" default = true endparam heading caption = "Slope Parameters" visible=@pass==true endheading param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 1.0 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible=@pass==true endparam heading caption = "Rotations and Translations" endheading $ifdef VER40 heading text = "Use the location tab for rotation around the Z Axis." endheading $endif param xangle caption = "X Axis Rotation" default = 0.0 hint = "This is the fixed (horizontal) Y Axis. It is performed \ after the normal fractal rotation(s) and zooms." endparam param zangle caption = "Y Axis Rotation" default = 0.0 ; min = 0.0 ; max = 180.0 hint = "This is the fixed (vertical) Y Axis. It is performed \ after the normal fractal rotation(s) and zooms." endparam param rotoffx caption = "Rot Center X Offset" default = 0.0 endparam param rotoffy caption = "Rot Center Y Offset" default = 0.0 endparam param rotoffz caption = "Rot Center Z Offset" default = 0.0 endparam param transx caption = "X Final Translation" default = 0.0 endparam param transy caption = "Y Final Translation" default = 0.0 endparam param transz caption = "Z Final Translation" default = 0.0 endparam heading caption = "Perspective" endheading param useproj caption = "Use Perspective" default = false visible = @oldver endparam param useprojn caption = "Use Perspective" default = true visible = !@oldver endparam param cprojx caption = "X Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam param cprojy caption = "Y Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam float param cprojz caption = "Z Center of Projection" default = -1 visible = @useproj || @useprojn endparam heading caption = "Attractor Parameters" endheading param hideparam caption = "Hide Parameters" default = true endparam param ed caption = "Euler Difference" default = 0.1 endparam param sel caption = "select preset coeffs" enum = "no preset" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" \ "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" \ "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42" "43" "44" \ "45" "46" "47" "48" "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" \ "60" "61" "62" "63" "64" "65" "66" "67" "69" "69" "70" "71" "72" "73" "74" \ "75" "76" "77" "78" "79" "80" "81" "82" "83" "84" "85" "86" "87" "88" "89" \ "90" "91" "92" "93" "94" "95" "96" "97" "98" "99" "100" "101" "102" "103" \ "104" "105" "106" "107" "108" "109" "110" "111" "112" "113" "114" "115" \ "116" "117" "118" "119" "120" "121" "122" "123" "124" "125" "126" "127" \ "128" "129" "130" "131" default = 0 endparam param a1 caption = "coefficient a1" default = 0.4 visible = @hideparam==false endparam param a2 caption = "coefficient a2" default = 0.7 visible = @hideparam==false endparam param a3 caption = "coefficient a3" default = -0.5 visible = @hideparam==false endparam param a4 caption = "coefficient a4" default = -0.3 visible = @hideparam==false endparam param a5 caption = "coefficient a5" default = 1.1 visible = @hideparam==false endparam param a6 caption = "coefficient a6" default = -0.9 visible = @hideparam==false endparam param a7 caption = "coefficient a7" default = 0.6 visible = @hideparam==false endparam param a8 caption = "coefficient a8" default = -0.5 visible = @hideparam==false endparam param a9 caption = "coefficient a9" default = 0.7 visible = @hideparam==false endparam param a10 caption = "coefficient a10" default = 0.1 visible = @hideparam==false endparam param a11 caption = "coefficient a11" default = 0.9 visible = @hideparam==false endparam param a12 caption = "coefficient a12" default = 1.1 visible = @hideparam==false endparam param a13 caption = "coefficient a13" default = -0.8 visible = @hideparam==false endparam param a14 caption = "coefficient a14" default = 0.9 visible = @hideparam==false endparam param a15 caption = "coefficient a15" default = -1.1 visible = @hideparam==false endparam param a16 caption = "coefficient a16" default = -0.6 visible = @hideparam==false endparam param a17 caption = "coefficient a17" default = 1.0 visible = @hideparam==false endparam param a18 caption = "coefficient a18" default = -1.2 visible = @hideparam==false endparam param a19 caption = "coefficient a19" default = 1.0 visible = @hideparam==false endparam param a20 caption = "coefficient a20" default = 0.8 visible = @hideparam==false endparam param a21 caption = "coefficient a21" default = 1.2 visible = @hideparam==false endparam param a22 caption = "coefficient a22" default = -1.1 visible = @hideparam==false endparam param a23 caption = "coefficient a23" default = -0.4 visible = @hideparam==false endparam param a24 caption = "coefficient a24" default = -0.9 visible = @hideparam==false endparam param a25 caption = "coefficient a25" default = -0.9 visible = @hideparam==false endparam param a26 caption = "coefficient a26" default = 0.8 visible = @hideparam==false endparam param a27 caption = "coefficient a27" default = -0.5 visible = @hideparam==false endparam param a28 caption = "coefficient a28" default = -1.1 visible = @hideparam==false endparam param a29 caption = "coefficient a29" default = -0.2 visible = @hideparam==false endparam param a30 caption = "coefficient a30" default = -0.6 visible = @hideparam==false endparam param a31 caption = "coefficient a31" default = 1.1 visible = @hideparam==false endparam param a32 caption = "coefficient a32" default = 0.1 visible = @hideparam==false endparam param a33 caption = "coefficient a33" default = 0.4 visible = @hideparam==false endparam param a34 caption = "coefficient a34" default = -1.0 visible = @hideparam==false endparam param a35 caption = "coefficient a35" default = 0.3 visible = @hideparam==false endparam param a36 caption = "coefficient a36" default = -0.7 visible = @hideparam==false endparam param a37 caption = "coefficient a37" default = -1.2 visible = @hideparam==false endparam param a38 caption = "coefficient a38" default = -0.5 visible = @hideparam==false endparam param a39 caption = "coefficient a39" default = 1.1 visible = @hideparam==false endparam param a40 caption = "coefficient a40" default = 1.1 visible = @hideparam==false endparam param a41 caption = "coefficient a41" default = 0.6 visible = @hideparam==false endparam param a42 caption = "coefficient a42" default = 0.9 visible = @hideparam==false endparam param a43 caption = "coefficient a43" default = -0.3 visible = @hideparam==false endparam param a44 caption = "coefficient a44" default = 0.0 visible = @hideparam==false endparam param a45 caption = "coefficient a45" default = 1.2 visible = @hideparam==false endparam param a46 caption = "coefficient a46" default = -1.2 visible = @hideparam==false endparam param a47 caption = "coefficient a47" default = -0.9 visible = @hideparam==false endparam param a48 caption = "coefficient a48" default = -0.3 visible = @hideparam==false endparam param a49 caption = "coefficient a49" default = 1.2 visible = @hideparam==false endparam param a50 caption = "coefficient a50" default = -0.8 visible = @hideparam==false endparam param a51 caption = "coefficient a51" default = 1.2 visible = @hideparam==false endparam param a52 caption = "coefficient a52" default = -0.1 visible = @hideparam==false endparam param a53 caption = "coefficient a53" default = 0.8 visible = @hideparam==false endparam param a54 caption = "coefficient a54" default = -0.5 visible = @hideparam==false endparam param a55 caption = "coefficient a55" default = -1.2 visible = @hideparam==false endparam param a56 caption = "coefficient a56" default = 0.6 visible = @hideparam==false endparam param a57 caption = "coefficient a57" default = -0.1 visible = @hideparam==false endparam param a58 caption = "coefficient a58" default = 1.1 visible = @hideparam==false endparam param a59 caption = "coefficient a59" default = -1.0 visible = @hideparam==false endparam param a60 caption = "coefficient a60" default = 0.3 visible = @hideparam==false endparam } Slope_3D_Quadratic_G_Attractor { ; Ron Barnett December 6, 2004 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III ; ; global: float zscale2 = 0 float cprojx = 0 float cprojy = 0 float cprojz = 0 float scrsize = sqrt(#width*#width+#height*#height) if !@oldver zscale2 = @zscale2*scrsize cprojx = @cprojx*#width cprojy = @cprojy*#height cprojz = @cprojz*scrsize else zscale2 = @zscale2 cprojx = @cprojx cprojy = @cprojy cprojz = @cprojz endif int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits2[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits3[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float s[193,31] float fx = 0.0 float ffx = 0.0 float xx = 0.0 float fy = 0.0 float ffy = 0.0 float yy = 0.0 float zz = 0.0 float ffz = 0.0 float b1 = 0 float b2 = 0 float b3 = 0 float b4 = 0 float b5 = 0 float b6 = 0 float b7 = 0 float b8 = 0 float b9 = 0 float b10 = 0 float b11 = 0 float b12 = 0 float b13 = 0 float b14 = 0 float b15 = 0 float b16 = 0 float b17 = 0 float b18 = 0 float b19 = 0 float b20 = 0 float b21 = 0 float b22 = 0 float b23 = 0 float b24 = 0 float b25 = 0 float b26 = 0 float b27 = 0 float b28 = 0 float b29 = 0 float b30 = 0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float tzmax = sqrt(txmax^2+tymax^2) float xmin = cx - txmax/2 float ymin = cy - tymax/2 float zmin = sqrt(xmin^2 + ymin^2) float iterate = @density*10000000 float maxnhit = 0 ; ; initialize hit array ; while(h < #height+wd) while(w < #width+ht) hits[w,h] = 0 hits2[w,h] = 0 hits3[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; initialize presets ; s[1,1]=0.2,s[1,2]=-0.6,s[1,3]=1.1,s[1,4]=-0.9,s[1,5]=1.0,s[1,6]=-0.4,s[1,7]=1.2,s[1,8]=-0.2,s[1,9]=-0.3,s[1,10]=-0.3,s[1,11]=0.2,s[1,12]=-0.5,s[1,13]=0.7,s[1,14]=0.3,s[1,15]=-0.5,s[1,16]=-0.1,s[1,17]=0.2,s[1,18]=-1.1,s[1,19]=-0.2,s[1,20]=-0.9,s[1,21]=-0.6,s[1,22]=0.5,s[1,23]=1.1,s[1,24]=-0.7,s[1,25]=-0.9,s[1,26]=-0.5,s[1,27]=0.8,s[1,28]=0.6,s[1,29]=0.9,s[1,30]=0.9 s[2,1]=-1.0,s[2,2]=0.2,s[2,3]=-0.2,s[2,4]=-0.1,s[2,5]=-0.5,s[2,6]=1.0,s[2,7]=-0.5,s[2,8]=-0.6,s[2,9]=0.8,s[2,10]=0.6,s[2,11]=0.2,s[2,12]=-0.9,s[2,13]=-1.0,s[2,14]=0.8,s[2,15]=0.4,s[2,16]=-0.4,s[2,17]=0.3,s[2,18]=-0.5,s[2,19]=1.2,s[2,20]=-0.5,s[2,21]=0.8,s[2,22]=-0.7,s[2,23]=-0.6,s[2,24]=-1.1,s[2,25]=0.1,s[2,26]=-1.2,s[2,27]=-0.1,s[2,28]=1.1,s[2,29]=0.3,s[2,30]=-1.0 s[3,1]=-0.2,s[3,2]=0.5,s[3,3]=-0.6,s[3,4]=0.3,s[3,5]=0.6,s[3,6]=-1.1,s[3,7]=0.7,s[3,8]=-0.3,s[3,9]=0.6,s[3,10]=-0.7,s[3,11]=-0.3,s[3,12]=0.6,s[3,13]=-0.6,s[3,14]=0.4,s[3,15]=-1.1,s[3,16]=-0.6,s[3,17]=0.7,s[3,18]=-1.2,s[3,19]=0.5,s[3,20]=-1.1,s[3,21]=0.7,s[3,22]=0.0,s[3,23]=-0.4,s[3,24]=0.1,s[3,25]=0.5,s[3,26]=0.4,s[3,27]=-0.5,s[3,28]=0.4,s[3,29]=0.5,s[3,30]=-0.9 s[4,1]=-0.4,s[4,2]=0.6,s[4,3]=1.2,s[4,4]=-0.5,s[4,5]=1.0,s[4,6]=-0.6,s[4,7]=-1.0,s[4,8]=1.2,s[4,9]=0.4,s[4,10]=0.8,s[4,11]=-0.6,s[4,12]=0.9,s[4,13]=0.6,s[4,14]=0.0,s[4,15]=0.1,s[4,16]=-0.8,s[4,17]=0.2,s[4,18]=-0.1,s[4,19]=-0.5,s[4,20]=-0.3,s[4,21]=-0.4,s[4,22]=0.6,s[4,23]=0.0,s[4,24]=-0.8,s[4,25]=-1.0,s[4,26]=-0.6,s[4,27]=-1.2,s[4,28]=0.8,s[4,29]=-0.6,s[4,30]=0.9 s[5,1]=-1.1,s[5,2]=-0.9,s[5,3]=-0.4,s[5,4]=-0.9,s[5,5]=0.3,s[5,6]=-0.7,s[5,7]=0.5,s[5,8]=0.7,s[5,9]=0.4,s[5,10]=0.2,s[5,11]=-0.1,s[5,12]=-1.0,s[5,13]=-0.6,s[5,14]=-0.5,s[5,15]=0.6,s[5,16]=-1.0,s[5,17]=1.2,s[5,18]=-0.5,s[5,19]=-1.0,s[5,20]=1.2,s[5,21]=0.5,s[5,22]=-1.0,s[5,23]=-0.2,s[5,24]=-0.9,s[5,25]=0.6,s[5,26]=0.4,s[5,27]=-1.0,s[5,28]=0.5,s[5,29]=-0.1,s[5,30]=-0.1 s[6,1]=-0.2,s[6,2]=0.8,s[6,3]=0.9,s[6,4]=1.0,s[6,5]=0.7,s[6,6]=-0.7,s[6,7]=0.4,s[6,8]=1.1,s[6,9]=-0.8,s[6,10]=1.0,s[6,11]=0.8,s[6,12]=0.5,s[6,13]=-0.1,s[6,14]=-0.5,s[6,15]=-0.2,s[6,16]=-0.9,s[6,17]=-0.5,s[6,18]=-0.8,s[6,19]=0.6,s[6,20]=0.7,s[6,21]=-0.1,s[6,22]=-0.3,s[6,23]=-0.8,s[6,24]=0.5,s[6,25]=-0.6,s[6,26]=0.3,s[6,27]=-0.1,s[6,28]=-0.1,s[6,29]=0.6,s[6,30]=0.8 s[7,1]=-0.2,s[7,2]=0.3,s[7,3]=-1.2,s[7,4]=-0.8,s[7,5]=-1.0,s[7,6]=0.4,s[7,7]=-0.3,s[7,8]=1.0,s[7,9]=1.0,s[7,10]=-0.8,s[7,11]=0.1,s[7,12]=0.8,s[7,13]=1.2,s[7,14]=-0.6,s[7,15]=0.3,s[7,16]=-1.2,s[7,17]=1.2,s[7,18]=0.8,s[7,19]=0.5,s[7,20]=-0.6,s[7,21]=0.4,s[7,22]=0.1,s[7,23]=-0.4,s[7,24]=-0.8,s[7,25]=-0.6,s[7,26]=-0.6,s[7,27]=-0.7,s[7,28]=-0.3,s[7,29]=-0.4,s[7,30]=-0.1 s[8,1]=1.0,s[8,2]=-0.4,s[8,3]=-1.1,s[8,4]=0.6,s[8,5]=-0.2,s[8,6]=-0.7,s[8,7]=-0.7,s[8,8]=-0.1,s[8,9]=1.0,s[8,10]=1.2,s[8,11]=-0.2,s[8,12]=1.2,s[8,13]=-0.9,s[8,14]=-0.6,s[8,15]=0.6,s[8,16]=-0.1,s[8,17]=-0.4,s[8,18]=0.8,s[8,19]=0.1,s[8,20]=-0.3,s[8,21]=-0.1,s[8,22]=0.5,s[8,23]=-0.7,s[8,24]=0.2,s[8,25]=-0.8,s[8,26]=-0.6,s[8,27]=-0.6,s[8,28]=-1.0,s[8,29]=0.4,s[8,30]=1.0 s[9,1]=0.6,s[9,2]=-0.3,s[9,3]=-0.8,s[9,4]=-0.2,s[9,5]=0.7,s[9,6]=0.4,s[9,7]=1.2,s[9,8]=0.7,s[9,9]=0.2,s[9,10]=0.5,s[9,11]=0.1,s[9,12]=-0.8,s[9,13]=0.2,s[9,14]=-0.6,s[9,15]=0.8,s[9,16]=0.3,s[9,17]=0.0,s[9,18]=0.7,s[9,19]=-1.1,s[9,20]=0.2,s[9,21]=-0.7,s[9,22]=1.0,s[9,23]=1.2,s[9,24]=0.8,s[9,25]=0.5,s[9,26]=0.0,s[9,27]=-0.7,s[9,28]=-0.9,s[9,29]=0.5,s[9,30]=1.1 s[10,1]=-0.2,s[10,2]=0.4,s[10,3]=0.7,s[10,4]=1.2,s[10,5]=0.5,s[10,6]=1.0,s[10,7]=-1.1,s[10,8]=0.0,s[10,9]=1.2,s[10,10]=-0.6,s[10,11]=0.1,s[10,12]=-1.1,s[10,13]=-0.5,s[10,14]=0.1,s[10,15]=-0.7,s[10,16]=-0.6,s[10,17]=0.0,s[10,18]=0.2,s[10,19]=0.6,s[10,20]=0.6,s[10,21]=0.3,s[10,22]=-0.5,s[10,23]=-0.2,s[10,24]=0.6,s[10,25]=1.1,s[10,26]=-0.4,s[10,27]=0.7,s[10,28]=-0.1,s[10,29]=-0.2,s[10,30]=-0.8 s[11,1]=0.1,s[11,2]=0.6,s[11,3]=-0.5,s[11,4]=0.9,s[11,5]=0.0,s[11,6]=-0.4,s[11,7]=1.0,s[11,8]=-0.8,s[11,9]=1.2,s[11,10]=0.9,s[11,11]=0.1,s[11,12]=0.1,s[11,13]=-0.3,s[11,14]=0.6,s[11,15]=0.8,s[11,16]=0.1,s[11,17]=0.2,s[11,18]=-1.0,s[11,19]=0.3,s[11,20]=-0.9,s[11,21]=0.7,s[11,22]=0.3,s[11,23]=-0.7,s[11,24]=-1.0,s[11,25]=1.0,s[11,26]=0.9,s[11,27]=-0.5,s[11,28]=0.1,s[11,29]=0.2,s[11,30]=-1.1 s[12,1]=1.0,s[12,2]=-0.4,s[12,3]=-0.3,s[12,4]=-0.4,s[12,5]=-0.2,s[12,6]=0.6,s[12,7]=-0.8,s[12,8]=1.2,s[12,9]=0.9,s[12,10]=0.6,s[12,11]=-0.1,s[12,12]=0.3,s[12,13]=-0.6,s[12,14]=0.0,s[12,15]=-0.3,s[12,16]=-0.8,s[12,17]=-0.1,s[12,18]=0.0,s[12,19]=0.7,s[12,20]=1.0,s[12,21]=-0.9,s[12,22]=0.6,s[12,23]=0.6,s[12,24]=0.4,s[12,25]=0.8,s[12,26]=-0.6,s[12,27]=0.7,s[12,28]=-0.4,s[12,29]=1.1,s[12,30]=1.0 s[13,1]=1.2,s[13,2]=0.7,s[13,3]=-0.9,s[13,4]=-1.1,s[13,5]=1.2,s[13,6]=-0.4,s[13,7]=-0.7,s[13,8]=0.8,s[13,9]=-0.9,s[13,10]=0.4,s[13,11]=0.0,s[13,12]=0.3,s[13,13]=-0.5,s[13,14]=-0.6,s[13,15]=-0.9,s[13,16]=0.7,s[13,17]=0.5,s[13,18]=0.2,s[13,19]=-0.2,s[13,20]=-1.0,s[13,21]=-0.1,s[13,22]=-0.1,s[13,23]=0.1,s[13,24]=-0.5,s[13,25]=-0.2,s[13,26]=1.1,s[13,27]=-0.4,s[13,28]=0.8,s[13,29]=-0.1,s[13,30]=-1.0 s[14,1]=-0.5,s[14,2]=0.1,s[14,3]=0.7,s[14,4]=-0.6,s[14,5]=0.9,s[14,6]=-0.9,s[14,7]=-0.5,s[14,8]=-0.9,s[14,9]=0.3,s[14,10]=-0.3,s[14,11]=-0.3,s[14,12]=-0.3,s[14,13]=-0.2,s[14,14]=0.8,s[14,15]=0.4,s[14,16]=0.3,s[14,17]=1.1,s[14,18]=-0.6,s[14,19]=-0.2,s[14,20]=0.1,s[14,21]=1.2,s[14,22]=0.2,s[14,23]=0.2,s[14,24]=-1.1,s[14,25]=0.9,s[14,26]=0.3,s[14,27]=0.9,s[14,28]=-1.1,s[14,29]=1.2,s[14,30]=-0.7 s[15,1]=-0.5,s[15,2]=-0.5,s[15,3]=0.9,s[15,4]=0.3,s[15,5]=-0.3,s[15,6]=-0.7,s[15,7]=0.9,s[15,8]=-0.9,s[15,9]=-0.2,s[15,10]=0.1,s[15,11]=0.0,s[15,12]=0.7,s[15,13]=0.5,s[15,14]=0.9,s[15,15]=0.4,s[15,16]=0.2,s[15,17]=0.9,s[15,18]=0.1,s[15,19]=-0.3,s[15,20]=1.2,s[15,21]=0.7,s[15,22]=-0.3,s[15,23]=-1.2,s[15,24]=-0.2,s[15,25]=0.7,s[15,26]=-1.1,s[15,27]=-0.5,s[15,28]=1.2,s[15,29]=0.4,s[15,30]=-1.0 s[16,1]=-1.0,s[16,2]=-0.2,s[16,3]=-0.2,s[16,4]=-0.3,s[16,5]=-0.5,s[16,6]=-1.1,s[16,7]=0.0,s[16,8]=1.0,s[16,9]=0.6,s[16,10]=0.9,s[16,11]=-0.3,s[16,12]=0.9,s[16,13]=1.1,s[16,14]=-1.1,s[16,15]=0.2,s[16,16]=0.3,s[16,17]=0.5,s[16,18]=0.2,s[16,19]=-0.2,s[16,20]=0.3,s[16,21]=0.5,s[16,22]=-0.6,s[16,23]=-1.2,s[16,24]=1.1,s[16,25]=0.4,s[16,26]=0.3,s[16,27]=-0.5,s[16,28]=0.2,s[16,29]=-0.3,s[16,30]=-0.7 s[17,1]=0.1,s[17,2]=0.4,s[17,3]=0.0,s[17,4]=-0.6,s[17,5]=1.0,s[17,6]=0.8,s[17,7]=1.0,s[17,8]=-0.2,s[17,9]=-0.9,s[17,10]=-0.2,s[17,11]=-0.6,s[17,12]=-1.1,s[17,13]=0.7,s[17,14]=-0.7,s[17,15]=0.0,s[17,16]=-0.8,s[17,17]=0.3,s[17,18]=0.6,s[17,19]=-0.1,s[17,20]=1.2,s[17,21]=0.2,s[17,22]=-0.8,s[17,23]=-1.2,s[17,24]=0.4,s[17,25]=0.9,s[17,26]=0.0,s[17,27]=-0.4,s[17,28]=-0.7,s[17,29]=-0.3,s[17,30]=-0.2 s[18,1]=-0.6,s[18,2]=1.2,s[18,3]=1.2,s[18,4]=1.0,s[18,5]=0.2,s[18,6]=0.5,s[18,7]=0.5,s[18,8]=0.6,s[18,9]=0.5,s[18,10]=0.9,s[18,11]=-0.7,s[18,12]=1.1,s[18,13]=1.2,s[18,14]=0.3,s[18,15]=0.2,s[18,16]=-0.2,s[18,17]=0.6,s[18,18]=1.1,s[18,19]=0.0,s[18,20]=-0.4,s[18,21]=0.5,s[18,22]=0.7,s[18,23]=-0.5,s[18,24]=0.9,s[18,25]=1.0,s[18,26]=0.2,s[18,27]=-0.6,s[18,28]=0.2,s[18,29]=0.0,s[18,30]=0.2 s[19,1]=0.6,s[19,2]=0.7,s[19,3]=-1.0,s[19,4]=-1.1,s[19,5]=1.0,s[19,6]=0.7,s[19,7]=0.1,s[19,8]=-0.2,s[19,9]=-0.8,s[19,10]=-0.4,s[19,11]=-0.1,s[19,12]=-0.4,s[19,13]=0.9,s[19,14]=-0.8,s[19,15]=-0.1,s[19,16]=-0.6,s[19,17]=-0.7,s[19,18]=-0.1,s[19,19]=-0.1,s[19,20]=-0.1,s[19,21]=-0.1,s[19,22]=0.9,s[19,23]=-0.3,s[19,24]=0.3,s[19,25]=-0.1,s[19,26]=-0.9,s[19,27]=0.3,s[19,28]=0.3,s[19,29]=-0.8,s[19,30]=-0.5 s[20,1]=0.4,s[20,2]=0.7,s[20,3]=-1.2,s[20,4]=0.6,s[20,5]=1.0,s[20,6]=0.2,s[20,7]=-0.3,s[20,8]=0.1,s[20,9]=0.7,s[20,10]=-1.0,s[20,11]=0.4,s[20,12]=0.7,s[20,13]=1.2,s[20,14]=-1.1,s[20,15]=0.8,s[20,16]=0.8,s[20,17]=-1.0,s[20,18]=-1.2,s[20,19]=1.0,s[20,20]=-1.1,s[20,21]=0.0,s[20,22]=-0.9,s[20,23]=-1.2,s[20,24]=1.0,s[20,25]=-0.1,s[20,26]=0.0,s[20,27]=-0.2,s[20,28]=-1.1,s[20,29]=-0.7,s[20,30]=-0.3 s[21,1]=0.3,s[21,2]=1.1,s[21,3]=-0.9,s[21,4]=-1.2,s[21,5]=0.2,s[21,6]=-0.1,s[21,7]=-1.2,s[21,8]=1.1,s[21,9]=0.3,s[21,10]=0.2,s[21,11]=-0.8,s[21,12]=0.3,s[21,13]=1.2,s[21,14]=-1.2,s[21,15]=1.1,s[21,16]=-0.1,s[21,17]=0.9,s[21,18]=-0.7,s[21,19]=0.2,s[21,20]=0.8,s[21,21]=-0.7,s[21,22]=-0.3,s[21,23]=0.5,s[21,24]=-0.1,s[21,25]=-0.1,s[21,26]=0.3,s[21,27]=0.0,s[21,28]=-1.1,s[21,29]=-0.4,s[21,30]=0.4 s[22,1]=0.5,s[22,2]=-0.7,s[22,3]=-1.1,s[22,4]=0.1,s[22,5]=-0.5,s[22,6]=0.3,s[22,7]=-0.2,s[22,8]=-0.9,s[22,9]=-0.7,s[22,10]=-0.1,s[22,11]=-0.6,s[22,12]=-1.0,s[22,13]=-0.9,s[22,14]=0.1,s[22,15]=-0.7,s[22,16]=-0.7,s[22,17]=-0.6,s[22,18]=-1.1,s[22,19]=-1.1,s[22,20]=0.2,s[22,21]=-0.6,s[22,22]=-0.2,s[22,23]=-0.9,s[22,24]=-0.2,s[22,25]=-0.6,s[22,26]=-0.6,s[22,27]=0.0,s[22,28]=0.6,s[22,29]=-0.9,s[22,30]=-1.1 s[23,1]=0.8,s[23,2]=-0.7,s[23,3]=-0.9,s[23,4]=-1.0,s[23,5]=-0.3,s[23,6]=0.9,s[23,7]=0.5,s[23,8]=-0.1,s[23,9]=0.7,s[23,10]=-1.0,s[23,11]=0.5,s[23,12]=-1.0,s[23,13]=0.3,s[23,14]=1.1,s[23,15]=-0.2,s[23,16]=-0.4,s[23,17]=-0.2,s[23,18]=1.0,s[23,19]=0.4,s[23,20]=-0.7,s[23,21]=0.5,s[23,22]=-1.2,s[23,23]=-0.5,s[23,24]=0.8,s[23,25]=0.2,s[23,26]=-0.8,s[23,27]=0.0,s[23,28]=1.1,s[23,29]=-0.2,s[23,30]=0.5 s[24,1]=-1.0,s[24,2]=-0.2,s[24,3]=1.1,s[24,4]=0.3,s[24,5]=-0.4,s[24,6]=-0.2,s[24,7]=0.6,s[24,8]=-0.1,s[24,9]=0.5,s[24,10]=-0.7,s[24,11]=0.7,s[24,12]=-0.4,s[24,13]=0.7,s[24,14]=0.2,s[24,15]=-0.2,s[24,16]=0.2,s[24,17]=-1.2,s[24,18]=0.0,s[24,19]=0.0,s[24,20]=-1.2,s[24,21]=-0.5,s[24,22]=-0.4,s[24,23]=0.5,s[24,24]=0.2,s[24,25]=-0.5,s[24,26]=-0.1,s[24,27]=0.6,s[24,28]=-0.4,s[24,29]=0.1,s[24,30]=1.0 s[25,1]=-0.1,s[25,2]=1.2,s[25,3]=0.8,s[25,4]=0.9,s[25,5]=0.4,s[25,6]=0.0,s[25,7]=0.2,s[25,8]=0.1,s[25,9]=0.9,s[25,10]=-1.1,s[25,11]=-0.4,s[25,12]=-0.4,s[25,13]=0.5,s[25,14]=-0.2,s[25,15]=-0.8,s[25,16]=-0.1,s[25,17]=0.0,s[25,18]=-0.6,s[25,19]=0.9,s[25,20]=0.9,s[25,21]=-0.3,s[25,22]=0.2,s[25,23]=-0.3,s[25,24]=1.1,s[25,25]=1.0,s[25,26]=0.0,s[25,27]=0.8,s[25,28]=-0.4,s[25,29]=-0.4,s[25,30]=-0.5 s[26,1]=0.6,s[26,2]=-1.0,s[26,3]=-0.7,s[26,4]=-1.0,s[26,5]=-0.1,s[26,6]=0.2,s[26,7]=0.7,s[26,8]=-1.2,s[26,9]=0.5,s[26,10]=0.2,s[26,11]=0.3,s[26,12]=-0.7,s[26,13]=0.1,s[26,14]=0.0,s[26,15]=-0.9,s[26,16]=-0.1,s[26,17]=0.4,s[26,18]=0.2,s[26,19]=1.2,s[26,20]=0.9,s[26,21]=-0.7,s[26,22]=-0.9,s[26,23]=1.1,s[26,24]=-0.7,s[26,25]=-0.5,s[26,26]=0.9,s[26,27]=0.9,s[26,28]=0.8,s[26,29]=1.0,s[26,30]=0.7 s[27,1]=-0.3,s[27,2]=-0.4,s[27,3]=0.9,s[27,4]=-1.2,s[27,5]=-1.1,s[27,6]=0.2,s[27,7]=0.9,s[27,8]=0.7,s[27,9]=-0.8,s[27,10]=0.6,s[27,11]=-0.3,s[27,12]=-0.7,s[27,13]=0.9,s[27,14]=-0.3,s[27,15]=0.1,s[27,16]=-0.6,s[27,17]=-1.1,s[27,18]=0.0,s[27,19]=-0.2,s[27,20]=-0.1,s[27,21]=1.0,s[27,22]=-0.4,s[27,23]=-0.7,s[27,24]=-0.3,s[27,25]=-0.2,s[27,26]=1.2,s[27,27]=1.1,s[27,28]=0.5,s[27,29]=-0.8,s[27,30]=1.0 s[28,1]=-0.5,s[28,2]=0.4,s[28,3]=-0.5,s[28,4]=-1.0,s[28,5]=-0.1,s[28,6]=0.2,s[28,7]=1.2,s[28,8]=-1.1,s[28,9]=0.4,s[28,10]=1.0,s[28,11]=-0.3,s[28,12]=-0.6,s[28,13]=0.2,s[28,14]=0.7,s[28,15]=-0.8,s[28,16]=1.2,s[28,17]=-0.6,s[28,18]=-0.7,s[28,19]=0.1,s[28,20]=1.1,s[28,21]=0.3,s[28,22]=0.6,s[28,23]=0.7,s[28,24]=1.2,s[28,25]=-0.4,s[28,26]=0.3,s[28,27]=-0.6,s[28,28]=-0.1,s[28,29]=-0.7,s[28,30]=0.7 s[29,1]=0.4,s[29,2]=0.1,s[29,3]=-0.4,s[29,4]=0.4,s[29,5]=1.1,s[29,6]=-0.1,s[29,7]=0.3,s[29,8]=-1.1,s[29,9]=0.1,s[29,10]=-0.8,s[29,11]=-0.5,s[29,12]=-0.4,s[29,13]=0.4,s[29,14]=-0.6,s[29,15]=-0.1,s[29,16]=0.3,s[29,17]=0.3,s[29,18]=1.2,s[29,19]=-0.4,s[29,20]=-1.0,s[29,21]=-0.8,s[29,22]=-1.2,s[29,23]=0.7,s[29,24]=0.7,s[29,25]=-1.1,s[29,26]=-1.0,s[29,27]=0.4,s[29,28]=-1.0,s[29,29]=0.8,s[29,30]=0.0 s[30,1]=-0.6,s[30,2]=-0.5,s[30,3]=-1.0,s[30,4]=0.7,s[30,5]=-0.9,s[30,6]=-1.0,s[30,7]=1.1,s[30,8]=1.0,s[30,9]=-0.9,s[30,10]=0.8,s[30,11]=0.4,s[30,12]=0.0,s[30,13]=-0.4,s[30,14]=-0.7,s[30,15]=-0.6,s[30,16]=-1.2,s[30,17]=0.8,s[30,18]=-1.2,s[30,19]=-0.3,s[30,20]=-0.7,s[30,21]=0.0,s[30,22]=-0.9,s[30,23]=-0.2,s[30,24]=-0.2,s[30,25]=-0.8,s[30,26]=0.7,s[30,27]=0.2,s[30,28]=1.1,s[30,29]=-0.2,s[30,30]=-0.4 s[31,1]=-0.1,s[31,2]=-0.3,s[31,3]=-0.2,s[31,4]=-1.2,s[31,5]=-0.2,s[31,6]=-0.4,s[31,7]=0.7,s[31,8]=0.1,s[31,9]=0.2,s[31,10]=0.0,s[31,11]=0.5,s[31,12]=0.6,s[31,13]=-0.1,s[31,14]=1.0,s[31,15]=1.1,s[31,16]=-0.5,s[31,17]=0.1,s[31,18]=0.0,s[31,19]=-0.1,s[31,20]=0.1,s[31,21]=1.0,s[31,22]=0.4,s[31,23]=-0.8,s[31,24]=0.5,s[31,25]=-0.1,s[31,26]=0.0,s[31,27]=-0.6,s[31,28]=-0.6,s[31,29]=-1.1,s[31,30]=0.9 s[32,1]=0.0,s[32,2]=0.3,s[32,3]=-0.2,s[32,4]=-1.0,s[32,5]=0.0,s[32,6]=-0.7,s[32,7]=1.1,s[32,8]=0.4,s[32,9]=0.2,s[32,10]=0.1,s[32,11]=0.1,s[32,12]=0.7,s[32,13]=-0.3,s[32,14]=1.0,s[32,15]=-1.0,s[32,16]=-0.7,s[32,17]=-0.6,s[32,18]=-0.5,s[32,19]=0.4,s[32,20]=-0.4,s[32,21]=0.2,s[32,22]=-0.8,s[32,23]=-0.3,s[32,24]=-0.1,s[32,25]=0.8,s[32,26]=0.4,s[32,27]=0.3,s[32,28]=0.0,s[32,29]=-1.2,s[32,30]=0.4 s[33,1]=0.9,s[33,2]=-1.2,s[33,3]=-0.2,s[33,4]=-0.6,s[33,5]=-0.7,s[33,6]=0.5,s[33,7]=0.9,s[33,8]=-0.4,s[33,9]=-0.4,s[33,10]=-0.2,s[33,11]=0.2,s[33,12]=0.3,s[33,13]=-0.5,s[33,14]=0.7,s[33,15]=0.3,s[33,16]=-1.0,s[33,17]=0.5,s[33,18]=0.3,s[33,19]=-0.3,s[33,20]=0.2,s[33,21]=-1.2,s[33,22]=0.1,s[33,23]=-1.0,s[33,24]=1.0,s[33,25]=-0.7,s[33,26]=-1.2,s[33,27]=1.1,s[33,28]=-0.1,s[33,29]=1.0,s[33,30]=0.8 s[34,1]=0.2,s[34,2]=-0.8,s[34,3]=-0.9,s[34,4]=-0.5,s[34,5]=-0.9,s[34,6]=-0.7,s[34,7]=-0.8,s[34,8]=-0.6,s[34,9]=0.9,s[34,10]=-0.5,s[34,11]=0.0,s[34,12]=0.2,s[34,13]=0.2,s[34,14]=0.1,s[34,15]=0.2,s[34,16]=-0.6,s[34,17]=0.9,s[34,18]=-1.2,s[34,19]=0.1,s[34,20]=0.9,s[34,21]=-0.2,s[34,22]=0.4,s[34,23]=0.1,s[34,24]=-0.8,s[34,25]=0.9,s[34,26]=0.7,s[34,27]=0.7,s[34,28]=0.7,s[34,29]=0.8,s[34,30]=-0.3 s[35,1]=-0.4,s[35,2]=0.1,s[35,3]=0.5,s[35,4]=0.5,s[35,5]=-0.3,s[35,6]=1.1,s[35,7]=1.1,s[35,8]=1.0,s[35,9]=-1.0,s[35,10]=0.3,s[35,11]=-0.2,s[35,12]=0.3,s[35,13]=-0.8,s[35,14]=0.9,s[35,15]=-0.6,s[35,16]=-1.2,s[35,17]=0.6,s[35,18]=-0.6,s[35,19]=0.1,s[35,20]=0.3,s[35,21]=-0.3,s[35,22]=-0.1,s[35,23]=0.1,s[35,24]=0.3,s[35,25]=-0.1,s[35,26]=0.6,s[35,27]=-0.5,s[35,28]=1.0,s[35,29]=-0.2,s[35,30]=-0.6 s[36,1]=0.3,s[36,2]=-0.6,s[36,3]=0.3,s[36,4]=-1.0,s[36,5]=0.4,s[36,6]=-0.2,s[36,7]=0.8,s[36,8]=0.8,s[36,9]=-0.9,s[36,10]=0.1,s[36,11]=0.8,s[36,12]=-0.4,s[36,13]=-1.0,s[36,14]=0.6,s[36,15]=0.8,s[36,16]=0.6,s[36,17]=-0.1,s[36,18]=-0.3,s[36,19]=0.3,s[36,20]=-1.0,s[36,21]=0.6,s[36,22]=-1.2,s[36,23]=0.8,s[36,24]=0.6,s[36,25]=0.3,s[36,26]=-0.4,s[36,27]=0.3,s[36,28]=-0.3,s[36,29]=-0.4,s[36,30]=-0.5 s[37,1]=0.5,s[37,2]=-1.2,s[37,3]=1.0,s[37,4]=0.8,s[37,5]=-0.5,s[37,6]=0.1,s[37,7]=-0.5,s[37,8]=0.2,s[37,9]=-1.1,s[37,10]=-0.1,s[37,11]=0.0,s[37,12]=-0.5,s[37,13]=-0.6,s[37,14]=-0.2,s[37,15]=-0.3,s[37,16]=0.8,s[37,17]=0.2,s[37,18]=-0.4,s[37,19]=-0.5,s[37,20]=-0.1,s[37,21]=0.5,s[37,22]=0.2,s[37,23]=-0.3,s[37,24]=-0.8,s[37,25]=0.3,s[37,26]=-0.1,s[37,27]=-0.4,s[37,28]=0.2,s[37,29]=0.7,s[37,30]=-0.2 s[38,1]=0.7,s[38,2]=-1.0,s[38,3]=0.1,s[38,4]=-0.3,s[38,5]=0.9,s[38,6]=0.3,s[38,7]=-1.1,s[38,8]=0.7,s[38,9]=-0.7,s[38,10]=0.5,s[38,11]=0.4,s[38,12]=-0.7,s[38,13]=-1.0,s[38,14]=0.3,s[38,15]=1.2,s[38,16]=-0.4,s[38,17]=1.2,s[38,18]=0.4,s[38,19]=-0.3,s[38,20]=0.4,s[38,21]=0.2,s[38,22]=-0.8,s[38,23]=1.1,s[38,24]=0.7,s[38,25]=-0.5,s[38,26]=-0.2,s[38,27]=0.6,s[38,28]=0.6,s[38,29]=-1.1,s[38,30]=0.5 s[39,1]=-0.2,s[39,2]=-1.0,s[39,3]=0.1,s[39,4]=0.4,s[39,5]=-0.5,s[39,6]=-1.2,s[39,7]=-0.9,s[39,8]=-0.1,s[39,9]=-1.1,s[39,10]=-0.4,s[39,11]=0.0,s[39,12]=0.4,s[39,13]=0.9,s[39,14]=-0.1,s[39,15]=0.7,s[39,16]=-0.2,s[39,17]=0.7,s[39,18]=0.4,s[39,19]=-0.3,s[39,20]=-1.0,s[39,21]=0.1,s[39,22]=-0.2,s[39,23]=-0.7,s[39,24]=-0.3,s[39,25]=-0.3,s[39,26]=-0.7,s[39,27]=0.4,s[39,28]=0.5,s[39,29]=-0.8,s[39,30]=0.7 s[40,1]=0.4,s[40,2]=0.9,s[40,3]=-0.3,s[40,4]=-0.3,s[40,5]=0.3,s[40,6]=0.9,s[40,7]=-0.6,s[40,8]=0.6,s[40,9]=0.3,s[40,10]=-0.9,s[40,11]=0.3,s[40,12]=0.0,s[40,13]=-0.5,s[40,14]=0.9,s[40,15]=0.0,s[40,16]=1.2,s[40,17]=-1.1,s[40,18]=0.9,s[40,19]=-0.4,s[40,20]=-0.1,s[40,21]=1.2,s[40,22]=-0.8,s[40,23]=-0.4,s[40,24]=0.6,s[40,25]=0.7,s[40,26]=0.0,s[40,27]=-1.0,s[40,28]=0.3,s[40,29]=-0.9,s[40,30]=0.0 s[41,1]=-0.7,s[41,2]=0.3,s[41,3]=0.4,s[41,4]=-1.2,s[41,5]=0.5,s[41,6]=0.3,s[41,7]=-0.6,s[41,8]=0.4,s[41,9]=0.3,s[41,10]=0.6,s[41,11]=1.2,s[41,12]=0.5,s[41,13]=-0.5,s[41,14]=0.6,s[41,15]=-0.1,s[41,16]=0.6,s[41,17]=-0.9,s[41,18]=-0.6,s[41,19]=0.3,s[41,20]=-0.1,s[41,21]=-0.9,s[41,22]=-0.3,s[41,23]=0.0,s[41,24]=0.1,s[41,25]=-0.1,s[41,26]=0.6,s[41,27]=-0.4,s[41,28]=-0.5,s[41,29]=-0.7,s[41,30]=-0.7 s[42,1]=-0.3,s[42,2]=-0.6,s[42,3]=-0.5,s[42,4]=-0.1,s[42,5]=1.0,s[42,6]=-0.6,s[42,7]=-0.5,s[42,8]=0.3,s[42,9]=0.6,s[42,10]=-0.2,s[42,11]=0.3,s[42,12]=1.0,s[42,13]=-0.7,s[42,14]=0.6,s[42,15]=1.0,s[42,16]=0.4,s[42,17]=-0.7,s[42,18]=1.1,s[42,19]=0.4,s[42,20]=0.2,s[42,21]=0.1,s[42,22]=-0.1,s[42,23]=0.5,s[42,24]=-0.5,s[42,25]=0.1,s[42,26]=-0.7,s[42,27]=0.4,s[42,28]=-0.4,s[42,29]=-0.9,s[42,30]=0.3 s[43,1]=0.1,s[43,2]=-0.6,s[43,3]=0.5,s[43,4]=-0.4,s[43,5]=0.6,s[43,6]=0.3,s[43,7]=-0.3,s[43,8]=0.8,s[43,9]=-1.2,s[43,10]=-1.1,s[43,11]=0.3,s[43,12]=0.6,s[43,13]=-0.6,s[43,14]=0.0,s[43,15]=0.1,s[43,16]=-0.8,s[43,17]=-0.9,s[43,18]=-0.6,s[43,19]=0.3,s[43,20]=-0.6,s[43,21]=-0.6,s[43,22]=0.9,s[43,23]=-0.5,s[43,24]=1.1,s[43,25]=-0.2,s[43,26]=0.0,s[43,27]=0.7,s[43,28]=-1.2,s[43,29]=-1.1,s[43,30]=-0.4 s[44,1]=1.1,s[44,2]=0.1,s[44,3]=-0.3,s[44,4]=0.2,s[44,5]=-0.6,s[44,6]=0.1,s[44,7]=0.0,s[44,8]=0.0,s[44,9]=-1.1,s[44,10]=-1.0,s[44,11]=0.9,s[44,12]=0.0,s[44,13]=-0.3,s[44,14]=0.9,s[44,15]=-0.2,s[44,16]=0.1,s[44,17]=-0.7,s[44,18]=0.7,s[44,19]=-0.5,s[44,20]=0.2,s[44,21]=0.2,s[44,22]=-0.6,s[44,23]=-0.5,s[44,24]=0.9,s[44,25]=-0.2,s[44,26]=0.9,s[44,27]=-0.7,s[44,28]=-0.8,s[44,29]=0.5,s[44,30]=-0.8 s[45,1]=-0.2,s[45,2]=-0.5,s[45,3]=0.9,s[45,4]=-0.2,s[45,5]=-0.7,s[45,6]=-0.6,s[45,7]=-0.9,s[45,8]=0.0,s[45,9]=-0.5,s[45,10]=-0.2,s[45,11]=-0.1,s[45,12]=-0.8,s[45,13]=-0.2,s[45,14]=0.4,s[45,15]=0.3,s[45,16]=-0.3,s[45,17]=1.1,s[45,18]=0.3,s[45,19]=-0.1,s[45,20]=-0.2,s[45,21]=-0.3,s[45,22]=0.6,s[45,23]=0.2,s[45,24]=0.6,s[45,25]=0.0,s[45,26]=-0.6,s[45,27]=-1.0,s[45,28]=0.6,s[45,29]=0.9,s[45,30]=0.0 s[46,1]=0.1,s[46,2]=-0.6,s[46,3]=0.3,s[46,4]=-0.1,s[46,5]=0.0,s[46,6]=0.3,s[46,7]=1.2,s[46,8]=0.0,s[46,9]=-0.1,s[46,10]=1.2,s[46,11]=-1.2,s[46,12]=1.0,s[46,13]=-0.4,s[46,14]=-0.1,s[46,15]=1.1,s[46,16]=-0.1,s[46,17]=0.6,s[46,18]=-1.1,s[46,19]=-0.6,s[46,20]=1.1,s[46,21]=0.3,s[46,22]=0.7,s[46,23]=-0.7,s[46,24]=1.2,s[46,25]=1.1,s[46,26]=-0.5,s[46,27]=-0.1,s[46,28]=0.1,s[46,29]=-1.0,s[46,30]=-0.4 s[47,1]=-0.6,s[47,2]=-1.2,s[47,3]=-1.0,s[47,4]=-0.4,s[47,5]=0.9,s[47,6]=-0.2,s[47,7]=-0.7,s[47,8]=-0.2,s[47,9]=0.6,s[47,10]=0.0,s[47,11]=0.3,s[47,12]=0.4,s[47,13]=0.0,s[47,14]=-0.9,s[47,15]=-0.1,s[47,16]=0.3,s[47,17]=0.0,s[47,18]=-0.4,s[47,19]=-0.1,s[47,20]=-0.3,s[47,21]=-0.4,s[47,22]=-0.6,s[47,23]=-1.1,s[47,24]=-0.5,s[47,25]=-1.1,s[47,26]=1.2,s[47,27]=0.0,s[47,28]=0.1,s[47,29]=0.7,s[47,30]=0.4 s[48,1]=-0.4,s[48,2]=-0.9,s[48,3]=-1.0,s[48,4]=-0.4,s[48,5]=0.0,s[48,6]=-0.1,s[48,7]=-0.8,s[48,8]=-0.9,s[48,9]=0.3,s[48,10]=0.0,s[48,11]=0.8,s[48,12]=-0.3,s[48,13]=-0.7,s[48,14]=0.4,s[48,15]=-0.9,s[48,16]=-0.9,s[48,17]=0.2,s[48,18]=-0.6,s[48,19]=1.2,s[48,20]=0.7,s[48,21]=0.1,s[48,22]=0.6,s[48,23]=0.0,s[48,24]=-0.1,s[48,25]=0.3,s[48,26]=-0.5,s[48,27]=-0.7,s[48,28]=0.7,s[48,29]=-0.7,s[48,30]=-1.1 s[49,1]=-0.9,s[49,2]=-1.1,s[49,3]=0.0,s[49,4]=0.2,s[49,5]=-0.9,s[49,6]=-1.0,s[49,7]=0.8,s[49,8]=-0.3,s[49,9]=-1.0,s[49,10]=-1.0,s[49,11]=-0.9,s[49,12]=0.3,s[49,13]=0.0,s[49,14]=-0.4,s[49,15]=-0.1,s[49,16]=0.0,s[49,17]=0.2,s[49,18]=-0.4,s[49,19]=0.1,s[49,20]=0.5,s[49,21]=1.1,s[49,22]=1.0,s[49,23]=-0.4,s[49,24]=0.4,s[49,25]=-0.5,s[49,26]=0.9,s[49,27]=0.0,s[49,28]=0.4,s[49,29]=0.9,s[49,30]=-0.4 s[50,1]=0.2,s[50,2]=0.7,s[50,3]=-0.2,s[50,4]=-1.0,s[50,5]=0.3,s[50,6]=0.7,s[50,7]=-0.3,s[50,8]=0.5,s[50,9]=0.7,s[50,10]=-0.7,s[50,11]=-0.1,s[50,12]=0.1,s[50,13]=0.5,s[50,14]=0.6,s[50,15]=-0.2,s[50,16]=-0.4,s[50,17]=-1.2,s[50,18]=1.1,s[50,19]=-0.3,s[50,20]=0.9,s[50,21]=-0.1,s[50,22]=0.2,s[50,23]=-0.7,s[50,24]=0.3,s[50,25]=-0.8,s[50,26]=-0.5,s[50,27]=0.5,s[50,28]=1.2,s[50,29]=-1.0,s[50,30]=0.9 s[51,1]=-0.3,s[51,2]=-0.8,s[51,3]=0.8,s[51,4]=-0.3,s[51,5]=-0.9,s[51,6]=-0.8,s[51,7]=0.6,s[51,8]=-0.2,s[51,9]=0.6,s[51,10]=0.1,s[51,11]=-0.1,s[51,12]=0.0,s[51,13]=-1.1,s[51,14]=0.8,s[51,15]=-0.1,s[51,16]=-0.5,s[51,17]=-1.1,s[51,18]=-1.2,s[51,19]=-1.0,s[51,20]=-0.1,s[51,21]=-0.1,s[51,22]=-0.5,s[51,23]=1.1,s[51,24]=0.8,s[51,25]=-1.0,s[51,26]=1.1,s[51,27]=-1.2,s[51,28]=0.0,s[51,29]=0.5,s[51,30]=-0.3 s[52,1]=0.2,s[52,2]=0.1,s[52,3]=-0.3,s[52,4]=0.1,s[52,5]=-0.4,s[52,6]=0.8,s[52,7]=-1.0,s[52,8]=-0.8,s[52,9]=0.5,s[52,10]=0.2,s[52,11]=0.1,s[52,12]=-0.9,s[52,13]=0.4,s[52,14]=-0.2,s[52,15]=0.3,s[52,16]=-0.2,s[52,17]=0.2,s[52,18]=0.4,s[52,19]=0.6,s[52,20]=-0.6,s[52,21]=0.4,s[52,22]=-0.3,s[52,23]=0.2,s[52,24]=-0.3,s[52,25]=-1.2,s[52,26]=0.2,s[52,27]=-0.9,s[52,28]=-0.4,s[52,29]=-0.6,s[52,30]=-0.9 s[53,1]=-0.6,s[53,2]=1.2,s[53,3]=0.9,s[53,4]=1.2,s[53,5]=0.0,s[53,6]=-0.8,s[53,7]=0.0,s[53,8]=-0.8,s[53,9]=-0.1,s[53,10]=-0.1,s[53,11]=-0.7,s[53,12]=0.1,s[53,13]=0.7,s[53,14]=-0.9,s[53,15]=-0.7,s[53,16]=-0.1,s[53,17]=-0.4,s[53,18]=0.4,s[53,19]=-0.7,s[53,20]=-0.1,s[53,21]=-0.4,s[53,22]=-0.3,s[53,23]=-1.0,s[53,24]=0.7,s[53,25]=1.0,s[53,26]=0.7,s[53,27]=1.1,s[53,28]=0.9,s[53,29]=0.6,s[53,30]=0.9 s[54,1]=-1.1,s[54,2]=-1.1,s[54,3]=-0.9,s[54,4]=-0.2,s[54,5]=1.1,s[54,6]=-0.8,s[54,7]=0.1,s[54,8]=0.4,s[54,9]=0.5,s[54,10]=0.3,s[54,11]=1.1,s[54,12]=-0.8,s[54,13]=-0.7,s[54,14]=1.0,s[54,15]=1.1,s[54,16]=0.8,s[54,17]=-0.1,s[54,18]=-1.0,s[54,19]=1.0,s[54,20]=-0.8,s[54,21]=-1.0,s[54,22]=1.0,s[54,23]=-0.9,s[54,24]=-0.2,s[54,25]=1.0,s[54,26]=-0.8,s[54,27]=1.1,s[54,28]=0.5,s[54,29]=-0.7,s[54,30]=-0.1 s[55,1]=0.1,s[55,2]=0.5,s[55,3]=0.8,s[55,4]=0.4,s[55,5]=0.7,s[55,6]=1.1,s[55,7]=-0.4,s[55,8]=-0.5,s[55,9]=0.4,s[55,10]=-0.1,s[55,11]=0.0,s[55,12]=0.6,s[55,13]=0.3,s[55,14]=-0.1,s[55,15]=0.9,s[55,16]=-0.5,s[55,17]=0.7,s[55,18]=0.9,s[55,19]=0.5,s[55,20]=-0.3,s[55,21]=0.1,s[55,22]=-0.1,s[55,23]=-1.1,s[55,24]=-0.9,s[55,25]=0.3,s[55,26]=-0.4,s[55,27]=0.7,s[55,28]=-0.9,s[55,29]=-0.3,s[55,30]=-0.3 s[56,1]=-0.3,s[56,2]=0.3,s[56,3]=0.1,s[56,4]=0.3,s[56,5]=0.8,s[56,6]=-0.6,s[56,7]=0.7,s[56,8]=-0.7,s[56,9]=0.7,s[56,10]=0.3,s[56,11]=-0.4,s[56,12]=-0.9,s[56,13]=0.8,s[56,14]=1.1,s[56,15]=0.3,s[56,16]=0.2,s[56,17]=0.8,s[56,18]=-0.9,s[56,19]=1.1,s[56,20]=0.0,s[56,21]=0.3,s[56,22]=0.3,s[56,23]=0.2,s[56,24]=-0.3,s[56,25]=1.0,s[56,26]=-0.5,s[56,27]=-0.4,s[56,28]=-0.2,s[56,29]=-0.8,s[56,30]=-0.8 s[57,1]=-0.1,s[57,2]=0.2,s[57,3]=1.1,s[57,4]=-0.9,s[57,5]=-1.2,s[57,6]=0.3,s[57,7]=-0.4,s[57,8]=-0.1,s[57,9]=0.5,s[57,10]=1.1,s[57,11]=-0.9,s[57,12]=-0.2,s[57,13]=0.8,s[57,14]=-0.8,s[57,15]=1.1,s[57,16]=0.7,s[57,17]=1.1,s[57,18]=0.2,s[57,19]=1.2,s[57,20]=-1.0,s[57,21]=0.3,s[57,22]=0.7,s[57,23]=0.3,s[57,24]=1.2,s[57,25]=-1.1,s[57,26]=-0.3,s[57,27]=-0.8,s[57,28]=-0.9,s[57,29]=-1.2,s[57,30]=-0.1 s[58,1]=-0.1,s[58,2]=1.1,s[58,3]=0.4,s[58,4]=-1.0,s[58,5]=-0.8,s[58,6]=1.1,s[58,7]=0.3,s[58,8]=0.7,s[58,9]=0.5,s[58,10]=-1.0,s[58,11]=-0.1,s[58,12]=-0.7,s[58,13]=1.0,s[58,14]=0.7,s[58,15]=0.7,s[58,16]=-1.1,s[58,17]=1.0,s[58,18]=0.6,s[58,19]=0.9,s[58,20]=-0.5,s[58,21]=0.1,s[58,22]=-1.0,s[58,23]=1.2,s[58,24]=-0.2,s[58,25]=1.1,s[58,26]=-0.9,s[58,27]=-0.2,s[58,28]=-0.5,s[58,29]=-1.0,s[58,30]=0.9 s[59,1]=0.3,s[59,2]=-0.7,s[59,3]=0.5,s[59,4]=-0.6,s[59,5]=1.2,s[59,6]=-0.6,s[59,7]=0.7,s[59,8]=-0.7,s[59,9]=0.2,s[59,10]=0.0,s[59,11]=0.0,s[59,12]=1.2,s[59,13]=0.8,s[59,14]=-0.8,s[59,15]=-1.1,s[59,16]=0.3,s[59,17]=-0.3,s[59,18]=0.5,s[59,19]=0.9,s[59,20]=0.0,s[59,21]=-0.4,s[59,22]=0.2,s[59,23]=-0.7,s[59,24]=1.2,s[59,25]=-0.1,s[59,26]=-0.6,s[59,27]=1.2,s[59,28]=0.4,s[59,29]=-0.3,s[59,30]=-0.4 s[60,1]=0.2,s[60,2]=-0.6,s[60,3]=-0.3,s[60,4]=0.3,s[60,5]=0.1,s[60,6]=0.4,s[60,7]=-0.7,s[60,8]=-0.5,s[60,9]=-0.6,s[60,10]=0.3,s[60,11]=0.1,s[60,12]=0.8,s[60,13]=0.5,s[60,14]=0.5,s[60,15]=-0.4,s[60,16]=1.1,s[60,17]=-0.6,s[60,18]=0.8,s[60,19]=0.4,s[60,20]=-0.4,s[60,21]=0.3,s[60,22]=0.0,s[60,23]=-0.5,s[60,24]=1.0,s[60,25]=0.0,s[60,26]=1.0,s[60,27]=-0.9,s[60,28]=-1.1,s[60,29]=-0.5,s[60,30]=0.4 s[61,1]=1.0,s[61,2]=0.2,s[61,3]=-0.1,s[61,4]=0.4,s[61,5]=-0.2,s[61,6]=-0.5,s[61,7]=-0.7,s[61,8]=-1.2,s[61,9]=-0.7,s[61,10]=-0.9,s[61,11]=0.2,s[61,12]=0.7,s[61,13]=-0.7,s[61,14]=0.4,s[61,15]=0.0,s[61,16]=0.3,s[61,17]=-0.7,s[61,18]=0.8,s[61,19]=0.5,s[61,20]=0.9,s[61,21]=-0.2,s[61,22]=-0.7,s[61,23]=0.4,s[61,24]=1.2,s[61,25]=-0.2,s[61,26]=-0.3,s[61,27]=-0.2,s[61,28]=-1.0,s[61,29]=0.3,s[61,30]=-0.1 s[62,1]=0.5,s[62,2]=-0.8,s[62,3]=-0.9,s[62,4]=-0.5,s[62,5]=-1.0,s[62,6]=0.3,s[62,7]=-0.3,s[62,8]=0.4,s[62,9]=-0.3,s[62,10]=0.1,s[62,11]=0.1,s[62,12]=0.0,s[62,13]=1.1,s[62,14]=0.5,s[62,15]=1.1,s[62,16]=0.1,s[62,17]=-0.2,s[62,18]=-0.8,s[62,19]=-0.6,s[62,20]=-1.1,s[62,21]=-0.5,s[62,22]=0.8,s[62,23]=-1.0,s[62,24]=-1.2,s[62,25]=0.4,s[62,26]=-0.2,s[62,27]=1.1,s[62,28]=-0.4,s[62,29]=0.4,s[62,30]=0.0 s[63,1]=0.2,s[63,2]=-0.8,s[63,3]=0.4,s[63,4]=1.0,s[63,5]=0.0,s[63,6]=0.1,s[63,7]=-0.6,s[63,8]=0.0,s[63,9]=1.2,s[63,10]=-0.7,s[63,11]=0.1,s[63,12]=-1.2,s[63,13]=0.1,s[63,14]=0.2,s[63,15]=1.1,s[63,16]=0.2,s[63,17]=0.8,s[63,18]=-0.8,s[63,19]=-1.2,s[63,20]=1.1,s[63,21]=0.8,s[63,22]=0.2,s[63,23]=0.8,s[63,24]=-0.1,s[63,25]=0.5,s[63,26]=-0.1,s[63,27]=-0.5,s[63,28]=0.4,s[63,29]=-0.9,s[63,30]=0.7 s[64,1]=0.7,s[64,2]=-1.0,s[64,3]=0.7,s[64,4]=-0.4,s[64,5]=-0.4,s[64,6]=1.2,s[64,7]=-1.0,s[64,8]=0.7,s[64,9]=-0.3,s[64,10]=-0.5,s[64,11]=0.6,s[64,12]=-0.3,s[64,13]=0.0,s[64,14]=1.1,s[64,15]=-0.4,s[64,16]=-0.4,s[64,17]=-1.2,s[64,18]=-0.5,s[64,19]=-0.8,s[64,20]=-0.3,s[64,21]=0.1,s[64,22]=-0.2,s[64,23]=-0.9,s[64,24]=1.1,s[64,25]=-1.1,s[64,26]=1.0,s[64,27]=-0.4,s[64,28]=-0.1,s[64,29]=0.9,s[64,30]=-0.4 s[65,1]=0.4,s[65,2]=-0.3,s[65,3]=0.9,s[65,4]=-1.2,s[65,5]=0.8,s[65,6]=-0.5,s[65,7]=0.9,s[65,8]=-1.0,s[65,9]=0.5,s[65,10]=1.0,s[65,11]=0.7,s[65,12]=1.1,s[65,13]=-0.9,s[65,14]=-0.3,s[65,15]=1.2,s[65,16]=1.2,s[65,17]=-1.1,s[65,18]=0.5,s[65,19]=-1.1,s[65,20]=-1.1,s[65,21]=-0.5,s[65,22]=0.1,s[65,23]=0.1,s[65,24]=-0.6,s[65,25]=-0.7,s[65,26]=0.2,s[65,27]=0.3,s[65,28]=-0.2,s[65,29]=0.9,s[65,30]=0.4 s[66,1]=0.3,s[66,2]=-0.6,s[66,3]=-0.5,s[66,4]=0.0,s[66,5]=0.7,s[66,6]=1.2,s[66,7]=0.9,s[66,8]=0.6,s[66,9]=0.1,s[66,10]=-0.4,s[66,11]=0.0,s[66,12]=0.1,s[66,13]=-0.1,s[66,14]=-0.3,s[66,15]=0.3,s[66,16]=-1.1,s[66,17]=-1.1,s[66,18]=0.1,s[66,19]=-0.1,s[66,20]=-0.4,s[66,21]=-0.1,s[66,22]=-1.2,s[66,23]=-0.4,s[66,24]=0.3,s[66,25]=-0.8,s[66,26]=0.2,s[66,27]=0.2,s[66,28]=0.1,s[66,29]=-0.9,s[66,30]=-0.3 s[67,1]=0.0,s[67,2]=0.0,s[67,3]=0.5,s[67,4]=0.0,s[67,5]=0.9,s[67,6]=-0.7,s[67,7]=-1.2,s[67,8]=1.2,s[67,9]=-0.2,s[67,10]=-0.2,s[67,11]=0.0,s[67,12]=-1.1,s[67,13]=-0.8,s[67,14]=0.2,s[67,15]=-1.2,s[67,16]=-0.4,s[67,17]=-0.8,s[67,18]=-0.8,s[67,19]=1.0,s[67,20]=0.7,s[67,21]=-1.1,s[67,22]=0.7,s[67,23]=0.8,s[67,24]=-0.4,s[67,25]=-0.3,s[67,26]=-0.7,s[67,27]=0.4,s[67,28]=0.7,s[67,29]=-0.2,s[67,30]=0.4 s[68,1]=0.4,s[68,2]=-0.3,s[68,3]=0.3,s[68,4]=-1.1,s[68,5]=-0.6,s[68,6]=-0.4,s[68,7]=0.3,s[68,8]=0.6,s[68,9]=-0.7,s[68,10]=-0.4,s[68,11]=0.7,s[68,12]=0.3,s[68,13]=-0.6,s[68,14]=0.1,s[68,15]=-0.8,s[68,16]=-0.5,s[68,17]=-0.6,s[68,18]=-0.8,s[68,19]=0.5,s[68,20]=-0.4,s[68,21]=-0.3,s[68,22]=-0.7,s[68,23]=0.3,s[68,24]=1.1,s[68,25]=-0.2,s[68,26]=1.0,s[68,27]=-0.4,s[68,28]=-0.6,s[68,29]=-0.3,s[68,30]=-1.0 s[69,1]=-0.1,s[69,2]=0.4,s[69,3]=0.0,s[69,4]=0.4,s[69,5]=0.2,s[69,6]=1.0,s[69,7]=0.8,s[69,8]=-1.2,s[69,9]=1.1,s[69,10]=-0.1,s[69,11]=-0.4,s[69,12]=-0.7,s[69,13]=0.8,s[69,14]=0.5,s[69,15]=0.6,s[69,16]=-0.8,s[69,17]=0.9,s[69,18]=0.9,s[69,19]=-0.2,s[69,20]=0.0,s[69,21]=-0.1,s[69,22]=0.7,s[69,23]=0.5,s[69,24]=-1.2,s[69,25]=0.3,s[69,26]=-0.4,s[69,27]=-0.8,s[69,28]=-1.2,s[69,29]=0.0,s[69,30]=0.9 s[70,1]=0.4,s[70,2]=-0.6,s[70,3]=-1.1,s[70,4]=0.9,s[70,5]=0.9,s[70,6]=0.6,s[70,7]=-0.5,s[70,8]=1.0,s[70,9]=0.5,s[70,10]=-0.5,s[70,11]=-0.5,s[70,12]=-0.9,s[70,13]=0.6,s[70,14]=-0.4,s[70,15]=-0.7,s[70,16]=0.4,s[70,17]=0.8,s[70,18]=-1.0,s[70,19]=0.0,s[70,20]=0.6,s[70,21]=0.6,s[70,22]=-0.9,s[70,23]=-0.8,s[70,24]=0.3,s[70,25]=-0.9,s[70,26]=0.2,s[70,27]=-1.1,s[70,28]=0.1,s[70,29]=0.6,s[70,30]=-1.1 s[71,1]=-1.0,s[71,2]=0.3,s[71,3]=1.2,s[71,4]=0.4,s[71,5]=0.8,s[71,6]=-0.1,s[71,7]=0.6,s[71,8]=-0.7,s[71,9]=-0.1,s[71,10]=-0.6,s[71,11]=-0.4,s[71,12]=-1.1,s[71,13]=-1.1,s[71,14]=-0.2,s[71,15]=-0.8,s[71,16]=0.4,s[71,17]=0.7,s[71,18]=0.2,s[71,19]=-0.7,s[71,20]=-1.1,s[71,21]=0.3,s[71,22]=0.6,s[71,23]=-0.9,s[71,24]=0.7,s[71,25]=-0.7,s[71,26]=-0.8,s[71,27]=-0.6,s[71,28]=-0.2,s[71,29]=0.2,s[71,30]=0.4 s[72,1]=-0.6,s[72,2]=-0.3,s[72,3]=1.0,s[72,4]=-0.4,s[72,5]=0.9,s[72,6]=-0.7,s[72,7]=0.3,s[72,8]=0.9,s[72,9]=1.1,s[72,10]=-0.5,s[72,11]=0.2,s[72,12]=-0.8,s[72,13]=0.3,s[72,14]=0.9,s[72,15]=-0.5,s[72,16]=0.8,s[72,17]=-0.2,s[72,18]=-1.1,s[72,19]=-0.7,s[72,20]=1.1,s[72,21]=0.8,s[72,22]=0.5,s[72,23]=-0.3,s[72,24]=0.2,s[72,25]=-1.1,s[72,26]=-0.6,s[72,27]=0.9,s[72,28]=-0.7,s[72,29]=-1.1,s[72,30]=0.9 s[73,1]=-0.8,s[73,2]=-0.2,s[73,3]=0.9,s[73,4]=1.0,s[73,5]=0.5,s[73,6]=0.0,s[73,7]=0.2,s[73,8]=0.4,s[73,9]=0.4,s[73,10]=0.7,s[73,11]=-0.4,s[73,12]=0.8,s[73,13]=0.1,s[73,14]=-0.5,s[73,15]=-0.8,s[73,16]=-1.1,s[73,17]=-0.7,s[73,18]=1.1,s[73,19]=0.8,s[73,20]=-0.7,s[73,21]=1.0,s[73,22]=0.0,s[73,23]=-0.2,s[73,24]=1.1,s[73,25]=0.5,s[73,26]=-0.6,s[73,27]=-1.0,s[73,28]=-0.4,s[73,29]=-0.4,s[73,30]=0.0 s[74,1]=0.2,s[74,2]=0.9,s[74,3]=-0.9,s[74,4]=0.0,s[74,5]=0.2,s[74,6]=-0.7,s[74,7]=-0.3,s[74,8]=-1.2,s[74,9]=-0.6,s[74,10]=-1.2,s[74,11]=-0.8,s[74,12]=1.2,s[74,13]=0.0,s[74,14]=0.4,s[74,15]=-1.2,s[74,16]=-1.1,s[74,17]=-0.5,s[74,18]=-0.9,s[74,19]=-1.0,s[74,20]=1.2,s[74,21]=0.0,s[74,22]=0.0,s[74,23]=-0.6,s[74,24]=-0.5,s[74,25]=0.6,s[74,26]=0.0,s[74,27]=0.7,s[74,28]=1.2,s[74,29]=0.7,s[74,30]=0.4 s[75,1]=-0.2,s[75,2]=-0.2,s[75,3]=-0.4,s[75,4]=-0.1,s[75,5]=-0.2,s[75,6]=-1.1,s[75,7]=0.2,s[75,8]=-1.0,s[75,9]=-1.1,s[75,10]=-0.5,s[75,11]=0.0,s[75,12]=0.0,s[75,13]=0.7,s[75,14]=-0.2,s[75,15]=-0.3,s[75,16]=-1.2,s[75,17]=0.3,s[75,18]=-0.6,s[75,19]=0.9,s[75,20]=0.9,s[75,21]=-0.3,s[75,22]=-0.7,s[75,23]=-0.7,s[75,24]=-0.7,s[75,25]=-0.7,s[75,26]=-0.7,s[75,27]=-1.1,s[75,28]=-0.7,s[75,29]=-0.9,s[75,30]=-0.9 s[76,1]=-0.4,s[76,2]=-0.6,s[76,3]=-0.2,s[76,4]=-1.1,s[76,5]=1.1,s[76,6]=-1.1,s[76,7]=-0.3,s[76,8]=-0.1,s[76,9]=-0.1,s[76,10]=0.1,s[76,11]=0.2,s[76,12]=1.2,s[76,13]=0.7,s[76,14]=-0.7,s[76,15]=-1.0,s[76,16]=0.4,s[76,17]=-0.5,s[76,18]=-0.7,s[76,19]=0.2,s[76,20]=0.9,s[76,21]=-0.6,s[76,22]=0.6,s[76,23]=0.0,s[76,24]=-0.8,s[76,25]=0.6,s[76,26]=0.2,s[76,27]=0.8,s[76,28]=0.4,s[76,29]=0.3,s[76,30]=0.3 s[77,1]=-0.1,s[77,2]=-0.5,s[77,3]=0.5,s[77,4]=0.1,s[77,5]=0.7,s[77,6]=-0.4,s[77,7]=1.2,s[77,8]=-1.1,s[77,9]=0.6,s[77,10]=0.2,s[77,11]=0.4,s[77,12]=-0.1,s[77,13]=-0.8,s[77,14]=1.0,s[77,15]=-1.0,s[77,16]=-1.1,s[77,17]=-0.6,s[77,18]=-0.4,s[77,19]=-0.4,s[77,20]=1.1,s[77,21]=0.3,s[77,22]=-0.4,s[77,23]=0.4,s[77,24]=0.4,s[77,25]=0.4,s[77,26]=0.2,s[77,27]=-1.2,s[77,28]=-0.6,s[77,29]=0.1,s[77,30]=0.4 s[78,1]=-0.5,s[78,2]=0.1,s[78,3]=0.5,s[78,4]=0.1,s[78,5]=-0.3,s[78,6]=0.9,s[78,7]=0.2,s[78,8]=-0.4,s[78,9]=0.7,s[78,10]=0.7,s[78,11]=0.8,s[78,12]=-0.9,s[78,13]=0.1,s[78,14]=0.6,s[78,15]=-0.1,s[78,16]=-1.2,s[78,17]=0.0,s[78,18]=-1.1,s[78,19]=0.1,s[78,20]=0.3,s[78,21]=-0.7,s[78,22]=0.5,s[78,23]=1.0,s[78,24]=1.0,s[78,25]=0.5,s[78,26]=0.6,s[78,27]=-0.5,s[78,28]=-0.7,s[78,29]=0.3,s[78,30]=1.1 s[79,1]=-0.2,s[79,2]=-0.2,s[79,3]=0.5,s[79,4]=1.2,s[79,5]=-0.9,s[79,6]=-0.2,s[79,7]=0.5,s[79,8]=1.2,s[79,9]=-0.3,s[79,10]=1.0,s[79,11]=0.8,s[79,12]=0.6,s[79,13]=-1.2,s[79,14]=0.5,s[79,15]=-0.5,s[79,16]=1.1,s[79,17]=-1.1,s[79,18]=-1.0,s[79,19]=0.5,s[79,20]=-0.6,s[79,21]=-0.5,s[79,22]=-0.1,s[79,23]=-1.1,s[79,24]=0.6,s[79,25]=-0.3,s[79,26]=1.1,s[79,27]=-1.1,s[79,28]=1.2,s[79,29]=-0.4,s[79,30]=0.6 s[80,1]=0.3,s[80,2]=0.1,s[80,3]=0.0,s[80,4]=0.2,s[80,5]=0.6,s[80,6]=0.9,s[80,7]=-0.1,s[80,8]=1.2,s[80,9]=-0.1,s[80,10]=1.0,s[80,11]=-0.3,s[80,12]=0.0,s[80,13]=1.1,s[80,14]=1.0,s[80,15]=-0.7,s[80,16]=-1.1,s[80,17]=-0.7,s[80,18]=0.3,s[80,19]=-1.1,s[80,20]=1.1,s[80,21]=0.6,s[80,22]=0.7,s[80,23]=-1.0,s[80,24]=0.6,s[80,25]=-0.8,s[80,26]=1.1,s[80,27]=-0.7,s[80,28]=-0.7,s[80,29]=0.7,s[80,30]=0.0 s[81,1]=0.1,s[81,2]=-0.2,s[81,3]=-0.8,s[81,4]=-0.3,s[81,5]=-0.9,s[81,6]=-0.8,s[81,7]=-0.9,s[81,8]=0.1,s[81,9]=0.7,s[81,10]=-0.2,s[81,11]=-0.8,s[81,12]=0.5,s[81,13]=-0.4,s[81,14]=0.7,s[81,15]=-0.9,s[81,16]=-0.2,s[81,17]=0.7,s[81,18]=0.6,s[81,19]=0.5,s[81,20]=-0.5,s[81,21]=-0.3,s[81,22]=-0.2,s[81,23]=1.1,s[81,24]=0.5,s[81,25]=-0.8,s[81,26]=-0.4,s[81,27]=-0.5,s[81,28]=-0.1,s[81,29]=-1.2,s[81,30]=0.7 s[82,1]=0.1,s[82,2]=-1.2,s[82,3]=-1.2,s[82,4]=0.2,s[82,5]=1.2,s[82,6]=-0.4,s[82,7]=0.2,s[82,8]=0.9,s[82,9]=0.8,s[82,10]=0.8,s[82,11]=0.3,s[82,12]=-0.4,s[82,13]=1.0,s[82,14]=0.9,s[82,15]=-0.1,s[82,16]=-0.3,s[82,17]=0.7,s[82,18]=-0.8,s[82,19]=0.5,s[82,20]=0.4,s[82,21]=-0.6,s[82,22]=-1.0,s[82,23]=1.0,s[82,24]=1.1,s[82,25]=-1.2,s[82,26]=0.1,s[82,27]=1.0,s[82,28]=-1.2,s[82,29]=0.8,s[82,30]=1.0 s[83,1]=-0.2,s[83,2]=0.3,s[83,3]=-0.1,s[83,4]=-1.1,s[83,5]=0.0,s[83,6]=0.4,s[83,7]=0.4,s[83,8]=-0.5,s[83,9]=0.1,s[83,10]=0.2,s[83,11]=-0.3,s[83,12]=0.1,s[83,13]=-0.2,s[83,14]=0.5,s[83,15]=0.0,s[83,16]=1.1,s[83,17]=-1.2,s[83,18]=-1.2,s[83,19]=0.5,s[83,20]=-0.1,s[83,21]=0.9,s[83,22]=-1.0,s[83,23]=-1.0,s[83,24]=-0.2,s[83,25]=0.1,s[83,26]=-0.4,s[83,27]=-1.1,s[83,28]=0.4,s[83,29]=1.1,s[83,30]=-0.2 s[84,1]=-0.5,s[84,2]=-1.0,s[84,3]=0.2,s[84,4]=0.9,s[84,5]=-1.0,s[84,6]=0.5,s[84,7]=-1.0,s[84,8]=-0.3,s[84,9]=0.4,s[84,10]=-0.3,s[84,11]=-0.3,s[84,12]=-1.2,s[84,13]=-0.8,s[84,14]=0.7,s[84,15]=0.2,s[84,16]=0.4,s[84,17]=0.8,s[84,18]=0.8,s[84,19]=-1.2,s[84,20]=0.7,s[84,21]=-0.3,s[84,22]=-0.3,s[84,23]=0.7,s[84,24]=0.7,s[84,25]=0.2,s[84,26]=-0.4,s[84,27]=0.5,s[84,28]=-1.1,s[84,29]=1.0,s[84,30]=0.3 s[85,1]=0.5,s[85,2]=0.0,s[85,3]=-1.2,s[85,4]=-0.5,s[85,5]=-0.7,s[85,6]=0.4,s[85,7]=-0.2,s[85,8]=-1.0,s[85,9]=0.1,s[85,10]=0.7,s[85,11]=-0.2,s[85,12]=0.5,s[85,13]=0.5,s[85,14]=-0.4,s[85,15]=-0.9,s[85,16]=1.0,s[85,17]=-0.1,s[85,18]=-0.9,s[85,19]=-1.1,s[85,20]=1.1,s[85,21]=0.3,s[85,22]=-1.2,s[85,23]=0.2,s[85,24]=-0.1,s[85,25]=1.0,s[85,26]=0.4,s[85,27]=0.6,s[85,28]=0.8,s[85,29]=-0.9,s[85,30]=0.0 s[86,1]=0.7,s[86,2]=-1.2,s[86,3]=0.8,s[86,4]=0.1,s[86,5]=0.2,s[86,6]=-0.3,s[86,7]=0.8,s[86,8]=1.0,s[86,9]=-0.2,s[86,10]=-0.6,s[86,11]=-0.5,s[86,12]=1.0,s[86,13]=0.0,s[86,14]=-1.2,s[86,15]=0.1,s[86,16]=0.9,s[86,17]=0.6,s[86,18]=0.0,s[86,19]=1.0,s[86,20]=0.0,s[86,21]=-0.5,s[86,22]=0.6,s[86,23]=-0.9,s[86,24]=1.0,s[86,25]=-0.8,s[86,26]=-1.2,s[86,27]=-0.4,s[86,28]=-1.0,s[86,29]=-0.9,s[86,30]=-0.3 s[87,1]=0.7,s[87,2]=-0.9,s[87,3]=0.3,s[87,4]=0.2,s[87,5]=-0.2,s[87,6]=0.5,s[87,7]=-1.0,s[87,8]=0.9,s[87,9]=-1.0,s[87,10]=-0.7,s[87,11]=0.2,s[87,12]=0.5,s[87,13]=-1.0,s[87,14]=0.0,s[87,15]=0.9,s[87,16]=0.7,s[87,17]=0.3,s[87,18]=0.3,s[87,19]=0.1,s[87,20]=0.1,s[87,21]=0.2,s[87,22]=0.1,s[87,23]=0.2,s[87,24]=0.3,s[87,25]=1.0,s[87,26]=-1.2,s[87,27]=0.4,s[87,28]=-0.3,s[87,29]=-0.7,s[87,30]=-0.3 s[88,1]=0.6,s[88,2]=-1.0,s[88,3]=1.0,s[88,4]=-0.7,s[88,5]=0.7,s[88,6]=-0.1,s[88,7]=-0.6,s[88,8]=-0.7,s[88,9]=0.7,s[88,10]=-1.0,s[88,11]=0.1,s[88,12]=-0.4,s[88,13]=-0.4,s[88,14]=-0.9,s[88,15]=-0.9,s[88,16]=-0.5,s[88,17]=1.1,s[88,18]=0.2,s[88,19]=1.0,s[88,20]=-0.8,s[88,21]=0.1,s[88,22]=-1.2,s[88,23]=0.9,s[88,24]=0.2,s[88,25]=0.4,s[88,26]=0.0,s[88,27]=1.2,s[88,28]=-0.3,s[88,29]=0.7,s[88,30]=-0.3 s[89,1]=0.9,s[89,2]=0.0,s[89,3]=-1.2,s[89,4]=-0.9,s[89,5]=1.0,s[89,6]=-0.2,s[89,7]=-0.7,s[89,8]=-0.4,s[89,9]=0.8,s[89,10]=0.9,s[89,11]=0.3,s[89,12]=-0.5,s[89,13]=0.0,s[89,14]=-0.4,s[89,15]=-0.7,s[89,16]=-0.4,s[89,17]=-1.1,s[89,18]=0.5,s[89,19]=-0.2,s[89,20]=-0.4,s[89,21]=-0.1,s[89,22]=-0.7,s[89,23]=-0.3,s[89,24]=-0.1,s[89,25]=-0.6,s[89,26]=-0.8,s[89,27]=-0.5,s[89,28]=-0.2,s[89,29]=0.0,s[89,30]=0.0 s[90,1]=0.0,s[90,2]=-0.3,s[90,3]=0.9,s[90,4]=-1.0,s[90,5]=0.1,s[90,6]=0.1,s[90,7]=0.8,s[90,8]=-0.7,s[90,9]=-0.4,s[90,10]=-1.0,s[90,11]=-0.2,s[90,12]=-0.6,s[90,13]=0.9,s[90,14]=-0.7,s[90,15]=-0.1,s[90,16]=-0.2,s[90,17]=-1.0,s[90,18]=-0.4,s[90,19]=-0.4,s[90,20]=-0.7,s[90,21]=0.2,s[90,22]=-0.7,s[90,23]=0.2,s[90,24]=0.5,s[90,25]=-0.7,s[90,26]=-0.3,s[90,27]=-0.4,s[90,28]=-0.1,s[90,29]=-0.9,s[90,30]=-1.0 s[91,1]=0.2,s[91,2]=-0.4,s[91,3]=-0.9,s[91,4]=0.9,s[91,5]=-0.5,s[91,6]=0.1,s[91,7]=0.1,s[91,8]=0.5,s[91,9]=0.7,s[91,10]=0.7,s[91,11]=0.0,s[91,12]=1.2,s[91,13]=0.6,s[91,14]=1.1,s[91,15]=0.9,s[91,16]=-0.9,s[91,17]=-1.0,s[91,18]=-0.1,s[91,19]=0.0,s[91,20]=0.2,s[91,21]=-0.5,s[91,22]=-1.1,s[91,23]=0.1,s[91,24]=-0.6,s[91,25]=1.0,s[91,26]=-0.2,s[91,27]=0.2,s[91,28]=0.8,s[91,29]=-0.7,s[91,30]=1.1 s[92,1]=-0.3,s[92,2]=-0.3,s[92,3]=-0.4,s[92,4]=0.1,s[92,5]=0.4,s[92,6]=0.6,s[92,7]=1.0,s[92,8]=0.3,s[92,9]=-0.1,s[92,10]=0.1,s[92,11]=-0.1,s[92,12]=-0.3,s[92,13]=0.6,s[92,14]=0.7,s[92,15]=0.6,s[92,16]=0.1,s[92,17]=-0.8,s[92,18]=-0.5,s[92,19]=-0.1,s[92,20]=-0.3,s[92,21]=-0.4,s[92,22]=-0.4,s[92,23]=0.3,s[92,24]=0.5,s[92,25]=0.1,s[92,26]=-0.3,s[92,27]=1.2,s[92,28]=0.3,s[92,29]=-1.2,s[92,30]=0.9 s[93,1]=0.0,s[93,2]=0.0,s[93,3]=0.2,s[93,4]=0.2,s[93,5]=1.1,s[93,6]=1.2,s[93,7]=0.7,s[93,8]=-0.3,s[93,9]=-0.5,s[93,10]=0.0,s[93,11]=-0.2,s[93,12]=-0.7,s[93,13]=-0.1,s[93,14]=0.3,s[93,15]=0.0,s[93,16]=0.6,s[93,17]=-0.6,s[93,18]=0.5,s[93,19]=-0.7,s[93,20]=-0.3,s[93,21]=-0.2,s[93,22]=0.4,s[93,23]=0.8,s[93,24]=-1.0,s[93,25]=-0.8,s[93,26]=0.4,s[93,27]=-0.4,s[93,28]=0.0,s[93,29]=-0.9,s[93,30]=0.1 s[94,1]=0.0,s[94,2]=1.0,s[94,3]=-1.0,s[94,4]=-0.7,s[94,5]=-0.7,s[94,6]=0.9,s[94,7]=-0.6,s[94,8]=-0.8,s[94,9]=0.2,s[94,10]=0.4,s[94,11]=-0.1,s[94,12]=0.0,s[94,13]=0.7,s[94,14]=1.2,s[94,15]=-0.4,s[94,16]=-1.2,s[94,17]=0.5,s[94,18]=0.7,s[94,19]=-0.5,s[94,20]=0.8,s[94,21]=0.7,s[94,22]=-0.6,s[94,23]=0.2,s[94,24]=0.7,s[94,25]=-0.5,s[94,26]=1.0,s[94,27]=0.9,s[94,28]=1.0,s[94,29]=-0.9,s[94,30]=-0.3 s[95,1]=-0.6,s[95,2]=0.0,s[95,3]=1.0,s[95,4]=0.0,s[95,5]=-0.5,s[95,6]=0.1,s[95,7]=0.6,s[95,8]=0.2,s[95,9]=0.0,s[95,10]=0.0,s[95,11]=-0.6,s[95,12]=0.6,s[95,13]=0.3,s[95,14]=1.2,s[95,15]=-1.2,s[95,16]=0.5,s[95,17]=0.2,s[95,18]=-0.6,s[95,19]=0.6,s[95,20]=0.0,s[95,21]=0.5,s[95,22]=0.2,s[95,23]=0.7,s[95,24]=0.3,s[95,25]=1.1,s[95,26]=-0.1,s[95,27]=0.9,s[95,28]=-1.0,s[95,29]=-0.8,s[95,30]=0.5 s[96,1]=-0.1,s[96,2]=-0.4,s[96,3]=-1.0,s[96,4]=0.4,s[96,5]=-0.7,s[96,6]=-0.9,s[96,7]=1.2,s[96,8]=0.7,s[96,9]=0.3,s[96,10]=-0.3,s[96,11]=0.5,s[96,12]=0.9,s[96,13]=0.3,s[96,14]=-1.0,s[96,15]=0.3,s[96,16]=-0.1,s[96,17]=-0.6,s[96,18]=-0.4,s[96,19]=0.3,s[96,20]=0.3,s[96,21]=-0.1,s[96,22]=-0.2,s[96,23]=0.2,s[96,24]=-0.2,s[96,25]=-1.0,s[96,26]=-0.7,s[96,27]=0.0,s[96,28]=1.2,s[96,29]=-0.1,s[96,30]=0.7 s[97,1]=0.1,s[97,2]=1.2,s[97,3]=-0.1,s[97,4]=-1.2,s[97,5]=0.7,s[97,6]=-0.4,s[97,7]=-0.8,s[97,8]=-0.9,s[97,9]=-0.7,s[97,10]=-0.5,s[97,11]=-0.3,s[97,12]=-0.1,s[97,13]=-0.2,s[97,14]=-0.2,s[97,15]=-0.3,s[97,16]=-0.5,s[97,17]=-0.4,s[97,18]=-0.4,s[97,19]=0.0,s[97,20]=0.4,s[97,21]=-0.6,s[97,22]=0.4,s[97,23]=-1.1,s[97,24]=1.2,s[97,25]=-0.1,s[97,26]=-0.2,s[97,27]=-0.3,s[97,28]=-0.7,s[97,29]=-0.6,s[97,30]=1.1 s[98,1]=-0.2,s[98,2]=-0.8,s[98,3]=-0.8,s[98,4]=-0.3,s[98,5]=-1.1,s[98,6]=0.1,s[98,7]=-0.5,s[98,8]=1.2,s[98,9]=-0.7,s[98,10]=1.0,s[98,11]=-0.7,s[98,12]=0.2,s[98,13]=-0.1,s[98,14]=0.0,s[98,15]=-0.4,s[98,16]=-0.8,s[98,17]=-0.1,s[98,18]=0.8,s[98,19]=-0.2,s[98,20]=-1.0,s[98,21]=-0.3,s[98,22]=0.3,s[98,23]=1.2,s[98,24]=-1.2,s[98,25]=-0.4,s[98,26]=-0.2,s[98,27]=0.9,s[98,28]=0.0,s[98,29]=1.2,s[98,30]=1.2 s[99,1]=0.4,s[99,2]=-0.3,s[99,3]=1.2,s[99,4]=0.5,s[99,5]=1.0,s[99,6]=0.9,s[99,7]=0.3,s[99,8]=-0.9,s[99,9]=-0.3,s[99,10]=0.0,s[99,11]=-1.0,s[99,12]=-0.1,s[99,13]=0.2,s[99,14]=-0.6,s[99,15]=0.8,s[99,16]=0.8,s[99,17]=1.0,s[99,18]=0.1,s[99,19]=-1.1,s[99,20]=0.4,s[99,21]=0.0,s[99,22]=-0.3,s[99,23]=-0.8,s[99,24]=-0.5,s[99,25]=-0.7,s[99,26]=-0.5,s[99,27]=-0.8,s[99,28]=-1.2,s[99,29]=-0.3,s[99,30]=-0.2 s[100,1]=-0.4,s[100,2]=-0.2,s[100,3]=-1.0,s[100,4]=0.5,s[100,5]=0.5,s[100,6]=-0.1,s[100,7]=-0.4,s[100,8]=1.2,s[100,9]=-0.4,s[100,10]=0.9,s[100,11]=-0.3,s[100,12]=-0.1,s[100,13]=-0.9,s[100,14]=-0.3,s[100,15]=-0.8,s[100,16]=0.2,s[100,17]=0.0,s[100,18]=-1.0,s[100,19]=-0.8,s[100,20]=1.0,s[100,21]=-0.5,s[100,22]=0.5,s[100,23]=1.0,s[100,24]=-0.1,s[100,25]=1.0,s[100,26]=0.9,s[100,27]=1.1,s[100,28]=1.1,s[100,29]=0.1,s[100,30]=0.8 s[101,1]=0.6,s[101,2]=-0.3,s[101,3]=-0.5,s[101,4]=-1.1,s[101,5]=-0.8,s[101,6]=-1.1,s[101,7]=0.2,s[101,8]=0.5,s[101,9]=0.6,s[101,10]=-0.5,s[101,11]=-0.2,s[101,12]=-1.0,s[101,13]=0.8,s[101,14]=-0.7,s[101,15]=-0.9,s[101,16]=0.6,s[101,17]=0.9,s[101,18]=-0.2,s[101,19]=-1.0,s[101,20]=-0.9,s[101,21]=0.0,s[101,22]=-0.4,s[101,23]=0.4,s[101,24]=0.3,s[101,25]=-0.6,s[101,26]=-0.5,s[101,27]=-0.7,s[101,28]=-0.4,s[101,29]=0.2,s[101,30]=-1.0 s[102,1]=0.8,s[102,2]=0.1,s[102,3]=-1.2,s[102,4]=0.9,s[102,5]=0.3,s[102,6]=-0.2,s[102,7]=0.0,s[102,8]=0.7,s[102,9]=0.0,s[102,10]=-0.6,s[102,11]=-0.2,s[102,12]=-1.0,s[102,13]=0.2,s[102,14]=-1.1,s[102,15]=-1.1,s[102,16]=1.2,s[102,17]=0.9,s[102,18]=-1.2,s[102,19]=0.1,s[102,20]=-0.4,s[102,21]=0.3,s[102,22]=0.0,s[102,23]=-0.3,s[102,24]=0.7,s[102,25]=1.1,s[102,26]=-0.7,s[102,27]=-0.4,s[102,28]=0.3,s[102,29]=0.8,s[102,30]=-1.2 s[103,1]=0.1,s[103,2]=-0.3,s[103,3]=-0.3,s[103,4]=-1.1,s[103,5]=0.7,s[103,6]=-1.1,s[103,7]=-0.5,s[103,8]=-0.9,s[103,9]=0.8,s[103,10]=-0.1,s[103,11]=0.7,s[103,12]=-0.3,s[103,13]=0.0,s[103,14]=0.4,s[103,15]=-0.8,s[103,16]=0.5,s[103,17]=-0.9,s[103,18]=-0.2,s[103,19]=0.5,s[103,20]=-0.6,s[103,21]=-0.2,s[103,22]=-0.2,s[103,23]=-0.4,s[103,24]=-1.1,s[103,25]=-0.1,s[103,26]=0.4,s[103,27]=-0.4,s[103,28]=-0.7,s[103,29]=0.2,s[103,30]=0.9 s[104,1]=-0.3,s[104,2]=-0.5,s[104,3]=0.7,s[104,4]=-0.5,s[104,5]=-0.3,s[104,6]=-0.7,s[104,7]=0.5,s[104,8]=-0.1,s[104,9]=-0.3,s[104,10]=0.8,s[104,11]=-0.3,s[104,12]=1.1,s[104,13]=-0.2,s[104,14]=1.0,s[104,15]=0.3,s[104,16]=-0.3,s[104,17]=0.0,s[104,18]=-0.2,s[104,19]=-0.3,s[104,20]=0.8,s[104,21]=0.3,s[104,22]=-0.3,s[104,23]=-1.1,s[104,24]=1.0,s[104,25]=-0.5,s[104,26]=-0.4,s[104,27]=-0.4,s[104,28]=-1.2,s[104,29]=-0.4,s[104,30]=-0.8 s[105,1]=0.7,s[105,2]=0.2,s[105,3]=-0.1,s[105,4]=-1.1,s[105,5]=-0.5,s[105,6]=1.2,s[105,7]=-0.1,s[105,8]=0.9,s[105,9]=0.3,s[105,10]=-0.2,s[105,11]=0.4,s[105,12]=-0.9,s[105,13]=-0.1,s[105,14]=0.2,s[105,15]=0.8,s[105,16]=-1.0,s[105,17]=-0.7,s[105,18]=-1.1,s[105,19]=-0.4,s[105,20]=-0.8,s[105,21]=0.1,s[105,22]=1.2,s[105,23]=-0.4,s[105,24]=-0.7,s[105,25]=-0.1,s[105,26]=0.8,s[105,27]=0.1,s[105,28]=0.0,s[105,29]=-0.3,s[105,30]=0.8 s[106,1]=-0.3,s[106,2]=0.0,s[106,3]=0.0,s[106,4]=-1.0,s[106,5]=0.6,s[106,6]=-0.8,s[106,7]=0.5,s[106,8]=-0.5,s[106,9]=-0.2,s[106,10]=0.6,s[106,11]=0.7,s[106,12]=0.6,s[106,13]=-0.6,s[106,14]=-1.0,s[106,15]=-0.9,s[106,16]=-0.5,s[106,17]=0.2,s[106,18]=0.6,s[106,19]=0.4,s[106,20]=0.4,s[106,21]=0.0,s[106,22]=0.4,s[106,23]=0.4,s[106,24]=-0.6,s[106,25]=-1.0,s[106,26]=1.2,s[106,27]=-1.2,s[106,28]=1.1,s[106,29]=-0.6,s[106,30]=-0.8 s[107,1]=0.6,s[107,2]=-1.0,s[107,3]=1.0,s[107,4]=0.1,s[107,5]=-0.7,s[107,6]=-0.2,s[107,7]=0.3,s[107,8]=0.9,s[107,9]=0.3,s[107,10]=-1.1,s[107,11]=0.3,s[107,12]=-0.5,s[107,13]=0.1,s[107,14]=-0.1,s[107,15]=-0.3,s[107,16]=-0.1,s[107,17]=0.2,s[107,18]=-0.6,s[107,19]=-0.1,s[107,20]=-1.0,s[107,21]=0.5,s[107,22]=0.7,s[107,23]=-0.9,s[107,24]=0.3,s[107,25]=0.2,s[107,26]=-0.8,s[107,27]=-0.7,s[107,28]=-0.4,s[107,29]=-0.2,s[107,30]=-0.1 s[108,1]=0.0,s[108,2]=-1.1,s[108,3]=0.0,s[108,4]=-0.8,s[108,5]=0.7,s[108,6]=-0.7,s[108,7]=-1.2,s[108,8]=0.7,s[108,9]=0.8,s[108,10]=-0.8,s[108,11]=-0.2,s[108,12]=-0.4,s[108,13]=-0.4,s[108,14]=0.8,s[108,15]=-0.1,s[108,16]=0.4,s[108,17]=0.2,s[108,18]=-0.8,s[108,19]=0.3,s[108,20]=0.6,s[108,21]=0.7,s[108,22]=-0.5,s[108,23]=-0.9,s[108,24]=-0.3,s[108,25]=-0.2,s[108,26]=0.1,s[108,27]=0.4,s[108,28]=-0.2,s[108,29]=0.6,s[108,30]=-1.1 s[109,1]=0.2,s[109,2]=1.2,s[109,3]=-0.2,s[109,4]=-1.0,s[109,5]=-1.2,s[109,6]=0.9,s[109,7]=-0.9,s[109,8]=0.4,s[109,9]=0.4,s[109,10]=-1.1,s[109,11]=0.8,s[109,12]=-1.0,s[109,13]=0.9,s[109,14]=0.8,s[109,15]=0.1,s[109,16]=-0.2,s[109,17]=0.0,s[109,18]=-0.4,s[109,19]=-1.1,s[109,20]=-0.9,s[109,21]=0.2,s[109,22]=0.3,s[109,23]=-0.4,s[109,24]=-1.1,s[109,25]=0.2,s[109,26]=0.6,s[109,27]=0.0,s[109,28]=0.3,s[109,29]=-0.8,s[109,30]=-1.1 s[110,1]=-0.3,s[110,2]=0.4,s[110,3]=1.2,s[110,4]=0.0,s[110,5]=1.2,s[110,6]=-1.1,s[110,7]=1.1,s[110,8]=1.0,s[110,9]=-0.4,s[110,10]=-0.1,s[110,11]=0.5,s[110,12]=0.0,s[110,13]=-0.3,s[110,14]=-0.4,s[110,15]=-0.7,s[110,16]=0.0,s[110,17]=-0.2,s[110,18]=0.8,s[110,19]=-0.8,s[110,20]=-1.2,s[110,21]=0.2,s[110,22]=-0.5,s[110,23]=0.2,s[110,24]=-0.4,s[110,25]=0.3,s[110,26]=0.4,s[110,27]=0.5,s[110,28]=-1.0,s[110,29]=-0.5,s[110,30]=0.2 s[111,1]=-0.2,s[111,2]=-0.7,s[111,3]=-0.4,s[111,4]=-0.9,s[111,5]=-0.4,s[111,6]=1.1,s[111,7]=1.1,s[111,8]=-1.0,s[111,9]=0.3,s[111,10]=0.5,s[111,11]=0.2,s[111,12]=-1.2,s[111,13]=-1.2,s[111,14]=-0.9,s[111,15]=-0.1,s[111,16]=0.4,s[111,17]=0.2,s[111,18]=0.0,s[111,19]=0.6,s[111,20]=0.8,s[111,21]=-0.3,s[111,22]=-0.1,s[111,23]=-0.4,s[111,24]=-0.8,s[111,25]=0.6,s[111,26]=0.0,s[111,27]=0.3,s[111,28]=-0.5,s[111,29]=-0.9,s[111,30]=-1.1 s[112,1]=-0.6,s[112,2]=1.0,s[112,3]=0.1,s[112,4]=-1.1,s[112,5]=-0.6,s[112,6]=-0.3,s[112,7]=0.7,s[112,8]=-0.3,s[112,9]=0.6,s[112,10]=0.1,s[112,11]=0.6,s[112,12]=1.0,s[112,13]=0.7,s[112,14]=0.5,s[112,15]=1.2,s[112,16]=0.6,s[112,17]=-0.1,s[112,18]=0.0,s[112,19]=-0.3,s[112,20]=0.4,s[112,21]=0.2,s[112,22]=-0.2,s[112,23]=0.4,s[112,24]=-0.8,s[112,25]=0.6,s[112,26]=-0.3,s[112,27]=1.0,s[112,28]=1.0,s[112,29]=-0.5,s[112,30]=0.7 s[113,1]=0.8,s[113,2]=-0.6,s[113,3]=-0.7,s[113,4]=-1.1,s[113,5]=-0.6,s[113,6]=-0.2,s[113,7]=0.0,s[113,8]=0.5,s[113,9]=0.7,s[113,10]=-0.9,s[113,11]=-0.2,s[113,12]=0.7,s[113,13]=-0.7,s[113,14]=0.5,s[113,15]=0.4,s[113,16]=-0.5,s[113,17]=-0.8,s[113,18]=-0.4,s[113,19]=-0.8,s[113,20]=0.2,s[113,21]=-0.5,s[113,22]=-0.6,s[113,23]=0.5,s[113,24]=-1.1,s[113,25]=0.0,s[113,26]=0.2,s[113,27]=-0.9,s[113,28]=0.5,s[113,29]=-0.8,s[113,30]=0.1 s[114,1]=-0.4,s[114,2]=0.3,s[114,3]=-0.6,s[114,4]=0.3,s[114,5]=-0.3,s[114,6]=0.8,s[114,7]=0.6,s[114,8]=1.2,s[114,9]=-0.7,s[114,10]=-0.2,s[114,11]=0.4,s[114,12]=0.7,s[114,13]=-0.7,s[114,14]=0.1,s[114,15]=0.4,s[114,16]=-0.7,s[114,17]=0.4,s[114,18]=-0.5,s[114,19]=0.4,s[114,20]=-0.9,s[114,21]=0.2,s[114,22]=0.5,s[114,23]=-0.4,s[114,24]=1.1,s[114,25]=-0.7,s[114,26]=0.2,s[114,27]=-0.8,s[114,28]=0.5,s[114,29]=-1.0,s[114,30]=-0.1 s[115,1]=-0.4,s[115,2]=-0.7,s[115,3]=-0.2,s[115,4]=-0.4,s[115,5]=-0.7,s[115,6]=0.4,s[115,7]=0.8,s[115,8]=0.9,s[115,9]=0.4,s[115,10]=0.4,s[115,11]=-1.2,s[115,12]=0.6,s[115,13]=0.9,s[115,14]=0.9,s[115,15]=-0.7,s[115,16]=0.3,s[115,17]=0.1,s[115,18]=0.4,s[115,19]=-0.1,s[115,20]=0.7,s[115,21]=-0.7,s[115,22]=0.7,s[115,23]=0.6,s[115,24]=0.5,s[115,25]=0.6,s[115,26]=-0.9,s[115,27]=0.6,s[115,28]=-0.3,s[115,29]=-0.1,s[115,30]=-0.6 s[116,1]=-0.2,s[116,2]=-1.1,s[116,3]=0.1,s[116,4]=-0.3,s[116,5]=0.5,s[116,6]=-0.2,s[116,7]=0.6,s[116,8]=-0.5,s[116,9]=-0.1,s[116,10]=0.0,s[116,11]=0.7,s[116,12]=0.9,s[116,13]=0.0,s[116,14]=1.1,s[116,15]=-1.1,s[116,16]=-0.4,s[116,17]=-0.3,s[116,18]=-0.8,s[116,19]=0.2,s[116,20]=-0.6,s[116,21]=1.1,s[116,22]=0.3,s[116,23]=0.9,s[116,24]=-0.5,s[116,25]=0.7,s[116,26]=0.0,s[116,27]=0.0,s[116,28]=-0.8,s[116,29]=-1.1,s[116,30]=0.9 s[117,1]=0.7,s[117,2]=0.6,s[117,3]=-0.8,s[117,4]=0.6,s[117,5]=-0.8,s[117,6]=0.4,s[117,7]=-1.0,s[117,8]=-0.6,s[117,9]=-0.9,s[117,10]=-0.9,s[117,11]=-0.2,s[117,12]=1.0,s[117,13]=-0.4,s[117,14]=-0.2,s[117,15]=-0.1,s[117,16]=1.1,s[117,17]=-1.0,s[117,18]=0.3,s[117,19]=0.8,s[117,20]=-1.1,s[117,21]=-0.2,s[117,22]=0.3,s[117,23]=0.3,s[117,24]=-0.9,s[117,25]=-1.0,s[117,26]=0.5,s[117,27]=-0.3,s[117,28]=-0.9,s[117,29]=0.0,s[117,30]=0.6 s[118,1]=-0.1,s[118,2]=0.1,s[118,3]=-0.1,s[118,4]=-0.1,s[118,5]=-0.3,s[118,6]=0.5,s[118,7]=0.0,s[118,8]=0.7,s[118,9]=0.7,s[118,10]=-0.9,s[118,11]=0.5,s[118,12]=-1.2,s[118,13]=-1.1,s[118,14]=-0.5,s[118,15]=-1.1,s[118,16]=-0.9,s[118,17]=0.4,s[118,18]=-0.5,s[118,19]=-0.1,s[118,20]=0.9,s[118,21]=-0.3,s[118,22]=0.7,s[118,23]=-0.2,s[118,24]=-1.2,s[118,25]=-0.5,s[118,26]=0.4,s[118,27]=1.2,s[118,28]=-0.7,s[118,29]=0.9,s[118,30]=1.0 s[119,1]=-0.5,s[119,2]=0.8,s[119,3]=0.9,s[119,4]=0.2,s[119,5]=0.7,s[119,6]=-0.3,s[119,7]=0.8,s[119,8]=1.2,s[119,9]=-1.2,s[119,10]=-0.4,s[119,11]=0.1,s[119,12]=-1.0,s[119,13]=-1.1,s[119,14]=-0.9,s[119,15]=-0.4,s[119,16]=-0.2,s[119,17]=-1.1,s[119,18]=0.0,s[119,19]=-0.6,s[119,20]=-1.1,s[119,21]=-0.3,s[119,22]=0.3,s[119,23]=0.5,s[119,24]=0.0,s[119,25]=-0.5,s[119,26]=1.0,s[119,27]=1.0,s[119,28]=-0.1,s[119,29]=-0.5,s[119,30]=0.0 s[120,1]=-0.1,s[120,2]=-0.3,s[120,3]=-0.4,s[120,4]=-0.4,s[120,5]=0.0,s[120,6]=-0.5,s[120,7]=0.3,s[120,8]=-1.1,s[120,9]=-0.9,s[120,10]=-0.8,s[120,11]=0.0,s[120,12]=1.1,s[120,13]=1.0,s[120,14]=-0.2,s[120,15]=-0.5,s[120,16]=-0.8,s[120,17]=-0.4,s[120,18]=1.0,s[120,19]=0.2,s[120,20]=-0.2,s[120,21]=0.0,s[120,22]=0.1,s[120,23]=-0.4,s[120,24]=0.2,s[120,25]=-1.1,s[120,26]=-1.1,s[120,27]=-0.2,s[120,28]=0.7,s[120,29]=0.5,s[120,30]=0.1 s[121,1]=-0.4,s[121,2]=-0.8,s[121,3]=0.7,s[121,4]=1.0,s[121,5]=0.3,s[121,6]=0.1,s[121,7]=0.8,s[121,8]=-1.0,s[121,9]=0.0,s[121,10]=0.1,s[121,11]=0.6,s[121,12]=0.5,s[121,13]=-0.5,s[121,14]=-1.0,s[121,15]=-0.2,s[121,16]=-0.5,s[121,17]=0.6,s[121,18]=0.8,s[121,19]=0.5,s[121,20]=0.1,s[121,21]=0.5,s[121,22]=-0.3,s[121,23]=-0.8,s[121,24]=-0.9,s[121,25]=0.1,s[121,26]=-0.2,s[121,27]=-0.8,s[121,28]=-0.7,s[121,29]=-0.1,s[121,30]=-0.5 s[122,1]=-0.6,s[122,2]=0.0,s[122,3]=-0.4,s[122,4]=-0.3,s[122,5]=-0.6,s[122,6]=-0.9,s[122,7]=0.6,s[122,8]=0.7,s[122,9]=-1.0,s[122,10]=0.5,s[122,11]=0.1,s[122,12]=0.8,s[122,13]=0.2,s[122,14]=-0.7,s[122,15]=0.3,s[122,16]=0.0,s[122,17]=0.7,s[122,18]=-0.1,s[122,19]=0.2,s[122,20]=-0.1,s[122,21]=-0.2,s[122,22]=-1.0,s[122,23]=-0.4,s[122,24]=-0.4,s[122,25]=-0.6,s[122,26]=-1.1,s[122,27]=1.2,s[122,28]=-0.2,s[122,29]=0.4,s[122,30]=-1.0 s[123,1]=-0.6,s[123,2]=0.0,s[123,3]=0.3,s[123,4]=0.5,s[123,5]=-0.9,s[123,6]=0.7,s[123,7]=0.2,s[123,8]=-0.1,s[123,9]=0.7,s[123,10]=-0.5,s[123,11]=1.1,s[123,12]=-0.1,s[123,13]=-0.1,s[123,14]=-0.1,s[123,15]=0.8,s[123,16]=-0.3,s[123,17]=-0.3,s[123,18]=-0.7,s[123,19]=0.9,s[123,20]=0.3,s[123,21]=-0.5,s[123,22]=0.1,s[123,23]=0.8,s[123,24]=0.2,s[123,25]=0.4,s[123,26]=0.3,s[123,27]=-0.9,s[123,28]=0.5,s[123,29]=-1.1,s[123,30]=-0.1 s[124,1]=0.2,s[124,2]=0.5,s[124,3]=0.2,s[124,4]=-0.6,s[124,5]=0.9,s[124,6]=-0.7,s[124,7]=0.3,s[124,8]=0.0,s[124,9]=1.2,s[124,10]=-1.2,s[124,11]=0.8,s[124,12]=-0.1,s[124,13]=0.1,s[124,14]=0.8,s[124,15]=-0.1,s[124,16]=-0.7,s[124,17]=0.8,s[124,18]=-0.5,s[124,19]=-1.1,s[124,20]=-0.4,s[124,21]=-0.2,s[124,22]=-0.5,s[124,23]=1.0,s[124,24]=-0.1,s[124,25]=-0.5,s[124,26]=-0.5,s[124,27]=0.3,s[124,28]=0.4,s[124,29]=0.1,s[124,30]=-0.4 s[125,1]=-0.6,s[125,2]=0.5,s[125,3]=0.1,s[125,4]=0.6,s[125,5]=0.8,s[125,6]=0.1,s[125,7]=0.8,s[125,8]=-0.4,s[125,9]=-0.9,s[125,10]=0.7,s[125,11]=0.1,s[125,12]=-0.8,s[125,13]=0.0,s[125,14]=0.3,s[125,15]=-0.1,s[125,16]=-0.7,s[125,17]=0.3,s[125,18]=1.1,s[125,19]=-0.2,s[125,20]=0.1,s[125,21]=-0.1,s[125,22]=0.5,s[125,23]=0.5,s[125,24]=0.4,s[125,25]=-0.3,s[125,26]=-0.8,s[125,27]=0.7,s[125,28]=1.1,s[125,29]=-0.3,s[125,30]=0.3 s[126,1]=-0.1,s[126,2]=0.5,s[126,3]=-0.5,s[126,4]=-1.2,s[126,5]=0.9,s[126,6]=0.5,s[126,7]=0.4,s[126,8]=-1.1,s[126,9]=0.7,s[126,10]=0.1,s[126,11]=-0.2,s[126,12]=0.5,s[126,13]=1.0,s[126,14]=-0.8,s[126,15]=0.0,s[126,16]=-0.9,s[126,17]=-0.2,s[126,18]=-0.5,s[126,19]=-0.3,s[126,20]=-0.2,s[126,21]=-0.1,s[126,22]=-0.5,s[126,23]=-0.4,s[126,24]=1.1,s[126,25]=-0.2,s[126,26]=-0.5,s[126,27]=1.2,s[126,28]=0.5,s[126,29]=-0.2,s[126,30]=-0.1 s[127,1]=1.2,s[127,2]=-1.2,s[127,3]=0.3,s[127,4]=-0.4,s[127,5]=0.0,s[127,6]=1.1,s[127,7]=0.2,s[127,8]=1.1,s[127,9]=0.8,s[127,10]=0.8,s[127,11]=-0.4,s[127,12]=-1.0,s[127,13]=1.0,s[127,14]=0.9,s[127,15]=-0.1,s[127,16]=0.0,s[127,17]=1.1,s[127,18]=0.4,s[127,19]=0.4,s[127,20]=0.8,s[127,21]=-0.5,s[127,22]=-0.4,s[127,23]=0.4,s[127,24]=-0.4,s[127,25]=1.0,s[127,26]=-1.0,s[127,27]=0.2,s[127,28]=-0.1,s[127,29]=-1.2,s[127,30]=0.0 s[128,1]=0.7,s[128,2]=-0.4,s[128,3]=-0.6,s[128,4]=-1.1,s[128,5]=-1.0,s[128,6]=-0.8,s[128,7]=0.0,s[128,8]=-1.2,s[128,9]=0.2,s[128,10]=-0.2,s[128,11]=-0.3,s[128,12]=-0.6,s[128,13]=0.8,s[128,14]=-0.6,s[128,15]=0.8,s[128,16]=0.8,s[128,17]=1.2,s[128,18]=-0.9,s[128,19]=-0.4,s[128,20]=0.4,s[128,21]=-0.4,s[128,22]=0.6,s[128,23]=0.3,s[128,24]=1.0,s[128,25]=-0.9,s[128,26]=-0.8,s[128,27]=0.5,s[128,28]=-0.8,s[128,29]=0.3,s[128,30]=-0.9 s[129,1]=0.2,s[129,2]=-0.1,s[129,3]=0.7,s[129,4]=-1.1,s[129,5]=0.8,s[129,6]=-0.5,s[129,7]=-1.1,s[129,8]=-0.8,s[129,9]=-0.5,s[129,10]=1.0,s[129,11]=-0.1,s[129,12]=-1.0,s[129,13]=0.9,s[129,14]=1.1,s[129,15]=0.4,s[129,16]=-1.1,s[129,17]=-0.6,s[129,18]=-0.7,s[129,19]=0.0,s[129,20]=0.5,s[129,21]=0.7,s[129,22]=-0.2,s[129,23]=-0.3,s[129,24]=0.8,s[129,25]=-0.3,s[129,26]=-0.6,s[129,27]=-0.1,s[129,28]=0.4,s[129,29]=-0.2,s[129,30]=0.2 s[130,1]=-1.1,s[130,2]=1.2,s[130,3]=1.1,s[130,4]=0.5,s[130,5]=0.5,s[130,6]=0.1,s[130,7]=0.4,s[130,8]=0.6,s[130,9]=0.1,s[130,10]=0.3,s[130,11]=0.7,s[130,12]=-0.6,s[130,13]=0.3,s[130,14]=0.5,s[130,15]=-0.4,s[130,16]=-0.8,s[130,17]=0.5,s[130,18]=0.8,s[130,19]=-1.1,s[130,20]=-0.3,s[130,21]=-0.5,s[130,22]=0.4,s[130,23]=0.4,s[130,24]=-1.1,s[130,25]=-0.6,s[130,26]=0.8,s[130,27]=-1.0,s[130,28]=0.2,s[130,29]=-0.5,s[130,30]=0.2 s[131,1]=-0.3,s[131,2]=-0.4,s[131,3]=-0.8,s[131,4]=0.9,s[131,5]=-0.2,s[131,6]=-0.1,s[131,7]=0.4,s[131,8]=-0.5,s[131,9]=1.2,s[131,10]=0.8,s[131,11]=-0.6,s[131,12]=0.6,s[131,13]=0.5,s[131,14]=0.3,s[131,15]=-0.3,s[131,16]=-0.4,s[131,17]=0.3,s[131,18]=-0.3,s[131,19]=1.0,s[131,20]=0.2,s[131,21]=0.2,s[131,22]=-0.6,s[131,23]=-1.0,s[131,24]=1.1,s[131,25]=-0.8,s[131,26]=-0.1,s[131,27]=-0.2,s[131,28]=0.2,s[131,29]=0.4,s[131,30]=0.2 s[132,1]=-1.0,s[132,2]=-0.4,s[132,3]=0.5,s[132,4]=-0.1,s[132,5]=0.3,s[132,6]=0.5,s[132,7]=0.3,s[132,8]=1.1,s[132,9]=-0.7,s[132,10]=0.5,s[132,11]=0.2,s[132,12]=0.0,s[132,13]=0.7,s[132,14]=0.0,s[132,15]=1.1,s[132,16]=-0.5,s[132,17]=0.1,s[132,18]=0.4,s[132,19]=-1.1,s[132,20]=0.7,s[132,21]=0.7,s[132,22]=0.3,s[132,23]=0.3,s[132,24]=-1.2,s[132,25]=0.6,s[132,26]=-0.7,s[132,27]=0.3,s[132,28]=0.8,s[132,29]=0.0,s[132,30]=-0.3 s[133,1]=0.3,s[133,2]=-0.3,s[133,3]=0.4,s[133,4]=0.6,s[133,5]=-0.7,s[133,6]=-1.0,s[133,7]=-0.6,s[133,8]=-1.0,s[133,9]=0.9,s[133,10]=-0.2,s[133,11]=-0.3,s[133,12]=0.1,s[133,13]=-0.1,s[133,14]=-0.8,s[133,15]=0.1,s[133,16]=0.9,s[133,17]=1.1,s[133,18]=0.7,s[133,19]=-0.5,s[133,20]=-0.3,s[133,21]=0.1,s[133,22]=-0.9,s[133,23]=0.9,s[133,24]=0.1,s[133,25]=0.7,s[133,26]=0.9,s[133,27]=0.4,s[133,28]=-1.2,s[133,29]=-0.6,s[133,30]=0.2 s[134,1]=-0.2,s[134,2]=-0.6,s[134,3]=0.0,s[134,4]=1.0,s[134,5]=-0.6,s[134,6]=-0.2,s[134,7]=-1.1,s[134,8]=0.5,s[134,9]=0.8,s[134,10]=-0.9,s[134,11]=-0.1,s[134,12]=0.5,s[134,13]=0.9,s[134,14]=1.0,s[134,15]=0.2,s[134,16]=0.7,s[134,17]=-0.2,s[134,18]=0.0,s[134,19]=1.2,s[134,20]=-0.6,s[134,21]=1.1,s[134,22]=0.8,s[134,23]=-0.1,s[134,24]=0.5,s[134,25]=0.8,s[134,26]=0.4,s[134,27]=1.1,s[134,28]=-0.1,s[134,29]=-0.4,s[134,30]=0.0 s[135,1]=0.1,s[135,2]=0.7,s[135,3]=1.1,s[135,4]=0.0,s[135,5]=0.5,s[135,6]=0.3,s[135,7]=0.0,s[135,8]=-1.2,s[135,9]=0.4,s[135,10]=-0.1,s[135,11]=0.3,s[135,12]=-1.2,s[135,13]=0.9,s[135,14]=-0.7,s[135,15]=1.2,s[135,16]=-0.4,s[135,17]=0.2,s[135,18]=0.8,s[135,19]=-0.5,s[135,20]=-0.1,s[135,21]=0.1,s[135,22]=-1.2,s[135,23]=0.1,s[135,24]=-0.9,s[135,25]=0.4,s[135,26]=-0.3,s[135,27]=0.9,s[135,28]=-1.0,s[135,29]=0.4,s[135,30]=0.0 s[136,1]=-0.2,s[136,2]=0.0,s[136,3]=1.2,s[136,4]=-0.1,s[136,5]=0.5,s[136,6]=0.9,s[136,7]=0.9,s[136,8]=-0.9,s[136,9]=1.0,s[136,10]=-1.2,s[136,11]=0.0,s[136,12]=-0.9,s[136,13]=-0.1,s[136,14]=-0.2,s[136,15]=0.0,s[136,16]=0.7,s[136,17]=0.7,s[136,18]=0.9,s[136,19]=-1.1,s[136,20]=0.2,s[136,21]=0.4,s[136,22]=-1.2,s[136,23]=-0.4,s[136,24]=-0.9,s[136,25]=0.8,s[136,26]=0.4,s[136,27]=-1.1,s[136,28]=-0.9,s[136,29]=-0.3,s[136,30]=-1.2 s[137,1]=0.3,s[137,2]=1.1,s[137,3]=-0.9,s[137,4]=-0.8,s[137,5]=1.0,s[137,6]=0.5,s[137,7]=-0.2,s[137,8]=-0.5,s[137,9]=1.1,s[137,10]=-1.2,s[137,11]=1.1,s[137,12]=-0.2,s[137,13]=1.0,s[137,14]=-0.3,s[137,15]=-0.7,s[137,16]=-0.5,s[137,17]=0.2,s[137,18]=0.0,s[137,19]=-0.4,s[137,20]=0.9,s[137,21]=1.0,s[137,22]=-0.4,s[137,23]=0.0,s[137,24]=1.0,s[137,25]=0.4,s[137,26]=1.2,s[137,27]=-0.7,s[137,28]=-0.8,s[137,29]=0.6,s[137,30]=-0.5 s[138,1]=0.8,s[138,2]=-0.2,s[138,3]=-1.0,s[138,4]=0.4,s[138,5]=1.2,s[138,6]=0.0,s[138,7]=0.2,s[138,8]=-0.1,s[138,9]=0.7,s[138,10]=-1.0,s[138,11]=-1.2,s[138,12]=-0.7,s[138,13]=1.1,s[138,14]=0.3,s[138,15]=-0.5,s[138,16]=-0.7,s[138,17]=-0.1,s[138,18]=0.5,s[138,19]=-1.0,s[138,20]=-1.2,s[138,21]=0.4,s[138,22]=-0.6,s[138,23]=-0.1,s[138,24]=0.2,s[138,25]=0.5,s[138,26]=0.4,s[138,27]=0.2,s[138,28]=-1.2,s[138,29]=-0.2,s[138,30]=0.7 s[139,1]=-0.1,s[139,2]=0.7,s[139,3]=-1.0,s[139,4]=-0.2,s[139,5]=0.7,s[139,6]=0.9,s[139,7]=1.2,s[139,8]=0.2,s[139,9]=0.2,s[139,10]=-0.4,s[139,11]=-1.2,s[139,12]=0.3,s[139,13]=0.9,s[139,14]=0.8,s[139,15]=0.6,s[139,16]=-0.1,s[139,17]=0.4,s[139,18]=0.7,s[139,19]=-1.0,s[139,20]=1.0,s[139,21]=0.0,s[139,22]=1.2,s[139,23]=-0.2,s[139,24]=-0.2,s[139,25]=-1.1,s[139,26]=-0.8,s[139,27]=-0.5,s[139,28]=-0.1,s[139,29]=1.1,s[139,30]=-0.9 s[140,1]=0.7,s[140,2]=-0.1,s[140,3]=0.0,s[140,4]=0.8,s[140,5]=-0.5,s[140,6]=-0.2,s[140,7]=-0.4,s[140,8]=-0.6,s[140,9]=0.6,s[140,10]=-1.1,s[140,11]=-0.9,s[140,12]=0.0,s[140,13]=-0.6,s[140,14]=1.2,s[140,15]=-0.5,s[140,16]=-0.5,s[140,17]=0.1,s[140,18]=0.7,s[140,19]=0.1,s[140,20]=0.8,s[140,21]=0.6,s[140,22]=-1.0,s[140,23]=0.8,s[140,24]=-0.8,s[140,25]=0.1,s[140,26]=-0.3,s[140,27]=-0.2,s[140,28]=1.1,s[140,29]=0.9,s[140,30]=-0.8 s[141,1]=0.4,s[141,2]=-0.1,s[141,3]=-0.6,s[141,4]=0.9,s[141,5]=-1.0,s[141,6]=0.7,s[141,7]=1.0,s[141,8]=-0.7,s[141,9]=-0.3,s[141,10]=0.2,s[141,11]=-0.5,s[141,12]=-1.2,s[141,13]=-0.5,s[141,14]=0.3,s[141,15]=0.0,s[141,16]=0.1,s[141,17]=0.6,s[141,18]=-1.0,s[141,19]=-0.5,s[141,20]=0.6,s[141,21]=-0.8,s[141,22]=-0.4,s[141,23]=0.8,s[141,24]=-0.6,s[141,25]=-0.5,s[141,26]=-0.6,s[141,27]=0.6,s[141,28]=-0.5,s[141,29]=1.0,s[141,30]=0.3 s[142,1]=0.9,s[142,2]=-1.1,s[142,3]=-0.5,s[142,4]=-0.3,s[142,5]=-0.8,s[142,6]=-0.1,s[142,7]=-1.1,s[142,8]=-0.2,s[142,9]=0.4,s[142,10]=0.0,s[142,11]=0.1,s[142,12]=-0.2,s[142,13]=0.3,s[142,14]=-1.2,s[142,15]=0.2,s[142,16]=-0.5,s[142,17]=-0.7,s[142,18]=-0.4,s[142,19]=-1.1,s[142,20]=-1.1,s[142,21]=-0.5,s[142,22]=-0.9,s[142,23]=-0.8,s[142,24]=0.4,s[142,25]=-1.1,s[142,26]=-0.7,s[142,27]=-0.2,s[142,28]=-0.9,s[142,29]=-0.7,s[142,30]=-0.1 s[143,1]=-0.2,s[143,2]=0.9,s[143,3]=0.2,s[143,4]=0.9,s[143,5]=-0.7,s[143,6]=-0.1,s[143,7]=0.2,s[143,8]=-0.7,s[143,9]=0.0,s[143,10]=0.5,s[143,11]=-0.5,s[143,12]=-0.5,s[143,13]=-0.1,s[143,14]=0.7,s[143,15]=-0.2,s[143,16]=-0.5,s[143,17]=1.0,s[143,18]=0.6,s[143,19]=0.0,s[143,20]=-1.1,s[143,21]=-0.3,s[143,22]=0.2,s[143,23]=1.0,s[143,24]=-0.7,s[143,25]=0.1,s[143,26]=-0.5,s[143,27]=-0.8,s[143,28]=-1.2,s[143,29]=-0.6,s[143,30]=0.7 s[144,1]=0.5,s[144,2]=-0.5,s[144,3]=-0.2,s[144,4]=0.7,s[144,5]=1.1,s[144,6]=-0.1,s[144,7]=-0.6,s[144,8]=0.0,s[144,9]=-1.0,s[144,10]=0.3,s[144,11]=0.7,s[144,12]=0.0,s[144,13]=-0.8,s[144,14]=0.1,s[144,15]=-0.1,s[144,16]=-1.1,s[144,17]=1.2,s[144,18]=0.0,s[144,19]=0.0,s[144,20]=0.1,s[144,21]=0.6,s[144,22]=1.0,s[144,23]=-1.2,s[144,24]=0.7,s[144,25]=0.3,s[144,26]=0.4,s[144,27]=0.1,s[144,28]=0.0,s[144,29]=0.1,s[144,30]=-0.5 s[145,1]=-0.4,s[145,2]=1.0,s[145,3]=1.1,s[145,4]=0.1,s[145,5]=-0.1,s[145,6]=-1.1,s[145,7]=0.0,s[145,8]=0.3,s[145,9]=0.8,s[145,10]=0.8,s[145,11]=1.1,s[145,12]=-1.0,s[145,13]=-0.7,s[145,14]=0.6,s[145,15]=0.5,s[145,16]=-0.2,s[145,17]=-0.3,s[145,18]=1.2,s[145,19]=0.2,s[145,20]=-0.9,s[145,21]=1.0,s[145,22]=-0.8,s[145,23]=-1.1,s[145,24]=-0.5,s[145,25]=0.9,s[145,26]=-1.1,s[145,27]=0.4,s[145,28]=-0.1,s[145,29]=0.1,s[145,30]=0.5 s[146,1]=0.3,s[146,2]=0.6,s[146,3]=-1.2,s[146,4]=-0.8,s[146,5]=1.1,s[146,6]=-0.2,s[146,7]=-1.1,s[146,8]=-0.1,s[146,9]=-0.3,s[146,10]=-1.2,s[146,11]=0.1,s[146,12]=-0.8,s[146,13]=-1.0,s[146,14]=-0.5,s[146,15]=-0.2,s[146,16]=-0.2,s[146,17]=0.6,s[146,18]=0.8,s[146,19]=-0.9,s[146,20]=0.9,s[146,21]=0.2,s[146,22]=-0.4,s[146,23]=-0.1,s[146,24]=1.2,s[146,25]=-0.1,s[146,26]=1.0,s[146,27]=0.8,s[146,28]=-0.4,s[146,29]=-0.3,s[146,30]=0.9 s[147,1]=0.0,s[147,2]=1.2,s[147,3]=-0.8,s[147,4]=-0.9,s[147,5]=0.6,s[147,6]=0.8,s[147,7]=0.7,s[147,8]=0.2,s[147,9]=-0.8,s[147,10]=-1.1,s[147,11]=0.1,s[147,12]=0.4,s[147,13]=-0.1,s[147,14]=-1.0,s[147,15]=1.0,s[147,16]=-0.6,s[147,17]=0.4,s[147,18]=-1.0,s[147,19]=0.2,s[147,20]=0.3,s[147,21]=-0.7,s[147,22]=-0.9,s[147,23]=-0.2,s[147,24]=0.0,s[147,25]=1.0,s[147,26]=-0.5,s[147,27]=0.9,s[147,28]=1.2,s[147,29]=0.7,s[147,30]=1.1 s[148,1]=-1.1,s[148,2]=0.9,s[148,3]=0.4,s[148,4]=0.9,s[148,5]=1.2,s[148,6]=0.1,s[148,7]=0.8,s[148,8]=1.0,s[148,9]=0.1,s[148,10]=0.9,s[148,11]=-0.2,s[148,12]=0.1,s[148,13]=0.3,s[148,14]=-0.3,s[148,15]=-1.2,s[148,16]=-0.2,s[148,17]=-0.2,s[148,18]=-0.3,s[148,19]=-1.0,s[148,20]=1.2,s[148,21]=0.8,s[148,22]=1.0,s[148,23]=0.0,s[148,24]=-0.9,s[148,25]=0.1,s[148,26]=0.2,s[148,27]=-0.1,s[148,28]=0.3,s[148,29]=0.5,s[148,30]=-0.8 s[149,1]=-0.4,s[149,2]=-1.0,s[149,3]=0.1,s[149,4]=0.8,s[149,5]=-0.9,s[149,6]=-0.5,s[149,7]=-0.5,s[149,8]=-0.7,s[149,9]=-0.8,s[149,10]=-0.4,s[149,11]=-0.4,s[149,12]=0.2,s[149,13]=0.5,s[149,14]=-0.5,s[149,15]=0.7,s[149,16]=0.8,s[149,17]=-0.3,s[149,18]=0.2,s[149,19]=0.0,s[149,20]=0.4,s[149,21]=-0.2,s[149,22]=-0.4,s[149,23]=0.0,s[149,24]=0.6,s[149,25]=-1.0,s[149,26]=1.1,s[149,27]=-0.5,s[149,28]=0.7,s[149,29]=0.0,s[149,30]=0.7 s[150,1]=0.2,s[150,2]=-0.5,s[150,3]=0.7,s[150,4]=-0.2,s[150,5]=-0.8,s[150,6]=-1.1,s[150,7]=1.1,s[150,8]=-0.1,s[150,9]=0.6,s[150,10]=-0.5,s[150,11]=0.5,s[150,12]=0.9,s[150,13]=-1.2,s[150,14]=0.9,s[150,15]=-1.1,s[150,16]=-1.1,s[150,17]=0.3,s[150,18]=-0.9,s[150,19]=0.8,s[150,20]=-0.6,s[150,21]=-0.2,s[150,22]=0.2,s[150,23]=0.6,s[150,24]=0.2,s[150,25]=0.2,s[150,26]=1.0,s[150,27]=-0.6,s[150,28]=0.3,s[150,29]=-1.0,s[150,30]=0.3 s[151,1]=0.3,s[151,2]=0.2,s[151,3]=0.4,s[151,4]=0.2,s[151,5]=0.2,s[151,6]=0.7,s[151,7]=-0.2,s[151,8]=0.9,s[151,9]=-1.1,s[151,10]=-1.1,s[151,11]=-0.2,s[151,12]=0.2,s[151,13]=0.7,s[151,14]=0.9,s[151,15]=0.8,s[151,16]=0.1,s[151,17]=-0.8,s[151,18]=-0.1,s[151,19]=1.0,s[151,20]=0.0,s[151,21]=-0.3,s[151,22]=-0.2,s[151,23]=0.3,s[151,24]=-0.6,s[151,25]=0.1,s[151,26]=0.6,s[151,27]=0.5,s[151,28]=1.0,s[151,29]=-0.3,s[151,30]=-0.8 s[152,1]=0.3,s[152,2]=-1.1,s[152,3]=0.8,s[152,4]=0.6,s[152,5]=0.5,s[152,6]=0.0,s[152,7]=0.0,s[152,8]=1.0,s[152,9]=0.0,s[152,10]=0.0,s[152,11]=-0.8,s[152,12]=0.8,s[152,13]=0.4,s[152,14]=-0.3,s[152,15]=-0.3,s[152,16]=0.7,s[152,17]=0.8,s[152,18]=0.9,s[152,19]=0.2,s[152,20]=-0.3,s[152,21]=-0.6,s[152,22]=0.6,s[152,23]=0.4,s[152,24]=0.1,s[152,25]=-0.4,s[152,26]=-0.9,s[152,27]=-0.4,s[152,28]=0.1,s[152,29]=0.1,s[152,30]=0.2 s[153,1]=0.4,s[153,2]=-0.8,s[153,3]=0.7,s[153,4]=-0.3,s[153,5]=0.7,s[153,6]=0.8,s[153,7]=0.7,s[153,8]=0.4,s[153,9]=0.7,s[153,10]=-0.3,s[153,11]=-1.0,s[153,12]=-0.2,s[153,13]=0.5,s[153,14]=0.0,s[153,15]=-0.7,s[153,16]=-0.7,s[153,17]=-0.5,s[153,18]=0.7,s[153,19]=1.2,s[153,20]=0.3,s[153,21]=0.3,s[153,22]=-1.1,s[153,23]=-0.2,s[153,24]=0.6,s[153,25]=-0.8,s[153,26]=-0.4,s[153,27]=-0.1,s[153,28]=-0.3,s[153,29]=1.0,s[153,30]=0.0 s[154,1]=-0.4,s[154,2]=0.7,s[154,3]=0.4,s[154,4]=0.9,s[154,5]=-0.1,s[154,6]=0.7,s[154,7]=0.4,s[154,8]=0.8,s[154,9]=-0.9,s[154,10]=0.9,s[154,11]=0.0,s[154,12]=-0.5,s[154,13]=-0.2,s[154,14]=-0.6,s[154,15]=0.1,s[154,16]=0.5,s[154,17]=0.1,s[154,18]=-0.7,s[154,19]=-0.8,s[154,20]=0.6,s[154,21]=0.6,s[154,22]=0.0,s[154,23]=-0.5,s[154,24]=-0.5,s[154,25]=-1.1,s[154,26]=0.3,s[154,27]=-1.1,s[154,28]=-0.8,s[154,29]=0.4,s[154,30]=-0.2 s[155,1]=0.2,s[155,2]=-0.4,s[155,3]=-0.3,s[155,4]=-1.0,s[155,5]=0.3,s[155,6]=0.8,s[155,7]=0.0,s[155,8]=1.0,s[155,9]=-0.1,s[155,10]=0.5,s[155,11]=-0.3,s[155,12]=-0.6,s[155,13]=-0.2,s[155,14]=-0.5,s[155,15]=0.5,s[155,16]=-0.8,s[155,17]=0.6,s[155,18]=-0.2,s[155,19]=-0.5,s[155,20]=0.2,s[155,21]=0.3,s[155,22]=-0.3,s[155,23]=-0.5,s[155,24]=0.7,s[155,25]=-0.6,s[155,26]=-0.6,s[155,27]=-1.0,s[155,28]=-0.3,s[155,29]=-0.9,s[155,30]=0.8 s[156,1]=0.8,s[156,2]=0.7,s[156,3]=-1.0,s[156,4]=-0.9,s[156,5]=-0.7,s[156,6]=-0.1,s[156,7]=0.5,s[156,8]=-0.5,s[156,9]=-0.2,s[156,10]=-0.3,s[156,11]=0.1,s[156,12]=0.9,s[156,13]=-0.9,s[156,14]=0.3,s[156,15]=0.8,s[156,16]=-0.8,s[156,17]=-0.7,s[156,18]=-0.3,s[156,19]=-0.8,s[156,20]=0.3,s[156,21]=0.3,s[156,22]=0.0,s[156,23]=-0.7,s[156,24]=-0.1,s[156,25]=-0.1,s[156,26]=0.8,s[156,27]=-0.7,s[156,28]=1.2,s[156,29]=-0.8,s[156,30]=0.2 s[157,1]=-0.4,s[157,2]=-0.7,s[157,3]=-0.8,s[157,4]=-0.5,s[157,5]=-0.4,s[157,6]=-0.4,s[157,7]=0.0,s[157,8]=0.6,s[157,9]=0.6,s[157,10]=0.3,s[157,11]=0.7,s[157,12]=0.5,s[157,13]=0.2,s[157,14]=-0.7,s[157,15]=0.3,s[157,16]=0.2,s[157,17]=-0.2,s[157,18]=-0.4,s[157,19]=-0.6,s[157,20]=0.7,s[157,21]=0.5,s[157,22]=1.0,s[157,23]=0.0,s[157,24]=-1.0,s[157,25]=0.1,s[157,26]=0.0,s[157,27]=-0.1,s[157,28]=1.2,s[157,29]=-0.7,s[157,30]=-0.9 s[158,1]=0.0,s[158,2]=0.0,s[158,3]=0.7,s[158,4]=-0.6,s[158,5]=-0.7,s[158,6]=-0.6,s[158,7]=0.1,s[158,8]=0.6,s[158,9]=0.8,s[158,10]=0.7,s[158,11]=-1.1,s[158,12]=-0.2,s[158,13]=0.6,s[158,14]=-0.9,s[158,15]=0.3,s[158,16]=-0.3,s[158,17]=1.1,s[158,18]=-0.2,s[158,19]=0.3,s[158,20]=0.8,s[158,21]=0.4,s[158,22]=-1.1,s[158,23]=0.7,s[158,24]=1.0,s[158,25]=0.9,s[158,26]=-1.1,s[158,27]=-0.4,s[158,28]=0.5,s[158,29]=-0.7,s[158,30]=-0.2 s[159,1]=-0.1,s[159,2]=0.2,s[159,3]=-1.1,s[159,4]=-1.0,s[159,5]=0.7,s[159,6]=-0.6,s[159,7]=0.0,s[159,8]=-1.0,s[159,9]=1.1,s[159,10]=-0.1,s[159,11]=-0.5,s[159,12]=-0.3,s[159,13]=1.1,s[159,14]=0.2,s[159,15]=-1.2,s[159,16]=0.7,s[159,17]=1.0,s[159,18]=-0.6,s[159,19]=0.5,s[159,20]=0.2,s[159,21]=0.7,s[159,22]=0.0,s[159,23]=0.0,s[159,24]=-0.2,s[159,25]=-0.2,s[159,26]=-1.1,s[159,27]=-0.3,s[159,28]=1.2,s[159,29]=-0.5,s[159,30]=0.5 s[160,1]=0.3,s[160,2]=-0.4,s[160,3]=0.7,s[160,4]=-0.3,s[160,5]=-0.4,s[160,6]=-0.4,s[160,7]=-0.5,s[160,8]=-0.1,s[160,9]=-0.2,s[160,10]=-1.0,s[160,11]=0.7,s[160,12]=0.1,s[160,13]=1.0,s[160,14]=0.7,s[160,15]=-1.1,s[160,16]=-0.5,s[160,17]=-0.7,s[160,18]=0.9,s[160,19]=-0.4,s[160,20]=0.7,s[160,21]=-0.2,s[160,22]=0.1,s[160,23]=1.0,s[160,24]=-1.0,s[160,25]=0.3,s[160,26]=0.5,s[160,27]=-1.2,s[160,28]=-0.8,s[160,29]=-0.3,s[160,30]=1.2 s[161,1]=0.9,s[161,2]=0.1,s[161,3]=-0.4,s[161,4]=1.2,s[161,5]=-0.6,s[161,6]=0.1,s[161,7]=-1.2,s[161,8]=1.0,s[161,9]=-0.6,s[161,10]=0.5,s[161,11]=0.3,s[161,12]=-0.3,s[161,13]=-1.0,s[161,14]=0.9,s[161,15]=0.8,s[161,16]=-1.0,s[161,17]=-0.4,s[161,18]=0.2,s[161,19]=-0.7,s[161,20]=0.2,s[161,21]=0.8,s[161,22]=0.3,s[161,23]=-0.1,s[161,24]=0.1,s[161,25]=-0.3,s[161,26]=0.7,s[161,27]=1.0,s[161,28]=0.3,s[161,29]=-0.3,s[161,30]=0.1 s[162,1]=-0.5,s[162,2]=0.0,s[162,3]=-0.1,s[162,4]=0.8,s[162,5]=-0.8,s[162,6]=-1.2,s[162,7]=-0.2,s[162,8]=-0.3,s[162,9]=0.1,s[162,10]=0.7,s[162,11]=-0.1,s[162,12]=-0.4,s[162,13]=-1.2,s[162,14]=-1.0,s[162,15]=0.5,s[162,16]=0.4,s[162,17]=0.2,s[162,18]=-0.6,s[162,19]=0.8,s[162,20]=0.2,s[162,21]=0.1,s[162,22]=0.3,s[162,23]=1.1,s[162,24]=1.2,s[162,25]=0.0,s[162,26]=-0.9,s[162,27]=0.4,s[162,28]=0.2,s[162,29]=-1.1,s[162,30]=-0.2 s[163,1]=-0.8,s[163,2]=-1.1,s[163,3]=-0.1,s[163,4]=1.0,s[163,5]=0.4,s[163,6]=0.9,s[163,7]=-0.1,s[163,8]=-1.0,s[163,9]=-0.2,s[163,10]=-0.3,s[163,11]=-0.1,s[163,12]=0.0,s[163,13]=1.1,s[163,14]=-0.8,s[163,15]=1.0,s[163,16]=1.1,s[163,17]=-0.1,s[163,18]=-1.2,s[163,19]=1.0,s[163,20]=-0.6,s[163,21]=0.8,s[163,22]=1.1,s[163,23]=0.3,s[163,24]=-0.4,s[163,25]=-0.7,s[163,26]=-1.1,s[163,27]=-0.1,s[163,28]=0.1,s[163,29]=0.2,s[163,30]=-0.8 s[164,1]=-0.3,s[164,2]=-1.2,s[164,3]=-0.3,s[164,4]=-0.1,s[164,5]=-0.7,s[164,6]=0.0,s[164,7]=-0.4,s[164,8]=0.1,s[164,9]=-0.4,s[164,10]=-0.3,s[164,11]=0.7,s[164,12]=0.0,s[164,13]=-1.1,s[164,14]=0.1,s[164,15]=-0.9,s[164,16]=-0.4,s[164,17]=-1.1,s[164,18]=0.7,s[164,19]=-0.8,s[164,20]=-0.8,s[164,21]=-0.1,s[164,22]=-0.1,s[164,23]=0.5,s[164,24]=-0.4,s[164,25]=-1.2,s[164,26]=-0.5,s[164,27]=-0.4,s[164,28]=-0.3,s[164,29]=-0.5,s[164,30]=-0.8 s[165,1]=0.0,s[165,2]=-0.9,s[165,3]=-1.0,s[165,4]=1.1,s[165,5]=-0.5,s[165,6]=0.0,s[165,7]=1.1,s[165,8]=-0.1,s[165,9]=0.5,s[165,10]=-0.1,s[165,11]=0.7,s[165,12]=-0.1,s[165,13]=-1.1,s[165,14]=0.7,s[165,15]=0.3,s[165,16]=-0.2,s[165,17]=-0.1,s[165,18]=-1.1,s[165,19]=-0.1,s[165,20]=-0.3,s[165,21]=-0.6,s[165,22]=-0.6,s[165,23]=0.0,s[165,24]=-0.2,s[165,25]=-1.1,s[165,26]=-0.5,s[165,27]=0.2,s[165,28]=1.2,s[165,29]=-1.2,s[165,30]=0.0 s[166,1]=0.2,s[166,2]=-0.3,s[166,3]=1.2,s[166,4]=0.8,s[166,5]=-1.1,s[166,6]=-1.0,s[166,7]=1.2,s[166,8]=0.9,s[166,9]=-0.3,s[166,10]=0.0,s[166,11]=0.0,s[166,12]=-0.4,s[166,13]=0.2,s[166,14]=0.1,s[166,15]=0.1,s[166,16]=-0.9,s[166,17]=1.0,s[166,18]=-0.9,s[166,19]=0.2,s[166,20]=0.6,s[166,21]=0.9,s[166,22]=-0.4,s[166,23]=-1.2,s[166,24]=1.1,s[166,25]=-0.3,s[166,26]=-0.5,s[166,27]=-0.6,s[166,28]=0.2,s[166,29]=-0.4,s[166,30]=-0.5 s[167,1]=-0.1,s[167,2]=-0.4,s[167,3]=1.2,s[167,4]=0.1,s[167,5]=-0.3,s[167,6]=0.5,s[167,7]=0.9,s[167,8]=1.2,s[167,9]=-0.2,s[167,10]=0.9,s[167,11]=-0.2,s[167,12]=-1.2,s[167,13]=1.1,s[167,14]=0.4,s[167,15]=-0.7,s[167,16]=-0.2,s[167,17]=0.9,s[167,18]=0.3,s[167,19]=0.0,s[167,20]=0.2,s[167,21]=0.1,s[167,22]=-1.1,s[167,23]=0.7,s[167,24]=-0.1,s[167,25]=-0.2,s[167,26]=-0.7,s[167,27]=0.0,s[167,28]=-0.4,s[167,29]=0.1,s[167,30]=0.1 s[168,1]=-0.1,s[168,2]=0.4,s[168,3]=0.2,s[168,4]=-0.9,s[168,5]=0.5,s[168,6]=-0.6,s[168,7]=0.5,s[168,8]=-0.6,s[168,9]=1.0,s[168,10]=0.9,s[168,11]=0.7,s[168,12]=-1.0,s[168,13]=0.3,s[168,14]=-1.2,s[168,15]=0.0,s[168,16]=0.4,s[168,17]=-1.1,s[168,18]=0.1,s[168,19]=-0.1,s[168,20]=-0.3,s[168,21]=-0.4,s[168,22]=0.5,s[168,23]=-0.7,s[168,24]=0.0,s[168,25]=0.1,s[168,26]=-1.1,s[168,27]=0.3,s[168,28]=-0.5,s[168,29]=0.0,s[168,30]=-0.3 s[169,1]=0.3,s[169,2]=-0.8,s[169,3]=-0.1,s[169,4]=-0.4,s[169,5]=-1.1,s[169,6]=-0.5,s[169,7]=-1.2,s[169,8]=0.8,s[169,9]=0.0,s[169,10]=0.2,s[169,11]=-0.3,s[169,12]=0.7,s[169,13]=0.5,s[169,14]=-0.7,s[169,15]=0.1,s[169,16]=-0.1,s[169,17]=-1.0,s[169,18]=0.7,s[169,19]=0.3,s[169,20]=0.2,s[169,21]=-0.2,s[169,22]=-0.7,s[169,23]=-0.5,s[169,24]=-1.2,s[169,25]=-0.3,s[169,26]=0.4,s[169,27]=-0.4,s[169,28]=-0.7,s[169,29]=-0.6,s[169,30]=0.2 s[170,1]=-0.5,s[170,2]=0.6,s[170,3]=-0.2,s[170,4]=0.2,s[170,5]=0.4,s[170,6]=0.3,s[170,7]=1.1,s[170,8]=-0.2,s[170,9]=-0.4,s[170,10]=0.5,s[170,11]=-0.8,s[170,12]=1.0,s[170,13]=0.7,s[170,14]=0.1,s[170,15]=0.3,s[170,16]=-0.1,s[170,17]=-0.1,s[170,18]=-0.3,s[170,19]=0.5,s[170,20]=0.4,s[170,21]=-0.7,s[170,22]=-0.3,s[170,23]=0.9,s[170,24]=0.5,s[170,25]=-0.4,s[170,26]=0.1,s[170,27]=0.0,s[170,28]=0.9,s[170,29]=-0.1,s[170,30]=-0.5 s[171,1]=-0.1,s[171,2]=-1.2,s[171,3]=-1.2,s[171,4]=-0.9,s[171,5]=0.3,s[171,6]=0.1,s[171,7]=0.2,s[171,8]=1.1,s[171,9]=0.8,s[171,10]=0.7,s[171,11]=0.4,s[171,12]=1.2,s[171,13]=-0.7,s[171,14]=-0.4,s[171,15]=0.7,s[171,16]=0.2,s[171,17]=-0.3,s[171,18]=-0.4,s[171,19]=0.9,s[171,20]=-0.1,s[171,21]=-0.3,s[171,22]=0.0,s[171,23]=-0.1,s[171,24]=0.3,s[171,25]=-0.2,s[171,26]=0.4,s[171,27]=-0.8,s[171,28]=1.2,s[171,29]=-1.1,s[171,30]=-0.6 s[172,1]=-0.4,s[172,2]=-0.6,s[172,3]=0.8,s[172,4]=0.0,s[172,5]=-1.2,s[172,6]=-0.3,s[172,7]=-1.2,s[172,8]=-0.2,s[172,9]=-0.2,s[172,10]=1.1,s[172,11]=0.5,s[172,12]=0.1,s[172,13]=0.1,s[172,14]=-0.4,s[172,15]=0.1,s[172,16]=1.0,s[172,17]=-1.0,s[172,18]=-0.2,s[172,19]=0.6,s[172,20]=0.1,s[172,21]=0.2,s[172,22]=0.7,s[172,23]=0.2,s[172,24]=-0.6,s[172,25]=0.4,s[172,26]=0.1,s[172,27]=-1.1,s[172,28]=-0.7,s[172,29]=0.2,s[172,30]=-0.5 s[173,1]=-0.1,s[173,2]=-0.3,s[173,3]=-1.0,s[173,4]=-0.2,s[173,5]=-1.2,s[173,6]=-0.6,s[173,7]=1.1,s[173,8]=-0.7,s[173,9]=-0.5,s[173,10]=-0.2,s[173,11]=0.5,s[173,12]=-0.5,s[173,13]=-1.2,s[173,14]=-0.2,s[173,15]=0.2,s[173,16]=-0.9,s[173,17]=-0.8,s[173,18]=-0.2,s[173,19]=-0.6,s[173,20]=0.0,s[173,21]=-0.2,s[173,22]=-0.2,s[173,23]=-0.4,s[173,24]=0.7,s[173,25]=0.9,s[173,26]=0.9,s[173,27]=1.2,s[173,28]=-1.2,s[173,29]=-0.1,s[173,30]=0.0 s[174,1]=1.1,s[174,2]=-1.2,s[174,3]=0.7,s[174,4]=-1.2,s[174,5]=-0.3,s[174,6]=1.0,s[174,7]=-0.1,s[174,8]=0.2,s[174,9]=1.0,s[174,10]=-1.0,s[174,11]=0.4,s[174,12]=-0.8,s[174,13]=-0.1,s[174,14]=1.2,s[174,15]=0.3,s[174,16]=0.1,s[174,17]=1.0,s[174,18]=-0.5,s[174,19]=0.5,s[174,20]=-0.7,s[174,21]=1.1,s[174,22]=0.4,s[174,23]=-0.4,s[174,24]=-1.1,s[174,25]=1.2,s[174,26]=0.8,s[174,27]=-1.0,s[174,28]=-0.3,s[174,29]=-0.7,s[174,30]=-0.2 s[175,1]=0.1,s[175,2]=-0.9,s[175,3]=-0.1,s[175,4]=0.7,s[175,5]=0.8,s[175,6]=0.5,s[175,7]=-1.2,s[175,8]=-0.2,s[175,9]=0.3,s[175,10]=-0.2,s[175,11]=-0.5,s[175,12]=-0.5,s[175,13]=0.3,s[175,14]=0.9,s[175,15]=-0.6,s[175,16]=0.7,s[175,17]=0.7,s[175,18]=0.5,s[175,19]=-0.1,s[175,20]=0.5,s[175,21]=0.9,s[175,22]=-0.4,s[175,23]=0.0,s[175,24]=0.7,s[175,25]=0.2,s[175,26]=0.7,s[175,27]=-0.3,s[175,28]=-1.2,s[175,29]=-0.8,s[175,30]=0.2 s[176,1]=0.9,s[176,2]=-1.0,s[176,3]=0.4,s[176,4]=-0.8,s[176,5]=-1.2,s[176,6]=0.3,s[176,7]=0.4,s[176,8]=-0.8,s[176,9]=0.1,s[176,10]=-0.3,s[176,11]=0.1,s[176,12]=-0.3,s[176,13]=-0.2,s[176,14]=0.9,s[176,15]=-0.5,s[176,16]=0.7,s[176,17]=1.1,s[176,18]=-0.3,s[176,19]=0.9,s[176,20]=0.3,s[176,21]=-0.6,s[176,22]=0.5,s[176,23]=0.7,s[176,24]=-1.0,s[176,25]=0.0,s[176,26]=0.4,s[176,27]=1.0,s[176,28]=-0.5,s[176,29]=0.2,s[176,30]=-1.0 s[177,1]=0.1,s[177,2]=-0.4,s[177,3]=-0.8,s[177,4]=1.1,s[177,5]=0.6,s[177,6]=-0.6,s[177,7]=1.0,s[177,8]=-0.1,s[177,9]=0.9,s[177,10]=-0.7,s[177,11]=0.6,s[177,12]=0.1,s[177,13]=-1.1,s[177,14]=-0.8,s[177,15]=0.4,s[177,16]=0.6,s[177,17]=0.0,s[177,18]=0.3,s[177,19]=-0.4,s[177,20]=-0.3,s[177,21]=0.2,s[177,22]=0.0,s[177,23]=0.5,s[177,24]=-0.7,s[177,25]=-0.1,s[177,26]=0.8,s[177,27]=0.8,s[177,28]=0.2,s[177,29]=-0.1,s[177,30]=-1.0 s[178,1]=-0.8,s[178,2]=-1.2,s[178,3]=-1.2,s[178,4]=1.1,s[178,5]=1.1,s[178,6]=-0.3,s[178,7]=-0.5,s[178,8]=-0.9,s[178,9]=0.5,s[178,10]=0.3,s[178,11]=0.1,s[178,12]=0.4,s[178,13]=-0.1,s[178,14]=0.9,s[178,15]=-0.7,s[178,16]=-1.2,s[178,17]=-0.5,s[178,18]=0.6,s[178,19]=1.2,s[178,20]=0.2,s[178,21]=-0.2,s[178,22]=1.1,s[178,23]=1.1,s[178,24]=0.6,s[178,25]=-1.0,s[178,26]=-0.8,s[178,27]=0.0,s[178,28]=0.1,s[178,29]=1.1,s[178,30]=0.9 s[179,1]=1.2,s[179,2]=-0.3,s[179,3]=0.3,s[179,4]=-0.7,s[179,5]=1.2,s[179,6]=0.2,s[179,7]=-0.5,s[179,8]=-0.4,s[179,9]=-0.2,s[179,10]=-0.5,s[179,11]=0.4,s[179,12]=-0.9,s[179,13]=0.9,s[179,14]=0.2,s[179,15]=0.1,s[179,16]=-0.6,s[179,17]=-0.7,s[179,18]=0.9,s[179,19]=0.2,s[179,20]=0.1,s[179,21]=-0.3,s[179,22]=0.2,s[179,23]=0.1,s[179,24]=0.3,s[179,25]=0.8,s[179,26]=0.7,s[179,27]=-1.1,s[179,28]=-0.4,s[179,29]=-0.4,s[179,30]=0.6 s[180,1]=0.6,s[180,2]=0.5,s[180,3]=1.2,s[180,4]=-0.7,s[180,5]=0.0,s[180,6]=-0.4,s[180,7]=-0.4,s[180,8]=0.4,s[180,9]=0.5,s[180,10]=-1.1,s[180,11]=0.2,s[180,12]=0.2,s[180,13]=-0.1,s[180,14]=1.1,s[180,15]=-0.8,s[180,16]=0.7,s[180,17]=-0.6,s[180,18]=1.0,s[180,19]=-0.2,s[180,20]=-0.5,s[180,21]=-0.6,s[180,22]=-0.9,s[180,23]=1.2,s[180,24]=-0.1,s[180,25]=-0.4,s[180,26]=0.2,s[180,27]=0.6,s[180,28]=-1.2,s[180,29]=0.4,s[180,30]=0.8 s[181,1]=-0.8,s[181,2]=0.4,s[181,3]=-0.2,s[181,4]=0.7,s[181,5]=0.3,s[181,6]=-0.4,s[181,7]=-0.1,s[181,8]=0.1,s[181,9]=0.1,s[181,10]=1.1,s[181,11]=0.5,s[181,12]=0.3,s[181,13]=-0.8,s[181,14]=-0.2,s[181,15]=0.4,s[181,16]=-0.2,s[181,17]=0.2,s[181,18]=-0.1,s[181,19]=-0.6,s[181,20]=-0.5,s[181,21]=-0.2,s[181,22]=0.1,s[181,23]=-0.6,s[181,24]=0.6,s[181,25]=0.9,s[181,26]=-0.5,s[181,27]=0.0,s[181,28]=-1.0,s[181,29]=0.2,s[181,30]=1.0 s[182,1]=0.8,s[182,2]=-0.8,s[182,3]=0.0,s[182,4]=0.6,s[182,5]=0.8,s[182,6]=-0.8,s[182,7]=0.2,s[182,8]=-1.1,s[182,9]=-0.6,s[182,10]=1.1,s[182,11]=-0.6,s[182,12]=1.0,s[182,13]=0.1,s[182,14]=-0.7,s[182,15]=-0.8,s[182,16]=1.1,s[182,17]=0.5,s[182,18]=0.6,s[182,19]=-0.1,s[182,20]=1.0,s[182,21]=0.4,s[182,22]=-0.5,s[182,23]=0.8,s[182,24]=-0.3,s[182,25]=-0.8,s[182,26]=-0.3,s[182,27]=-1.1,s[182,28]=0.1,s[182,29]=0.4,s[182,30]=0.8 s[183,1]=-0.6,s[183,2]=0.6,s[183,3]=-0.3,s[183,4]=0.3,s[183,5]=-1.2,s[183,6]=0.5,s[183,7]=1.2,s[183,8]=-1.0,s[183,9]=-0.5,s[183,10]=-0.4,s[183,11]=0.4,s[183,12]=-0.4,s[183,13]=-0.5,s[183,14]=0.5,s[183,15]=-1.2,s[183,16]=0.1,s[183,17]=1.0,s[183,18]=-0.9,s[183,19]=0.6,s[183,20]=-1.1,s[183,21]=0.9,s[183,22]=-0.4,s[183,23]=-0.9,s[183,24]=-0.9,s[183,25]=-0.3,s[183,26]=-0.6,s[183,27]=1.2,s[183,28]=-0.5,s[183,29]=-0.5,s[183,30]=0.5 s[184,1]=0.2,s[184,2]=-0.8,s[184,3]=-0.7,s[184,4]=0.5,s[184,5]=-1.2,s[184,6]=0.6,s[184,7]=-1.0,s[184,8]=0.8,s[184,9]=0.3,s[184,10]=0.3,s[184,11]=-0.4,s[184,12]=-1.1,s[184,13]=1.1,s[184,14]=-0.4,s[184,15]=-0.1,s[184,16]=0.5,s[184,17]=0.5,s[184,18]=0.7,s[184,19]=0.7,s[184,20]=0.6,s[184,21]=-0.4,s[184,22]=0.7,s[184,23]=0.0,s[184,24]=-0.5,s[184,25]=0.5,s[184,26]=-0.7,s[184,27]=-0.3,s[184,28]=0.1,s[184,29]=0.1,s[184,30]=0.5 s[185,1]=-0.3,s[185,2]=1.1,s[185,3]=0.0,s[185,4]=-0.5,s[185,5]=-0.6,s[185,6]=0.6,s[185,7]=-0.2,s[185,8]=0.2,s[185,9]=0.6,s[185,10]=0.9,s[185,11]=0.3,s[185,12]=-0.9,s[185,13]=0.2,s[185,14]=-0.1,s[185,15]=0.5,s[185,16]=-0.3,s[185,17]=0.5,s[185,18]=-0.2,s[185,19]=-0.1,s[185,20]=1.0,s[185,21]=0.4,s[185,22]=-1.1,s[185,23]=-0.7,s[185,24]=-0.9,s[185,25]=-0.7,s[185,26]=0.1,s[185,27]=0.4,s[185,28]=-0.1,s[185,29]=-0.5,s[185,30]=-0.6 s[186,1]=-0.1,s[186,2]=-1.1,s[186,3]=0.3,s[186,4]=0.2,s[186,5]=0.3,s[186,6]=-0.9,s[186,7]=0.9,s[186,8]=-0.5,s[186,9]=0.6,s[186,10]=1.0,s[186,11]=0.3,s[186,12]=0.9,s[186,13]=-1.0,s[186,14]=-0.6,s[186,15]=0.2,s[186,16]=0.6,s[186,17]=0.0,s[186,18]=1.1,s[186,19]=-0.2,s[186,20]=1.0,s[186,21]=-0.3,s[186,22]=0.9,s[186,23]=-0.2,s[186,24]=-1.0,s[186,25]=-0.5,s[186,26]=0.1,s[186,27]=0.3,s[186,28]=-0.2,s[186,29]=0.4,s[186,30]=0.3 s[187,1]=0.3,s[187,2]=-0.5,s[187,3]=-0.2,s[187,4]=-0.4,s[187,5]=0.6,s[187,6]=-1.2,s[187,7]=0.3,s[187,8]=0.0,s[187,9]=-0.1,s[187,10]=0.6,s[187,11]=0.0,s[187,12]=0.3,s[187,13]=-0.3,s[187,14]=1.2,s[187,15]=-1.1,s[187,16]=1.2,s[187,17]=-0.9,s[187,18]=0.6,s[187,19]=1.0,s[187,20]=0.1,s[187,21]=0.2,s[187,22]=-0.2,s[187,23]=-1.2,s[187,24]=-0.6,s[187,25]=1.0,s[187,26]=0.0,s[187,27]=-1.1,s[187,28]=-0.9,s[187,29]=0.2,s[187,30]=0.9 s[188,1]=0.4,s[188,2]=0.4,s[188,3]=-1.1,s[188,4]=1.0,s[188,5]=0.6,s[188,6]=-0.5,s[188,7]=-0.3,s[188,8]=-0.4,s[188,9]=-0.3,s[188,10]=-0.7,s[188,11]=0.4,s[188,12]=0.8,s[188,13]=-0.5,s[188,14]=0.4,s[188,15]=-0.8,s[188,16]=0.1,s[188,17]=0.6,s[188,18]=0.3,s[188,19]=0.4,s[188,20]=-0.5,s[188,21]=-0.2,s[188,22]=-0.7,s[188,23]=0.2,s[188,24]=-0.1,s[188,25]=0.8,s[188,26]=-0.9,s[188,27]=-1.1,s[188,28]=-0.1,s[188,29]=-0.6,s[188,30]=0.6 s[189,1]=0.0,s[189,2]=-0.8,s[189,3]=0.3,s[189,4]=0.7,s[189,5]=-0.7,s[189,6]=1.1,s[189,7]=0.0,s[189,8]=0.8,s[189,9]=0.3,s[189,10]=0.0,s[189,11]=-0.5,s[189,12]=0.4,s[189,13]=1.2,s[189,14]=0.7,s[189,15]=-0.8,s[189,16]=-0.7,s[189,17]=0.3,s[189,18]=0.1,s[189,19]=-0.1,s[189,20]=0.4,s[189,21]=-0.1,s[189,22]=-1.1,s[189,23]=-1.1,s[189,24]=-0.7,s[189,25]=0.3,s[189,26]=-0.2,s[189,27]=0.2,s[189,28]=0.0,s[189,29]=0.8,s[189,30]=0.9 s[190,1]=0.9,s[190,2]=0.8,s[190,3]=-1.2,s[190,4]=-0.1,s[190,5]=-0.4,s[190,6]=-0.2,s[190,7]=-1.1,s[190,8]=0.8,s[190,9]=-0.2,s[190,10]=-0.7,s[190,11]=0.2,s[190,12]=-0.1,s[190,13]=-0.1,s[190,14]=0.3,s[190,15]=-0.7,s[190,16]=1.1,s[190,17]=-1.2,s[190,18]=1.1,s[190,19]=-0.3,s[190,20]=-0.9,s[190,21]=-0.4,s[190,22]=0.9,s[190,23]=-0.5,s[190,24]=-1.1,s[190,25]=0.6,s[190,26]=-1.2,s[190,27]=0.4,s[190,28]=1.2,s[190,29]=-0.8,s[190,30]=0.7 s[191,1]=0.9,s[191,2]=0.9,s[191,3]=-0.6,s[191,4]=1.2,s[191,5]=0.2,s[191,6]=-0.5,s[191,7]=1.0,s[191,8]=-0.8,s[191,9]=0.1,s[191,10]=0.6,s[191,11]=-1.0,s[191,12]=-0.4,s[191,13]=0.5,s[191,14]=-0.4,s[191,15]=0.6,s[191,16]=0.1,s[191,17]=1.1,s[191,18]=-0.9,s[191,19]=-1.0,s[191,20]=-0.1,s[191,21]=-0.4,s[191,22]=-1.1,s[191,23]=0.6,s[191,24]=0.6,s[191,25]=0.4,s[191,26]=-0.8,s[191,27]=-0.9,s[191,28]=1.2,s[191,29]=-0.4,s[191,30]=0.2 s[192,1]=0.4,s[192,2]=0.2,s[192,3]=-0.1,s[192,4]=0.4,s[192,5]=0.0,s[192,6]=1.2,s[192,7]=-0.8,s[192,8]=-0.8,s[192,9]=0.4,s[192,10]=0.6,s[192,11]=0.7,s[192,12]=-0.4,s[192,13]=-0.3,s[192,14]=1.0,s[192,15]=0.2,s[192,16]=-0.9,s[192,17]=0.0,s[192,18]=0.1,s[192,19]=-0.7,s[192,20]=1.1,s[192,21]=-0.3,s[192,22]=-0.8,s[192,23]=0.2,s[192,24]=0.6,s[192,25]=-1.0,s[192,26]=0.8,s[192,27]=-0.6,s[192,28]=0.1,s[192,29]=-0.1,s[192,30]=0.8 ; ; initialize coefficients ; if @sel > 0 b1 = s[@sel,1] b2 = s[@sel,2] b3 = s[@sel,3] b4 = s[@sel,4] b5 = s[@sel,5] b6 = s[@sel,6] b7 = s[@sel,7] b8 = s[@sel,8] b9 = s[@sel,9] b10 = s[@sel,10] b11 = s[@sel,11] b12 = s[@sel,12] b13 = s[@sel,13] b14 = s[@sel,14] b15 = s[@sel,15] b16 = s[@sel,16] b17 = s[@sel,17] b18 = s[@sel,18] b19 = s[@sel,19] b20 = s[@sel,20] b21 = s[@sel,21] b22 = s[@sel,22] b23 = s[@sel,23] b24 = s[@sel,24] b25 = s[@sel,25] b26 = s[@sel,26] b27 = s[@sel,27] b28 = s[@sel,28] b29 = s[@sel,29] b30 = s[@sel,30] endif ; ; fill the hit array ; while (iter < (iterate*sqr(#width*#magn/400))) xx = fx yy = fy if @sel == 0 fx = @a1 + @a2*fx + @a3*fx*fx + @a4*fx*fy + @a5*fx*zz + @a6*fy + @a7*fy*fy + \ @a8*fy*zz + @a9*zz + @a10*zz*zz fy = @a11 + @a12*xx + @a13*xx*xx + @a14*xx*fy + @a15*xx*zz + @a16*fy + @a17*fy*fy + \ @a18*fy*zz + @a19*zz + @a20*zz*zz zz = @a21 + @a22*xx + @a23*xx*xx + @a24*xx*yy + @a25*xx*zz + @a26*yy + @a27*yy*yy + \ @a28*yy*zz + @a29*zz + @a30*zz*zz else fx = b1 + b2*fx + b3*fx*fx + b4*fx*fy + b5*fx*zz + b6*fy + b7*fy*fy + \ b8*fy*zz + b9*zz + b10*zz*zz fy = b11 + b12*xx + b13*xx*xx + b14*xx*fy + b15*xx*zz + b16*fy + b17*fy*fy + \ b18*fy*zz + b19*zz + b20*zz*zz zz = b21 + b22*xx + b23*xx*xx + b24*xx*yy + b25*xx*zz + b26*yy + b27*yy*yy + \ b28*yy*zz + b29*zz + b30*zz*zz endif ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax ffz = (zmin-zz)/sqrt(txmax^2+tymax^2) xx = ffx ; ; move center of rotations ; ffx = ffx + @cenrotx*#magn ffy = ffy + @cenroty*#magn ffz = ffz + @cenrotz*#magn ; ; rotation around the z axis ; xx = ffx ffx = 0.5 + (ffx - 0.5 - @rotoffx/txmax)*cos(#angle) - \ (ffy - 0.5 - @rotoffy/tymax)*sin(#angle)*#height/#width ffy = 0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(#angle) + \ (xx - 0.5 - @rotoffx/txmax)*sin(#angle)*#width/#height; ; ; rotation around the y axis ; xx = ffx ffx = (0.5 + (ffz - 0.5 - @rotoffz/txmax)*sin(@zangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@zangle*pi/180))*#width ffz = (0.5 + (ffz - 0.5 - @rotoffz/tzmax)*cos(@zangle*pi/180) - \ (xx - 0.5 - @rotoffx/txmax)*sin(@zangle*pi/180)) ; ; rotation around the x axis ; yy = ffy ffy = (0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(@xangle*pi/180) - \ (ffz - 0.5 - @rotoffz/tzmax)*sin(@xangle*pi/180))*#height if @oldver ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*#height/2 else ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*scrsize endif ; ; final translation ; ffx = ffx - @transx*#width ffy = ffy - @transy*#height if @oldver ffz = ffz - @transz*#height/2 else ffz = ffz - @transz*scrsize endif ; ; perspective application ; if @oldver if @useproj ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif else if @useprojn ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif endif px = trunc(ffx)+wd2 py = trunc(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+1+flip(ffz) if real(hits[px,py])>maxnhit maxnhit = real(hits[px,py]) endif if ffz > hits3[px,py] || hits3[px,py] == 0 hits3[px,py] = ffz endif hits2[px,py] = ffz endif iter = iter + 1 endwhile h = 0 w = 0 ; init: float nhit=0 float zave=0 float zlast=0 float zbiggest=0 float nhitx=0 float zavex=0 float zlastx=0 float zbiggestx=0 float nhity=0 float zavey=0 float zlasty=0 float zbiggesty=0 bool done = false float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 int i = 0 ;loop: int delta = ceil(@closeness) int xcrd = #x int ycrd = #y bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true if xcrd+@closeness < #width+wd && ycrd+@closeness < #height+ht && real(hits[xcrd,ycrd]) > @thresh if @filter == 0 if @value == 3 zbiggest = hits3[xcrd,ycrd] zbiggestx = hits3[xcrd+delta,ycrd] zbiggesty = hits3[xcrd,ycrd+delta] elseif @value == 0 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) elseif @value == 1 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) zave = imag(hits[xcrd,ycrd])/(nhit + 1) zavex = imag(hits[xcrd+delta,ycrd])/(nhitx + 1) zavey = imag(hits[xcrd,ycrd+delta])/(nhity + 1) elseif @value == 2 zlast = hits2[xcrd,ycrd] zlastx = hits2[xcrd+delta,ycrd] zlasty = hits2[xcrd,ycrd+delta] endif else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 zbiggest = 0 zbiggestx = 0 zbiggesty = 0 zave = 0 zavex = 0 zavey = 0 zlast = 0 zlastx = 0 zlasty = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter if @value == 0 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) elseif @value == 1 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) zave = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy])/(nhit+1) zavex = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx+delta,ycrd+gy])/(nhitx+1) zavey = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta])/(nhity+1) elseif @value == 2 zlast = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy] zlastx = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx+delta,ycrd+gy] zlasty = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy+delta] elseif @value == 3 zbiggest = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy] zbiggestx = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx+delta,ycrd+gy] zbiggesty = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy+delta] endif gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile if @value == 0 nhit = nhit/gweight nhitx = nhitx/gweight nhity = nhity/gweight elseif @value == 1 zave = zave/gweight zavex = zavex/gweight zavey = zavey/gweight elseif @value == 2 zlast = zlast/gweight zlastx = zlastx/gweight zlasty = zlasty/gweight elseif @value == 3 zbiggest = zbiggest/gweight zbiggestx = zbiggestx/gweight zbiggesty = zbiggesty/gweight endif endif endif endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = zave cenx = zavex ceny = zavey elseif @value == 2 cen = zlast cenx = zlastx ceny = zlasty else cen = zbiggest cenx = zbiggestx ceny = zbiggesty endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * zscale2 e2 = e2 * zscale2 e3 = e3 * zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxnhit elseif @value == 1 #z = (zave/(log(maxnhit)+1))^3 elseif @value == 2 #z = (zlast/(log(maxnhit)+1))^10 elseif @value == 3 #z = (zbiggest/(log(maxnhit)+1))^10 endif endif if @oldver if done == false done = true endif endif loop: i = i + 1 if !@oldver if cen < i if done == false done = true endif endif endif bailout: done == false default: heading caption="Sprott 3D Quadratic G Attractor" endheading $ifdef VER40 heading text=" x -> Quadratic in x, y and z" endheading heading text=" y -> Quadratic in x, y and z" endheading heading text=" z -> Quadratic in x, y and z" endheading heading text="Color with Damien's Lighting, 3D Texturizer Enhanced III or\ Direct Color Slope." endheading $else heading caption="x -> Quadratic in x, y and z" endheading heading caption="y -> Quadratic in x, y and z" endheading heading caption="z -> Quadratic in x, y and z" endheading heading caption="Color with Damien's Lighting" endheading heading caption="or one of the 3D Texturizer formulas" endheading heading caption="3D Texturizer III is needed for" endheading heading caption="the non-slope color options." endheading $endif title="Slope 3D Quadratic G Attractor" maxiter=1000 method=multipass periodicity=0 magn = 3.0 float param version caption = "Version number" default = 1.1 hint = "This is for backwards compatibility with old versions \ of the formula." visible = false endparam bool param oldver caption = "Use original version" default = false endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 0.01 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 0 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param value caption = "Hit Value" enum = "Count" "Ave Z" "Last Z" "Largest Z" default = 3 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param pass caption = "Pass slope values" default = true endparam heading caption = "Slope Parameters" visible=@pass==true endheading param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 1.0 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible=@pass==true endparam heading caption = "Rotations and Translations" endheading $ifdef VER40 heading text = "Use the location tab for rotation around the Z Axis." endheading $endif param xangle caption = "X Axis Rotation" default = 0.0 hint = "This is the fixed (horizontal) Y Axis. It is performed \ after the normal fractal rotation(s) and zooms." endparam param zangle caption = "Y Axis Rotation" default = 0.0 ; min = 0.0 ; max = 180.0 hint = "This is the fixed (vertical) Y Axis. It is performed \ after the normal fractal rotation(s) and zooms." endparam float param cenrotx caption = "X Center of Rotation" default = 0 endparam float param cenroty caption = "Y Center of Rotation" default = 0 endparam float param cenrotz caption = "Z Center of Rotation" default = 0 endparam param rotoffx caption = "Rot Center X Offset" default = 0.0 endparam param rotoffy caption = "Rot Center Y Offset" default = 0.0 endparam param rotoffz caption = "Rot Center Z Offset" default = 0.0 endparam param transx caption = "X Final Translation" default = 0.0 endparam param transy caption = "Y Final Translation" default = 0.0 endparam param transz caption = "Z Final Translation" default = -0.1 endparam heading caption = "Perspective" endheading param useproj caption = "Use Perspective" default = false visible = @oldver endparam param useprojn caption = "Use Perspective" default = true visible = !@oldver endparam param cprojx caption = "X Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam param cprojy caption = "Y Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam float param cprojz caption = "Z Center of Projection" default = -1 visible = @useproj || @useprojn endparam heading caption = "Attractor Parameters" endheading param hideparam caption = "Hide Parameters" default = true endparam param sel caption = "select preset coeffs" enum = "no preset" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" \ "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" \ "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42" "43" "44" \ "45" "46" "47" "48" "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" \ "60" "61" "62" "63" "64" "65" "66" "67" "69" "69" "70" "71" "72" "73" "74" \ "75" "76" "77" "78" "79" "80" "81" "82" "83" "84" "85" "86" "87" "88" "89" \ "90" "91" "92" "93" "94" "95" "96" "97" "98" "99" "100" "101" "102" "103" \ "104" "105" "106" "107" "108" "109" "110" "111" "112" "113" "114" "115" \ "116" "117" "118" "119" "120" "121" "122" "123" "124" "125" "126" "127" \ "128" "129" "130" "131" "132" "133" "134" "135" "136" "137" "138" "139" \ "140" "141" "142" "143" "144" "145" "146" "147" "148" "149" "150" "151" \ "152" "153" "154" "155" "156" "157" "158" "159" "160" "161" "162" "163" \ "164" "165" "166" "167" "168" "169" "170" "171" "172" "173" "174" "175" \ "176" "177" "178" "179" "180" "181" "182" "183" "184" "185" "186" "187" \ "188" "189" "190" "191" "192" default = 0 endparam param a1 caption = "coefficient a1" default = 0.3 visible = @hideparam==false endparam param a2 caption = "coefficient a2" default = -0.8 visible = @hideparam==false endparam param a3 caption = "coefficient a3" default = -0.8 visible = @hideparam==false endparam param a4 caption = "coefficient a4" default = 1.2 visible = @hideparam==false endparam param a5 caption = "coefficient a5" default = 0.6 visible = @hideparam==false endparam param a6 caption = "coefficient a6" default = 0.3 visible = @hideparam==false endparam param a7 caption = "coefficient a7" default = -0.7 visible = @hideparam==false endparam param a8 caption = "coefficient a8" default = 0.5 visible = @hideparam==false endparam param a9 caption = "coefficient a9" default = -0.7 visible = @hideparam==false endparam param a10 caption = "coefficient a10" default = 0.1 visible = @hideparam==false endparam param a11 caption = "coefficient a11" default = 0.1 visible = @hideparam==false endparam param a12 caption = "coefficient a12" default = -0.4 visible = @hideparam==false endparam param a13 caption = "coefficient a13" default = 0.7 visible = @hideparam==false endparam param a14 caption = "coefficient a14" default = 0.7 visible = @hideparam==false endparam param a15 caption = "coefficient a15" default = -0.3 visible = @hideparam==false endparam param a16 caption = "coefficient a16" default = -0.5 visible = @hideparam==false endparam param a17 caption = "coefficient a17" default = 1.0 visible = @hideparam==false endparam param a18 caption = "coefficient a18" default = -0.7 visible = @hideparam==false endparam param a19 caption = "coefficient a19" default = 0.9 visible = @hideparam==false endparam param a20 caption = "coefficient a20" default = -0.3 visible = @hideparam==false endparam param a21 caption = "coefficient a21" default = 0.1 visible = @hideparam==false endparam param a22 caption = "coefficient a22" default = 0.8 visible = @hideparam==false endparam param a23 caption = "coefficient a23" default = 0.4 visible = @hideparam==false endparam param a24 caption = "coefficient a24" default = -1.0 visible = @hideparam==false endparam param a25 caption = "coefficient a25" default = 0.3 visible = @hideparam==false endparam param a26 caption = "coefficient a26" default = -1.0 visible = @hideparam==false endparam param a27 caption = "coefficient a27" default = 0.6 visible = @hideparam==false endparam param a28 caption = "coefficient a28" default = 0.2 visible = @hideparam==false endparam param a29 caption = "coefficient a29" default = -0.5 visible = @hideparam==false endparam param a30 caption = "coefficient a30" default = 0.7 visible = @hideparam==false endparam } Slope_4D_Quadratic_G_Attractor { ; Ron Barnett December 6, 2004 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III ; ; global: float zscale2 = 0 float cprojx = 0 float cprojy = 0 float cprojz = 0 float scrsize = sqrt(#width*#width+#height*#height) if !@oldver zscale2 = @zscale2*scrsize cprojx = @cprojx*#width cprojy = @cprojy*#height cprojz = @cprojz*scrsize else zscale2 = @zscale2 cprojx = @cprojx cprojy = @cprojy cprojz = @cprojz endif int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits2[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits3[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float s[69,61] float fx = 0.0 float ffx = 0.0 float xx = 0.0 float fy = 0.0 float ffy = 0.0 float yy = 0.0 float zz = 0.0 float fz = 0.0 float ffz = 0.0 float ww = 0.0 float ffw = 0.0 float b1 = 0 float b2 = 0 float b3 = 0 float b4 = 0 float b5 = 0 float b6 = 0 float b7 = 0 float b8 = 0 float b9 = 0 float b10 = 0 float b11 = 0 float b12 = 0 float b13 = 0 float b14 = 0 float b15 = 0 float b16 = 0 float b17 = 0 float b18 = 0 float b19 = 0 float b20 = 0 float b21 = 0 float b22 = 0 float b23 = 0 float b24 = 0 float b25 = 0 float b26 = 0 float b27 = 0 float b28 = 0 float b29 = 0 float b30 = 0 float b31 = 0 float b32 = 0 float b33 = 0 float b34 = 0 float b35 = 0 float b36 = 0 float b37 = 0 float b38 = 0 float b39 = 0 float b40 = 0 float b41 = 0 float b42 = 0 float b43 = 0 float b44 = 0 float b45 = 0 float b46 = 0 float b47 = 0 float b48 = 0 float b49 = 0 float b50 = 0 float b51 = 0 float b52 = 0 float b53 = 0 float b54 = 0 float b55 = 0 float b56 = 0 float b57 = 0 float b58 = 0 float b59 = 0 float b60 = 0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float tzmax = sqrt(txmax^2+tymax^2) float twmax = sqrt(txmax^2+tymax^2) float xmin = cx - txmax/2 float ymin = cy - tymax/2 float zmin = sqrt(xmin^2 + ymin^2) float wmin = sqrt(xmin^2 + ymin^2) float iterate = @density*10000000 float maxnhit = 0 ; ; initialize hit array ; while(h < #height+wd) while(w < #width+ht) hits[w,h] = 0 hits2[w,h] = 0 hits3[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; initialize presets ; s[1,1]=-0.4,s[1,2]=0.1,s[1,3]=1.1,s[1,4]=0.6,s[1,5]=-1.2,s[1,6]=-0.6,s[1,7]=0.4,s[1,8]=0.4,s[1,9]=0.0,s[1,10]=0.0,s[1,11]=0.2,s[1,12]=-0.9,s[1,13]=-0.8,s[1,14]=-0.3,s[1,15]=-0.2,s[1,16]=0.3,s[1,17]=0.1,s[1,18]=0.3,s[1,19]=-0.4,s[1,20]=0.7,s[1,21]=0.2,s[1,22]=-0.5,s[1,23]=-0.5,s[1,24]=-0.6,s[1,25]=-1.2,s[1,26]=0.4,s[1,27]=0.1,s[1,28]=0.1,s[1,29]=0.3,s[1,30]=-0.3,s[1,31]=0.6,s[1,32]=0.8,s[1,33]=0.0,s[1,34]=1.0,s[1,35]=-1.0,s[1,36]=0.4,s[1,37]=1.2,s[1,38]=0.4,s[1,39]=-0.5,s[1,40]=-0.5,s[1,41]=-0.7,s[1,42]=0.3,s[1,43]=1.1,s[1,44]=-0.4,s[1,45]=-0.3,s[1,46]=0.0,s[1,47]=0.6,s[1,48]=-0.7,s[1,49]=1.0,s[1,50]=0.3,s[1,51]=1.0,s[1,52]=-0.1,s[1,53]=0.1,s[1,54]=1.0,s[1,55]=0.1,s[1,56]=0.4,s[1,57]=0.9,s[1,58]=-0.1,s[1,59]=0.5,s[1,60]=-0.5 s[2,1]=-0.2,s[2,2]=0.6,s[2,3]=0.2,s[2,4]=-0.2,s[2,5]=0.4,s[2,6]=-0.9,s[2,7]=-0.6,s[2,8]=0.9,s[2,9]=-0.6,s[2,10]=0.8,s[2,11]=-0.7,s[2,12]=-0.5,s[2,13]=1.0,s[2,14]=0.4,s[2,15]=1.2,s[2,16]=-0.1,s[2,17]=0.6,s[2,18]=-0.7,s[2,19]=0.8,s[2,20]=1.2,s[2,21]=-0.7,s[2,22]=0.4,s[2,23]=-1.1,s[2,24]=-0.9,s[2,25]=-0.5,s[2,26]=0.7,s[2,27]=-1.1,s[2,28]=0.6,s[2,29]=1.1,s[2,30]=-0.8,s[2,31]=0.0,s[2,32]=-0.5,s[2,33]=0.2,s[2,34]=0.8,s[2,35]=0.6,s[2,36]=0.1,s[2,37]=-0.9,s[2,38]=-1.0,s[2,39]=-0.3,s[2,40]=0.3,s[2,41]=-0.6,s[2,42]=-0.4,s[2,43]=-0.9,s[2,44]=0.1,s[2,45]=-0.2,s[2,46]=0.1,s[2,47]=-0.6,s[2,48]=0.3,s[2,49]=-0.2,s[2,50]=0.4,s[2,51]=-0.1,s[2,52]=0.6,s[2,53]=-0.1,s[2,54]=-0.9,s[2,55]=0.4,s[2,56]=1.0,s[2,57]=0.3,s[2,58]=-0.3,s[2,59]=0.1,s[2,60]=0.4 s[3,1]=-0.1,s[3,2]=0.4,s[3,3]=-1.2,s[3,4]=-0.1,s[3,5]=-0.7,s[3,6]=1.2,s[3,7]=-0.4,s[3,8]=-0.3,s[3,9]=0.0,s[3,10]=-0.3,s[3,11]=-0.2,s[3,12]=-0.2,s[3,13]=-1.0,s[3,14]=0.2,s[3,15]=-1.1,s[3,16]=-0.7,s[3,17]=-0.4,s[3,18]=0.9,s[3,19]=0.1,s[3,20]=1.1,s[3,21]=-0.7,s[3,22]=-0.8,s[3,23]=-0.1,s[3,24]=0.8,s[3,25]=-0.6,s[3,26]=0.6,s[3,27]=-0.6,s[3,28]=-1.1,s[3,29]=0.1,s[3,30]=1.0,s[3,31]=-0.5,s[3,32]=-1.2,s[3,33]=1.2,s[3,34]=1.0,s[3,35]=-0.9,s[3,36]=-0.4,s[3,37]=0.4,s[3,38]=1.2,s[3,39]=-0.9,s[3,40]=0.5,s[3,41]=-0.3,s[3,42]=0.2,s[3,43]=0.8,s[3,44]=1.0,s[3,45]=0.1,s[3,46]=-0.1,s[3,47]=0.0,s[3,48]=-0.1,s[3,49]=0.2,s[3,50]=0.3,s[3,51]=-1.2,s[3,52]=-0.2,s[3,53]=-0.3,s[3,54]=-0.7,s[3,55]=-1.1,s[3,56]=-0.7,s[3,57]=0.4,s[3,58]=-0.5,s[3,59]=-0.5,s[3,60]=-0.9 s[4,1]=-0.1,s[4,2]=0.5,s[4,3]=-0.1,s[4,4]=-0.9,s[4,5]=0.9,s[4,6]=-0.4,s[4,7]=0.5,s[4,8]=-0.7,s[4,9]=-0.3,s[4,10]=0.5,s[4,11]=-0.3,s[4,12]=-0.6,s[4,13]=-0.4,s[4,14]=-0.1,s[4,15]=0.8,s[4,16]=0.4,s[4,17]=1.2,s[4,18]=1.2,s[4,19]=1.2,s[4,20]=0.6,s[4,21]=-0.7,s[4,22]=-0.2,s[4,23]=-0.5,s[4,24]=0.0,s[4,25]=0.4,s[4,26]=0.4,s[4,27]=0.2,s[4,28]=1.0,s[4,29]=0.5,s[4,30]=0.0,s[4,31]=-0.4,s[4,32]=-0.4,s[4,33]=0.3,s[4,34]=0.5,s[4,35]=-0.6,s[4,36]=0.1,s[4,37]=0.4,s[4,38]=-0.3,s[4,39]=-0.5,s[4,40]=0.5,s[4,41]=-0.2,s[4,42]=-0.2,s[4,43]=-0.5,s[4,44]=1.2,s[4,45]=-0.9,s[4,46]=0.0,s[4,47]=1.1,s[4,48]=0.6,s[4,49]=-0.4,s[4,50]=1.2,s[4,51]=0.0,s[4,52]=-0.7,s[4,53]=0.3,s[4,54]=-0.1,s[4,55]=0.4,s[4,56]=0.5,s[4,57]=1.0,s[4,58]=0.6,s[4,59]=0.6,s[4,60]=-0.9 s[5,1]=0.0,s[5,2]=-0.9,s[5,3]=-0.9,s[5,4]=-0.2,s[5,5]=-1.0,s[5,6]=-1.1,s[5,7]=0.5,s[5,8]=0.2,s[5,9]=-0.2,s[5,10]=1.2,s[5,11]=-0.3,s[5,12]=0.0,s[5,13]=1.1,s[5,14]=1.1,s[5,15]=0.4,s[5,16]=-0.2,s[5,17]=0.3,s[5,18]=-1.1,s[5,19]=0.0,s[5,20]=-0.3,s[5,21]=0.6,s[5,22]=0.6,s[5,23]=0.0,s[5,24]=0.6,s[5,25]=0.8,s[5,26]=0.5,s[5,27]=0.1,s[5,28]=-0.4,s[5,29]=-0.2,s[5,30]=0.6,s[5,31]=0.2,s[5,32]=0.1,s[5,33]=-1.1,s[5,34]=0.7,s[5,35]=1.0,s[5,36]=0.8,s[5,37]=-1.0,s[5,38]=-1.0,s[5,39]=0.2,s[5,40]=0.3,s[5,41]=0.5,s[5,42]=-1.2,s[5,43]=-0.6,s[5,44]=0.0,s[5,45]=-0.7,s[5,46]=0.3,s[5,47]=0.1,s[5,48]=0.1,s[5,49]=0.7,s[5,50]=0.9,s[5,51]=-0.6,s[5,52]=0.5,s[5,53]=0.1,s[5,54]=-0.8,s[5,55]=0.4,s[5,56]=-0.9,s[5,57]=0.4,s[5,58]=1.2,s[5,59]=0.1,s[5,60]=-0.1 s[6,1]=0.0,s[6,2]=1.0,s[6,3]=1.2,s[6,4]=-0.2,s[6,5]=-1.2,s[6,6]=0.5,s[6,7]=1.1,s[6,8]=-0.3,s[6,9]=-0.6,s[6,10]=1.1,s[6,11]=0.5,s[6,12]=-0.9,s[6,13]=-0.1,s[6,14]=0.0,s[6,15]=-0.2,s[6,16]=-0.2,s[6,17]=-0.8,s[6,18]=0.6,s[6,19]=-0.5,s[6,20]=0.1,s[6,21]=0.6,s[6,22]=-0.3,s[6,23]=-0.8,s[6,24]=0.4,s[6,25]=-0.5,s[6,26]=-0.3,s[6,27]=0.5,s[6,28]=0.9,s[6,29]=-0.8,s[6,30]=-0.8,s[6,31]=0.5,s[6,32]=0.6,s[6,33]=1.0,s[6,34]=1.0,s[6,35]=-0.7,s[6,36]=1.1,s[6,37]=-0.8,s[6,38]=-0.8,s[6,39]=-0.1,s[6,40]=0.6,s[6,41]=-0.6,s[6,42]=-0.6,s[6,43]=0.0,s[6,44]=0.8,s[6,45]=-1.2,s[6,46]=0.2,s[6,47]=-0.8,s[6,48]=-0.5,s[6,49]=1.0,s[6,50]=1.2,s[6,51]=1.1,s[6,52]=-0.1,s[6,53]=0.0,s[6,54]=-0.5,s[6,55]=0.1,s[6,56]=-0.1,s[6,57]=0.0,s[6,58]=-0.1,s[6,59]=0.2,s[6,60]=0.1 s[7,1]=-0.2,s[7,2]=1.0,s[7,3]=1.0,s[7,4]=-0.7,s[7,5]=0.7,s[7,6]=0.4,s[7,7]=-0.5,s[7,8]=1.0,s[7,9]=-0.7,s[7,10]=-0.7,s[7,11]=-1.1,s[7,12]=-0.2,s[7,13]=-1.0,s[7,14]=-0.7,s[7,15]=-0.5,s[7,16]=0.0,s[7,17]=0.8,s[7,18]=0.6,s[7,19]=0.9,s[7,20]=-0.7,s[7,21]=-0.7,s[7,22]=-0.7,s[7,23]=-1.2,s[7,24]=0.1,s[7,25]=-1.0,s[7,26]=0.5,s[7,27]=0.2,s[7,28]=-0.6,s[7,29]=0.6,s[7,30]=0.6,s[7,31]=0.3,s[7,32]=0.3,s[7,33]=-0.6,s[7,34]=0.2,s[7,35]=1.2,s[7,36]=0.7,s[7,37]=0.7,s[7,38]=-1.0,s[7,39]=-1.2,s[7,40]=0.2,s[7,41]=0.1,s[7,42]=-0.4,s[7,43]=0.8,s[7,44]=-0.1,s[7,45]=0.3,s[7,46]=-0.6,s[7,47]=0.5,s[7,48]=-0.4,s[7,49]=0.7,s[7,50]=-0.8,s[7,51]=-1.2,s[7,52]=0.4,s[7,53]=0.9,s[7,54]=0.9,s[7,55]=0.4,s[7,56]=-0.4,s[7,57]=-1.0,s[7,58]=-1.1,s[7,59]=-0.2,s[7,60]=-0.2 s[8,1]=0.1,s[8,2]=-0.6,s[8,3]=-0.7,s[8,4]=0.2,s[8,5]=-0.7,s[8,6]=0.0,s[8,7]=-0.2,s[8,8]=-1.0,s[8,9]=1.2,s[8,10]=-0.4,s[8,11]=-0.7,s[8,12]=-0.6,s[8,13]=-0.3,s[8,14]=0.6,s[8,15]=0.6,s[8,16]=0.2,s[8,17]=0.9,s[8,18]=0.4,s[8,19]=-0.2,s[8,20]=0.8,s[8,21]=1.2,s[8,22]=-0.2,s[8,23]=0.8,s[8,24]=-0.5,s[8,25]=0.7,s[8,26]=-0.4,s[8,27]=0.7,s[8,28]=-0.3,s[8,29]=1.0,s[8,30]=-0.8,s[8,31]=0.0,s[8,32]=0.8,s[8,33]=-0.5,s[8,34]=0.1,s[8,35]=0.3,s[8,36]=1.1,s[8,37]=0.0,s[8,38]=-0.7,s[8,39]=-1.2,s[8,40]=-1.1,s[8,41]=0.8,s[8,42]=1.0,s[8,43]=1.1,s[8,44]=-0.6,s[8,45]=-1.2,s[8,46]=0.0,s[8,47]=0.4,s[8,48]=0.1,s[8,49]=0.4,s[8,50]=0.2,s[8,51]=1.1,s[8,52]=0.0,s[8,53]=-0.6,s[8,54]=0.4,s[8,55]=0.7,s[8,56]=0.9,s[8,57]=-0.3,s[8,58]=0.4,s[8,59]=0.2,s[8,60]=-1.2 s[9,1]=0.5,s[9,2]=-0.4,s[9,3]=-0.9,s[9,4]=-0.7,s[9,5]=0.0,s[9,6]=-0.4,s[9,7]=-0.5,s[9,8]=0.5,s[9,9]=-0.2,s[9,10]=-0.4,s[9,11]=0.5,s[9,12]=-1.2,s[9,13]=0.1,s[9,14]=-0.8,s[9,15]=0.1,s[9,16]=-0.4,s[9,17]=0.1,s[9,18]=0.9,s[9,19]=0.7,s[9,20]=-0.9,s[9,21]=0.1,s[9,22]=-0.3,s[9,23]=-0.2,s[9,24]=-1.1,s[9,25]=0.5,s[9,26]=0.9,s[9,27]=-1.2,s[9,28]=-0.7,s[9,29]=0.1,s[9,30]=1.0,s[9,31]=0.3,s[9,32]=0.4,s[9,33]=-0.3,s[9,34]=-0.9,s[9,35]=-0.9,s[9,36]=0.2,s[9,37]=-0.9,s[9,38]=-1.2,s[9,39]=0.0,s[9,40]=0.9,s[9,41]=-0.3,s[9,42]=-0.4,s[9,43]=1.0,s[9,44]=0.2,s[9,45]=-0.4,s[9,46]=0.4,s[9,47]=0.2,s[9,48]=1.0,s[9,49]=-0.7,s[9,50]=0.4,s[9,51]=-1.1,s[9,52]=-0.6,s[9,53]=-0.3,s[9,54]=-0.3,s[9,55]=-0.8,s[9,56]=-0.7,s[9,57]=-0.4,s[9,58]=0.5,s[9,59]=-0.8,s[9,60]=1.2 s[10,1]=-0.4,s[10,2]=0.9,s[10,3]=-0.4,s[10,4]=-0.3,s[10,5]=1.2,s[10,6]=-0.9,s[10,7]=1.0,s[10,8]=0.6,s[10,9]=-0.2,s[10,10]=-1.0,s[10,11]=-1.2,s[10,12]=-0.6,s[10,13]=0.7,s[10,14]=0.4,s[10,15]=-1.2,s[10,16]=0.0,s[10,17]=-0.3,s[10,18]=-0.9,s[10,19]=1.0,s[10,20]=-0.1,s[10,21]=1.2,s[10,22]=-1.0,s[10,23]=-1.1,s[10,24]=-0.2,s[10,25]=-0.3,s[10,26]=-0.6,s[10,27]=-0.9,s[10,28]=-0.3,s[10,29]=-0.2,s[10,30]=-0.1,s[10,31]=-0.6,s[10,32]=-0.8,s[10,33]=-0.8,s[10,34]=-1.2,s[10,35]=-0.1,s[10,36]=-1.0,s[10,37]=-1.1,s[10,38]=-1.0,s[10,39]=-1.0,s[10,40]=-0.7,s[10,41]=0.5,s[10,42]=0.5,s[10,43]=0.0,s[10,44]=-0.3,s[10,45]=-0.6,s[10,46]=0.1,s[10,47]=0.0,s[10,48]=0.1,s[10,49]=0.6,s[10,50]=0.7,s[10,51]=-0.1,s[10,52]=-1.1,s[10,53]=1.1,s[10,54]=0.4,s[10,55]=1.2,s[10,56]=1.2,s[10,57]=0.1,s[10,58]=1.2,s[10,59]=0.7,s[10,60]=0.8 s[11,1]=-0.2,s[11,2]=0.1,s[11,3]=-0.9,s[11,4]=0.9,s[11,5]=1.0,s[11,6]=1.1,s[11,7]=0.0,s[11,8]=0.2,s[11,9]=-0.3,s[11,10]=-1.0,s[11,11]=-0.1,s[11,12]=0.3,s[11,13]=0.3,s[11,14]=-0.7,s[11,15]=-0.9,s[11,16]=-0.9,s[11,17]=-0.6,s[11,18]=1.0,s[11,19]=-0.6,s[11,20]=-0.7,s[11,21]=-1.2,s[11,22]=-0.5,s[11,23]=0.0,s[11,24]=0.2,s[11,25]=0.3,s[11,26]=-0.2,s[11,27]=-0.2,s[11,28]=0.6,s[11,29]=-0.3,s[11,30]=1.0,s[11,31]=-0.3,s[11,32]=0.7,s[11,33]=-0.4,s[11,34]=0.5,s[11,35]=-1.0,s[11,36]=-0.7,s[11,37]=-0.9,s[11,38]=0.3,s[11,39]=-1.1,s[11,40]=1.2,s[11,41]=-0.3,s[11,42]=0.8,s[11,43]=0.1,s[11,44]=0.8,s[11,45]=-1.2,s[11,46]=-0.1,s[11,47]=-0.9,s[11,48]=-0.5,s[11,49]=1.2,s[11,50]=-0.8,s[11,51]=0.0,s[11,52]=1.0,s[11,53]=0.3,s[11,54]=0.1,s[11,55]=0.7,s[11,56]=0.8,s[11,57]=1.2,s[11,58]=0.6,s[11,59]=0.0,s[11,60]=0.1 s[12,1]=0.2,s[12,2]=-0.1,s[12,3]=0.6,s[12,4]=-0.1,s[12,5]=-1.2,s[12,6]=-0.9,s[12,7]=-0.9,s[12,8]=-0.9,s[12,9]=0.4,s[12,10]=-0.7,s[12,11]=0.3,s[12,12]=-0.4,s[12,13]=-1.2,s[12,14]=-0.4,s[12,15]=0.8,s[12,16]=-0.4,s[12,17]=1.0,s[12,18]=-0.5,s[12,19]=-1.1,s[12,20]=-0.7,s[12,21]=1.2,s[12,22]=0.4,s[12,23]=0.6,s[12,24]=0.8,s[12,25]=0.3,s[12,26]=0.6,s[12,27]=0.5,s[12,28]=0.3,s[12,29]=-0.8,s[12,30]=-0.9,s[12,31]=0.0,s[12,32]=-0.3,s[12,33]=1.1,s[12,34]=0.5,s[12,35]=-0.4,s[12,36]=-0.9,s[12,37]=0.7,s[12,38]=0.6,s[12,39]=1.1,s[12,40]=-0.6,s[12,41]=0.1,s[12,42]=-0.4,s[12,43]=0.9,s[12,44]=0.8,s[12,45]=-0.1,s[12,46]=0.0,s[12,47]=0.8,s[12,48]=0.8,s[12,49]=0.3,s[12,50]=-0.4,s[12,51]=-0.1,s[12,52]=-0.1,s[12,53]=-0.7,s[12,54]=-0.6,s[12,55]=-0.9,s[12,56]=0.4,s[12,57]=-0.5,s[12,58]=0.5,s[12,59]=0.6,s[12,60]=-0.9 s[13,1]=0.0,s[13,2]=-0.5,s[13,3]=0.5,s[13,4]=-0.5,s[13,5]=0.9,s[13,6]=-0.4,s[13,7]=0.2,s[13,8]=-0.5,s[13,9]=0.3,s[13,10]=-0.2,s[13,11]=-0.1,s[13,12]=-0.9,s[13,13]=-0.3,s[13,14]=0.1,s[13,15]=-1.0,s[13,16]=-0.2,s[13,17]=-0.8,s[13,18]=-0.1,s[13,19]=-1.2,s[13,20]=0.6,s[13,21]=-0.2,s[13,22]=-0.9,s[13,23]=0.4,s[13,24]=-0.3,s[13,25]=-0.6,s[13,26]=0.8,s[13,27]=0.0,s[13,28]=-1.2,s[13,29]=0.1,s[13,30]=1.1,s[13,31]=-0.4,s[13,32]=-0.1,s[13,33]=1.2,s[13,34]=0.1,s[13,35]=0.4,s[13,36]=-0.5,s[13,37]=-0.9,s[13,38]=0.2,s[13,39]=1.0,s[13,40]=-0.7,s[13,41]=0.7,s[13,42]=-0.6,s[13,43]=-0.6,s[13,44]=0.4,s[13,45]=1.1,s[13,46]=0.0,s[13,47]=0.1,s[13,48]=0.4,s[13,49]=-0.2,s[13,50]=0.4,s[13,51]=1.2,s[13,52]=0.7,s[13,53]=-0.4,s[13,54]=0.5,s[13,55]=1.2,s[13,56]=-0.8,s[13,57]=0.2,s[13,58]=-1.1,s[13,59]=0.2,s[13,60]=-0.9 s[14,1]=0.6,s[14,2]=-0.7,s[14,3]=-0.5,s[14,4]=-0.7,s[14,5]=1.0,s[14,6]=0.4,s[14,7]=-0.5,s[14,8]=-1.0,s[14,9]=-0.6,s[14,10]=-0.3,s[14,11]=-0.9,s[14,12]=-1.0,s[14,13]=0.0,s[14,14]=1.2,s[14,15]=-0.5,s[14,16]=0.1,s[14,17]=-0.4,s[14,18]=0.0,s[14,19]=0.5,s[14,20]=-1.0,s[14,21]=0.3,s[14,22]=0.3,s[14,23]=1.2,s[14,24]=0.0,s[14,25]=-0.4,s[14,26]=0.7,s[14,27]=0.5,s[14,28]=1.0,s[14,29]=0.3,s[14,30]=0.6,s[14,31]=0.1,s[14,32]=0.6,s[14,33]=-1.1,s[14,34]=0.2,s[14,35]=-0.8,s[14,36]=1.1,s[14,37]=-0.8,s[14,38]=0.6,s[14,39]=-1.1,s[14,40]=0.8,s[14,41]=0.0,s[14,42]=-0.3,s[14,43]=-0.5,s[14,44]=-0.5,s[14,45]=-0.8,s[14,46]=0.3,s[14,47]=-0.6,s[14,48]=0.1,s[14,49]=0.2,s[14,50]=1.0,s[14,51]=1.0,s[14,52]=-1.0,s[14,53]=1.2,s[14,54]=0.3,s[14,55]=-0.1,s[14,56]=0.3,s[14,57]=0.8,s[14,58]=0.2,s[14,59]=0.1,s[14,60]=0.5 s[15,1]=-0.1,s[15,2]=-1.0,s[15,3]=0.1,s[15,4]=0.8,s[15,5]=0.3,s[15,6]=1.1,s[15,7]=0.1,s[15,8]=-0.3,s[15,9]=0.5,s[15,10]=0.5,s[15,11]=0.7,s[15,12]=0.9,s[15,13]=0.4,s[15,14]=0.5,s[15,15]=-0.3,s[15,16]=0.2,s[15,17]=0.1,s[15,18]=0.1,s[15,19]=0.6,s[15,20]=-1.2,s[15,21]=0.5,s[15,22]=-0.7,s[15,23]=0.7,s[15,24]=-0.6,s[15,25]=0.5,s[15,26]=-0.2,s[15,27]=0.4,s[15,28]=0.1,s[15,29]=0.9,s[15,30]=0.2,s[15,31]=-0.2,s[15,32]=-1.2,s[15,33]=0.9,s[15,34]=-0.1,s[15,35]=-1.1,s[15,36]=0.6,s[15,37]=0.1,s[15,38]=-0.1,s[15,39]=-1.0,s[15,40]=0.4,s[15,41]=0.5,s[15,42]=0.7,s[15,43]=0.3,s[15,44]=0.4,s[15,45]=-0.4,s[15,46]=-0.2,s[15,47]=-0.5,s[15,48]=0.6,s[15,49]=0.1,s[15,50]=-0.8,s[15,51]=0.8,s[15,52]=-0.6,s[15,53]=0.5,s[15,54]=-1.2,s[15,55]=-1.0,s[15,56]=0.3,s[15,57]=1.1,s[15,58]=0.3,s[15,59]=-0.4,s[15,60]=-0.3 s[16,1]=0.1,s[16,2]=-0.2,s[16,3]=-0.7,s[16,4]=-1.1,s[16,5]=-0.4,s[16,6]=0.0,s[16,7]=-0.7,s[16,8]=-0.8,s[16,9]=-0.2,s[16,10]=-0.7,s[16,11]=-0.1,s[16,12]=0.1,s[16,13]=0.0,s[16,14]=0.0,s[16,15]=-1.1,s[16,16]=-0.2,s[16,17]=0.3,s[16,18]=1.2,s[16,19]=0.3,s[16,20]=0.9,s[16,21]=0.9,s[16,22]=-0.6,s[16,23]=0.0,s[16,24]=0.8,s[16,25]=1.0,s[16,26]=0.2,s[16,27]=-0.6,s[16,28]=-1.2,s[16,29]=-0.8,s[16,30]=0.5,s[16,31]=0.0,s[16,32]=-0.3,s[16,33]=-0.6,s[16,34]=-0.2,s[16,35]=-0.9,s[16,36]=0.2,s[16,37]=0.2,s[16,38]=-0.8,s[16,39]=-0.3,s[16,40]=-0.8,s[16,41]=-0.2,s[16,42]=1.0,s[16,43]=0.8,s[16,44]=1.0,s[16,45]=0.3,s[16,46]=0.3,s[16,47]=-0.6,s[16,48]=-1.1,s[16,49]=0.6,s[16,50]=-1.0,s[16,51]=0.2,s[16,52]=0.3,s[16,53]=0.1,s[16,54]=0.4,s[16,55]=1.1,s[16,56]=0.6,s[16,57]=-0.3,s[16,58]=0.1,s[16,59]=0.7,s[16,60]=0.0 s[17,1]=0.0,s[17,2]=0.1,s[17,3]=1.1,s[17,4]=1.1,s[17,5]=0.9,s[17,6]=1.2,s[17,7]=-0.8,s[17,8]=-0.3,s[17,9]=0.6,s[17,10]=0.2,s[17,11]=0.0,s[17,12]=0.0,s[17,13]=0.7,s[17,14]=-1.0,s[17,15]=-0.2,s[17,16]=-0.2,s[17,17]=0.2,s[17,18]=0.4,s[17,19]=0.0,s[17,20]=0.2,s[17,21]=0.2,s[17,22]=0.2,s[17,23]=-1.2,s[17,24]=0.0,s[17,25]=-0.8,s[17,26]=0.8,s[17,27]=1.0,s[17,28]=-1.2,s[17,29]=0.1,s[17,30]=0.0,s[17,31]=-0.2,s[17,32]=-0.8,s[17,33]=-0.3,s[17,34]=1.2,s[17,35]=-0.6,s[17,36]=1.0,s[17,37]=-0.9,s[17,38]=0.5,s[17,39]=-0.6,s[17,40]=-1.1,s[17,41]=-1.1,s[17,42]=-0.1,s[17,43]=-0.4,s[17,44]=0.6,s[17,45]=0.1,s[17,46]=-0.2,s[17,47]=0.1,s[17,48]=-1.1,s[17,49]=-1.1,s[17,50]=-0.5,s[17,51]=0.6,s[17,52]=-0.3,s[17,53]=0.8,s[17,54]=0.2,s[17,55]=0.9,s[17,56]=-0.8,s[17,57]=1.1,s[17,58]=0.7,s[17,59]=0.0,s[17,60]=-0.3 s[18,1]=0.1,s[18,2]=-0.1,s[18,3]=0.8,s[18,4]=1.1,s[18,5]=0.9,s[18,6]=-0.7,s[18,7]=0.7,s[18,8]=1.0,s[18,9]=-0.5,s[18,10]=-0.2,s[18,11]=0.0,s[18,12]=-1.1,s[18,13]=-0.7,s[18,14]=0.5,s[18,15]=0.3,s[18,16]=-0.3,s[18,17]=-0.3,s[18,18]=0.2,s[18,19]=1.2,s[18,20]=0.9,s[18,21]=-0.8,s[18,22]=-0.7,s[18,23]=0.0,s[18,24]=-1.2,s[18,25]=-0.5,s[18,26]=-0.4,s[18,27]=0.2,s[18,28]=1.0,s[18,29]=1.0,s[18,30]=-1.1,s[18,31]=0.1,s[18,32]=0.6,s[18,33]=-0.7,s[18,34]=0.0,s[18,35]=-0.1,s[18,36]=1.1,s[18,37]=0.7,s[18,38]=0.7,s[18,39]=-1.1,s[18,40]=1.2,s[18,41]=-1.2,s[18,42]=0.5,s[18,43]=-0.6,s[18,44]=-0.6,s[18,45]=1.0,s[18,46]=0.0,s[18,47]=-0.2,s[18,48]=0.2,s[18,49]=0.6,s[18,50]=-0.2,s[18,51]=0.0,s[18,52]=0.4,s[18,53]=0.2,s[18,54]=0.3,s[18,55]=1.1,s[18,56]=0.7,s[18,57]=-0.7,s[18,58]=0.2,s[18,59]=0.1,s[18,60]=0.9 s[19,1]=0.6,s[19,2]=0.3,s[19,3]=-0.3,s[19,4]=0.2,s[19,5]=-0.4,s[19,6]=0.7,s[19,7]=0.7,s[19,8]=0.8,s[19,9]=0.6,s[19,10]=1.2,s[19,11]=-0.5,s[19,12]=-1.2,s[19,13]=0.7,s[19,14]=-0.9,s[19,15]=-0.8,s[19,16]=-0.4,s[19,17]=0.7,s[19,18]=0.4,s[19,19]=-0.2,s[19,20]=-0.2,s[19,21]=-0.5,s[19,22]=-0.4,s[19,23]=-0.3,s[19,24]=-0.7,s[19,25]=-0.6,s[19,26]=0.0,s[19,27]=0.1,s[19,28]=0.2,s[19,29]=0.7,s[19,30]=0.9,s[19,31]=0.4,s[19,32]=-0.1,s[19,33]=1.1,s[19,34]=-0.4,s[19,35]=0.3,s[19,36]=0.2,s[19,37]=0.6,s[19,38]=-0.3,s[19,39]=-0.5,s[19,40]=0.3,s[19,41]=0.1,s[19,42]=-0.2,s[19,43]=-0.5,s[19,44]=-0.8,s[19,45]=-0.4,s[19,46]=-0.1,s[19,47]=-0.6,s[19,48]=-0.4,s[19,49]=0.7,s[19,50]=1.1,s[19,51]=0.0,s[19,52]=-0.8,s[19,53]=0.1,s[19,54]=0.0,s[19,55]=-0.2,s[19,56]=0.7,s[19,57]=-1.0,s[19,58]=-0.8,s[19,59]=1.0,s[19,60]=-1.1 s[20,1]=0.3,s[20,2]=0.0,s[20,3]=0.7,s[20,4]=1.0,s[20,5]=-0.8,s[20,6]=0.6,s[20,7]=0.1,s[20,8]=-0.8,s[20,9]=-0.7,s[20,10]=0.7,s[20,11]=0.0,s[20,12]=0.6,s[20,13]=-0.1,s[20,14]=0.1,s[20,15]=-0.1,s[20,16]=-1.1,s[20,17]=0.5,s[20,18]=0.9,s[20,19]=-1.1,s[20,20]=-1.2,s[20,21]=0.6,s[20,22]=1.0,s[20,23]=0.9,s[20,24]=0.7,s[20,25]=-0.2,s[20,26]=-0.3,s[20,27]=1.0,s[20,28]=-0.2,s[20,29]=-0.7,s[20,30]=0.2,s[20,31]=0.2,s[20,32]=0.9,s[20,33]=0.2,s[20,34]=0.5,s[20,35]=1.1,s[20,36]=0.4,s[20,37]=-0.8,s[20,38]=-0.7,s[20,39]=1.2,s[20,40]=0.3,s[20,41]=0.5,s[20,42]=-0.9,s[20,43]=0.9,s[20,44]=0.4,s[20,45]=-0.3,s[20,46]=-1.1,s[20,47]=0.1,s[20,48]=0.9,s[20,49]=-0.1,s[20,50]=-0.9,s[20,51]=0.5,s[20,52]=0.3,s[20,53]=0.5,s[20,54]=-0.1,s[20,55]=-0.5,s[20,56]=-1.1,s[20,57]=-0.7,s[20,58]=-0.7,s[20,59]=-0.2,s[20,60]=0.2 s[21,1]=-0.2,s[21,2]=0.0,s[21,3]=0.9,s[21,4]=0.9,s[21,5]=-0.7,s[21,6]=-0.7,s[21,7]=1.2,s[21,8]=-0.2,s[21,9]=-1.0,s[21,10]=-0.7,s[21,11]=-0.4,s[21,12]=1.1,s[21,13]=1.1,s[21,14]=-1.2,s[21,15]=0.6,s[21,16]=0.3,s[21,17]=0.4,s[21,18]=-0.4,s[21,19]=-0.9,s[21,20]=1.0,s[21,21]=1.2,s[21,22]=0.3,s[21,23]=-1.2,s[21,24]=1.1,s[21,25]=0.8,s[21,26]=0.9,s[21,27]=-1.0,s[21,28]=0.6,s[21,29]=0.4,s[21,30]=-1.0,s[21,31]=0.1,s[21,32]=-0.3,s[21,33]=-0.1,s[21,34]=1.2,s[21,35]=-1.1,s[21,36]=-0.7,s[21,37]=1.0,s[21,38]=-1.1,s[21,39]=-0.5,s[21,40]=-1.2,s[21,41]=-0.9,s[21,42]=0.9,s[21,43]=0.1,s[21,44]=-0.6,s[21,45]=-1.2,s[21,46]=-0.1,s[21,47]=0.0,s[21,48]=-0.3,s[21,49]=1.0,s[21,50]=1.2,s[21,51]=-0.7,s[21,52]=0.0,s[21,53]=-0.1,s[21,54]=-0.8,s[21,55]=-0.9,s[21,56]=0.9,s[21,57]=-0.9,s[21,58]=1.2,s[21,59]=0.1,s[21,60]=-0.6 s[22,1]=-0.1,s[22,2]=-0.2,s[22,3]=-0.1,s[22,4]=-1.0,s[22,5]=0.6,s[22,6]=1.1,s[22,7]=0.1,s[22,8]=-0.5,s[22,9]=0.2,s[22,10]=0.5,s[22,11]=-0.1,s[22,12]=-1.1,s[22,13]=-0.3,s[22,14]=0.4,s[22,15]=0.5,s[22,16]=0.2,s[22,17]=-0.1,s[22,18]=1.0,s[22,19]=0.7,s[22,20]=-1.1,s[22,21]=-0.1,s[22,22]=0.9,s[22,23]=-0.7,s[22,24]=0.1,s[22,25]=-0.6,s[22,26]=-0.7,s[22,27]=-1.1,s[22,28]=-0.7,s[22,29]=-1.0,s[22,30]=-0.8,s[22,31]=0.0,s[22,32]=0.2,s[22,33]=1.2,s[22,34]=-0.8,s[22,35]=0.1,s[22,36]=-1.2,s[22,37]=0.5,s[22,38]=-0.1,s[22,39]=0.8,s[22,40]=0.3,s[22,41]=-0.6,s[22,42]=-1.2,s[22,43]=-0.1,s[22,44]=-0.2,s[22,45]=-0.8,s[22,46]=-0.2,s[22,47]=-0.7,s[22,48]=-0.1,s[22,49]=-0.6,s[22,50]=0.7,s[22,51]=-0.3,s[22,52]=0.6,s[22,53]=0.2,s[22,54]=1.1,s[22,55]=-1.2,s[22,56]=0.4,s[22,57]=0.6,s[22,58]=-0.3,s[22,59]=-0.4,s[22,60]=1.1 s[23,1]=-0.1,s[23,2]=0.0,s[23,3]=-0.8,s[23,4]=0.6,s[23,5]=-1.1,s[23,6]=-0.6,s[23,7]=-0.9,s[23,8]=-1.0,s[23,9]=1.2,s[23,10]=0.5,s[23,11]=-1.1,s[23,12]=-1.2,s[23,13]=-0.1,s[23,14]=-0.5,s[23,15]=0.0,s[23,16]=0.4,s[23,17]=0.3,s[23,18]=0.1,s[23,19]=0.9,s[23,20]=0.0,s[23,21]=-0.9,s[23,22]=-0.4,s[23,23]=1.2,s[23,24]=-0.7,s[23,25]=0.2,s[23,26]=0.4,s[23,27]=0.9,s[23,28]=-1.1,s[23,29]=0.1,s[23,30]=0.5,s[23,31]=-0.1,s[23,32]=-0.8,s[23,33]=-1.0,s[23,34]=0.8,s[23,35]=0.4,s[23,36]=1.2,s[23,37]=0.0,s[23,38]=-0.9,s[23,39]=0.5,s[23,40]=-1.0,s[23,41]=0.6,s[23,42]=1.1,s[23,43]=0.2,s[23,44]=1.0,s[23,45]=0.6,s[23,46]=-0.4,s[23,47]=0.1,s[23,48]=0.0,s[23,49]=-0.6,s[23,50]=-1.0,s[23,51]=0.4,s[23,52]=-0.2,s[23,53]=0.0,s[23,54]=-1.0,s[23,55]=-1.2,s[23,56]=-0.3,s[23,57]=0.3,s[23,58]=1.2,s[23,59]=0.3,s[23,60]=0.2 s[24,1]=-0.3,s[24,2]=0.1,s[24,3]=-0.1,s[24,4]=0.0,s[24,5]=-0.5,s[24,6]=-0.4,s[24,7]=-1.0,s[24,8]=0.0,s[24,9]=-1.0,s[24,10]=-0.9,s[24,11]=-0.6,s[24,12]=-0.3,s[24,13]=-0.8,s[24,14]=-0.3,s[24,15]=-1.0,s[24,16]=-0.1,s[24,17]=0.8,s[24,18]=-0.3,s[24,19]=0.9,s[24,20]=-0.4,s[24,21]=-0.1,s[24,22]=-0.4,s[24,23]=-0.4,s[24,24]=0.2,s[24,25]=-0.8,s[24,26]=0.0,s[24,27]=0.6,s[24,28]=0.8,s[24,29]=-0.7,s[24,30]=0.0,s[24,31]=0.3,s[24,32]=1.1,s[24,33]=-0.3,s[24,34]=-0.1,s[24,35]=-0.6,s[24,36]=-1.0,s[24,37]=-0.9,s[24,38]=-0.3,s[24,39]=-1.1,s[24,40]=-0.9,s[24,41]=0.2,s[24,42]=0.0,s[24,43]=-0.5,s[24,44]=0.5,s[24,45]=-0.5,s[24,46]=-0.5,s[24,47]=-0.3,s[24,48]=-0.4,s[24,49]=0.9,s[24,50]=1.1,s[24,51]=0.2,s[24,52]=-0.2,s[24,53]=-0.9,s[24,54]=0.2,s[24,55]=0.7,s[24,56]=-0.2,s[24,57]=0.0,s[24,58]=0.7,s[24,59]=-0.7,s[24,60]=0.1 s[25,1]=0.3,s[25,2]=0.8,s[25,3]=-1.2,s[25,4]=1.0,s[25,5]=-0.4,s[25,6]=-0.7,s[25,7]=-0.6,s[25,8]=1.1,s[25,9]=-0.3,s[25,10]=0.9,s[25,11]=-0.5,s[25,12]=-0.2,s[25,13]=-0.2,s[25,14]=-0.1,s[25,15]=-0.7,s[25,16]=0.5,s[25,17]=-0.3,s[25,18]=-0.4,s[25,19]=0.5,s[25,20]=-0.5,s[25,21]=0.3,s[25,22]=-0.3,s[25,23]=-0.9,s[25,24]=0.7,s[25,25]=0.5,s[25,26]=0.9,s[25,27]=0.5,s[25,28]=-0.2,s[25,29]=-0.6,s[25,30]=-1.0,s[25,31]=0.2,s[25,32]=0.9,s[25,33]=-0.4,s[25,34]=-0.7,s[25,35]=-0.6,s[25,36]=-1.2,s[25,37]=-0.3,s[25,38]=0.3,s[25,39]=-1.0,s[25,40]=1.0,s[25,41]=0.7,s[25,42]=0.4,s[25,43]=-0.4,s[25,44]=-0.6,s[25,45]=0.0,s[25,46]=0.0,s[25,47]=0.1,s[25,48]=0.9,s[25,49]=0.0,s[25,50]=0.1,s[25,51]=-0.3,s[25,52]=-0.4,s[25,53]=1.1,s[25,54]=-0.3,s[25,55]=-1.2,s[25,56]=-0.8,s[25,57]=0.7,s[25,58]=0.9,s[25,59]=-0.7,s[25,60]=0.7 s[26,1]=-0.1,s[26,2]=-1.0,s[26,3]=-0.9,s[26,4]=-1.1,s[26,5]=1.2,s[26,6]=-1.1,s[26,7]=-0.5,s[26,8]=-0.2,s[26,9]=0.4,s[26,10]=-0.1,s[26,11]=0.4,s[26,12]=-0.6,s[26,13]=0.9,s[26,14]=-1.2,s[26,15]=0.0,s[26,16]=-0.1,s[26,17]=0.0,s[26,18]=0.7,s[26,19]=-1.1,s[26,20]=-0.9,s[26,21]=-1.1,s[26,22]=-0.1,s[26,23]=-0.1,s[26,24]=0.7,s[26,25]=-0.6,s[26,26]=-0.7,s[26,27]=0.8,s[26,28]=0.0,s[26,29]=0.0,s[26,30]=1.1,s[26,31]=0.5,s[26,32]=-0.1,s[26,33]=0.9,s[26,34]=-0.8,s[26,35]=-1.0,s[26,36]=-0.1,s[26,37]=1.2,s[26,38]=0.4,s[26,39]=-1.1,s[26,40]=0.1,s[26,41]=0.0,s[26,42]=0.5,s[26,43]=0.7,s[26,44]=0.3,s[26,45]=-0.8,s[26,46]=0.1,s[26,47]=-0.3,s[26,48]=0.2,s[26,49]=1.2,s[26,50]=0.4,s[26,51]=0.5,s[26,52]=1.2,s[26,53]=0.8,s[26,54]=1.1,s[26,55]=0.6,s[26,56]=0.6,s[26,57]=-1.0,s[26,58]=-0.7,s[26,59]=0.0,s[26,60]=-0.7 s[27,1]=0.2,s[27,2]=-0.8,s[27,3]=0.3,s[27,4]=-0.7,s[27,5]=0.7,s[27,6]=-0.6,s[27,7]=0.0,s[27,8]=1.0,s[27,9]=-0.1,s[27,10]=1.1,s[27,11]=1.0,s[27,12]=0.9,s[27,13]=-0.4,s[27,14]=0.6,s[27,15]=-0.1,s[27,16]=-0.2,s[27,17]=-1.0,s[27,18]=0.2,s[27,19]=0.0,s[27,20]=-0.6,s[27,21]=0.9,s[27,22]=-1.1,s[27,23]=-1.2,s[27,24]=0.8,s[27,25]=-0.6,s[27,26]=0.3,s[27,27]=-0.6,s[27,28]=0.7,s[27,29]=0.2,s[27,30]=-1.1,s[27,31]=0.2,s[27,32]=-0.4,s[27,33]=0.7,s[27,34]=-0.5,s[27,35]=-0.5,s[27,36]=0.2,s[27,37]=0.2,s[27,38]=-0.5,s[27,39]=-0.3,s[27,40]=1.1,s[27,41]=0.1,s[27,42]=-0.3,s[27,43]=-1.1,s[27,44]=-0.2,s[27,45]=-0.2,s[27,46]=0.1,s[27,47]=-1.0,s[27,48]=0.8,s[27,49]=-0.5,s[27,50]=0.8,s[27,51]=0.5,s[27,52]=-0.8,s[27,53]=-0.4,s[27,54]=0.5,s[27,55]=1.0,s[27,56]=-0.1,s[27,57]=1.1,s[27,58]=-0.8,s[27,59]=-0.3,s[27,60]=0.3 s[28,1]=0.1,s[28,2]=0.7,s[28,3]=-0.9,s[28,4]=0.0,s[28,5]=0.0,s[28,6]=1.2,s[28,7]=-0.5,s[28,8]=0.8,s[28,9]=-0.4,s[28,10]=-0.6,s[28,11]=-1.1,s[28,12]=-0.1,s[28,13]=-0.7,s[28,14]=0.4,s[28,15]=0.6,s[28,16]=0.1,s[28,17]=-0.9,s[28,18]=1.1,s[28,19]=-1.0,s[28,20]=0.5,s[28,21]=0.2,s[28,22]=0.2,s[28,23]=0.3,s[28,24]=1.0,s[28,25]=-0.8,s[28,26]=-1.1,s[28,27]=0.7,s[28,28]=-1.1,s[28,29]=-0.3,s[28,30]=-0.4,s[28,31]=-0.2,s[28,32]=0.8,s[28,33]=1.2,s[28,34]=-0.7,s[28,35]=-0.2,s[28,36]=-0.3,s[28,37]=-1.0,s[28,38]=1.2,s[28,39]=0.8,s[28,40]=0.8,s[28,41]=0.7,s[28,42]=0.7,s[28,43]=-0.7,s[28,44]=0.0,s[28,45]=0.1,s[28,46]=-0.6,s[28,47]=0.4,s[28,48]=1.1,s[28,49]=-0.9,s[28,50]=-1.1,s[28,51]=-1.0,s[28,52]=0.5,s[28,53]=-1.1,s[28,54]=1.2,s[28,55]=-0.2,s[28,56]=0.1,s[28,57]=-0.7,s[28,58]=1.0,s[28,59]=0.2,s[28,60]=-0.2 s[29,1]=-0.4,s[29,2]=-0.7,s[29,3]=-0.4,s[29,4]=0.8,s[29,5]=-0.1,s[29,6]=0.6,s[29,7]=0.4,s[29,8]=-0.3,s[29,9]=0.2,s[29,10]=-0.8,s[29,11]=-0.2,s[29,12]=-0.9,s[29,13]=-1.2,s[29,14]=-0.4,s[29,15]=-0.8,s[29,16]=0.0,s[29,17]=0.0,s[29,18]=1.1,s[29,19]=0.8,s[29,20]=1.0,s[29,21]=0.6,s[29,22]=0.8,s[29,23]=0.0,s[29,24]=-1.0,s[29,25]=0.5,s[29,26]=1.2,s[29,27]=-1.2,s[29,28]=-0.8,s[29,29]=-0.6,s[29,30]=1.0,s[29,31]=-0.5,s[29,32]=0.6,s[29,33]=1.2,s[29,34]=0.1,s[29,35]=-0.8,s[29,36]=1.0,s[29,37]=0.0,s[29,38]=0.5,s[29,39]=1.2,s[29,40]=0.3,s[29,41]=-0.2,s[29,42]=0.9,s[29,43]=-0.2,s[29,44]=0.0,s[29,45]=-0.1,s[29,46]=-0.2,s[29,47]=0.1,s[29,48]=-0.2,s[29,49]=-0.6,s[29,50]=0.0,s[29,51]=-0.9,s[29,52]=-0.6,s[29,53]=0.3,s[29,54]=-0.4,s[29,55]=-1.0,s[29,56]=-1.1,s[29,57]=-1.1,s[29,58]=0.1,s[29,59]=-0.6,s[29,60]=-0.3 s[30,1]=-0.3,s[30,2]=-0.1,s[30,3]=1.0,s[30,4]=-0.8,s[30,5]=-1.2,s[30,6]=1.0,s[30,7]=-0.6,s[30,8]=0.0,s[30,9]=0.8,s[30,10]=-0.4,s[30,11]=-0.4,s[30,12]=0.9,s[30,13]=0.8,s[30,14]=-0.2,s[30,15]=0.5,s[30,16]=-0.2,s[30,17]=-0.9,s[30,18]=-0.4,s[30,19]=-0.1,s[30,20]=-0.9,s[30,21]=0.3,s[30,22]=0.7,s[30,23]=-0.6,s[30,24]=1.2,s[30,25]=0.2,s[30,26]=0.2,s[30,27]=-0.4,s[30,28]=-1.1,s[30,29]=1.0,s[30,30]=0.9,s[30,31]=0.2,s[30,32]=-0.5,s[30,33]=-0.4,s[30,34]=0.0,s[30,35]=1.0,s[30,36]=1.1,s[30,37]=0.0,s[30,38]=-0.4,s[30,39]=-0.2,s[30,40]=1.1,s[30,41]=0.3,s[30,42]=0.8,s[30,43]=-0.6,s[30,44]=-0.7,s[30,45]=0.1,s[30,46]=0.1,s[30,47]=0.7,s[30,48]=0.4,s[30,49]=0.8,s[30,50]=0.8,s[30,51]=0.5,s[30,52]=-0.9,s[30,53]=0.8,s[30,54]=0.3,s[30,55]=-1.0,s[30,56]=-0.1,s[30,57]=0.6,s[30,58]=0.8,s[30,59]=-1.0,s[30,60]=1.2 s[31,1]=0.0,s[31,2]=0.8,s[31,3]=0.2,s[31,4]=-0.2,s[31,5]=0.4,s[31,6]=-0.1,s[31,7]=0.0,s[31,8]=-1.0,s[31,9]=1.0,s[31,10]=0.2,s[31,11]=0.3,s[31,12]=-1.0,s[31,13]=0.0,s[31,14]=1.0,s[31,15]=1.2,s[31,16]=-0.2,s[31,17]=1.2,s[31,18]=1.2,s[31,19]=-0.9,s[31,20]=-0.2,s[31,21]=0.7,s[31,22]=0.2,s[31,23]=-0.1,s[31,24]=-0.7,s[31,25]=-0.9,s[31,26]=0.6,s[31,27]=-0.3,s[31,28]=1.1,s[31,29]=1.1,s[31,30]=0.9,s[31,31]=0.8,s[31,32]=0.4,s[31,33]=0.1,s[31,34]=0.8,s[31,35]=0.8,s[31,36]=0.1,s[31,37]=-1.1,s[31,38]=0.8,s[31,39]=0.5,s[31,40]=0.2,s[31,41]=-0.9,s[31,42]=0.1,s[31,43]=0.7,s[31,44]=-1.0,s[31,45]=-0.6,s[31,46]=-0.1,s[31,47]=-0.7,s[31,48]=-0.1,s[31,49]=1.1,s[31,50]=0.2,s[31,51]=0.6,s[31,52]=0.2,s[31,53]=1.1,s[31,54]=-1.1,s[31,55]=-0.4,s[31,56]=0.0,s[31,57]=0.8,s[31,58]=1.2,s[31,59]=0.2,s[31,60]=-1.0 s[32,1]=0.1,s[32,2]=1.2,s[32,3]=0.8,s[32,4]=-0.7,s[32,5]=-0.8,s[32,6]=0.1,s[32,7]=0.1,s[32,8]=0.2,s[32,9]=0.0,s[32,10]=0.9,s[32,11]=0.3,s[32,12]=-0.4,s[32,13]=1.2,s[32,14]=0.4,s[32,15]=0.6,s[32,16]=0.2,s[32,17]=0.3,s[32,18]=-0.3,s[32,19]=-1.0,s[32,20]=-0.6,s[32,21]=-0.8,s[32,22]=-0.3,s[32,23]=1.0,s[32,24]=-0.5,s[32,25]=0.1,s[32,26]=-0.8,s[32,27]=1.0,s[32,28]=-0.6,s[32,29]=-0.9,s[32,30]=-1.2,s[32,31]=-0.1,s[32,32]=-0.1,s[32,33]=0.8,s[32,34]=1.0,s[32,35]=0.2,s[32,36]=-0.1,s[32,37]=0.2,s[32,38]=-0.1,s[32,39]=-1.2,s[32,40]=1.1,s[32,41]=-0.7,s[32,42]=-0.2,s[32,43]=0.0,s[32,44]=-0.1,s[32,45]=0.8,s[32,46]=0.0,s[32,47]=-0.3,s[32,48]=-0.5,s[32,49]=-0.9,s[32,50]=0.7,s[32,51]=0.4,s[32,52]=0.1,s[32,53]=-0.4,s[32,54]=-0.1,s[32,55]=1.0,s[32,56]=0.5,s[32,57]=-0.5,s[32,58]=-0.7,s[32,59]=-0.1,s[32,60]=-0.7 s[33,1]=-0.3,s[33,2]=-0.1,s[33,3]=0.0,s[33,4]=-0.8,s[33,5]=0.6,s[33,6]=-1.0,s[33,7]=-0.7,s[33,8]=0.3,s[33,9]=-0.5,s[33,10]=-1.1,s[33,11]=0.0,s[33,12]=0.9,s[33,13]=-1.0,s[33,14]=-0.2,s[33,15]=-0.3,s[33,16]=-0.2,s[33,17]=-0.2,s[33,18]=0.6,s[33,19]=-0.1,s[33,20]=-1.2,s[33,21]=0.4,s[33,22]=-0.7,s[33,23]=0.5,s[33,24]=0.1,s[33,25]=-0.9,s[33,26]=0.2,s[33,27]=1.0,s[33,28]=-0.5,s[33,29]=-0.5,s[33,30]=-0.7,s[33,31]=-0.5,s[33,32]=0.5,s[33,33]=-0.9,s[33,34]=0.8,s[33,35]=0.8,s[33,36]=-0.7,s[33,37]=-0.9,s[33,38]=0.8,s[33,39]=-0.2,s[33,40]=-0.3,s[33,41]=-0.2,s[33,42]=0.0,s[33,43]=-0.1,s[33,44]=0.7,s[33,45]=1.0,s[33,46]=0.0,s[33,47]=0.5,s[33,48]=0.3,s[33,49]=-0.5,s[33,50]=-0.6,s[33,51]=0.9,s[33,52]=-0.1,s[33,53]=0.7,s[33,54]=-0.7,s[33,55]=-0.2,s[33,56]=-0.6,s[33,57]=-1.1,s[33,58]=-0.4,s[33,59]=-0.5,s[33,60]=0.6 s[34,1]=-0.1,s[34,2]=1.0,s[34,3]=0.3,s[34,4]=-0.5,s[34,5]=1.1,s[34,6]=-1.1,s[34,7]=1.1,s[34,8]=1.1,s[34,9]=-0.7,s[34,10]=1.0,s[34,11]=-0.4,s[34,12]=0.6,s[34,13]=-1.1,s[34,14]=0.0,s[34,15]=0.7,s[34,16]=0.1,s[34,17]=-0.1,s[34,18]=-0.9,s[34,19]=-0.4,s[34,20]=0.4,s[34,21]=-0.3,s[34,22]=-0.8,s[34,23]=1.0,s[34,24]=0.0,s[34,25]=-0.5,s[34,26]=0.7,s[34,27]=1.0,s[34,28]=-0.5,s[34,29]=-1.2,s[34,30]=0.2,s[34,31]=0.6,s[34,32]=1.1,s[34,33]=1.2,s[34,34]=-0.8,s[34,35]=-0.4,s[34,36]=0.6,s[34,37]=-0.3,s[34,38]=0.7,s[34,39]=-1.2,s[34,40]=0.5,s[34,41]=0.2,s[34,42]=0.4,s[34,43]=-1.2,s[34,44]=-1.0,s[34,45]=-0.9,s[34,46]=0.4,s[34,47]=0.3,s[34,48]=1.2,s[34,49]=0.9,s[34,50]=0.0,s[34,51]=0.5,s[34,52]=0.4,s[34,53]=-0.1,s[34,54]=-0.8,s[34,55]=0.8,s[34,56]=0.1,s[34,57]=-0.7,s[34,58]=-0.6,s[34,59]=-0.3,s[34,60]=1.1 s[35,1]=-0.7,s[35,2]=-0.7,s[35,3]=-0.2,s[35,4]=-1.1,s[35,5]=0.1,s[35,6]=-0.4,s[35,7]=1.0,s[35,8]=-1.0,s[35,9]=1.2,s[35,10]=-0.4,s[35,11]=-1.0,s[35,12]=-0.5,s[35,13]=-0.3,s[35,14]=-0.1,s[35,15]=0.9,s[35,16]=-0.1,s[35,17]=1.0,s[35,18]=0.9,s[35,19]=-1.0,s[35,20]=0.5,s[35,21]=1.1,s[35,22]=-0.4,s[35,23]=1.2,s[35,24]=-1.0,s[35,25]=-0.6,s[35,26]=-0.4,s[35,27]=-0.2,s[35,28]=-1.2,s[35,29]=-0.1,s[35,30]=-0.5,s[35,31]=0.0,s[35,32]=-1.0,s[35,33]=-0.9,s[35,34]=1.0,s[35,35]=0.3,s[35,36]=0.3,s[35,37]=-0.5,s[35,38]=0.3,s[35,39]=-0.6,s[35,40]=-0.9,s[35,41]=0.2,s[35,42]=-0.2,s[35,43]=0.4,s[35,44]=1.0,s[35,45]=0.7,s[35,46]=-0.6,s[35,47]=0.6,s[35,48]=-0.1,s[35,49]=-0.6,s[35,50]=0.5,s[35,51]=0.1,s[35,52]=0.7,s[35,53]=1.1,s[35,54]=-1.2,s[35,55]=-1.1,s[35,56]=0.8,s[35,57]=-1.1,s[35,58]=0.1,s[35,59]=-1.0,s[35,60]=0.1 s[36,1]=0.3,s[36,2]=-0.4,s[36,3]=0.5,s[36,4]=0.4,s[36,5]=0.8,s[36,6]=0.5,s[36,7]=0.4,s[36,8]=1.0,s[36,9]=0.7,s[36,10]=0.1,s[36,11]=0.9,s[36,12]=-0.9,s[36,13]=1.0,s[36,14]=-0.2,s[36,15]=-0.9,s[36,16]=-0.6,s[36,17]=-0.1,s[36,18]=-0.2,s[36,19]=-0.7,s[36,20]=-0.9,s[36,21]=-0.3,s[36,22]=-1.0,s[36,23]=-1.0,s[36,24]=0.9,s[36,25]=-0.8,s[36,26]=0.3,s[36,27]=-1.1,s[36,28]=1.0,s[36,29]=0.3,s[36,30]=0.5,s[36,31]=0.4,s[36,32]=-0.4,s[36,33]=0.2,s[36,34]=0.3,s[36,35]=-0.3,s[36,36]=0.9,s[36,37]=-0.7,s[36,38]=-1.0,s[36,39]=-0.2,s[36,40]=-0.1,s[36,41]=0.1,s[36,42]=-0.6,s[36,43]=-0.5,s[36,44]=0.2,s[36,45]=0.0,s[36,46]=0.2,s[36,47]=0.1,s[36,48]=0.5,s[36,49]=-0.3,s[36,50]=-0.3,s[36,51]=1.2,s[36,52]=1.1,s[36,53]=0.6,s[36,54]=0.3,s[36,55]=0.6,s[36,56]=0.2,s[36,57]=-0.8,s[36,58]=-0.5,s[36,59]=-0.3,s[36,60]=1.1 s[37,1]=0.2,s[37,2]=0.2,s[37,3]=-0.6,s[37,4]=0.3,s[37,5]=0.5,s[37,6]=1.1,s[37,7]=1.2,s[37,8]=-0.2,s[37,9]=-1.1,s[37,10]=-1.2,s[37,11]=0.5,s[37,12]=0.8,s[37,13]=0.5,s[37,14]=0.6,s[37,15]=-0.7,s[37,16]=-0.3,s[37,17]=1.0,s[37,18]=0.8,s[37,19]=-0.2,s[37,20]=1.0,s[37,21]=-0.3,s[37,22]=0.8,s[37,23]=-1.1,s[37,24]=-1.0,s[37,25]=0.4,s[37,26]=0.4,s[37,27]=-0.6,s[37,28]=-0.3,s[37,29]=1.0,s[37,30]=-0.8,s[37,31]=0.1,s[37,32]=-1.1,s[37,33]=0.7,s[37,34]=0.0,s[37,35]=0.5,s[37,36]=-1.1,s[37,37]=-0.4,s[37,38]=0.4,s[37,39]=-0.6,s[37,40]=0.4,s[37,41]=-0.9,s[37,42]=-0.6,s[37,43]=-0.3,s[37,44]=0.5,s[37,45]=-1.1,s[37,46]=0.2,s[37,47]=-0.8,s[37,48]=0.9,s[37,49]=1.2,s[37,50]=0.5,s[37,51]=-0.2,s[37,52]=-1.2,s[37,53]=-0.3,s[37,54]=0.4,s[37,55]=-0.3,s[37,56]=-0.1,s[37,57]=0.4,s[37,58]=0.7,s[37,59]=0.0,s[37,60]=-0.9 s[38,1]=0.4,s[38,2]=-0.4,s[38,3]=-0.3,s[38,4]=-1.1,s[38,5]=0.7,s[38,6]=0.0,s[38,7]=-0.1,s[38,8]=-0.6,s[38,9]=0.2,s[38,10]=0.3,s[38,11]=-0.8,s[38,12]=0.6,s[38,13]=-1.1,s[38,14]=0.7,s[38,15]=0.8,s[38,16]=0.1,s[38,17]=-0.3,s[38,18]=0.4,s[38,19]=1.2,s[38,20]=-0.8,s[38,21]=-0.7,s[38,22]=0.2,s[38,23]=0.3,s[38,24]=-0.7,s[38,25]=0.6,s[38,26]=-0.3,s[38,27]=0.7,s[38,28]=0.5,s[38,29]=-1.1,s[38,30]=1.0,s[38,31]=0.4,s[38,32]=1.1,s[38,33]=-0.2,s[38,34]=-1.0,s[38,35]=-0.4,s[38,36]=-0.3,s[38,37]=0.5,s[38,38]=-0.8,s[38,39]=0.0,s[38,40]=0.6,s[38,41]=-0.5,s[38,42]=0.9,s[38,43]=0.1,s[38,44]=0.5,s[38,45]=-1.2,s[38,46]=0.5,s[38,47]=0.0,s[38,48]=1.1,s[38,49]=0.7,s[38,50]=0.6,s[38,51]=0.3,s[38,52]=-0.2,s[38,53]=-1.2,s[38,54]=0.1,s[38,55]=-0.5,s[38,56]=-0.1,s[38,57]=-0.3,s[38,58]=-0.2,s[38,59]=0.3,s[38,60]=-1.2 s[39,1]=-0.7,s[39,2]=-0.6,s[39,3]=0.9,s[39,4]=-0.5,s[39,5]=-0.2,s[39,6]=0.9,s[39,7]=0.8,s[39,8]=0.4,s[39,9]=-0.8,s[39,10]=-0.8,s[39,11]=-0.6,s[39,12]=0.9,s[39,13]=-1.2,s[39,14]=0.0,s[39,15]=1.1,s[39,16]=0.2,s[39,17]=0.9,s[39,18]=1.0,s[39,19]=-0.6,s[39,20]=-0.5,s[39,21]=-0.3,s[39,22]=-1.0,s[39,23]=1.1,s[39,24]=0.4,s[39,25]=-0.7,s[39,26]=0.4,s[39,27]=-0.9,s[39,28]=0.1,s[39,29]=0.3,s[39,30]=-0.1,s[39,31]=0.1,s[39,32]=-0.6,s[39,33]=-0.1,s[39,34]=0.9,s[39,35]=1.2,s[39,36]=-0.7,s[39,37]=0.1,s[39,38]=0.5,s[39,39]=0.0,s[39,40]=-1.0,s[39,41]=1.0,s[39,42]=-0.5,s[39,43]=-1.0,s[39,44]=0.3,s[39,45]=-0.2,s[39,46]=0.6,s[39,47]=0.4,s[39,48]=0.6,s[39,49]=-0.4,s[39,50]=1.1,s[39,51]=0.8,s[39,52]=-1.2,s[39,53]=-1.2,s[39,54]=0.2,s[39,55]=-0.8,s[39,56]=-0.1,s[39,57]=-0.5,s[39,58]=-0.3,s[39,59]=0.6,s[39,60]=-0.5 s[40,1]=-0.3,s[40,2]=0.1,s[40,3]=0.0,s[40,4]=-0.5,s[40,5]=-1.0,s[40,6]=-1.0,s[40,7]=-1.0,s[40,8]=-0.4,s[40,9]=-0.8,s[40,10]=1.1,s[40,11]=-0.8,s[40,12]=0.6,s[40,13]=0.6,s[40,14]=-0.8,s[40,15]=0.7,s[40,16]=-0.3,s[40,17]=-0.2,s[40,18]=1.2,s[40,19]=-0.5,s[40,20]=-1.2,s[40,21]=1.1,s[40,22]=0.4,s[40,23]=-0.2,s[40,24]=1.0,s[40,25]=-0.8,s[40,26]=-0.6,s[40,27]=0.3,s[40,28]=-1.0,s[40,29]=-0.5,s[40,30]=0.9,s[40,31]=0.1,s[40,32]=-1.0,s[40,33]=0.9,s[40,34]=-0.8,s[40,35]=0.7,s[40,36]=1.0,s[40,37]=0.3,s[40,38]=-1.2,s[40,39]=0.2,s[40,40]=-1.1,s[40,41]=-0.3,s[40,42]=-0.7,s[40,43]=-0.9,s[40,44]=-0.1,s[40,45]=0.2,s[40,46]=0.7,s[40,47]=0.9,s[40,48]=-0.8,s[40,49]=-1.0,s[40,50]=-0.7,s[40,51]=-0.6,s[40,52]=-0.9,s[40,53]=-0.3,s[40,54]=1.1,s[40,55]=-0.7,s[40,56]=0.8,s[40,57]=-0.6,s[40,58]=-0.1,s[40,59]=-1.1,s[40,60]=0.4 s[41,1]=0.1,s[41,2]=0.5,s[41,3]=-0.3,s[41,4]=1.1,s[41,5]=-0.4,s[41,6]=-1.0,s[41,7]=-0.1,s[41,8]=0.3,s[41,9]=1.2,s[41,10]=0.9,s[41,11]=0.1,s[41,12]=-0.2,s[41,13]=-0.4,s[41,14]=0.6,s[41,15]=-0.3,s[41,16]=-1.0,s[41,17]=0.7,s[41,18]=0.2,s[41,19]=-0.4,s[41,20]=0.5,s[41,21]=0.6,s[41,22]=0.3,s[41,23]=0.7,s[41,24]=-0.1,s[41,25]=0.6,s[41,26]=0.8,s[41,27]=0.6,s[41,28]=-1.2,s[41,29]=-0.3,s[41,30]=0.3,s[41,31]=-0.3,s[41,32]=-0.6,s[41,33]=0.8,s[41,34]=0.0,s[41,35]=0.6,s[41,36]=-0.4,s[41,37]=0.1,s[41,38]=0.3,s[41,39]=-0.2,s[41,40]=0.0,s[41,41]=0.1,s[41,42]=0.7,s[41,43]=-0.6,s[41,44]=-0.3,s[41,45]=0.2,s[41,46]=-0.5,s[41,47]=0.3,s[41,48]=0.9,s[41,49]=-0.5,s[41,50]=-1.0,s[41,51]=-0.8,s[41,52]=0.2,s[41,53]=0.0,s[41,54]=-0.4,s[41,55]=0.8,s[41,56]=0.2,s[41,57]=0.9,s[41,58]=0.8,s[41,59]=0.9,s[41,60]=-0.6 s[42,1]=0.0,s[42,2]=-0.3,s[42,3]=-0.5,s[42,4]=-0.6,s[42,5]=-1.1,s[42,6]=0.6,s[42,7]=-0.6,s[42,8]=-0.1,s[42,9]=1.0,s[42,10]=-1.2,s[42,11]=0.2,s[42,12]=0.2,s[42,13]=0.1,s[42,14]=-1.2,s[42,15]=0.0,s[42,16]=-0.1,s[42,17]=0.4,s[42,18]=-1.1,s[42,19]=0.3,s[42,20]=0.9,s[42,21]=0.7,s[42,22]=-0.5,s[42,23]=-1.0,s[42,24]=0.4,s[42,25]=-0.2,s[42,26]=0.0,s[42,27]=0.4,s[42,28]=0.2,s[42,29]=-0.1,s[42,30]=0.9,s[42,31]=-0.4,s[42,32]=-0.4,s[42,33]=-0.7,s[42,34]=0.7,s[42,35]=0.5,s[42,36]=0.3,s[42,37]=-0.2,s[42,38]=0.9,s[42,39]=0.7,s[42,40]=-0.7,s[42,41]=-0.5,s[42,42]=-1.2,s[42,43]=0.9,s[42,44]=-0.9,s[42,45]=-1.2,s[42,46]=-0.1,s[42,47]=0.1,s[42,48]=-0.1,s[42,49]=1.1,s[42,50]=0.6,s[42,51]=0.2,s[42,52]=-0.5,s[42,53]=0.6,s[42,54]=-0.5,s[42,55]=-0.9,s[42,56]=0.3,s[42,57]=-1.2,s[42,58]=1.1,s[42,59]=-0.5,s[42,60]=0.1 s[43,1]=-0.1,s[43,2]=1.0,s[43,3]=-1.2,s[43,4]=0.9,s[43,5]=0.4,s[43,6]=0.3,s[43,7]=0.8,s[43,8]=-0.6,s[43,9]=0.4,s[43,10]=0.4,s[43,11]=-0.7,s[43,12]=1.0,s[43,13]=0.9,s[43,14]=-0.1,s[43,15]=1.2,s[43,16]=-0.1,s[43,17]=0.3,s[43,18]=-0.5,s[43,19]=-0.2,s[43,20]=1.2,s[43,21]=-1.0,s[43,22]=-0.5,s[43,23]=0.4,s[43,24]=-0.4,s[43,25]=-1.2,s[43,26]=-0.4,s[43,27]=0.9,s[43,28]=-1.0,s[43,29]=-1.0,s[43,30]=-0.8,s[43,31]=-0.5,s[43,32]=0.7,s[43,33]=-0.7,s[43,34]=-0.6,s[43,35]=0.0,s[43,36]=-0.9,s[43,37]=0.1,s[43,38]=1.0,s[43,39]=-0.6,s[43,40]=0.9,s[43,41]=-0.9,s[43,42]=1.0,s[43,43]=0.9,s[43,44]=0.5,s[43,45]=0.4,s[43,46]=0.6,s[43,47]=0.1,s[43,48]=-1.0,s[43,49]=-0.9,s[43,50]=-0.2,s[43,51]=-0.7,s[43,52]=-0.4,s[43,53]=-0.8,s[43,54]=0.2,s[43,55]=0.8,s[43,56]=0.0,s[43,57]=0.3,s[43,58]=0.9,s[43,59]=-0.3,s[43,60]=-0.3 s[44,1]=0.3,s[44,2]=-0.1,s[44,3]=0.2,s[44,4]=-1.1,s[44,5]=0.2,s[44,6]=-1.0,s[44,7]=0.2,s[44,8]=0.3,s[44,9]=0.2,s[44,10]=-1.2,s[44,11]=0.1,s[44,12]=-0.2,s[44,13]=-0.1,s[44,14]=0.5,s[44,15]=0.2,s[44,16]=0.1,s[44,17]=-1.2,s[44,18]=-1.1,s[44,19]=0.9,s[44,20]=0.5,s[44,21]=0.1,s[44,22]=-0.8,s[44,23]=1.2,s[44,24]=-0.3,s[44,25]=-0.3,s[44,26]=1.0,s[44,27]=0.2,s[44,28]=-1.2,s[44,29]=0.0,s[44,30]=0.9,s[44,31]=0.5,s[44,32]=-0.1,s[44,33]=1.1,s[44,34]=-1.2,s[44,35]=-1.2,s[44,36]=0.4,s[44,37]=-0.4,s[44,38]=-0.5,s[44,39]=1.0,s[44,40]=0.8,s[44,41]=0.5,s[44,42]=-0.4,s[44,43]=0.6,s[44,44]=-1.1,s[44,45]=0.5,s[44,46]=0.1,s[44,47]=0.4,s[44,48]=1.2,s[44,49]=0.8,s[44,50]=-1.1,s[44,51]=-0.9,s[44,52]=0.1,s[44,53]=0.0,s[44,54]=-0.9,s[44,55]=-1.0,s[44,56]=-0.7,s[44,57]=0.1,s[44,58]=-1.1,s[44,59]=0.7,s[44,60]=-0.6 s[45,1]=0.3,s[45,2]=-0.8,s[45,3]=0.7,s[45,4]=-0.1,s[45,5]=1.1,s[45,6]=-0.3,s[45,7]=0.6,s[45,8]=1.0,s[45,9]=1.0,s[45,10]=0.3,s[45,11]=0.4,s[45,12]=-0.5,s[45,13]=-1.1,s[45,14]=-0.1,s[45,15]=0.4,s[45,16]=0.0,s[45,17]=-0.7,s[45,18]=-1.0,s[45,19]=-0.8,s[45,20]=1.2,s[45,21]=0.1,s[45,22]=0.0,s[45,23]=-0.6,s[45,24]=-1.0,s[45,25]=0.8,s[45,26]=0.6,s[45,27]=0.1,s[45,28]=-0.3,s[45,29]=0.5,s[45,30]=0.3,s[45,31]=-0.1,s[45,32]=0.6,s[45,33]=0.3,s[45,34]=-0.4,s[45,35]=-0.4,s[45,36]=-0.3,s[45,37]=-0.8,s[45,38]=0.4,s[45,39]=1.0,s[45,40]=-0.6,s[45,41]=-0.1,s[45,42]=0.1,s[45,43]=1.0,s[45,44]=-0.1,s[45,45]=-0.7,s[45,46]=0.6,s[45,47]=-1.2,s[45,48]=-0.3,s[45,49]=0.1,s[45,50]=-0.4,s[45,51]=-0.4,s[45,52]=1.0,s[45,53]=-0.4,s[45,54]=1.1,s[45,55]=0.4,s[45,56]=-0.1,s[45,57]=-1.1,s[45,58]=-0.5,s[45,59]=0.6,s[45,60]=-0.6 s[46,1]=-0.3,s[46,2]=0.0,s[46,3]=1.1,s[46,4]=-0.1,s[46,5]=-1.2,s[46,6]=1.2,s[46,7]=0.5,s[46,8]=-1.0,s[46,9]=-1.0,s[46,10]=-0.1,s[46,11]=-0.4,s[46,12]=-0.3,s[46,13]=0.0,s[46,14]=-0.3,s[46,15]=0.7,s[46,16]=-0.1,s[46,17]=-0.2,s[46,18]=-0.8,s[46,19]=-0.8,s[46,20]=-0.5,s[46,21]=-0.6,s[46,22]=-0.1,s[46,23]=0.7,s[46,24]=-0.4,s[46,25]=-0.7,s[46,26]=-0.3,s[46,27]=-0.1,s[46,28]=0.1,s[46,29]=-0.7,s[46,30]=-0.5,s[46,31]=0.6,s[46,32]=0.7,s[46,33]=-0.7,s[46,34]=-0.7,s[46,35]=1.2,s[46,36]=1.1,s[46,37]=0.6,s[46,38]=-0.7,s[46,39]=-1.1,s[46,40]=-0.8,s[46,41]=0.1,s[46,42]=-0.4,s[46,43]=-0.9,s[46,44]=0.5,s[46,45]=0.2,s[46,46]=0.0,s[46,47]=-1.2,s[46,48]=-0.8,s[46,49]=-0.9,s[46,50]=-0.5,s[46,51]=1.2,s[46,52]=1.2,s[46,53]=-0.4,s[46,54]=-0.5,s[46,55]=-1.0,s[46,56]=-0.6,s[46,57]=1.2,s[46,58]=0.9,s[46,59]=-0.1,s[46,60]=-0.9 s[47,1]=-0.3,s[47,2]=-1.0,s[47,3]=0.1,s[47,4]=-0.2,s[47,5]=-0.6,s[47,6]=0.0,s[47,7]=1.0,s[47,8]=0.1,s[47,9]=-0.3,s[47,10]=-0.7,s[47,11]=0.1,s[47,12]=0.1,s[47,13]=0.8,s[47,14]=0.4,s[47,15]=1.1,s[47,16]=0.0,s[47,17]=-0.4,s[47,18]=0.1,s[47,19]=0.7,s[47,20]=-0.3,s[47,21]=-1.0,s[47,22]=1.1,s[47,23]=-0.1,s[47,24]=-1.0,s[47,25]=0.4,s[47,26]=-0.5,s[47,27]=-0.9,s[47,28]=-0.3,s[47,29]=0.3,s[47,30]=0.5,s[47,31]=-1.0,s[47,32]=0.9,s[47,33]=0.9,s[47,34]=1.1,s[47,35]=1.0,s[47,36]=-0.9,s[47,37]=-0.9,s[47,38]=0.6,s[47,39]=0.6,s[47,40]=-0.8,s[47,41]=0.3,s[47,42]=1.1,s[47,43]=-0.9,s[47,44]=-0.2,s[47,45]=0.3,s[47,46]=-0.2,s[47,47]=0.3,s[47,48]=0.6,s[47,49]=0.4,s[47,50]=-0.6,s[47,51]=0.3,s[47,52]=0.4,s[47,53]=-0.6,s[47,54]=-0.5,s[47,55]=0.8,s[47,56]=0.2,s[47,57]=-0.2,s[47,58]=0.0,s[47,59]=0.0,s[47,60]=-0.4 s[48,1]=0.1,s[48,2]=-0.4,s[48,3]=-0.8,s[48,4]=0.6,s[48,5]=0.7,s[48,6]=1.2,s[48,7]=-0.4,s[48,8]=-0.7,s[48,9]=-0.1,s[48,10]=-0.6,s[48,11]=0.9,s[48,12]=-1.2,s[48,13]=-0.6,s[48,14]=0.2,s[48,15]=-0.9,s[48,16]=0.2,s[48,17]=-0.2,s[48,18]=0.0,s[48,19]=-0.1,s[48,20]=-1.1,s[48,21]=-1.1,s[48,22]=0.4,s[48,23]=-0.9,s[48,24]=-0.2,s[48,25]=0.5,s[48,26]=-0.6,s[48,27]=-1.1,s[48,28]=-0.5,s[48,29]=-0.4,s[48,30]=-1.0 s[48,31]=0.2,s[48,32]=0.0,s[48,33]=-0.2,s[48,34]=-0.6,s[48,35]=0.6,s[48,36]=0.2,s[48,37]=0.7,s[48,38]=0.0,s[48,39]=0.1,s[48,40]=-0.3,s[48,41]=-0.3,s[48,42]=-1.0,s[48,43]=-0.4,s[48,44]=0.3,s[48,45]=-0.1,s[48,46]=-0.3,s[48,47]=-0.7,s[48,48]=0.6,s[48,49]=1.1,s[48,50]=-1.2,s[48,51]=-0.7,s[48,52]=-1.2,s[48,53]=-0.6,s[48,54]=0.2,s[48,55]=0.2,s[48,56]=-0.7,s[48,57]=-0.3,s[48,58]=0.2,s[48,59]=-1.0,s[48,60]=0.2 s[49,1]=-0.4,s[49,2]=0.3,s[49,3]=0.0,s[49,4]=-0.7,s[49,5]=0.5,s[49,6]=-0.9,s[49,7]=0.2,s[49,8]=0.6,s[49,9]=1.0,s[49,10]=-1.0,s[49,11]=-0.2,s[49,12]=-0.2,s[49,13]=0.0,s[49,14]=0.5,s[49,15]=1.0,s[49,16]=0.1,s[49,17]=-0.3,s[49,18]=-0.4,s[49,19]=-0.8,s[49,20]=0.3,s[49,21]=0.5,s[49,22]=0.2,s[49,23]=0.0,s[49,24]=-0.9,s[49,25]=1.2,s[49,26]=-0.3,s[49,27]=-1.2,s[49,28]=0.9,s[49,29]=0.2,s[49,30]=-1.2 s[49,31]=-0.2,s[49,32]=1.2,s[49,33]=0.5,s[49,34]=-0.8,s[49,35]=1.0,s[49,36]=0.5,s[49,37]=0.1,s[49,38]=0.6,s[49,39]=0.4,s[49,40]=0.2,s[49,41]=0.4,s[49,42]=0.0,s[49,43]=1.1,s[49,44]=1.2,s[49,45]=-1.2,s[49,46]=0.1,s[49,47]=0.7,s[49,48]=0.9,s[49,49]=1.0,s[49,50]=-0.1,s[49,51]=-0.2,s[49,52]=-0.7,s[49,53]=-0.9,s[49,54]=-1.0,s[49,55]=0.9,s[49,56]=-0.3,s[49,57]=0.8,s[49,58]=0.9,s[49,59]=0.3,s[49,60]=0.8 s[50,1]=0.1,s[50,2]=-1.1,s[50,3]=-0.3,s[50,4]=-0.9,s[50,5]=-0.5,s[50,6]=-0.3,s[50,7]=0.5,s[50,8]=0.3,s[50,9]=-0.5,s[50,10]=-1.1,s[50,11]=-0.8,s[50,12]=-0.9,s[50,13]=0.5,s[50,14]=0.8,s[50,15]=-0.2,s[50,16]=0.1,s[50,17]=-0.7,s[50,18]=0.0,s[50,19]=1.1,s[50,20]=0.2,s[50,21]=-1.0,s[50,22]=0.9,s[50,23]=-0.8,s[50,24]=-0.2,s[50,25]=1.0,s[50,26]=-0.9,s[50,27]=-0.8,s[50,28]=0.1,s[50,29]=-0.2,s[50,30]=-0.4 s[50,31]=-0.2,s[50,32]=-0.2,s[50,33]=0.8,s[50,34]=-0.9,s[50,35]=0.3,s[50,36]=-1.0,s[50,37]=-0.1,s[50,38]=0.1,s[50,39]=0.4,s[50,40]=0.7,s[50,41]=-0.8,s[50,42]=-1.0,s[50,43]=-0.1,s[50,44]=1.0,s[50,45]=1.2,s[50,46]=-0.3,s[50,47]=-0.6,s[50,48]=0.2,s[50,49]=-0.1,s[50,50]=-1.2,s[50,51]=0.2,s[50,52]=-1.0,s[50,53]=-0.7,s[50,54]=-0.6,s[50,55]=-0.4,s[50,56]=0.5,s[50,57]=-0.7,s[50,58]=0.2,s[50,59]=0.7,s[50,60]=0.8 s[51,1]=-0.6,s[51,2]=0.4,s[51,3]=-0.1,s[51,4]=0.3,s[51,5]=1.2,s[51,6]=-0.1,s[51,7]=-0.4,s[51,8]=-0.4,s[51,9]=0.5,s[51,10]=0.8,s[51,11]=0.0,s[51,12]=-0.4,s[51,13]=-1.2,s[51,14]=-0.1,s[51,15]=-0.9,s[51,16]=-0.4,s[51,17]=-0.1,s[51,18]=-0.7,s[51,19]=-0.8,s[51,20]=-1.1,s[51,21]=-0.1,s[51,22]=-1.2,s[51,23]=0.9,s[51,24]=0.3,s[51,25]=1.0,s[51,26]=0.0,s[51,27]=1.1,s[51,28]=-0.6,s[51,29]=-0.3,s[51,30]=0.4 s[51,31]=-0.8,s[51,32]=-0.2,s[51,33]=0.7,s[51,34]=0.0,s[51,35]=-0.4,s[51,36]=0.7,s[51,37]=0.8,s[51,38]=-1.2,s[51,39]=1.0,s[51,40]=-0.9,s[51,41]=-0.1,s[51,42]=0.3,s[51,43]=-0.4,s[51,44]=0.8,s[51,45]=-0.9,s[51,46]=1.1,s[51,47]=-0.2,s[51,48]=0.3,s[51,49]=0.6,s[51,50]=0.1,s[51,51]=1.1,s[51,52]=-0.4,s[51,53]=-0.8,s[51,54]=0.0,s[51,55]=0.7,s[51,56]=1.0,s[51,57]=-0.8,s[51,58]=-1.2,s[51,59]=-0.4,s[51,60]=0.8 s[52,1]=0.1,s[52,2]=-0.5,s[52,3]=0.2,s[52,4]=-0.1,s[52,5]=0.3,s[52,6]=-0.8,s[52,7]=0.4,s[52,8]=-1.1,s[52,9]=0.1,s[52,10]=0.1,s[52,11]=0.1,s[52,12]=-0.6,s[52,13]=-1.1,s[52,14]=0.9,s[52,15]=0.4,s[52,16]=-0.1,s[52,17]=0.5,s[52,18]=1.0,s[52,19]=-1.1,s[52,20]=0.4,s[52,21]=-0.3,s[52,22]=1.2,s[52,23]=1.1,s[52,24]=-0.3,s[52,25]=0.7,s[52,26]=-0.3,s[52,27]=-0.4,s[52,28]=-1.0,s[52,29]=0.2,s[52,30]=0.9 s[52,31]=-0.2,s[52,32]=0.3,s[52,33]=0.3,s[52,34]=0.0,s[52,35]=-0.9,s[52,36]=1.2,s[52,37]=-0.4,s[52,38]=-0.2,s[52,39]=0.7,s[52,40]=-1.2,s[52,41]=-0.4,s[52,42]=-0.1,s[52,43]=0.8,s[52,44]=0.9,s[52,45]=1.2,s[52,46]=-0.2,s[52,47]=-0.5,s[52,48]=-0.2,s[52,49]=0.9,s[52,50]=0.3,s[52,51]=-0.5,s[52,52]=0.7,s[52,53]=-0.1,s[52,54]=-0.4,s[52,55]=-0.9,s[52,56]=-0.7,s[52,57]=-0.6,s[52,58]=0.5,s[52,59]=0.5,s[52,60]=0.1 s[53,1]=0.5,s[53,2]=0.6,s[53,3]=-0.2,s[53,4]=0.6,s[53,5]=0.1,s[53,6]=1.1,s[53,7]=0.7,s[53,8]=0.7,s[53,9]=-1.0,s[53,10]=0.9,s[53,11]=-0.6,s[53,12]=-0.5,s[53,13]=0.0,s[53,14]=0.4,s[53,15]=-0.8,s[53,16]=-0.1,s[53,17]=1.0,s[53,18]=-0.3,s[53,19]=1.0,s[53,20]=-0.1,s[53,21]=0.2,s[53,22]=-0.4,s[53,23]=0.5,s[53,24]=0.1,s[53,25]=1.1,s[53,26]=-0.8,s[53,27]=0.3,s[53,28]=0.7,s[53,29]=-0.4,s[53,30]=0.6 s[53,31]=0.3,s[53,32]=0.0,s[53,33]=0.9,s[53,34]=-0.3,s[53,35]=-0.6,s[53,36]=-0.3,s[53,37]=0.1,s[53,38]=-0.3,s[53,39]=0.4,s[53,40]=0.4,s[53,41]=0.9,s[53,42]=-0.6,s[53,43]=1.2,s[53,44]=1.2,s[53,45]=0.3,s[53,46]=0.0,s[53,47]=-0.6,s[53,48]=0.7,s[53,49]=0.2,s[53,50]=0.9,s[53,51]=-0.4,s[53,52]=0.3,s[53,53]=1.2,s[53,54]=0.8,s[53,55]=0.2,s[53,56]=-0.4,s[53,57]=0.7,s[53,58]=-0.6,s[53,59]=-0.8,s[53,60]=0.6 s[54,1]=0.4,s[54,2]=0.7,s[54,3]=0.5,s[54,4]=-1.2,s[54,5]=0.1,s[54,6]=0.9,s[54,7]=-1.2,s[54,8]=1.1,s[54,9]=-1.1,s[54,10]=-1.2,s[54,11]=1.1,s[54,12]=0.8,s[54,13]=-0.1,s[54,14]=-0.4,s[54,15]=-0.4,s[54,16]=0.5,s[54,17]=-0.8,s[54,18]=-0.1,s[54,19]=1.2,s[54,20]=0.3,s[54,21]=-0.6,s[54,22]=-0.2,s[54,23]=-0.9,s[54,24]=0.3,s[54,25]=0.5,s[54,26]=0.0,s[54,27]=1.1,s[54,28]=-1.2,s[54,29]=-0.5,s[54,30]=-0.2 s[54,31]=-0.8,s[54,32]=1.2,s[54,33]=0.3,s[54,34]=-0.1,s[54,35]=-0.6,s[54,36]=0.6,s[54,37]=-0.4,s[54,38]=0.4,s[54,39]=-0.5,s[54,40]=0.8,s[54,41]=-0.8,s[54,42]=-0.9,s[54,43]=-0.8,s[54,44]=-0.8,s[54,45]=-0.3,s[54,46]=-0.3,s[54,47]=-0.7,s[54,48]=-0.4,s[54,49]=1.2,s[54,50]=0.5,s[54,51]=0.5,s[54,52]=-0.4,s[54,53]=1.0,s[54,54]=-0.5,s[54,55]=-1.0,s[54,56]=0.6,s[54,57]=0.9,s[54,58]=-0.5,s[54,59]=1.0,s[54,60]=1.1 s[55,1]=-0.3,s[55,2]=0.4,s[55,3]=-0.7,s[55,4]=0.3,s[55,5]=0.7,s[55,6]=0.9,s[55,7]=-0.1,s[55,8]=1.0,s[55,9]=0.5,s[55,10]=-1.0,s[55,11]=0.6,s[55,12]=0.6,s[55,13]=-0.3,s[55,14]=0.2,s[55,15]=1.1,s[55,16]=-0.4,s[55,17]=-0.1,s[55,18]=-0.8,s[55,19]=0.6,s[55,20]=-0.9,s[55,21]=-0.5,s[55,22]=0.6,s[55,23]=0.5,s[55,24]=-0.4,s[55,25]=0.4,s[55,26]=-1.0,s[55,27]=-1.0,s[55,28]=1.0,s[55,29]=1.1,s[55,30]=0.2 s[55,31]=-0.3,s[55,32]=0.6,s[55,33]=-1.1,s[55,34]=0.4,s[55,35]=0.5,s[55,36]=-1.1,s[55,37]=-0.8,s[55,38]=-1.2,s[55,39]=1.2,s[55,40]=-0.8,s[55,41]=0.7,s[55,42]=-0.2,s[55,43]=0.7,s[55,44]=0.0,s[55,45]=0.4,s[55,46]=0.0,s[55,47]=0.0,s[55,48]=-0.3,s[55,49]=-0.1,s[55,50]=-0.4,s[55,51]=0.7,s[55,52]=-0.2,s[55,53]=-0.1,s[55,54]=-1.0,s[55,55]=0.1,s[55,56]=0.2,s[55,57]=-0.2,s[55,58]=-0.5,s[55,59]=-1.2,s[55,60]=-0.5 s[56,1]=-0.3,s[56,2]=-0.1,s[56,3]=-0.8,s[56,4]=0.2,s[56,5]=-0.4,s[56,6]=0.6,s[56,7]=-0.5,s[56,8]=-0.1,s[56,9]=-0.1,s[56,10]=1.0,s[56,11]=-0.1,s[56,12]=-0.9,s[56,13]=-0.5,s[56,14]=-0.2,s[56,15]=0.0,s[56,16]=-0.2,s[56,17]=0.6,s[56,18]=0.9,s[56,19]=-1.2,s[56,20]=-0.9,s[56,21]=0.4,s[56,22]=-0.7,s[56,23]=0.2,s[56,24]=-0.2,s[56,25]=-1.1,s[56,26]=0.2,s[56,27]=1.2,s[56,28]=-1.1,s[56,29]=0.2,s[56,30]=0.5 s[56,31]=-0.1,s[56,32]=1.0,s[56,33]=1.1,s[56,34]=-0.8,s[56,35]=0.3,s[56,36]=0.8,s[56,37]=-1.0,s[56,38]=0.2,s[56,39]=0.8,s[56,40]=1.1,s[56,41]=-0.1,s[56,42]=-0.2,s[56,43]=1.2,s[56,44]=0.4,s[56,45]=1.1,s[56,46]=-0.1,s[56,47]=-0.1,s[56,48]=1.2,s[56,49]=0.8,s[56,50]=0.8,s[56,51]=-1.2,s[56,52]=0.9,s[56,53]=-0.6,s[56,54]=1.2,s[56,55]=0.7,s[56,56]=-0.1,s[56,57]=1.1,s[56,58]=0.1,s[56,59]=-0.8,s[56,60]=1.1 s[57,1]=0.2,s[57,2]=-0.1,s[57,3]=0.7,s[57,4]=0.9,s[57,5]=-0.7,s[57,6]=-0.5,s[57,7]=-0.1,s[57,8]=-0.9,s[57,9]=0.3,s[57,10]=-0.6,s[57,11]=-0.3,s[57,12]=-1.1,s[57,13]=0.7,s[57,14]=0.0,s[57,15]=-0.3,s[57,16]=-0.2,s[57,17]=0.5,s[57,18]=0.0,s[57,19]=-1.0,s[57,20]=-0.1,s[57,21]=-0.3,s[57,22]=1.1,s[57,23]=0.0,s[57,24]=0.5,s[57,25]=0.4,s[57,26]=0.3,s[57,27]=0.6,s[57,28]=1.2,s[57,29]=0.3,s[57,30]=0.0 s[57,31]=-0.6,s[57,32]=0.8,s[57,33]=0.4,s[57,34]=0.6,s[57,35]=0.6,s[57,36]=0.0,s[57,37]=0.6,s[57,38]=0.3,s[57,39]=-0.2,s[57,40]=-0.1,s[57,41]=-1.2,s[57,42]=-0.5,s[57,43]=-0.8,s[57,44]=0.6,s[57,45]=1.0,s[57,46]=-0.7,s[57,47]=-0.7,s[57,48]=-0.4,s[57,49]=0.0,s[57,50]=0.0,s[57,51]=0.3,s[57,52]=0.0,s[57,53]=-0.8,s[57,54]=0.3,s[57,55]=-0.7,s[57,56]=0.7,s[57,57]=0.5,s[57,58]=0.8,s[57,59]=0.3,s[57,60]=0.6 s[58,1]=-0.3,s[58,2]=0.5,s[58,3]=0.4,s[58,4]=0.5,s[58,5]=-0.9,s[58,6]=-0.7,s[58,7]=1.1,s[58,8]=1.0,s[58,9]=-0.2,s[58,10]=-0.8,s[58,11]=0.5,s[58,12]=1.0,s[58,13]=1.2,s[58,14]=0.1,s[58,15]=1.0,s[58,16]=-0.1,s[58,17]=-0.4,s[58,18]=0.5,s[58,19]=0.7,s[58,20]=0.1,s[58,21]=-0.4,s[58,22]=0.1,s[58,23]=1.2,s[58,24]=0.6,s[58,25]=-0.1,s[58,26]=1.1,s[58,27]=-0.1,s[58,28]=0.8,s[58,29]=-0.8,s[58,30]=-0.5 s[58,31]=-0.4,s[58,32]=0.4,s[58,33]=0.6,s[58,34]=-0.3,s[58,35]=-0.1,s[58,36]=0.0,s[58,37]=-0.2,s[58,38]=-0.2,s[58,39]=0.8,s[58,40]=0.5,s[58,41]=-0.4,s[58,42]=-0.1,s[58,43]=-0.8,s[58,44]=-0.2,s[58,45]=0.2,s[58,46]=-0.3,s[58,47]=-0.4,s[58,48]=0.0,s[58,49]=-1.0,s[58,50]=-1.0,s[58,51]=0.8,s[58,52]=-0.8,s[58,53]=-0.5,s[58,54]=-0.1,s[58,55]=-0.9,s[58,56]=-0.4,s[58,57]=0.6,s[58,58]=0.1,s[58,59]=-0.3,s[58,60]=-0.1 s[59,1]=0.3,s[59,2]=-1.1,s[59,3]=-0.3,s[59,4]=-0.4,s[59,5]=-0.4,s[59,6]=0.3,s[59,7]=-0.5,s[59,8]=-0.1,s[59,9]=0.5,s[59,10]=0.7,s[59,11]=1.0,s[59,12]=-0.3,s[59,13]=-1.1,s[59,14]=0.8,s[59,15]=0.0,s[59,16]=0.3,s[59,17]=-0.2,s[59,18]=-0.9,s[59,19]=-0.3,s[59,20]=-1.1,s[59,21]=-0.3,s[59,22]=0.9,s[59,23]=-0.3,s[59,24]=-0.3,s[59,25]=-1.2,s[59,26]=-0.3,s[59,27]=-0.1,s[59,28]=1.0,s[59,29]=0.0,s[59,30]=-1.1 s[59,31]=0.5,s[59,32]=-1.1,s[59,33]=-1.1,s[59,34]=0.8,s[59,35]=-0.1,s[59,36]=-0.6,s[59,37]=0.0,s[59,38]=0.7,s[59,39]=0.7,s[59,40]=0.3,s[59,41]=0.3,s[59,42]=-0.4,s[59,43]=0.0,s[59,44]=-0.2,s[59,45]=1.0,s[59,46]=0.1,s[59,47]=-0.2,s[59,48]=0.3,s[59,49]=0.4,s[59,50]=1.1,s[59,51]=-1.2,s[59,52]=-1.2,s[59,53]=1.2,s[59,54]=-1.1,s[59,55]=-0.5,s[59,56]=0.8,s[59,57]=-0.7,s[59,58]=-0.8,s[59,59]=-0.1,s[59,60]=1.1 s[60,1]=0.1,s[60,2]=0.1,s[60,3]=0.4,s[60,4]=0.9,s[60,5]=-0.2,s[60,6]=0.7,s[60,7]=-0.2,s[60,8]=0.8,s[60,9]=0.6,s[60,10]=-1.1,s[60,11]=-0.7,s[60,12]=1.0,s[60,13]=-0.4,s[60,14]=0.4,s[60,15]=-0.3,s[60,16]=0.6,s[60,17]=-1.1,s[60,18]=-0.5,s[60,19]=-0.9,s[60,20]=0.3,s[60,21]=0.9,s[60,22]=-0.7,s[60,23]=0.3,s[60,24]=0.8,s[60,25]=-1.1,s[60,26]=-0.9,s[60,27]=-0.2,s[60,28]=-0.8,s[60,29]=1.1,s[60,30]=-0.5 s[60,31]=-0.1,s[60,32]=0.2,s[60,33]=0.3,s[60,34]=-0.4,s[60,35]=0.5,s[60,36]=1.1,s[60,37]=0.7,s[60,38]=0.4,s[60,39]=-1.2,s[60,40]=0.5,s[60,41]=0.3,s[60,42]=1.1,s[60,43]=0.4,s[60,44]=-1.0,s[60,45]=1.1,s[60,46]=0.4,s[60,47]=0.0,s[60,48]=-0.2,s[60,49]=0.6,s[60,50]=-0.3,s[60,51]=-0.3,s[60,52]=-0.2,s[60,53]=0.6,s[60,54]=0.1,s[60,55]=0.0,s[60,56]=-0.2,s[60,57]=-0.9,s[60,58]=0.2,s[60,59]=-0.5,s[60,60]=-0.5 s[61,1]=0.0,s[61,2]=-0.9,s[61,3]=-0.2,s[61,4]=-1.2,s[61,5]=-1.1,s[61,6]=-0.1,s[61,7]=0.6,s[61,8]=-0.3,s[61,9]=0.2,s[61,10]=0.5,s[61,11]=0.3,s[61,12]=-1.2,s[61,13]=0.0,s[61,14]=-1.1,s[61,15]=-0.4,s[61,16]=-0.1,s[61,17]=-0.2,s[61,18]=0.3,s[61,19]=0.1,s[61,20]=-1.0,s[61,21]=0.1,s[61,22]=-0.3,s[61,23]=-0.8,s[61,24]=0.3,s[61,25]=-1.0,s[61,26]=0.8,s[61,27]=0.3,s[61,28]=-0.4,s[61,29]=0.0,s[61,30]=-0.8 s[61,31]=-0.1,s[61,32]=1.0,s[61,33]=-0.2,s[61,34]=0.7,s[61,35]=-0.7,s[61,36]=-0.3,s[61,37]=-0.8,s[61,38]=0.9,s[61,39]=0.7,s[61,40]=0.3,s[61,41]=0.6,s[61,42]=1.1,s[61,43]=1.0,s[61,44]=1.1,s[61,45]=0.2,s[61,46]=0.2,s[61,47]=-0.2,s[61,48]=0.4,s[61,49]=1.0,s[61,50]=0.7,s[61,51]=0.7,s[61,52]=0.3,s[61,53]=0.6,s[61,54]=0.0,s[61,55]=0.2,s[61,56]=0.2,s[61,57]=-0.1,s[61,58]=-1.1,s[61,59]=-0.9,s[61,60]=0.3 s[62,1]=0.1,s[62,2]=1.2,s[62,3]=-0.9,s[62,4]=-0.7,s[62,5]=-0.9,s[62,6]=0.4,s[62,7]=0.3,s[62,8]=-0.9,s[62,9]=0.3,s[62,10]=0.7,s[62,11]=-1.0,s[62,12]=1.0,s[62,13]=0.0,s[62,14]=0.0,s[62,15]=-0.1,s[62,16]=0.8,s[62,17]=0.0,s[62,18]=0.6,s[62,19]=-1.1,s[62,20]=-0.2,s[62,21]=0.1,s[62,22]=-0.8,s[62,23]=1.0,s[62,24]=-0.4,s[62,25]=0.7,s[62,26]=0.9,s[62,27]=0.2,s[62,28]=0.5,s[62,29]=-0.6,s[62,30]=0.6 s[62,31]=-0.2,s[62,32]=0.0,s[62,33]=0.5,s[62,34]=0.2,s[62,35]=0.1,s[62,36]=1.1,s[62,37]=-0.2,s[62,38]=0.5,s[62,39]=0.6,s[62,40]=-0.2,s[62,41]=-0.4,s[62,42]=-1.0,s[62,43]=-1.2,s[62,44]=0.7,s[62,45]=0.7,s[62,46]=-0.1,s[62,47]=0.5,s[62,48]=-0.9,s[62,49]=-0.4,s[62,50]=-0.4,s[62,51]=-0.9,s[62,52]=-0.4,s[62,53]=-0.2,s[62,54]=-0.7,s[62,55]=-0.7,s[62,56]=-0.1,s[62,57]=1.1,s[62,58]=-0.3,s[62,59]=-0.5,s[62,60]=0.2 s[63,1]=0.0,s[63,2]=0.4,s[63,3]=0.0,s[63,4]=-0.4,s[63,5]=0.3,s[63,6]=0.1,s[63,7]=0.5,s[63,8]=-0.2,s[63,9]=0.8,s[63,10]=1.1,s[63,11]=-0.6,s[63,12]=-0.6,s[63,13]=0.0,s[63,14]=-0.1,s[63,15]=-0.4,s[63,16]=0.1,s[63,17]=0.0,s[63,18]=-1.2,s[63,19]=-0.7,s[63,20]=-1.1,s[63,21]=1.0,s[63,22]=0.0,s[63,23]=-0.8,s[63,24]=-0.7,s[63,25]=-1.2,s[63,26]=-0.4,s[63,27]=1.1,s[63,28]=0.9,s[63,29]=0.5,s[63,30]=0.2 s[63,31]=-0.1,s[63,32]=-0.5,s[63,33]=-0.8,s[63,34]=-0.1,s[63,35]=-0.8,s[63,36]=-0.5,s[63,37]=-0.6,s[63,38]=0.8,s[63,39]=1.2,s[63,40]=-1.1,s[63,41]=-0.3,s[63,42]=1.0,s[63,43]=1.2,s[63,44]=0.4,s[63,45]=1.0,s[63,46]=0.0,s[63,47]=0.2,s[63,48]=1.2,s[63,49]=-0.6,s[63,50]=-0.2,s[63,51]=-1.0,s[63,52]=-1.1,s[63,53]=-0.2,s[63,54]=1.2,s[63,55]=0.3,s[63,56]=-0.9,s[63,57]=-0.9,s[63,58]=0.4,s[63,59]=-0.4,s[63,60]=1.0 s[64,1]=0.3,s[64,2]=-1.2,s[64,3]=1.0,s[64,4]=1.1,s[64,5]=0.4,s[64,6]=-0.7,s[64,7]=-1.2,s[64,8]=0.9,s[64,9]=1.2,s[64,10]=0.5,s[64,11]=-1.2,s[64,12]=0.1,s[64,13]=-0.7,s[64,14]=0.3,s[64,15]=-0.8,s[64,16]=0.3,s[64,17]=0.3,s[64,18]=-0.1,s[64,19]=-0.3,s[64,20]=-0.4,s[64,21]=-0.7,s[64,22]=0.0,s[64,23]=-0.2,s[64,24]=-0.3,s[64,25]=1.0,s[64,26]=0.8,s[64,27]=1.0,s[64,28]=1.0,s[64,29]=-0.6,s[64,30]=-0.3 s[64,31]=0.2,s[64,32]=0.4,s[64,33]=-0.5,s[64,34]=-0.3,s[64,35]=-0.9,s[64,36]=0.8,s[64,37]=-0.6,s[64,38]=-0.2,s[64,39]=0.9,s[64,40]=0.3,s[64,41]=0.7,s[64,42]=0.0,s[64,43]=1.1,s[64,44]=-0.9,s[64,45]=1.1,s[64,46]=0.3,s[64,47]=-0.8,s[64,48]=-1.1,s[64,49]=0.7,s[64,50]=-0.4,s[64,51]=-0.9,s[64,52]=-0.3,s[64,53]=-0.8,s[64,54]=0.4,s[64,55]=-0.4,s[64,56]=-0.9,s[64,57]=-1.0,s[64,58]=-0.1,s[64,59]=0.3,s[64,60]=0.2 s[65,1]=0.3,s[65,2]=-0.1,s[65,3]=-0.4,s[65,4]=1.2,s[65,5]=-0.6,s[65,6]=-0.7,s[65,7]=0.1,s[65,8]=0.2,s[65,9]=-0.8,s[65,10]=-0.6,s[65,11]=-0.2,s[65,12]=-0.8,s[65,13]=-0.6,s[65,14]=-0.7,s[65,15]=1.1,s[65,16]=0.0,s[65,17]=1.2,s[65,18]=-0.7,s[65,19]=0.8,s[65,20]=-0.3,s[65,21]=-0.6,s[65,22]=-0.5,s[65,23]=0.9,s[65,24]=1.2,s[65,25]=-1.1,s[65,26]=1.2,s[65,27]=0.5,s[65,28]=0.0,s[65,29]=0.7,s[65,30]=1.1 s[65,31]=0.0,s[65,32]=-0.6,s[65,33]=-1.0,s[65,34]=1.1,s[65,35]=-1.0,s[65,36]=-0.6,s[65,37]=-1.1,s[65,38]=0.4,s[65,39]=-0.8,s[65,40]=-0.9,s[65,41]=0.7,s[65,42]=0.5,s[65,43]=1.1,s[65,44]=1.2,s[65,45]=0.5,s[65,46]=0.3,s[65,47]=0.8,s[65,48]=-0.7,s[65,49]=-0.2,s[65,50]=-1.0,s[65,51]=1.0,s[65,52]=-0.1,s[65,53]=-0.3,s[65,54]=0.9,s[65,55]=1.1,s[65,56]=1.1,s[65,57]=-0.4,s[65,58]=0.5,s[65,59]=0.4,s[65,60]=-1.2 s[66,1]=0.0,s[66,2]=0.1,s[66,3]=0.6,s[66,4]=-0.2,s[66,5]=-0.5,s[66,6]=0.9,s[66,7]=0.5,s[66,8]=-0.3,s[66,9]=-0.6,s[66,10]=-0.9,s[66,11]=-0.2,s[66,12]=-1.1,s[66,13]=0.9,s[66,14]=0.2,s[66,15]=0.4,s[66,16]=0.6,s[66,17]=0.1,s[66,18]=-1.2,s[66,19]=0.6,s[66,20]=0.3,s[66,21]=0.2,s[66,22]=-0.3,s[66,23]=-0.1,s[66,24]=-0.5,s[66,25]=0.3,s[66,26]=-0.6,s[66,27]=-0.2,s[66,28]=-0.3,s[66,29]=-0.4,s[66,30]=-0.9 s[66,31]=0.0,s[66,32]=1.0,s[66,33]=0.0,s[66,34]=-1.0,s[66,35]=0.7,s[66,36]=-1.0,s[66,37]=0.7,s[66,38]=-0.7,s[66,39]=-0.6,s[66,40]=1.2,s[66,41]=0.6,s[66,42]=-1.1,s[66,43]=0.6,s[66,44]=-0.8,s[66,45]=-1.2,s[66,46]=-0.4,s[66,47]=0.9,s[66,48]=0.9,s[66,49]=0.5,s[66,50]=1.0,s[66,51]=0.9,s[66,52]=0.3,s[66,53]=-0.6,s[66,54]=0.6,s[66,55]=-0.2,s[66,56]=-0.6,s[66,57]=0.1,s[66,58]=-0.9,s[66,59]=-0.2,s[66,60]=1.0 s[67,1]=-0.3,s[67,2]=-0.7,s[67,3]=-0.4,s[67,4]=0.6,s[67,5]=0.9,s[67,6]=0.6,s[67,7]=0.5,s[67,8]=-0.4,s[67,9]=0.9,s[67,10]=-0.2,s[67,11]=0.5,s[67,12]=-0.7,s[67,13]=0.2,s[67,14]=1.1,s[67,15]=-1.0,s[67,16]=0.2,s[67,17]=0.2,s[67,18]=0.6,s[67,19]=-0.2,s[67,20]=-1.1,s[67,21]=-0.9,s[67,22]=0.7,s[67,23]=0.4,s[67,24]=0.1,s[67,25]=-0.9,s[67,26]=0.1,s[67,27]=-0.4,s[67,28]=-0.7,s[67,29]=-1.0,s[67,30]=0.8 s[67,31]=0.1,s[67,32]=0.0,s[67,33]=-0.7,s[67,34]=-0.1,s[67,35]=-0.5,s[67,36]=-0.4,s[67,37]=-0.2,s[67,38]=0.4,s[67,39]=0.0,s[67,40]=0.4,s[67,41]=0.8,s[67,42]=-0.1,s[67,43]=-1.0,s[67,44]=-0.7,s[67,45]=1.2,s[67,46]=0.3,s[67,47]=0.8,s[67,48]=-1.0,s[67,49]=-0.2,s[67,50]=-1.0,s[67,51]=0.0,s[67,52]=0.7,s[67,53]=-0.3,s[67,54]=0.7,s[67,55]=1.2,s[67,56]=-0.4,s[67,57]=1.0,s[67,58]=0.8,s[67,59]=-1.2,s[67,60]=0.7 s[68,1]=0.1,s[68,2]=1.2,s[68,3]=1.2,s[68,4]=0.2,s[68,5]=0.6,s[68,6]=-1.0,s[68,7]=-1.0,s[68,8]=-0.4,s[68,9]=-1.2,s[68,10]=-0.4,s[68,11]=0.5,s[68,12]=-0.3,s[68,13]=0.3,s[68,14]=-0.1,s[68,15]=0.6,s[68,16]=0.3,s[68,17]=0.6,s[68,18]=-1.2,s[68,19]=-0.5,s[68,20]=-1.1,s[68,21]=-0.6,s[68,22]=0.8,s[68,23]=-0.6,s[68,24]=0.4,s[68,25]=0.4,s[68,26]=0.1,s[68,27]=0.6,s[68,28]=-0.1,s[68,29]=-0.9,s[68,30]=1.1 s[68,31]=0.4,s[68,32]=-0.7,s[68,33]=-0.7,s[68,34]=-0.9,s[68,35]=0.5,s[68,36]=1.0,s[68,37]=-0.4,s[68,38]=0.1,s[68,39]=0.6,s[68,40]=0.9,s[68,41]=-0.7,s[68,42]=0.6,s[68,43]=1.2,s[68,44]=-0.8,s[68,45]=-0.9,s[68,46]=0.4,s[68,47]=0.6,s[68,48]=-0.4,s[68,49]=-0.1,s[68,50]=-0.9,s[68,51]=-0.7,s[68,52]=-1.2,s[68,53]=1.2,s[68,54]=0.3,s[68,55]=0.5,s[68,56]=0.5,s[68,57]=-1.0,s[68,58]=-0.4,s[68,59]=0.1,s[68,60]=0.3 ; ; initialize coefficients ; if @sel > 0 b1 = s[@sel,1] b2 = s[@sel,2] b3 = s[@sel,3] b4 = s[@sel,4] b5 = s[@sel,5] b6 = s[@sel,6] b7 = s[@sel,7] b8 = s[@sel,8] b9 = s[@sel,9] b10 = s[@sel,10] b11 = s[@sel,11] b12 = s[@sel,12] b13 = s[@sel,13] b14 = s[@sel,14] b15 = s[@sel,15] b16 = s[@sel,16] b17 = s[@sel,17] b18 = s[@sel,18] b19 = s[@sel,19] b20 = s[@sel,20] b21 = s[@sel,21] b22 = s[@sel,22] b23 = s[@sel,23] b24 = s[@sel,24] b25 = s[@sel,25] b26 = s[@sel,26] b27 = s[@sel,27] b28 = s[@sel,28] b29 = s[@sel,29] b30 = s[@sel,30] b31 = s[@sel,31] b32 = s[@sel,32] b33 = s[@sel,33] b34 = s[@sel,34] b35 = s[@sel,35] b36 = s[@sel,36] b37 = s[@sel,37] b38 = s[@sel,38] b39 = s[@sel,39] b40 = s[@sel,40] b41 = s[@sel,41] b42 = s[@sel,42] b43 = s[@sel,43] b44 = s[@sel,44] b45 = s[@sel,45] b46 = s[@sel,46] b47 = s[@sel,47] b48 = s[@sel,48] b49 = s[@sel,49] b50 = s[@sel,50] b51 = s[@sel,51] b52 = s[@sel,52] b53 = s[@sel,53] b54 = s[@sel,54] b55 = s[@sel,55] b56 = s[@sel,56] b57 = s[@sel,57] b58 = s[@sel,58] b59 = s[@sel,59] b60 = s[@sel,60] endif ; ; fill the hit array ; while (iter < (iterate*sqr(#width*#magn/400))) xx = fx yy = fy zz = fz if @sel == 0 fx = @a1 + @a2*fx + @a3*fx*fx + @a4*fx*fy + @a5*fx*fz + @a6*fx*ww + @a7*fy + @a8*fy*fy + \ @a9*fy*fz + @a10*fy*ww + @a11*fz + @a12*fz*fz + @a13*fz*ww + @a14*ww + @a15*ww*ww fy = @a16 + @a17*xx + @a18*xx*xx + @a19*xx*fy + @a20*xx*fz + @a21*xx*ww + @a22*fy + @a23*fy*fy + \ @a24*fy*fz + @a25*fy*ww + @a26*fz + @a27*fz*fz + @a28*fz*ww + @a29*ww + @a30*ww*ww fz = @a31 + @a32*xx + @a33*xx*xx + @a34*xx*yy + @a35*xx*fz + @a36*xx*ww + @a37*yy + @a38*yy*yy + \ @a39*yy*fz + @a40*yy*ww + @a41*fz + @a42*fz*fz + @a43*fz*ww + @a44*ww + @a45*ww*ww ww = @a46 + @a47*xx + @a48*xx*xx + @a49*xx*yy + @a50*xx*zz + @a51*xx*ww + @a52*yy + @a53*yy*yy + \ @a54*yy*zz + @a55*yy*ww + @a56*zz + @a57*zz*zz + @a58*zz*ww + @a59*ww + @a60*ww*ww else fx = b1 + b2*fx + b3*fx*fx + b4*fx*fy + b5*fx*fz + b6*fx*ww + b7*fy + b8*fy*fy + \ b9*fy*fz + b10*fy*ww + b11*fz + b12*fz*fz + b13*fz*ww + b14*ww + b15*ww*ww fy = b16 + b17*xx + b18*xx*xx + b19*xx*fy + b20*xx*fz + b21*xx*ww + b22*fy + b23*fy*fy + \ b24*fy*fz + b25*fy*ww + b26*fz + b27*fz*fz + b28*fz*ww + b29*ww + b30*ww*ww fz = b31 + b32*xx + b33*xx*xx + b34*xx*yy + b35*xx*fz + b36*xx*ww + b37*yy + b38*yy*yy + \ b39*yy*fz + b40*yy*ww + b41*fz + b42*fz*fz + b43*fz*ww + b44*ww + b45*ww*ww ww = b46 + b47*xx + b48*xx*xx + b49*xx*yy + b50*xx*zz + b51*xx*ww + b52*yy + b53*yy*yy + \ b54*yy*zz + b55*yy*ww + b56*zz + b57*zz*zz + b58*zz*ww + b59*ww + b60*ww*ww endif ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax ffz = (zmin-fz)/sqrt(txmax^2+tymax^2) ffw = (wmin-ww)/sqrt(txmax^2+tymax^2) ; rotation in the XW Plane xx = ffx ffx = (0.5 - (ffw - 0.5 - @rotoffw/twmax)*sin(@xwangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@xwangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@xwangle*pi/180) + \ (xx - 0.5 - @rotoffw/twmax)*sin(@xwangle*pi/180)) ; rotation in the YW Plane yy = ffy ffy = (0.5 + (ffw - 0.5 - @rotoffw/txmax)*sin(@ywangle*pi/180) + \ (ffy - 0.5 - @rotoffy/tymax)*cos(@ywangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@ywangle*pi/180) - \ (yy - 0.5 - @rotoffw/twmax)*sin(@ywangle*pi/180)) ; rotation in the ZW Plane zz = ffz ffz = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*sin(@zwangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@zwangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@zwangle*pi/180) - \ (zz - 0.5 - @rotoffw/twmax)*sin(@zwangle*pi/180)) ; rotation in the XY Plane (from the Location TAB) ; xx = ffx ffx = 0.5 + (ffx - 0.5 - @rotoffx/txmax)*cos(#angle) - \ (ffy - 0.5 - @rotoffy/tymax)*sin(#angle)*#height/#width ffy = 0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(#angle) + \ (xx - 0.5 - @rotoffx/txmax)*sin(#angle)*#width/#height ; ; rotation in the XZ Plane ; xx = ffx ffx = (0.5 + (ffz - 0.5 - @rotoffz/txmax)*sin(@zangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@zangle*pi/180))*#width ffz = (0.5 + (ffz - 0.5 - @rotoffz/tzmax)*cos(@zangle*pi/180) - \ (xx - 0.5 - @rotoffx/txmax)*sin(@zangle*pi/180)) ; ; rotation in the YZ plane ; yy = ffy ffy = (0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(@xangle*pi/180) - \ (ffz - 0.5 - @rotoffz/tzmax)*sin(@xangle*pi/180))*#height if @oldver ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*#height/2 else ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*scrsize endif ; ; final translation ; ffx = ffx - @transx*#width ffy = ffy - @transy*#height if @oldver ffz = ffz - @transz*#height/2 else ffz = ffz - @transz*scrsize endif ; ; perspective application ; if @oldver if @useproj ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif else if @useprojn ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif endif px = trunc(ffx)+wd2 py = trunc(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+1+flip(ffz) if real(hits[px,py])>maxnhit maxnhit = real(hits[px,py]) endif if ffz > hits3[px,py] || hits3[px,py] == 0 hits3[px,py] = ffz endif hits2[px,py] = ffz endif iter = iter + 1 endwhile h = 0 w = 0 ; init: float nhit=0 float zave=0 float zlast=0 float zbiggest=0 float nhitx=0 float zavex=0 float zlastx=0 float zbiggestx=0 float nhity=0 float zavey=0 float zlasty=0 float zbiggesty=0 bool done = false float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 int i = 0 ;loop: int delta = ceil(@closeness) int xcrd = #x int ycrd = #y bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true if xcrd+@closeness < #width+wd && ycrd+@closeness < #height+ht && real(hits[xcrd,ycrd]) > @thresh if @filter == 0 if @value == 3 zbiggest = hits3[xcrd,ycrd] zbiggestx = hits3[xcrd+delta,ycrd] zbiggesty = hits3[xcrd,ycrd+delta] elseif @value == 0 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) elseif @value == 1 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) zave = imag(hits[xcrd,ycrd])/(nhit + 1) zavex = imag(hits[xcrd+delta,ycrd])/(nhitx + 1) zavey = imag(hits[xcrd,ycrd+delta])/(nhity + 1) elseif @value == 2 zlast = hits2[xcrd,ycrd] zlastx = hits2[xcrd+delta,ycrd] zlasty = hits2[xcrd,ycrd+delta] endif else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 zbiggest = 0 zbiggestx = 0 zbiggesty = 0 zave = 0 zavex = 0 zavey = 0 zlast = 0 zlastx = 0 zlasty = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter if @value == 0 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) elseif @value == 1 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) zave = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy])/(nhit+1) zavex = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx+delta,ycrd+gy])/(nhitx+1) zavey = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta])/(nhity+1) elseif @value == 2 zlast = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy] zlastx = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx+delta,ycrd+gy] zlasty = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy+delta] elseif @value == 3 zbiggest = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy] zbiggestx = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx+delta,ycrd+gy] zbiggesty = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy+delta] endif gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile if @value == 0 nhit = nhit/gweight nhitx = nhitx/gweight nhity = nhity/gweight elseif @value == 1 zave = zave/gweight zavex = zavex/gweight zavey = zavey/gweight elseif @value == 2 zlast = zlast/gweight zlastx = zlastx/gweight zlasty = zlasty/gweight elseif @value == 3 zbiggest = zbiggest/gweight zbiggestx = zbiggestx/gweight zbiggesty = zbiggesty/gweight endif endif endif endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = zave cenx = zavex ceny = zavey elseif @value == 2 cen = zlast cenx = zlastx ceny = zlasty else cen = zbiggest cenx = zbiggestx ceny = zbiggesty endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * zscale2 e2 = e2 * zscale2 e3 = e3 * zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxnhit elseif @value == 1 #z = (zave/(log(maxnhit)+1))^3 elseif @value == 2 #z = (zlast/(log(maxnhit)+1))^10 elseif @value == 3 #z = (zbiggest/(log(maxnhit)+1))^10 endif endif if @oldver if done == false done = true endif endif loop: i = i + 1 if !@oldver if cen < i if done == false done = true endif endif endif bailout: done == false default: heading caption="Sprott 4D Quadratic G Attractors" endheading $ifdef VER40 heading text=" x -> Quadratic in x, y, z and w" endheading heading text=" y -> Quadratic in x, y, z and w" endheading heading text=" z -> Quadratic in x, y, z and w" endheading heading text=" w -> Quadratic in x, y, z and w" endheading heading text="Color with Damien's Lighting, 3D Texturizer Enhanced III or \ Direct Color Slope." endheading $else heading caption="x -> Quadratic in x, y, z and w" endheading heading caption="y -> Quadratic in x, y, z and w" endheading heading caption="z -> Quadratic in x, y, z and w" endheading heading caption="w -> Quadratic in x, y, z and w" endheading heading caption="Color with Damien's Lighting" endheading heading caption="or one of the 3D Texturizer formulas" endheading heading caption="3D Texturizer III is needed for" endheading heading caption="the non-slope color options." endheading $endif title="Slope 4D Quadratic G Attractor" maxiter=1000 method=multipass periodicity=0 magn=3.0 float param version caption = "Version number" default = 1.1 hint = "This is for backwards compatibility with old versions \ of the formula." visible = false endparam bool param oldver caption = "Use original version" default = false endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 0.01 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 0 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param value caption = "Hit Value" enum = "Count" "Ave Z" "Last Z" "Largest Z" default = 3 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param pass caption = "Pass slope values" default = true endparam heading caption = "Slope Parameters" visible=@pass==true endheading param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 1.0 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible=@pass==true endparam heading caption = "Rotations and Translations" endheading $ifdef VER40 heading text = "Use the location tab XY Plane Rotation." endheading $endif param xangle caption = "YZ Plane Rotation" default = 0.0 hint = "This is equivalent of a X Axis rotation in 3 Dimensions. \ It is performed after the normal fractal rotation(s) \ (XY Plane Rotation) and zooms." endparam param zangle caption = "XZ Plane Rotation" default = 0.0 hint = "This is equivalent of a Y Axis rotation in 3 Dimensions. \ It is performed after the normal fractal rotation(s) \ (XY Plane Rotation) and zooms." endparam param xwangle caption = "XW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param ywangle caption = "YW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param zwangle caption = "ZW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param rotoffx caption = "Rot Center X Offset" default = 0.0 endparam param rotoffy caption = "Rot Center Y Offset" default = 0.0 endparam param rotoffz caption = "Rot Center Z Offset" default = 0.0 endparam param rotoffw caption = "Rot Center W Offset" default = 0.0 endparam param transx caption = "X Final Translation" default = 0.0 endparam param transy caption = "Y Final Translation" default = 0.0 endparam param transz caption = "Z Final Translation" default = 0.0 endparam heading caption = "Perspective" endheading param useproj caption = "Use Perspective" default = false visible = @oldver endparam param useprojn caption = "Use Perspective" default = true visible = !@oldver endparam param cprojx caption = "X Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam param cprojy caption = "Y Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam float param cprojz caption = "Z Center of Projection" default = -1 visible = @useproj || @useprojn endparam heading caption = "Attractor Parameters" endheading param hideparam caption = "Hide Parameters" default = true endparam param sel caption = "select preset coeffs" enum = "no preset" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" \ "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" \ "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" \ "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" \ "41" "42" "43" "44" "45" "46" "47" "48" "49" "50" \ "51" "52" "53" "54" "55" "56" "57" "58" "59" "60" \ "61" "62" "63" "64" "65" "66" "67" "68" default = 0 endparam param a1 caption = "coefficient a1" default = -0.6 visible=@hideparam==false endparam param a2 caption = "coefficient a2" default = 0.5 visible=@hideparam==false endparam param a3 caption = "coefficient a3" default = 1.0 visible=@hideparam==false endparam param a4 caption = "coefficient a4" default = -0.6 visible=@hideparam==false endparam param a5 caption = "coefficient a5" default = 0.9 visible=@hideparam==false endparam param a6 caption = "coefficient a6" default = 0.3 visible=@hideparam==false endparam param a7 caption = "coefficient a7" default = 1.0 visible=@hideparam==false endparam param a8 caption = "coefficient a8" default = 0.4 visible=@hideparam==false endparam param a9 caption = "coefficient a9" default = -0.6 visible=@hideparam==false endparam param a10 caption = "coefficient a10" default = 1.0 visible=@hideparam==false endparam param a11 caption = "coefficient a11" default = -0.3 visible=@hideparam==false endparam param a12 caption = "coefficient a12" default = -1.0 visible=@hideparam==false endparam param a13 caption = "coefficient a13" default = 0.3 visible=@hideparam==false endparam param a14 caption = "coefficient a14" default = -0.4 visible=@hideparam==false endparam param a15 caption = "coefficient a15" default = 0.5 visible=@hideparam==false endparam param a16 caption = "coefficient a16" default = -0.3 visible=@hideparam==false endparam param a17 caption = "coefficient a17" default = 1.0 visible=@hideparam==false endparam param a18 caption = "coefficient a18" default = 0.0 visible=@hideparam==false endparam param a19 caption = "coefficient a19" default = 0.1 visible=@hideparam==false endparam param a20 caption = "coefficient a20" default = 0.7 visible=@hideparam==false endparam param a21 caption = "coefficient a21" default = 0.3 visible=@hideparam==false endparam param a22 caption = "coefficient a22" default = 0.3 visible=@hideparam==false endparam param a23 caption = "coefficient a23" default = 0.3 visible=@hideparam==false endparam param a24 caption = "coefficient a24" default = -0.6 visible=@hideparam==false endparam param a25 caption = "coefficient a25" default = 0.7 visible=@hideparam==false endparam param a26 caption = "coefficient a26" default = 0.4 visible=@hideparam==false endparam param a27 caption = "coefficient a27" default = -0.7 visible=@hideparam==false endparam param a28 caption = "coefficient a28" default = -0.5 visible=@hideparam==false endparam param a29 caption = "coefficient a29" default = 0.1 visible=@hideparam==false endparam param a30 caption = "coefficient a30" default = -0.1 visible=@hideparam==false endparam param a31 caption = "coefficient a31" default = 0.0 visible=@hideparam==false endparam param a32 caption = "coefficient a32" default = -0.1 visible=@hideparam==false endparam param a33 caption = "coefficient a33" default = 0.8 visible=@hideparam==false endparam param a34 caption = "coefficient a34" default = 0.3 visible=@hideparam==false endparam param a35 caption = "coefficient a35" default = 0.3 visible=@hideparam==false endparam param a36 caption = "coefficient a36" default = -0.1 visible=@hideparam==false endparam param a37 caption = "coefficient a37" default = -0.3 visible=@hideparam==false endparam param a38 caption = "coefficient a38" default = 0.9 visible=@hideparam==false endparam param a39 caption = "coefficient a39" default = 1.0 visible=@hideparam==false endparam param a40 caption = "coefficient a40" default = -0.8 visible=@hideparam==false endparam param a41 caption = "coefficient a41" default = 0.6 visible=@hideparam==false endparam param a42 caption = "coefficient a42" default = -0.6 visible=@hideparam==false endparam param a43 caption = "coefficient a43" default = -0.4 visible=@hideparam==false endparam param a44 caption = "coefficient a44" default = 0.6 visible=@hideparam==false endparam param a45 caption = "coefficient a45" default = -0.4 visible=@hideparam==false endparam param a46 caption = "coefficient a46" default = -0.5 visible=@hideparam==false endparam param a47 caption = "coefficient a47" default = 0.3 visible=@hideparam==false endparam param a48 caption = "coefficient a48" default = -0.5 visible=@hideparam==false endparam param a49 caption = "coefficient a49" default = 0.5 visible=@hideparam==false endparam param a50 caption = "coefficient a50" default = 1.2 visible=@hideparam==false endparam param a51 caption = "coefficient a51" default = -0.1 visible=@hideparam==false endparam param a52 caption = "coefficient a52" default = 1.1 visible=@hideparam==false endparam param a53 caption = "coefficient a53" default = 0.3 visible=@hideparam==false endparam param a54 caption = "coefficient a54" default = -1.2 visible=@hideparam==false endparam param a55 caption = "coefficient a55" default = 1.0 visible=@hideparam==false endparam param a56 caption = "coefficient a56" default = 0.2 visible=@hideparam==false endparam param a57 caption = "coefficient a57" default = -1.2 visible=@hideparam==false endparam param a58 caption = "coefficient a58" default = 0.3 visible=@hideparam==false endparam param a59 caption = "coefficient a59" default = -0.5 visible=@hideparam==false endparam param a60 caption = "coefficient a60" default = 0.1 visible=@hideparam==false endparam } Slope_4D_Quadratic_ODE_G_Attractor { ; Ron Barnett December 11, 2004 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III ; ; global: float zscale2 = 0 float cprojx = 0 float cprojy = 0 float cprojz = 0 float scrsize = sqrt(#width*#width+#height*#height) if !@oldver zscale2 = @zscale2*scrsize cprojx = @cprojx*#width cprojy = @cprojy*#height cprojz = @cprojz*scrsize else zscale2 = @zscale2 cprojx = @cprojx cprojy = @cprojy cprojz = @cprojz endif int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits2[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits3[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float s[91,61] float fx = 0.0 float ffx = 0.0 float xx = 0.0 float fy = 0.0 float ffy = 0.0 float yy = 0.0 float zz = 0.0 float fz = 0.0 float ffz = 0.0 float ww = 0.0 float ffw = 0.0 float b1 = 0 float b2 = 0 float b3 = 0 float b4 = 0 float b5 = 0 float b6 = 0 float b7 = 0 float b8 = 0 float b9 = 0 float b10 = 0 float b11 = 0 float b12 = 0 float b13 = 0 float b14 = 0 float b15 = 0 float b16 = 0 float b17 = 0 float b18 = 0 float b19 = 0 float b20 = 0 float b21 = 0 float b22 = 0 float b23 = 0 float b24 = 0 float b25 = 0 float b26 = 0 float b27 = 0 float b28 = 0 float b29 = 0 float b30 = 0 float b31 = 0 float b32 = 0 float b33 = 0 float b34 = 0 float b35 = 0 float b36 = 0 float b37 = 0 float b38 = 0 float b39 = 0 float b40 = 0 float b41 = 0 float b42 = 0 float b43 = 0 float b44 = 0 float b45 = 0 float b46 = 0 float b47 = 0 float b48 = 0 float b49 = 0 float b50 = 0 float b51 = 0 float b52 = 0 float b53 = 0 float b54 = 0 float b55 = 0 float b56 = 0 float b57 = 0 float b58 = 0 float b59 = 0 float b60 = 0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float tzmax = sqrt(txmax^2+tymax^2) float twmax = sqrt(txmax^2+tymax^2) float xmin = cx - txmax/2 float ymin = cy - tymax/2 float zmin = sqrt(xmin^2 + ymin^2) float wmin = sqrt(xmin^2 + ymin^2) float iterate = @density*10000000 float maxnhit = 0 ; ; initialize hit array ; while(h < #height+wd) while(w < #width+ht) hits[w,h] = 0 hits2[w,h] = 0 hits3[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; initialize presets ; s[1,1]=0.7,s[1,2]=0.1,s[1,3]=0.1,s[1,4]=1.2,s[1,5]=-1.0,s[1,6]=0.4,s[1,7]=0.7,s[1,8]=-0.9,s[1,9]=-0.3,s[1,10]=-0.9,s[1,11]=-0.5,s[1,12]=-0.5,s[1,13]=-1.0,s[1,14]=0.0,s[1,15]=-0.4,s[1,16]=-0.2,s[1,17]=-0.5,s[1,18]=0.1,s[1,19]=-1.0,s[1,20]=0.3,s[1,21]=-0.4,s[1,22]=1.1,s[1,23]=1.1,s[1,24]=0.0,s[1,25]=-1.1,s[1,26]=-0.7,s[1,27]=0.0,s[1,28]=0.5,s[1,29]=0.7,s[1,30]=0.7,s[1,31]=-1.0,s[1,32]=0.7,s[1,33]=0.2,s[1,34]=-0.7,s[1,35]=-1.1,s[1,36]=0.7,s[1,37]=-0.7,s[1,38]=0.0,s[1,39]=-0.5,s[1,40]=0.2,s[1,41]=-0.1,s[1,42]=-0.6,s[1,43]=0.2,s[1,44]=-0.4,s[1,45]=-0.8,s[1,46]=0.8,s[1,47]=0.5,s[1,48]=-1.2,s[1,49]=-0.4,s[1,50]=-1.1,s[1,51]=-1.1,s[1,52]=-0.5,s[1,53]=0.2,s[1,54]=-0.8,s[1,55]=0.3,s[1,56]=0.2,s[1,57]=-0.5,s[1,58]=0.0,s[1,59]=-0.9,s[1,60]=-1.0 s[2,1]=0.0,s[2,2]=-0.9,s[2,3]=1.2,s[2,4]=0.3,s[2,5]=0.6,s[2,6]=0.6,s[2,7]=-0.7,s[2,8]=-0.1,s[2,9]=-0.1,s[2,10]=-0.9,s[2,11]=0.8,s[2,12]=0.5,s[2,13]=0.7,s[2,14]=0.8,s[2,15]=-1.2,s[2,16]=-1.0,s[2,17]=-0.2,s[2,18]=-1.1,s[2,19]=0.5,s[2,20]=-0.9,s[2,21]=0.6,s[2,22]=-0.1,s[2,23]=0.6,s[2,24]=0.2,s[2,25]=-0.3,s[2,26]=-0.5,s[2,27]=1.1,s[2,28]=-0.3,s[2,29]=-0.7,s[2,30]=-0.4,s[2,31]=-0.6,s[2,32]=0.9,s[2,33]=0.0,s[2,34]=-0.6,s[2,35]=1.2,s[2,36]=-0.4,s[2,37]=0.9,s[2,38]=0.7,s[2,39]=-0.2,s[2,40]=-0.1,s[2,41]=-0.8,s[2,42]=-0.8,s[2,43]=-1.2,s[2,44]=1.2,s[2,45]=0.2,s[2,46]=-0.7,s[2,47]=-0.9,s[2,48]=-0.4,s[2,49]=0.1,s[2,50]=0.7,s[2,51]=0.2,s[2,52]=1.1,s[2,53]=-0.1,s[2,54]=-1.2,s[2,55]=-0.5,s[2,56]=0.0,s[2,57]=1.0,s[2,58]=1.2,s[2,59]=-0.2,s[2,60]=-1.1 s[3,1]=0.0,s[3,2]=-0.7,s[3,3]=0.0,s[3,4]=-0.8,s[3,5]=-0.8,s[3,6]=-0.6,s[3,7]=0.3,s[3,8]=0.1,s[3,9]=0.5,s[3,10]=-0.4,s[3,11]=0.0,s[3,12]=0.4,s[3,13]=0.7,s[3,14]=0.4,s[3,15]=1.2,s[3,16]=-0.6,s[3,17]=0.4,s[3,18]=-0.2,s[3,19]=-1.2,s[3,20]=0.2,s[3,21]=-1.0,s[3,22]=-0.6,s[3,23]=-0.9,s[3,24]=0.7,s[3,25]=-0.6,s[3,26]=1.2,s[3,27]=0.8,s[3,28]=-0.3,s[3,29]=0.3,s[3,30]=0.3,s[3,31]=-1.2,s[3,32]=0.6,s[3,33]=0.3,s[3,34]=0.6,s[3,35]=-0.5,s[3,36]=0.4,s[3,37]=-0.2,s[3,38]=-0.4,s[3,39]=-0.6,s[3,40]=-0.3,s[3,41]=-0.7,s[3,42]=0.0,s[3,43]=1.0,s[3,44]=0.8,s[3,45]=1.1,s[3,46]=0.7,s[3,47]=0.3,s[3,48]=-0.3,s[3,49]=-1.2,s[3,50]=-0.6,s[3,51]=-1.1,s[3,52]=-0.3,s[3,53]=-0.2,s[3,54]=-0.7,s[3,55]=-1.0,s[3,56]=1.2,s[3,57]=-1.2,s[3,58]=-0.7,s[3,59]=0.2,s[3,60]=-0.2 s[4,1]=-0.7,s[4,2]=-1.1,s[4,3]=1.2,s[4,4]=-0.2,s[4,5]=-1.1,s[4,6]=0.8,s[4,7]=-1.1,s[4,8]=0.8,s[4,9]=0.3,s[4,10]=-0.9,s[4,11]=-0.5,s[4,12]=0.5,s[4,13]=-0.2,s[4,14]=-0.7,s[4,15]=0.3,s[4,16]=1.2,s[4,17]=-0.8,s[4,18]=0.0,s[4,19]=-1.0,s[4,20]=-1.0,s[4,21]=-1.0,s[4,22]=0.8,s[4,23]=-0.4,s[4,24]=0.6,s[4,25]=-1.1,s[4,26]=0.7,s[4,27]=-0.5,s[4,28]=-0.4,s[4,29]=-1.2,s[4,30]=0.7,s[4,31]=-0.9,s[4,32]=0.5,s[4,33]=0.9,s[4,34]=-0.6,s[4,35]=-1.1,s[4,36]=-0.5,s[4,37]=0.0,s[4,38]=-1.0,s[4,39]=0.1,s[4,40]=1.0,s[4,41]=-1.0,s[4,42]=-0.3,s[4,43]=-0.8,s[4,44]=1.2,s[4,45]=-0.3,s[4,46]=0.8,s[4,47]=0.8,s[4,48]=-1.2,s[4,49]=-0.3,s[4,50]=0.7,s[4,51]=1.1,s[4,52]=0.8,s[4,53]=0.1,s[4,54]=0.8,s[4,55]=0.3,s[4,56]=1.2,s[4,57]=1.0,s[4,58]=0.2,s[4,59]=0.6,s[4,60]=-0.6 s[5,1]=-0.2,s[5,2]=0.0,s[5,3]=-1.0,s[5,4]=1.0,s[5,5]=-0.3,s[5,6]=-0.7,s[5,7]=-1.2,s[5,8]=-0.6,s[5,9]=0.4,s[5,10]=0.5,s[5,11]=0.9,s[5,12]=1.1,s[5,13]=0.8,s[5,14]=1.2,s[5,15]=0.1,s[5,16]=1.1,s[5,17]=-0.5,s[5,18]=-0.4,s[5,19]=-0.4,s[5,20]=0.4,s[5,21]=-0.9,s[5,22]=-0.2,s[5,23]=0.0,s[5,24]=-0.9,s[5,25]=-0.8,s[5,26]=1.2,s[5,27]=-1.2,s[5,28]=0.2,s[5,29]=0.4,s[5,30]=-0.1,s[5,31]=0.3,s[5,32]=-0.6,s[5,33]=-0.1,s[5,34]=-1.1,s[5,35]=-0.5,s[5,36]=-1.0,s[5,37]=0.7,s[5,38]=0.0,s[5,39]=-1.0,s[5,40]=0.0,s[5,41]=0.3,s[5,42]=0.3,s[5,43]=1.0,s[5,44]=0.1,s[5,45]=1.0,s[5,46]=1.2,s[5,47]=-0.1,s[5,48]=-0.4,s[5,49]=-0.5,s[5,50]=0.1,s[5,51]=-0.4,s[5,52]=0.4,s[5,53]=-0.6,s[5,54]=-1.1,s[5,55]=-0.1,s[5,56]=0.0,s[5,57]=0.2,s[5,58]=0.0,s[5,59]=-0.1,s[5,60]=-0.9 s[6,1]=-0.3,s[6,2]=0.6,s[6,3]=0.0,s[6,4]=-0.7,s[6,5]=0.6,s[6,6]=1.2,s[6,7]=-0.1,s[6,8]=0.7,s[6,9]=-0.9,s[6,10]=-1.1,s[6,11]=1.2,s[6,12]=1.1,s[6,13]=-1.1,s[6,14]=-0.1,s[6,15]=0.3,s[6,16]=-0.1,s[6,17]=-0.9,s[6,18]=-0.4,s[6,19]=0.3,s[6,20]=0.1,s[6,21]=-1.2,s[6,22]=-0.6,s[6,23]=-0.3,s[6,24]=0.2,s[6,25]=-0.2,s[6,26]=-0.2,s[6,27]=0.3,s[6,28]=1.1,s[6,29]=-1.1,s[6,30]=-1.0,s[6,31]=-1.0,s[6,32]=0.3,s[6,33]=-0.3,s[6,34]=0.6,s[6,35]=-1.2,s[6,36]=0.1,s[6,37]=-0.2,s[6,38]=0.5,s[6,39]=1.2,s[6,40]=0.9,s[6,41]=-0.5,s[6,42]=1.1,s[6,43]=-0.3,s[6,44]=0.9,s[6,45]=-0.3,s[6,46]=1.0,s[6,47]=-0.5,s[6,48]=-0.2,s[6,49]=0.2,s[6,50]=0.9,s[6,51]=1.1,s[6,52]=0.5,s[6,53]=-1.0,s[6,54]=-0.5,s[6,55]=0.9,s[6,56]=-0.6,s[6,57]=-1.1,s[6,58]=-0.2,s[6,59]=-0.3,s[6,60]=0.5 s[7,1]=-0.8,s[7,2]=0.7,s[7,3]=-0.5,s[7,4]=-1.1,s[7,5]=-0.7,s[7,6]=0.7,s[7,7]=-1.1,s[7,8]=-0.3,s[7,9]=0.6,s[7,10]=-0.1,s[7,11]=-0.8,s[7,12]=0.6,s[7,13]=1.2,s[7,14]=-1.1,s[7,15]=0.6,s[7,16]=-0.1,s[7,17]=-0.3,s[7,18]=0.5,s[7,19]=0.1,s[7,20]=0.9,s[7,21]=0.8,s[7,22]=-0.6,s[7,23]=0.8,s[7,24]=1.2,s[7,25]=0.3,s[7,26]=-0.5,s[7,27]=0.7,s[7,28]=0.1,s[7,29]=1.2,s[7,30]=-1.1,s[7,31]=0.9,s[7,32]=-0.9,s[7,33]=0.6,s[7,34]=-0.4,s[7,35]=0.2,s[7,36]=-0.7,s[7,37]=-0.8,s[7,38]=-0.6,s[7,39]=-0.7,s[7,40]=-0.5,s[7,41]=0.8,s[7,42]=-1.2,s[7,43]=1.0,s[7,44]=-1.2,s[7,45]=0.1,s[7,46]=-0.4,s[7,47]=0.1,s[7,48]=-0.6,s[7,49]=-0.6,s[7,50]=0.2,s[7,51]=-0.4,s[7,52]=0.5,s[7,53]=-0.2,s[7,54]=-0.5,s[7,55]=0.9,s[7,56]=-0.1,s[7,57]=-1.1,s[7,58]=0.4,s[7,59]=-1.0,s[7,60]=-0.3 s[8,1]=1.1,s[8,2]=-1.0,s[8,3]=0.7,s[8,4]=0.9,s[8,5]=1.1,s[8,6]=-0.1,s[8,7]=0.3,s[8,8]=0.4,s[8,9]=-1.1,s[8,10]=-1.0,s[8,11]=-0.9,s[8,12]=-1.1,s[8,13]=-0.4,s[8,14]=-1.1,s[8,15]=-0.2,s[8,16]=-1.2,s[8,17]=-0.2,s[8,18]=0.1,s[8,19]=0.7,s[8,20]=0.7,s[8,21]=0.5,s[8,22]=-0.3,s[8,23]=-1.0,s[8,24]=0.1,s[8,25]=-0.7,s[8,26]=0.8,s[8,27]=-1.2,s[8,28]=-0.7,s[8,29]=0.5,s[8,30]=0.9,s[8,31]=-0.6,s[8,32]=-0.8,s[8,33]=-0.5,s[8,34]=0.3,s[8,35]=0.2,s[8,36]=0.8,s[8,37]=-0.6,s[8,38]=1.0,s[8,39]=-0.8,s[8,40]=-1.2,s[8,41]=0.5,s[8,42]=-0.2,s[8,43]=-1.1,s[8,44]=-0.4,s[8,45]=0.4,s[8,46]=0.9,s[8,47]=0.6,s[8,48]=0.6,s[8,49]=0.1,s[8,50]=1.0,s[8,51]=0.6,s[8,52]=-0.8,s[8,53]=0.6,s[8,54]=0.2,s[8,55]=0.7,s[8,56]=1.1,s[8,57]=0.8,s[8,58]=0.2,s[8,59]=-0.6,s[8,60]=-0.5 s[9,1]=0.8,s[9,2]=-0.1,s[9,3]=-0.2,s[9,4]=-0.4,s[9,5]=1.2,s[9,6]=-0.6,s[9,7]=-0.2,s[9,8]=0.7,s[9,9]=-0.9,s[9,10]=0.0,s[9,11]=-0.2,s[9,12]=-1.0,s[9,13]=0.9,s[9,14]=-1.1,s[9,15]=0.5,s[9,16]=0.0,s[9,17]=1.0,s[9,18]=-0.9,s[9,19]=-0.2,s[9,20]=-1.0,s[9,21]=1.0,s[9,22]=0.0,s[9,23]=0.8,s[9,24]=1.2,s[9,25]=1.2,s[9,26]=0.7,s[9,27]=0.0,s[9,28]=-0.5,s[9,29]=0.7,s[9,30]=-0.7,s[9,31]=0.1,s[9,32]=-0.9,s[9,33]=-0.9,s[9,34]=0.6,s[9,35]=-0.5,s[9,36]=0.0,s[9,37]=0.9,s[9,38]=-0.2,s[9,39]=0.6,s[9,40]=-1.1,s[9,41]=0.0,s[9,42]=1.2,s[9,43]=0.6,s[9,44]=-0.3,s[9,45]=-1.1,s[9,46]=-1.0,s[9,47]=-0.5,s[9,48]=-1.0,s[9,49]=0.5,s[9,50]=0.7,s[9,51]=-0.5,s[9,52]=-1.1,s[9,53]=0.7,s[9,54]=-0.8,s[9,55]=-0.7,s[9,56]=0.9,s[9,57]=1.1,s[9,58]=-0.6,s[9,59]=1.1,s[9,60]=1.2 s[10,1]=0.1,s[10,2]=0.3,s[10,3]=-1.0,s[10,4]=-0.3,s[10,5]=-0.7,s[10,6]=0.8,s[10,7]=0.5,s[10,8]=-0.5,s[10,9]=0.5,s[10,10]=-1.1,s[10,11]=-0.7,s[10,12]=0.9,s[10,13]=0.1,s[10,14]=-0.8,s[10,15]=0.0,s[10,16]=-0.6,s[10,17]=-0.8,s[10,18]=1.2,s[10,19]=-1.2,s[10,20]=0.9,s[10,21]=1.1,s[10,22]=-1.1,s[10,23]=-0.3,s[10,24]=0.8,s[10,25]=0.9,s[10,26]=1.2,s[10,27]=1.0,s[10,28]=0.6,s[10,29]=0.5,s[10,30]=-0.9,s[10,31]=-1.0,s[10,32]=1.2,s[10,33]=-0.2,s[10,34]=-0.3,s[10,35]=-1.2,s[10,36]=0.7,s[10,37]=-0.3,s[10,38]=-0.2,s[10,39]=-0.8,s[10,40]=-1.1,s[10,41]=-0.4,s[10,42]=1.2,s[10,43]=1.1,s[10,44]=0.3,s[10,45]=-1.1,s[10,46]=1.0,s[10,47]=-1.0,s[10,48]=-0.3,s[10,49]=0.3,s[10,50]=-0.7,s[10,51]=-0.9,s[10,52]=0.2,s[10,53]=0.2,s[10,54]=0.1,s[10,55]=-0.4,s[10,56]=0.6,s[10,57]=-1.1,s[10,58]=0.6,s[10,59]=-0.1,s[10,60]=-0.9 s[11,1]=0.0,s[11,2]=0.8,s[11,3]=-0.3,s[11,4]=-0.5,s[11,5]=-0.4,s[11,6]=0.3,s[11,7]=0.8,s[11,8]=-0.3,s[11,9]=-0.5,s[11,10]=-0.6,s[11,11]=0.6,s[11,12]=1.1,s[11,13]=-0.6,s[11,14]=-0.1,s[11,15]=0.0,s[11,16]=-0.1,s[11,17]=0.5,s[11,18]=0.0,s[11,19]=0.8,s[11,20]=0.7,s[11,21]=0.4,s[11,22]=-0.9,s[11,23]=-0.1,s[11,24]=0.3,s[11,25]=-0.6,s[11,26]=0.7,s[11,27]=-0.7,s[11,28]=1.1,s[11,29]=0.3,s[11,30]=-0.9,s[11,31]=0.6,s[11,32]=-0.9,s[11,33]=0.7,s[11,34]=-0.5,s[11,35]=0.7,s[11,36]=1.1,s[11,37]=-1.2,s[11,38]=1.2,s[11,39]=-0.9,s[11,40]=-1.0,s[11,41]=-1.2,s[11,42]=1.0,s[11,43]=-0.6,s[11,44]=0.2,s[11,45]=-0.6,s[11,46]=1.2,s[11,47]=0.3,s[11,48]=-0.3,s[11,49]=-0.6,s[11,50]=0.8,s[11,51]=-0.4,s[11,52]=0.7,s[11,53]=-0.4,s[11,54]=0.0,s[11,55]=0.2,s[11,56]=-0.1,s[11,57]=0.1,s[11,58]=0.3,s[11,59]=-0.6,s[11,60]=-0.7 s[12,1]=-0.7,s[12,2]=-1.1,s[12,3]=-0.1,s[12,4]=-0.8,s[12,5]=1.2,s[12,6]=-0.6,s[12,7]=0.6,s[12,8]=-0.7,s[12,9]=0.5,s[12,10]=1.2,s[12,11]=0.1,s[12,12]=0.5,s[12,13]=0.9,s[12,14]=1.1,s[12,15]=-1.0,s[12,16]=0.8,s[12,17]=0.4,s[12,18]=-1.0,s[12,19]=-0.4,s[12,20]=0.0,s[12,21]=-0.2,s[12,22]=0.3,s[12,23]=0.0,s[12,24]=-1.1,s[12,25]=-0.1,s[12,26]=-0.7,s[12,27]=-1.2,s[12,28]=0.1,s[12,29]=0.9,s[12,30]=1.0,s[12,31]=-0.6,s[12,32]=-1.0,s[12,33]=0.7,s[12,34]=-1.0,s[12,35]=0.3,s[12,36]=-1.1,s[12,37]=-1.1,s[12,38]=1.0,s[12,39]=0.1,s[12,40]=0.8,s[12,41]=0.4,s[12,42]=-0.4,s[12,43]=-0.3,s[12,44]=-0.1,s[12,45]=0.2,s[12,46]=-0.3,s[12,47]=-0.4,s[12,48]=0.5,s[12,49]=-1.0,s[12,50]=-0.9,s[12,51]=1.1,s[12,52]=1.2,s[12,53]=0.5,s[12,54]=0.0,s[12,55]=-0.1,s[12,56]=-0.9,s[12,57]=0.4,s[12,58]=1.0,s[12,59]=-0.4,s[12,60]=-1.2 s[13,1]=0.7,s[13,2]=1.1,s[13,3]=-0.1,s[13,4]=-0.3,s[13,5]=0.6,s[13,6]=0.8,s[13,7]=0.3,s[13,8]=-0.3,s[13,9]=-1.2,s[13,10]=0.7,s[13,11]=-0.2,s[13,12]=1.0,s[13,13]=0.4,s[13,14]=0.2,s[13,15]=-0.3,s[13,16]=0.6,s[13,17]=0.9,s[13,18]=0.3,s[13,19]=-1.0,s[13,20]=0.8,s[13,21]=-0.6,s[13,22]=-0.8,s[13,23]=-0.7,s[13,24]=-0.3,s[13,25]=-0.1,s[13,26]=-0.4,s[13,27]=0.1,s[13,28]=1.1,s[13,29]=0.6,s[13,30]=0.9,s[13,31]=-0.7,s[13,32]=0.7,s[13,33]=0.0,s[13,34]=0.6,s[13,35]=0.8,s[13,36]=-0.9,s[13,37]=0.8,s[13,38]=0.7,s[13,39]=-0.6,s[13,40]=0.9,s[13,41]=-1.1,s[13,42]=-0.7,s[13,43]=0.5,s[13,44]=0.0,s[13,45]=0.8,s[13,46]=1.0,s[13,47]=0.3,s[13,48]=-0.9,s[13,49]=-0.7,s[13,50]=-0.1,s[13,51]=0.4,s[13,52]=0.2,s[13,53]=-0.9,s[13,54]=-1.2,s[13,55]=-0.4,s[13,56]=0.3,s[13,57]=-0.8,s[13,58]=-0.5,s[13,59]=-0.5,s[13,60]=1.1 s[14,1]=-0.2,s[14,2]=1.1,s[14,3]=-1.1,s[14,4]=1.2,s[14,5]=1.2,s[14,6]=1.0,s[14,7]=0.2,s[14,8]=1.0,s[14,9]=-0.3,s[14,10]=0.6,s[14,11]=0.5,s[14,12]=0.8,s[14,13]=-0.6,s[14,14]=-0.6,s[14,15]=-0.3,s[14,16]=-1.0,s[14,17]=-0.6,s[14,18]=0.8,s[14,19]=0.6,s[14,20]=0.5,s[14,21]=1.0,s[14,22]=-0.3,s[14,23]=1.1,s[14,24]=-0.7,s[14,25]=-0.7,s[14,26]=1.0,s[14,27]=-0.8,s[14,28]=0.5,s[14,29]=0.5,s[14,30]=1.2,s[14,31]=0.1,s[14,32]=-0.3,s[14,33]=-1.2,s[14,34]=-0.4,s[14,35]=0.7,s[14,36]=0.3,s[14,37]=0.3,s[14,38]=0.9,s[14,39]=-0.9,s[14,40]=0.8,s[14,41]=0.9,s[14,42]=0.0,s[14,43]=0.8,s[14,44]=-0.3,s[14,45]=-0.4,s[14,46]=-1.2,s[14,47]=1.1,s[14,48]=1.0,s[14,49]=1.0,s[14,50]=-1.2,s[14,51]=-1.2,s[14,52]=0.8,s[14,53]=-0.3,s[14,54]=0.5,s[14,55]=-0.5,s[14,56]=0.9,s[14,57]=0.0,s[14,58]=0.6,s[14,59]=-1.0,s[14,60]=-0.1 s[15,1]=0.3,s[15,2]=0.1,s[15,3]=0.2,s[15,4]=0.7,s[15,5]=0.6,s[15,6]=-0.6,s[15,7]=-0.1,s[15,8]=-0.7,s[15,9]=0.3,s[15,10]=-0.5,s[15,11]=0.3,s[15,12]=-0.2,s[15,13]=0.0,s[15,14]=0.6,s[15,15]=-0.3,s[15,16]=-0.1,s[15,17]=0.4,s[15,18]=0.1,s[15,19]=0.7,s[15,20]=-1.0,s[15,21]=0.9,s[15,22]=0.4,s[15,23]=-0.5,s[15,24]=1.1,s[15,25]=1.1,s[15,26]=-0.6,s[15,27]=0.6,s[15,28]=0.6,s[15,29]=-0.3,s[15,30]=-0.9,s[15,31]=0.8,s[15,32]=0.1,s[15,33]=0.0,s[15,34]=0.4,s[15,35]=1.2,s[15,36]=1.0,s[15,37]=1.2,s[15,38]=-1.1,s[15,39]=-0.3,s[15,40]=-0.3,s[15,41]=-0.3,s[15,42]=0.2,s[15,43]=0.6,s[15,44]=-0.8,s[15,45]=0.3,s[15,46]=1.2,s[15,47]=0.8,s[15,48]=0.6,s[15,49]=1.0,s[15,50]=0.0,s[15,51]=0.0,s[15,52]=1.1,s[15,53]=-1.0,s[15,54]=1.1,s[15,55]=0.6,s[15,56]=0.1,s[15,57]=-1.2,s[15,58]=1.2,s[15,59]=-0.9,s[15,60]=0.3 s[16,1]=-0.5,s[16,2]=0.5,s[16,3]=0.8,s[16,4]=0.4,s[16,5]=0.1,s[16,6]=-0.3,s[16,7]=-0.3,s[16,8]=0.9,s[16,9]=-0.9,s[16,10]=-0.6,s[16,11]=1.2,s[16,12]=-0.9,s[16,13]=-0.3,s[16,14]=0.4,s[16,15]=0.2,s[16,16]=-0.3,s[16,17]=-0.1,s[16,18]=0.7,s[16,19]=1.2,s[16,20]=0.3,s[16,21]=-0.5,s[16,22]=-0.2,s[16,23]=0.7,s[16,24]=-0.8,s[16,25]=0.9,s[16,26]=0.9,s[16,27]=0.2,s[16,28]=-0.4,s[16,29]=1.2,s[16,30]=0.5,s[16,31]=-0.3,s[16,32]=-0.2,s[16,33]=0.5,s[16,34]=-0.2,s[16,35]=-0.6,s[16,36]=0.9,s[16,37]=-0.5,s[16,38]=1.2,s[16,39]=0.7,s[16,40]=0.9,s[16,41]=0.4,s[16,42]=-0.9,s[16,43]=0.4,s[16,44]=0.6,s[16,45]=-0.6,s[16,46]=0.9,s[16,47]=-0.4,s[16,48]=-0.6,s[16,49]=-0.5,s[16,50]=-0.6,s[16,51]=-0.1,s[16,52]=-0.8,s[16,53]=-1.2,s[16,54]=-0.8,s[16,55]=1.2,s[16,56]=0.1,s[16,57]=-0.8,s[16,58]=0.8,s[16,59]=-1.1,s[16,60]=0.4 s[17,1]=0.5,s[17,2]=0.0,s[17,3]=-1.2,s[17,4]=0.7,s[17,5]=0.3,s[17,6]=0.8,s[17,7]=0.5,s[17,8]=1.1,s[17,9]=-0.5,s[17,10]=-1.0,s[17,11]=-1.2,s[17,12]=-0.3,s[17,13]=0.0,s[17,14]=1.2,s[17,15]=0.5,s[17,16]=1.2,s[17,17]=-0.6,s[17,18]=0.7,s[17,19]=0.2,s[17,20]=0.7,s[17,21]=1.2,s[17,22]=-0.3,s[17,23]=-0.8,s[17,24]=0.7,s[17,25]=-1.0,s[17,26]=0.6,s[17,27]=0.3,s[17,28]=-0.5,s[17,29]=1.2,s[17,30]=-0.7,s[17,31]=1.0,s[17,32]=0.0,s[17,33]=-0.7,s[17,34]=0.7,s[17,35]=0.3,s[17,36]=-0.5,s[17,37]=-0.3,s[17,38]=-0.7,s[17,39]=0.0,s[17,40]=-0.6,s[17,41]=0.7,s[17,42]=0.9,s[17,43]=-1.2,s[17,44]=0.3,s[17,45]=0.2,s[17,46]=-0.1,s[17,47]=-1.1,s[17,48]=-1.1,s[17,49]=1.0,s[17,50]=-0.5,s[17,51]=-0.3,s[17,52]=0.3,s[17,53]=-0.5,s[17,54]=0.7,s[17,55]=-1.2,s[17,56]=0.9,s[17,57]=1.1,s[17,58]=0.9,s[17,59]=1.0,s[17,60]=0.4 s[18,1]=-1.0,s[18,2]=-0.3,s[18,3]=1.2,s[18,4]=-0.9,s[18,5]=-0.6,s[18,6]=1.0,s[18,7]=0.5,s[18,8]=-1.2,s[18,9]=-1.0,s[18,10]=-0.9,s[18,11]=0.8,s[18,12]=-1.1,s[18,13]=0.2,s[18,14]=-0.6,s[18,15]=-0.2,s[18,16]=-0.7,s[18,17]=0.6,s[18,18]=0.4,s[18,19]=0.6,s[18,20]=0.3,s[18,21]=-0.4,s[18,22]=-0.1,s[18,23]=0.5,s[18,24]=0.1,s[18,25]=-0.3,s[18,26]=-0.7,s[18,27]=-0.4,s[18,28]=-0.2,s[18,29]=0.5,s[18,30]=0.7,s[18,31]=-0.9,s[18,32]=0.2,s[18,33]=0.4,s[18,34]=0.0,s[18,35]=-0.4,s[18,36]=0.2,s[18,37]=-0.4,s[18,38]=0.0,s[18,39]=1.2,s[18,40]=-1.2,s[18,41]=-1.1,s[18,42]=-0.1,s[18,43]=-1.1,s[18,44]=0.6,s[18,45]=1.1,s[18,46]=0.3,s[18,47]=1.0,s[18,48]=-1.1,s[18,49]=-0.8,s[18,50]=-0.8,s[18,51]=0.2,s[18,52]=0.2,s[18,53]=-1.2,s[18,54]=-1.0,s[18,55]=-1.1,s[18,56]=-0.5,s[18,57]=0.8,s[18,58]=-1.2,s[18,59]=-1.1,s[18,60]=0.0 s[19,1]=-0.2,s[19,2]=-1.0,s[19,3]=0.9,s[19,4]=0.3,s[19,5]=-0.6,s[19,6]=1.2,s[19,7]=0.1,s[19,8]=-1.2,s[19,9]=0.9,s[19,10]=0.1,s[19,11]=0.6,s[19,12]=-1.1,s[19,13]=-1.0,s[19,14]=0.1,s[19,15]=0.6,s[19,16]=0.6,s[19,17]=-1.1,s[19,18]=-0.5,s[19,19]=1.2,s[19,20]=-0.2,s[19,21]=0.5,s[19,22]=-0.8,s[19,23]=0.5,s[19,24]=-0.7,s[19,25]=-1.1,s[19,26]=0.9,s[19,27]=-0.3,s[19,28]=0.4,s[19,29]=0.0,s[19,30]=-1.0,s[19,31]=1.0,s[19,32]=-1.1,s[19,33]=-0.9,s[19,34]=0.7,s[19,35]=0.8,s[19,36]=-0.4,s[19,37]=-0.5,s[19,38]=0.3,s[19,39]=0.2,s[19,40]=-0.8,s[19,41]=-0.6,s[19,42]=0.4,s[19,43]=0.5,s[19,44]=-0.4,s[19,45]=-0.9,s[19,46]=-0.9,s[19,47]=-0.5,s[19,48]=1.0,s[19,49]=0.9,s[19,50]=-0.8,s[19,51]=-0.6,s[19,52]=-1.2,s[19,53]=-0.2,s[19,54]=-0.6,s[19,55]=-0.6,s[19,56]=-0.1,s[19,57]=-1.2,s[19,58]=1.0,s[19,59]=-1.0,s[19,60]=-0.2 s[20,1]=0.9,s[20,2]=0.5,s[20,3]=-0.6,s[20,4]=0.8,s[20,5]=-0.4,s[20,6]=0.9,s[20,7]=-1.0,s[20,8]=0.0,s[20,9]=-0.1,s[20,10]=0.5,s[20,11]=0.8,s[20,12]=-0.6,s[20,13]=0.8,s[20,14]=-0.8,s[20,15]=0.2,s[20,16]=-0.2,s[20,17]=-1.0,s[20,18]=0.0,s[20,19]=-1.2,s[20,20]=0.8,s[20,21]=0.8,s[20,22]=1.2,s[20,23]=-0.9,s[20,24]=1.1,s[20,25]=1.0,s[20,26]=-0.4,s[20,27]=0.9,s[20,28]=0.8,s[20,29]=-1.2,s[20,30]=-0.2,s[20,31]=-0.6,s[20,32]=1.2,s[20,33]=-0.5,s[20,34]=-0.3,s[20,35]=-1.0,s[20,36]=-0.1,s[20,37]=-0.7,s[20,38]=-0.1,s[20,39]=0.8,s[20,40]=0.1,s[20,41]=-0.1,s[20,42]=1.0,s[20,43]=1.2,s[20,44]=0.6,s[20,45]=-0.8,s[20,46]=-1.1,s[20,47]=0.2,s[20,48]=-0.1,s[20,49]=-1.2,s[20,50]=-1.2,s[20,51]=-0.8,s[20,52]=-1.2,s[20,53]=-1.1,s[20,54]=1.0,s[20,55]=0.9,s[20,56]=0.3,s[20,57]=-0.6,s[20,58]=-0.4,s[20,59]=-1.1,s[20,60]=-0.9 s[21,1]=-0.1,s[21,2]=-0.6,s[21,3]=-0.7,s[21,4]=0.3,s[21,5]=0.3,s[21,6]=-0.7,s[21,7]=-0.7,s[21,8]=-0.6,s[21,9]=1.2,s[21,10]=-0.1,s[21,11]=0.1,s[21,12]=0.5,s[21,13]=-0.3,s[21,14]=1.2,s[21,15]=1.1,s[21,16]=0.7,s[21,17]=-0.8,s[21,18]=-1.1,s[21,19]=0.0,s[21,20]=-0.6,s[21,21]=-1.2,s[21,22]=-0.8,s[21,23]=0.7,s[21,24]=0.9,s[21,25]=0.5,s[21,26]=-0.9,s[21,27]=-0.6,s[21,28]=0.1,s[21,29]=0.5,s[21,30]=-0.9,s[21,31]=0.0,s[21,32]=0.5,s[21,33]=-1.2,s[21,34]=1.0,s[21,35]=-0.4,s[21,36]=0.1,s[21,37]=1.1,s[21,38]=-0.1,s[21,39]=-0.3,s[21,40]=-0.9,s[21,41]=-0.6,s[21,42]=-0.2,s[21,43]=0.7,s[21,44]=-1.0,s[21,45]=-0.1,s[21,46]=-1.2,s[21,47]=-0.1,s[21,48]=1.2,s[21,49]=-1.0,s[21,50]=-0.7,s[21,51]=-0.1,s[21,52]=-0.7,s[21,53]=1.2,s[21,54]=-1.2,s[21,55]=-0.1,s[21,56]=-1.1,s[21,57]=-0.4,s[21,58]=1.2,s[21,59]=-0.4,s[21,60]=-0.3 s[22,1]=1.2,s[22,2]=0.5,s[22,3]=-0.7,s[22,4]=0.4,s[22,5]=-1.0,s[22,6]=0.7,s[22,7]=-0.3,s[22,8]=1.1,s[22,9]=-0.6,s[22,10]=-0.5,s[22,11]=1.2,s[22,12]=-1.1,s[22,13]=-0.8,s[22,14]=0.3,s[22,15]=0.5,s[22,16]=0.8,s[22,17]=-1.2,s[22,18]=-0.4,s[22,19]=0.1,s[22,20]=-0.4,s[22,21]=-1.2,s[22,22]=0.6,s[22,23]=0.8,s[22,24]=0.9,s[22,25]=0.1,s[22,26]=-0.2,s[22,27]=-0.1,s[22,28]=0.5,s[22,29]=0.5,s[22,30]=0.9,s[22,31]=0.8,s[22,32]=0.0,s[22,33]=0.3,s[22,34]=1.0,s[22,35]=-0.6,s[22,36]=-0.3,s[22,37]=0.0,s[22,38]=0.9,s[22,39]=1.1,s[22,40]=0.8,s[22,41]=0.6,s[22,42]=-0.8,s[22,43]=0.1,s[22,44]=-0.9,s[22,45]=0.9,s[22,46]=0.5,s[22,47]=-1.0,s[22,48]=-0.4,s[22,49]=0.7,s[22,50]=0.6,s[22,51]=0.4,s[22,52]=1.1,s[22,53]=-1.2,s[22,54]=-0.9,s[22,55]=1.2,s[22,56]=-0.8,s[22,57]=0.8,s[22,58]=-1.0,s[22,59]=0.0,s[22,60]=0.9 s[23,1]=-1.1,s[23,2]=-0.5,s[23,3]=-0.9,s[23,4]=0.8,s[23,5]=-0.3,s[23,6]=-0.2,s[23,7]=1.2,s[23,8]=0.2,s[23,9]=-1.0,s[23,10]=0.1,s[23,11]=0.2,s[23,12]=0.8,s[23,13]=-1.0,s[23,14]=-1.1,s[23,15]=0.6,s[23,16]=0.7,s[23,17]=-0.3,s[23,18]=-0.6,s[23,19]=0.8,s[23,20]=0.1,s[23,21]=0.2,s[23,22]=-0.3,s[23,23]=-0.8,s[23,24]=-0.9,s[23,25]=-0.9,s[23,26]=0.9,s[23,27]=-1.1,s[23,28]=1.1,s[23,29]=-0.6,s[23,30]=0.6,s[23,31]=-0.2,s[23,32]=-0.4,s[23,33]=0.6,s[23,34]=-0.5,s[23,35]=-0.4,s[23,36]=-0.4,s[23,37]=-0.3,s[23,38]=0.8,s[23,39]=0.9,s[23,40]=0.9,s[23,41]=-0.1,s[23,42]=-0.7,s[23,43]=0.6,s[23,44]=0.9,s[23,45]=-0.6,s[23,46]=1.1,s[23,47]=-0.5,s[23,48]=0.9,s[23,49]=-1.0,s[23,50]=1.1,s[23,51]=0.8,s[23,52]=1.2,s[23,53]=1.2,s[23,54]=0.0,s[23,55]=-0.7,s[23,56]=-0.9,s[23,57]=-0.2,s[23,58]=-0.7,s[23,59]=-0.6,s[23,60]=-0.3 s[24,1]=1.1,s[24,2]=0.4,s[24,3]=-0.4,s[24,4]=-1.0,s[24,5]=0.3,s[24,6]=0.4,s[24,7]=0.5,s[24,8]=-0.6,s[24,9]=0.9,s[24,10]=-0.5,s[24,11]=-0.8,s[24,12]=-0.7,s[24,13]=0.5,s[24,14]=0.3,s[24,15]=-1.2,s[24,16]=0.8,s[24,17]=-0.4,s[24,18]=-0.9,s[24,19]=-0.4,s[24,20]=-0.9,s[24,21]=1.1,s[24,22]=-0.6,s[24,23]=0.2,s[24,24]=-0.7,s[24,25]=-1.1,s[24,26]=-0.5,s[24,27]=1.1,s[24,28]=-1.1,s[24,29]=0.6,s[24,30]=0.2,s[24,31]=1.2,s[24,32]=-0.5,s[24,33]=1.2,s[24,34]=0.7,s[24,35]=0.9,s[24,36]=1.0,s[24,37]=0.3,s[24,38]=-1.0,s[24,39]=-0.5,s[24,40]=-0.9,s[24,41]=-0.5,s[24,42]=0.4,s[24,43]=-1.1,s[24,44]=0.7,s[24,45]=0.2,s[24,46]=-0.5,s[24,47]=0.5,s[24,48]=-0.8,s[24,49]=0.4,s[24,50]=-0.2,s[24,51]=1.1,s[24,52]=0.9,s[24,53]=1.0,s[24,54]=0.2,s[24,55]=-0.8,s[24,56]=0.9,s[24,57]=0.2,s[24,58]=-1.2,s[24,59]=0.3,s[24,60]=0.6 s[25,1]=-0.2,s[25,2]=0.9,s[25,3]=-0.5,s[25,4]=-0.8,s[25,5]=-0.5,s[25,6]=0.3,s[25,7]=0.2,s[25,8]=0.7,s[25,9]=0.7,s[25,10]=0.2,s[25,11]=-0.3,s[25,12]=-0.4,s[25,13]=-0.9,s[25,14]=-1.2,s[25,15]=0.9,s[25,16]=0.5,s[25,17]=0.5,s[25,18]=0.1,s[25,19]=-0.1,s[25,20]=0.6,s[25,21]=-0.4,s[25,22]=0.0,s[25,23]=0.0,s[25,24]=0.6,s[25,25]=0.0,s[25,26]=-1.1,s[25,27]=-0.7,s[25,28]=-1.2,s[25,29]=0.8,s[25,30]=0.9,s[25,31]=-0.3,s[25,32]=1.0,s[25,33]=1.0,s[25,34]=0.2,s[25,35]=0.1,s[25,36]=0.3,s[25,37]=-0.8,s[25,38]=-0.9,s[25,39]=0.3,s[25,40]=1.1,s[25,41]=-0.1,s[25,42]=0.1,s[25,43]=-0.1,s[25,44]=-0.5,s[25,45]=-0.7,s[25,46]=-1.2,s[25,47]=-0.1,s[25,48]=0.9,s[25,49]=-0.6,s[25,50]=0.5,s[25,51]=-0.9,s[25,52]=1.1,s[25,53]=-0.2,s[25,54]=-0.3,s[25,55]=-0.7,s[25,56]=0.1,s[25,57]=0.2,s[25,58]=1.0,s[25,59]=1.2,s[25,60]=0.9 s[26,1]=-1.2,s[26,2]=0.2,s[26,3]=-0.4,s[26,4]=1.0,s[26,5]=0.8,s[26,6]=0.0,s[26,7]=1.1,s[26,8]=-0.4,s[26,9]=1.1,s[26,10]=0.5,s[26,11]=0.7,s[26,12]=0.3,s[26,13]=0.8,s[26,14]=-0.7,s[26,15]=1.2,s[26,16]=-0.8,s[26,17]=-1.0,s[26,18]=-0.9,s[26,19]=0.6,s[26,20]=-0.9,s[26,21]=-0.6,s[26,22]=-0.7,s[26,23]=-0.4,s[26,24]=0.7,s[26,25]=0.6,s[26,26]=-1.1,s[26,27]=0.4,s[26,28]=0.7,s[26,29]=1.1,s[26,30]=-0.4,s[26,31]=-0.4,s[26,32]=0.8,s[26,33]=-0.6,s[26,34]=-0.7,s[26,35]=-0.2,s[26,36]=-1.1,s[26,37]=0.6,s[26,38]=0.2,s[26,39]=0.3,s[26,40]=-0.9,s[26,41]=0.7,s[26,42]=0.3,s[26,43]=1.0,s[26,44]=-0.6,s[26,45]=0.4,s[26,46]=0.2,s[26,47]=-0.6,s[26,48]=-0.9,s[26,49]=-0.4,s[26,50]=0.4,s[26,51]=0.5,s[26,52]=0.8,s[26,53]=0.1,s[26,54]=-0.1,s[26,55]=0.9,s[26,56]=-1.1,s[26,57]=-0.7,s[26,58]=-0.1,s[26,59]=-0.9,s[26,60]=0.0 s[27,1]=0.7,s[27,2]=-0.8,s[27,3]=0.3,s[27,4]=-0.5,s[27,5]=-0.1,s[27,6]=-0.2,s[27,7]=-0.9,s[27,8]=0.6,s[27,9]=-0.8,s[27,10]=-0.6,s[27,11]=-1.1,s[27,12]=1.0,s[27,13]=-0.4,s[27,14]=-0.6,s[27,15]=0.6,s[27,16]=-1.0,s[27,17]=0.1,s[27,18]=1.2,s[27,19]=0.6,s[27,20]=0.7,s[27,21]=-1.2,s[27,22]=-1.0,s[27,23]=-0.6,s[27,24]=0.9,s[27,25]=0.8,s[27,26]=-0.6,s[27,27]=-1.2,s[27,28]=0.0,s[27,29]=0.0,s[27,30]=0.3,s[27,31]=-0.2,s[27,32]=0.7,s[27,33]=0.0,s[27,34]=0.5,s[27,35]=0.5,s[27,36]=1.2,s[27,37]=-0.3,s[27,38]=-1.1,s[27,39]=-0.7,s[27,40]=0.2,s[27,41]=-0.5,s[27,42]=0.0,s[27,43]=-0.7,s[27,44]=-0.7,s[27,45]=1.1,s[27,46]=0.5,s[27,47]=0.6,s[27,48]=-1.0,s[27,49]=1.1,s[27,50]=-0.4,s[27,51]=0.2,s[27,52]=-0.7,s[27,53]=1.1,s[27,54]=-0.3,s[27,55]=-0.7,s[27,56]=-0.4,s[27,57]=0.7,s[27,58]=-0.8,s[27,59]=-1.2,s[27,60]=-0.9 s[28,1]=0.5,s[28,2]=-0.8,s[28,3]=-0.1,s[28,4]=-0.3,s[28,5]=0.1,s[28,6]=0.6,s[28,7]=0.2,s[28,8]=0.7,s[28,9]=-1.0,s[28,10]=0.8,s[28,11]=-1.1,s[28,12]=-1.0,s[28,13]=0.9,s[28,14]=0.1,s[28,15]=1.2,s[28,16]=-1.2,s[28,17]=1.2,s[28,18]=-0.9,s[28,19]=-1.0,s[28,20]=0.5,s[28,21]=-1.2,s[28,22]=-0.4,s[28,23]=-0.9,s[28,24]=0.4,s[28,25]=-0.5,s[28,26]=-1.1,s[28,27]=0.4,s[28,28]=0.9,s[28,29]=-1.0,s[28,30]=0.1,s[28,31]=0.3,s[28,32]=-0.4,s[28,33]=0.1,s[28,34]=0.2,s[28,35]=-1.1,s[28,36]=-0.1,s[28,37]=-0.9,s[28,38]=-0.4,s[28,39]=-1.0,s[28,40]=-0.9,s[28,41]=-0.3,s[28,42]=0.5,s[28,43]=0.4,s[28,44]=-1.0,s[28,45]=-0.8,s[28,46]=0.0,s[28,47]=0.9,s[28,48]=-0.2,s[28,49]=0.8,s[28,50]=0.0,s[28,51]=0.4,s[28,52]=0.3,s[28,53]=-0.6,s[28,54]=-0.7,s[28,55]=-0.7,s[28,56]=0.3,s[28,57]=0.7,s[28,58]=-0.1,s[28,59]=-0.8,s[28,60]=1.0 s[29,1]=1.1,s[29,2]=0.0,s[29,3]=-0.8,s[29,4]=0.7,s[29,5]=0.8,s[29,6]=1.2,s[29,7]=0.8,s[29,8]=0.8,s[29,9]=-0.7,s[29,10]=0.9,s[29,11]=0.3,s[29,12]=0.9,s[29,13]=1.0,s[29,14]=0.7,s[29,15]=-0.3,s[29,16]=-0.7,s[29,17]=0.7,s[29,18]=-0.9,s[29,19]=0.0,s[29,20]=-1.1,s[29,21]=0.0,s[29,22]=0.0,s[29,23]=0.8,s[29,24]=-1.2,s[29,25]=0.0,s[29,26]=-0.8,s[29,27]=0.3,s[29,28]=1.1,s[29,29]=-0.7,s[29,30]=0.8,s[29,31]=0.3,s[29,32]=-0.9,s[29,33]=-0.6,s[29,34]=-0.7,s[29,35]=0.7,s[29,36]=-0.9,s[29,37]=-0.9,s[29,38]=0.3,s[29,39]=1.0,s[29,40]=-1.0,s[29,41]=1.2,s[29,42]=0.1,s[29,43]=0.3,s[29,44]=0.3,s[29,45]=-0.4,s[29,46]=1.0,s[29,47]=-0.2,s[29,48]=-1.1,s[29,49]=0.1,s[29,50]=0.4,s[29,51]=-0.8,s[29,52]=-0.1,s[29,53]=-0.9,s[29,54]=-0.7,s[29,55]=0.1,s[29,56]=-0.3,s[29,57]=-0.9,s[29,58]=-0.9,s[29,59]=-0.6,s[29,60]=-0.4 s[30,1]=0.8,s[30,2]=0.6,s[30,3]=-0.2,s[30,4]=-1.2,s[30,5]=-0.7,s[30,6]=0.9,s[30,7]=0.6,s[30,8]=-1.2,s[30,9]=-0.1,s[30,10]=0.3,s[30,11]=-0.8,s[30,12]=0.0,s[30,13]=1.0,s[30,14]=0.8,s[30,15]=-1.0,s[30,16]=-0.3,s[30,17]=0.9,s[30,18]=0.6,s[30,19]=-0.2,s[30,20]=1.1,s[30,21]=-1.2,s[30,22]=0.0,s[30,23]=0.5,s[30,24]=0.5,s[30,25]=0.1,s[30,26]=0.8,s[30,27]=0.0,s[30,28]=0.0,s[30,29]=-0.4,s[30,30]=-0.9,s[30,31]=-1.1,s[30,32]=0.5,s[30,33]=-0.4,s[30,34]=0.6,s[30,35]=-0.2,s[30,36]=0.4,s[30,37]=0.4,s[30,38]=-0.9,s[30,39]=0.8,s[30,40]=-0.8,s[30,41]=-1.1,s[30,42]=1.2,s[30,43]=0.5,s[30,44]=0.2,s[30,45]=-0.7,s[30,46]=-1.0,s[30,47]=1.0,s[30,48]=0.3,s[30,49]=1.0,s[30,50]=1.2,s[30,51]=-0.3,s[30,52]=0.7,s[30,53]=-1.2,s[30,54]=-1.0,s[30,55]=0.9,s[30,56]=-0.2,s[30,57]=-0.9,s[30,58]=0.6,s[30,59]=-1.0,s[30,60]=-0.2 s[31,1]=-0.3,s[31,2]=-0.7,s[31,3]=1.1,s[31,4]=0.1,s[31,5]=0.2,s[31,6]=1.1,s[31,7]=0.6,s[31,8]=-1.1,s[31,9]=0.6,s[31,10]=0.7,s[31,11]=-0.4,s[31,12]=-0.9,s[31,13]=0.2,s[31,14]=-1.2,s[31,15]=-1.0,s[31,16]=0.8,s[31,17]=-0.2,s[31,18]=-1.2,s[31,19]=0.8,s[31,20]=0.9,s[31,21]=-1.1,s[31,22]=-0.5,s[31,23]=1.2,s[31,24]=-1.0,s[31,25]=0.2,s[31,26]=-0.7,s[31,27]=-0.7,s[31,28]=0.4,s[31,29]=0.0,s[31,30]=-0.6,s[31,31]=-0.8,s[31,32]=-0.4,s[31,33]=-0.3,s[31,34]=0.0,s[31,35]=0.4,s[31,36]=-1.1,s[31,37]=0.0,s[31,38]=0.7,s[31,39]=0.5,s[31,40]=0.7,s[31,41]=-0.5,s[31,42]=1.2,s[31,43]=0.3,s[31,44]=0.2,s[31,45]=-1.2,s[31,46]=-0.6,s[31,47]=0.3,s[31,48]=0.7,s[31,49]=0.2,s[31,50]=-0.6,s[31,51]=0.5,s[31,52]=-0.9,s[31,53]=-0.8,s[31,54]=-1.1,s[31,55]=-0.1,s[31,56]=-0.5,s[31,57]=0.7,s[31,58]=0.8,s[31,59]=1.0,s[31,60]=-1.1 s[32,1]=0.6,s[32,2]=0.0,s[32,3]=-1.1,s[32,4]=0.9,s[32,5]=0.7,s[32,6]=-0.7,s[32,7]=-1.2,s[32,8]=0.9,s[32,9]=-0.5,s[32,10]=-0.6,s[32,11]=-0.4,s[32,12]=1.0,s[32,13]=0.8,s[32,14]=0.8,s[32,15]=-1.0,s[32,16]=1.2,s[32,17]=0.2,s[32,18]=0.9,s[32,19]=0.6,s[32,20]=1.2,s[32,21]=-0.9,s[32,22]=0.8,s[32,23]=-0.1,s[32,24]=-0.9,s[32,25]=-0.9,s[32,26]=-1.0,s[32,27]=-1.1,s[32,28]=0.4,s[32,29]=0.2,s[32,30]=0.0,s[32,31]=-0.9,s[32,32]=0.2,s[32,33]=-0.5,s[32,34]=-0.6,s[32,35]=-0.7,s[32,36]=0.1,s[32,37]=-0.3,s[32,38]=0.4,s[32,39]=-0.8,s[32,40]=0.0,s[32,41]=-0.3,s[32,42]=0.1,s[32,43]=-0.2,s[32,44]=-0.5,s[32,45]=0.0,s[32,46]=0.6,s[32,47]=-0.7,s[32,48]=1.2,s[32,49]=1.0,s[32,50]=-0.7,s[32,51]=-0.7,s[32,52]=-1.2,s[32,53]=-0.3,s[32,54]=1.0,s[32,55]=-1.1,s[32,56]=-0.4,s[32,57]=0.5,s[32,58]=1.2,s[32,59]=0.7,s[32,60]=0.5 s[33,1]=-0.8,s[33,2]=-1.0,s[33,3]=0.8,s[33,4]=0.9,s[33,5]=0.1,s[33,6]=-0.1,s[33,7]=0.5,s[33,8]=-0.2,s[33,9]=-0.5,s[33,10]=-1.1,s[33,11]=-0.1,s[33,12]=1.1,s[33,13]=0.7,s[33,14]=-0.9,s[33,15]=-0.5,s[33,16]=-0.6,s[33,17]=0.1,s[33,18]=0.6,s[33,19]=-0.1,s[33,20]=-0.8,s[33,21]=1.0,s[33,22]=-1.2,s[33,23]=-0.1,s[33,24]=-0.1,s[33,25]=0.1,s[33,26]=-0.9,s[33,27]=1.1,s[33,28]=-1.0,s[33,29]=-0.5,s[33,30]=-0.9,s[33,31]=1.1,s[33,32]=-0.1,s[33,33]=-1.0,s[33,34]=0.4,s[33,35]=0.0,s[33,36]=0.0,s[33,37]=-0.5,s[33,38]=-1.2,s[33,39]=0.8,s[33,40]=-1.2,s[33,41]=0.0,s[33,42]=0.0,s[33,43]=0.7,s[33,44]=-0.9,s[33,45]=0.0,s[33,46]=-1.1,s[33,47]=0.3,s[33,48]=0.6,s[33,49]=-0.2,s[33,50]=-0.7,s[33,51]=0.3,s[33,52]=-0.2,s[33,53]=-0.2,s[33,54]=-0.2,s[33,55]=0.4,s[33,56]=0.7,s[33,57]=-1.1,s[33,58]=1.1,s[33,59]=1.0,s[33,60]=0.3 s[34,1]=-0.7,s[34,2]=-0.8,s[34,3]=-0.4,s[34,4]=-0.1,s[34,5]=1.2,s[34,6]=-0.4,s[34,7]=0.5,s[34,8]=0.1,s[34,9]=0.5,s[34,10]=0.3,s[34,11]=-1.0,s[34,12]=1.0,s[34,13]=0.5,s[34,14]=0.6,s[34,15]=0.9,s[34,16]=-0.6,s[34,17]=1.1,s[34,18]=0.1,s[34,19]=0.0,s[34,20]=-0.6,s[34,21]=-0.8,s[34,22]=-0.1,s[34,23]=0.1,s[34,24]=-0.1,s[34,25]=0.1,s[34,26]=-1.2,s[34,27]=-1.2,s[34,28]=-0.4,s[34,29]=0.6,s[34,30]=0.7,s[34,31]=-0.8,s[34,32]=-0.6,s[34,33]=0.6,s[34,34]=-0.1,s[34,35]=-1.2,s[34,36]=-1.2,s[34,37]=0.8,s[34,38]=0.7,s[34,39]=1.0,s[34,40]=0.8,s[34,41]=0.0,s[34,42]=0.0,s[34,43]=0.5,s[34,44]=0.4,s[34,45]=-0.5,s[34,46]=-0.8,s[34,47]=0.2,s[34,48]=0.6,s[34,49]=-0.7,s[34,50]=0.8,s[34,51]=-0.9,s[34,52]=-1.1,s[34,53]=1.0,s[34,54]=0.3,s[34,55]=-0.8,s[34,56]=1.1,s[34,57]=0.5,s[34,58]=0.0,s[34,59]=-0.4,s[34,60]=-0.2 s[35,1]=-0.9,s[35,2]=-1.0,s[35,3]=0.9,s[35,4]=0.1,s[35,5]=-0.1,s[35,6]=0.3,s[35,7]=-0.9,s[35,8]=-1.1,s[35,9]=0.5,s[35,10]=0.7,s[35,11]=-0.9,s[35,12]=-0.5,s[35,13]=-0.4,s[35,14]=0.1,s[35,15]=-0.9,s[35,16]=0.0,s[35,17]=-0.1,s[35,18]=0.2,s[35,19]=-0.1,s[35,20]=-0.1,s[35,21]=1.2,s[35,22]=1.0,s[35,23]=0.1,s[35,24]=0.9,s[35,25]=-0.3,s[35,26]=-0.5,s[35,27]=1.2,s[35,28]=0.5,s[35,29]=-0.8,s[35,30]=0.2,s[35,31]=-0.2,s[35,32]=0.7,s[35,33]=-0.6,s[35,34]=-0.4,s[35,35]=1.1,s[35,36]=-0.8,s[35,37]=0.6,s[35,38]=-0.2,s[35,39]=0.1,s[35,40]=0.8,s[35,41]=-0.5,s[35,42]=-0.7,s[35,43]=0.5,s[35,44]=-0.3,s[35,45]=0.9,s[35,46]=-0.3,s[35,47]=0.1,s[35,48]=-0.6,s[35,49]=-0.9,s[35,50]=0.9,s[35,51]=1.2,s[35,52]=1.2,s[35,53]=-0.1,s[35,54]=-1.2,s[35,55]=-0.9,s[35,56]=-1.2,s[35,57]=-0.2,s[35,58]=-0.7,s[35,59]=1.1,s[35,60]=-1.0 s[36,1]=-0.6,s[36,2]=0.2,s[36,3]=0.8,s[36,4]=0.3,s[36,5]=-0.7,s[36,6]=0.5,s[36,7]=0.2,s[36,8]=-1.0,s[36,9]=-0.4,s[36,10]=-0.6,s[36,11]=-0.2,s[36,12]=0.6,s[36,13]=1.1,s[36,14]=-0.9,s[36,15]=0.2,s[36,16]=0.1,s[36,17]=0.0,s[36,18]=-0.6,s[36,19]=0.4,s[36,20]=-0.2,s[36,21]=-0.7,s[36,22]=-0.7,s[36,23]=0.6,s[36,24]=0.0,s[36,25]=-0.2,s[36,26]=1.2,s[36,27]=-0.8,s[36,28]=-0.8,s[36,29]=-0.6,s[36,30]=0.4,s[36,31]=0.7,s[36,32]=-0.9,s[36,33]=1.1,s[36,34]=0.4,s[36,35]=0.3,s[36,36]=-0.1,s[36,37]=-0.9,s[36,38]=-0.5,s[36,39]=1.1,s[36,40]=0.1,s[36,41]=0.8,s[36,42]=0.4,s[36,43]=0.2,s[36,44]=1.0,s[36,45]=-0.7,s[36,46]=0.7,s[36,47]=0.6,s[36,48]=1.0,s[36,49]=0.9,s[36,50]=0.2,s[36,51]=0.0,s[36,52]=-0.2,s[36,53]=-1.0,s[36,54]=-1.0,s[36,55]=-0.7,s[36,56]=-0.3,s[36,57]=-0.6,s[36,58]=-1.2,s[36,59]=0.8,s[36,60]=1.0 s[37,1]=-1.2,s[37,2]=-0.7,s[37,3]=0.2,s[37,4]=-1.2,s[37,5]=0.7,s[37,6]=0.7,s[37,7]=0.1,s[37,8]=-0.4,s[37,9]=0.1,s[37,10]=0.6,s[37,11]=0.2,s[37,12]=0.9,s[37,13]=0.8,s[37,14]=-1.2,s[37,15]=1.1,s[37,16]=0.2,s[37,17]=-0.2,s[37,18]=-1.1,s[37,19]=-1.2,s[37,20]=-0.1,s[37,21]=0.4,s[37,22]=0.7,s[37,23]=-0.2,s[37,24]=-0.3,s[37,25]=0.1,s[37,26]=1.2,s[37,27]=0.5,s[37,28]=-0.1,s[37,29]=0.1,s[37,30]=0.7,s[37,31]=1.2,s[37,32]=-1.1,s[37,33]=0.5,s[37,34]=-1.0,s[37,35]=0.5,s[37,36]=0.0,s[37,37]=-0.8,s[37,38]=0.2,s[37,39]=0.1,s[37,40]=0.1,s[37,41]=-1.0,s[37,42]=-1.0,s[37,43]=-1.0,s[37,44]=0.6,s[37,45]=1.1,s[37,46]=-0.8,s[37,47]=1.2,s[37,48]=0.8,s[37,49]=0.0,s[37,50]=0.8,s[37,51]=-1.0,s[37,52]=-0.3,s[37,53]=-0.4,s[37,54]=0.7,s[37,55]=0.0,s[37,56]=-0.7,s[37,57]=0.3,s[37,58]=0.1,s[37,59]=-0.8,s[37,60]=0.2 s[38,1]=-0.8,s[38,2]=1.0,s[38,3]=-0.2,s[38,4]=0.9,s[38,5]=-0.9,s[38,6]=1.0,s[38,7]=-0.2,s[38,8]=0.9,s[38,9]=-0.3,s[38,10]=-1.1,s[38,11]=0.7,s[38,12]=-0.8,s[38,13]=0.9,s[38,14]=0.8,s[38,15]=-0.8,s[38,16]=-0.4,s[38,17]=0.6,s[38,18]=-0.1,s[38,19]=-0.1,s[38,20]=0.4,s[38,21]=0.7,s[38,22]=-1.2,s[38,23]=-0.7,s[38,24]=0.0,s[38,25]=-0.9,s[38,26]=-0.9,s[38,27]=-0.9,s[38,28]=0.8,s[38,29]=1.0,s[38,30]=1.2,s[38,31]=0.7,s[38,32]=-1.2,s[38,33]=0.8,s[38,34]=-0.7,s[38,35]=-0.6,s[38,36]=-0.2,s[38,37]=0.0,s[38,38]=-0.9,s[38,39]=1.1,s[38,40]=0.2,s[38,41]=-0.7,s[38,42]=-0.9,s[38,43]=1.2,s[38,44]=-1.2,s[38,45]=-0.5,s[38,46]=0.6,s[38,47]=0.1,s[38,48]=1.0,s[38,49]=-0.2,s[38,50]=0.3,s[38,51]=0.7,s[38,52]=-0.7,s[38,53]=0.6,s[38,54]=-0.5,s[38,55]=1.1,s[38,56]=0.7,s[38,57]=-1.0,s[38,58]=1.2,s[38,59]=-1.2,s[38,60]=-0.6 s[39,1]=-0.3,s[39,2]=-0.9,s[39,3]=-0.8,s[39,4]=1.2,s[39,5]=-0.6,s[39,6]=-0.6,s[39,7]=0.4,s[39,8]=0.3,s[39,9]=-0.5,s[39,10]=-0.7,s[39,11]=0.2,s[39,12]=-1.1,s[39,13]=1.2,s[39,14]=0.3,s[39,15]=-1.0,s[39,16]=-0.9,s[39,17]=0.8,s[39,18]=-1.2,s[39,19]=-1.0,s[39,20]=-0.8,s[39,21]=0.9,s[39,22]=-0.2,s[39,23]=0.3,s[39,24]=0.4,s[39,25]=0.4,s[39,26]=-0.7,s[39,27]=-1.2,s[39,28]=1.2,s[39,29]=-0.1,s[39,30]=0.4,s[39,31]=0.3,s[39,32]=0.4,s[39,33]=0.2,s[39,34]=-0.4,s[39,35]=-0.9,s[39,36]=-0.7,s[39,37]=-1.0,s[39,38]=-0.4,s[39,39]=0.0,s[39,40]=1.1,s[39,41]=1.2,s[39,42]=0.3,s[39,43]=-0.6,s[39,44]=-0.6,s[39,45]=0.0,s[39,46]=-1.2,s[39,47]=-0.7,s[39,48]=0.2,s[39,49]=0.4,s[39,50]=-0.9,s[39,51]=-0.3,s[39,52]=0.9,s[39,53]=0.2,s[39,54]=0.1,s[39,55]=1.0,s[39,56]=-0.7,s[39,57]=-0.2,s[39,58]=-0.4,s[39,59]=0.8,s[39,60]=0.0 s[40,1]=1.0,s[40,2]=0.9,s[40,3]=-1.2,s[40,4]=0.8,s[40,5]=-0.2,s[40,6]=-0.2,s[40,7]=-0.9,s[40,8]=-0.9,s[40,9]=-0.3,s[40,10]=-0.9,s[40,11]=-1.0,s[40,12]=1.0,s[40,13]=0.3,s[40,14]=0.6,s[40,15]=0.4,s[40,16]=-0.7,s[40,17]=-0.3,s[40,18]=-0.9,s[40,19]=1.2,s[40,20]=1.0,s[40,21]=0.2,s[40,22]=0.0,s[40,23]=1.0,s[40,24]=-0.7,s[40,25]=-0.8,s[40,26]=-1.2,s[40,27]=-0.2,s[40,28]=0.8,s[40,29]=-0.9,s[40,30]=0.8,s[40,31]=0.3,s[40,32]=0.0,s[40,33]=0.2,s[40,34]=-0.1,s[40,35]=-1.1,s[40,36]=0.6,s[40,37]=-1.0,s[40,38]=-0.3,s[40,39]=1.2,s[40,40]=-1.2,s[40,41]=-1.0,s[40,42]=0.9,s[40,43]=0.0,s[40,44]=1.2,s[40,45]=0.9,s[40,46]=-0.3,s[40,47]=0.5,s[40,48]=-1.0,s[40,49]=-0.5,s[40,50]=-1.0,s[40,51]=1.0,s[40,52]=0.8,s[40,53]=1.0,s[40,54]=-0.7,s[40,55]=-0.5,s[40,56]=0.0,s[40,57]=-1.1,s[40,58]=0.8,s[40,59]=-1.0,s[40,60]=0.8 s[41,1]=0.1,s[41,2]=0.5,s[41,3]=-0.3,s[41,4]=-1.1,s[41,5]=-1.2,s[41,6]=0.7,s[41,7]=-1.2,s[41,8]=0.6,s[41,9]=-1.1,s[41,10]=0.3,s[41,11]=0.2,s[41,12]=-1.0,s[41,13]=-1.2,s[41,14]=-0.7,s[41,15]=0.9,s[41,16]=0.9,s[41,17]=0.4,s[41,18]=0.2,s[41,19]=-0.8,s[41,20]=0.1,s[41,21]=1.1,s[41,22]=0.6,s[41,23]=-0.4,s[41,24]=-0.4,s[41,25]=1.0,s[41,26]=0.5,s[41,27]=-0.8,s[41,28]=0.7,s[41,29]=-0.7,s[41,30]=1.1,s[41,31]=-0.8,s[41,32]=0.7,s[41,33]=-0.2,s[41,34]=-0.1,s[41,35]=-0.8,s[41,36]=-0.6,s[41,37]=0.3,s[41,38]=-0.2,s[41,39]=-0.7,s[41,40]=-1.1,s[41,41]=-1.2,s[41,42]=0.1,s[41,43]=-0.3,s[41,44]=0.7,s[41,45]=0.9,s[41,46]=-0.3,s[41,47]=-0.6,s[41,48]=0.1,s[41,49]=-0.2,s[41,50]=-1.2,s[41,51]=-1.2,s[41,52]=0.7,s[41,53]=-1.1,s[41,54]=1.0,s[41,55]=0.2,s[41,56]=-0.9,s[41,57]=0.8,s[41,58]=-0.3,s[41,59]=-0.4,s[41,60]=0.0 s[42,1]=-1.2,s[42,2]=0.5,s[42,3]=-0.6,s[42,4]=0.3,s[42,5]=0.1,s[42,6]=-1.1,s[42,7]=0.6,s[42,8]=-0.3,s[42,9]=0.7,s[42,10]=-0.6,s[42,11]=1.1,s[42,12]=-0.4,s[42,13]=0.2,s[42,14]=0.1,s[42,15]=0.3,s[42,16]=1.0,s[42,17]=0.0,s[42,18]=-1.0,s[42,19]=1.2,s[42,20]=-0.6,s[42,21]=-0.3,s[42,22]=-1.1,s[42,23]=-0.1,s[42,24]=0.2,s[42,25]=0.1,s[42,26]=-0.2,s[42,27]=0.9,s[42,28]=-0.7,s[42,29]=0.6,s[42,30]=-1.1,s[42,31]=-1.2,s[42,32]=0.6,s[42,33]=0.2,s[42,34]=0.2,s[42,35]=0.5,s[42,36]=0.1,s[42,37]=-0.3,s[42,38]=-0.1,s[42,39]=-0.8,s[42,40]=0.0,s[42,41]=-1.2,s[42,42]=0.5,s[42,43]=-0.6,s[42,44]=0.2,s[42,45]=-0.9,s[42,46]=-0.7,s[42,47]=-0.5,s[42,48]=0.5,s[42,49]=1.2,s[42,50]=-0.7,s[42,51]=1.0,s[42,52]=-0.4,s[42,53]=-0.9,s[42,54]=0.7,s[42,55]=0.0,s[42,56]=1.2,s[42,57]=1.2,s[42,58]=1.2,s[42,59]=-0.7,s[42,60]=0.6 s[43,1]=0.7,s[43,2]=0.1,s[43,3]=0.3,s[43,4]=1.1,s[43,5]=-0.3,s[43,6]=0.9,s[43,7]=0.9,s[43,8]=0.5,s[43,9]=-0.2,s[43,10]=0.1,s[43,11]=-1.2,s[43,12]=1.0,s[43,13]=-0.3,s[43,14]=-0.3,s[43,15]=-0.8,s[43,16]=-1.0,s[43,17]=0.4,s[43,18]=0.2,s[43,19]=-0.5,s[43,20]=-0.1,s[43,21]=1.0,s[43,22]=0.9,s[43,23]=0.6,s[43,24]=-1.1,s[43,25]=0.5,s[43,26]=0.5,s[43,27]=0.1,s[43,28]=0.7,s[43,29]=0.5,s[43,30]=-1.2,s[43,31]=0.8,s[43,32]=0.6,s[43,33]=-0.2,s[43,34]=-1.2,s[43,35]=0.3,s[43,36]=-0.9,s[43,37]=1.1,s[43,38]=0.2,s[43,39]=0.4,s[43,40]=-0.2,s[43,41]=-0.4,s[43,42]=-0.7,s[43,43]=0.5,s[43,44]=-0.7,s[43,45]=-0.1,s[43,46]=1.2,s[43,47]=-0.7,s[43,48]=-1.2,s[43,49]=-0.2,s[43,50]=-1.0,s[43,51]=0.5,s[43,52]=0.5,s[43,53]=1.1,s[43,54]=-0.4,s[43,55]=1.0,s[43,56]=0.4,s[43,57]=-1.2,s[43,58]=-0.7,s[43,59]=0.8,s[43,60]=-0.8 s[44,1]=0.8,s[44,2]=0.8,s[44,3]=-0.6,s[44,4]=-0.8,s[44,5]=0.0,s[44,6]=0.0,s[44,7]=-0.6,s[44,8]=0.4,s[44,9]=0.7,s[44,10]=-0.6,s[44,11]=1.1,s[44,12]=0.3,s[44,13]=0.6,s[44,14]=0.4,s[44,15]=-1.0,s[44,16]=0.6,s[44,17]=-0.6,s[44,18]=-0.4,s[44,19]=-0.7,s[44,20]=0.5,s[44,21]=-0.4,s[44,22]=-1.1,s[44,23]=0.5,s[44,24]=-0.4,s[44,25]=-0.5,s[44,26]=0.7,s[44,27]=-0.2,s[44,28]=0.2,s[44,29]=0.4,s[44,30]=-0.9,s[44,31]=0.5,s[44,32]=-1.2,s[44,33]=-0.1,s[44,34]=-0.6,s[44,35]=1.0,s[44,36]=-0.2,s[44,37]=-1.0,s[44,38]=0.6,s[44,39]=0.2,s[44,40]=1.1,s[44,41]=0.6,s[44,42]=-1.1,s[44,43]=-0.7,s[44,44]=0.4,s[44,45]=0.7,s[44,46]=-0.4,s[44,47]=0.3,s[44,48]=-1.2,s[44,49]=-0.6,s[44,50]=-0.1,s[44,51]=0.7,s[44,52]=-0.4,s[44,53]=0.1,s[44,54]=0.9,s[44,55]=1.1,s[44,56]=0.3,s[44,57]=1.0,s[44,58]=0.0,s[44,59]=0.2,s[44,60]=0.2 s[45,1]=-0.5,s[45,2]=0.2,s[45,3]=1.0,s[45,4]=-0.6,s[45,5]=1.0,s[45,6]=1.2,s[45,7]=0.7,s[45,8]=-0.1,s[45,9]=-0.7,s[45,10]=-0.6,s[45,11]=-0.1,s[45,12]=-0.8,s[45,13]=-0.9,s[45,14]=1.1,s[45,15]=-1.1,s[45,16]=-0.1,s[45,17]=0.0,s[45,18]=0.3,s[45,19]=0.9,s[45,20]=1.2,s[45,21]=-0.5,s[45,22]=-0.7,s[45,23]=-0.9,s[45,24]=-0.6,s[45,25]=0.2,s[45,26]=1.2,s[45,27]=0.7,s[45,28]=0.9,s[45,29]=-0.1,s[45,30]=-0.1,s[45,31]=1.2,s[45,32]=0.3,s[45,33]=-0.3,s[45,34]=-0.5,s[45,35]=-0.1,s[45,36]=0.0,s[45,37]=-0.7,s[45,38]=0.0,s[45,39]=-0.1,s[45,40]=-1.2,s[45,41]=-1.0,s[45,42]=0.1,s[45,43]=-0.3,s[45,44]=1.1,s[45,45]=-1.2,s[45,46]=0.4,s[45,47]=0.9,s[45,48]=-1.1,s[45,49]=0.6,s[45,50]=-0.6,s[45,51]=0.5,s[45,52]=0.0,s[45,53]=1.1,s[45,54]=-0.9,s[45,55]=0.1,s[45,56]=0.6,s[45,57]=-1.1,s[45,58]=0.4,s[45,59]=0.2,s[45,60]=0.8 s[46,1]=-0.7,s[46,2]=0.0,s[46,3]=0.6,s[46,4]=0.3,s[46,5]=-0.3,s[46,6]=-1.0,s[46,7]=1.2,s[46,8]=-0.9,s[46,9]=-0.9,s[46,10]=-0.5,s[46,11]=-0.4,s[46,12]=-0.1,s[46,13]=-0.9,s[46,14]=-0.7,s[46,15]=-0.9,s[46,16]=0.9,s[46,17]=0.4,s[46,18]=-0.1,s[46,19]=1.1,s[46,20]=1.1,s[46,21]=-0.3,s[46,22]=0.0,s[46,23]=-0.3,s[46,24]=-0.6,s[46,25]=0.0,s[46,26]=-0.2,s[46,27]=-0.5,s[46,28]=0.4,s[46,29]=0.6,s[46,30]=-1.1,s[46,31]=-0.3,s[46,32]=-0.8,s[46,33]=0.4,s[46,34]=0.5,s[46,35]=0.1,s[46,36]=1.1,s[46,37]=1.2,s[46,38]=-0.9,s[46,39]=0.2,s[46,40]=1.2,s[46,41]=-1.2,s[46,42]=0.5,s[46,43]=1.0,s[46,44]=-0.7,s[46,45]=-1.2,s[46,46]=0.9,s[46,47]=1.2,s[46,48]=0.7,s[46,49]=0.0,s[46,50]=-0.6,s[46,51]=0.6,s[46,52]=-0.7,s[46,53]=1.1,s[46,54]=0.2,s[46,55]=-0.3,s[46,56]=-1.2,s[46,57]=-1.1,s[46,58]=0.9,s[46,59]=0.7,s[46,60]=0.7 s[47,1]=-0.3,s[47,2]=-0.7,s[47,3]=-0.7,s[47,4]=0.5,s[47,5]=-1.1,s[47,6]=-0.5,s[47,7]=0.0,s[47,8]=1.0,s[47,9]=0.6,s[47,10]=1.1,s[47,11]=0.5,s[47,12]=0.0,s[47,13]=-0.7,s[47,14]=-0.3,s[47,15]=1.0,s[47,16]=-1.1,s[47,17]=0.3,s[47,18]=-0.2,s[47,19]=1.1,s[47,20]=-1.0,s[47,21]=1.2,s[47,22]=-0.5,s[47,23]=-0.7,s[47,24]=-1.0,s[47,25]=-0.4,s[47,26]=1.2,s[47,27]=1.1,s[47,28]=0.6,s[47,29]=-0.1,s[47,30]=1.1,s[47,31]=0.5,s[47,32]=-1.1,s[47,33]=-0.4,s[47,34]=1.2,s[47,35]=-0.9,s[47,36]=0.7,s[47,37]=0.1,s[47,38]=0.9,s[47,39]=-0.7,s[47,40]=-0.4,s[47,41]=-1.1,s[47,42]=0.7,s[47,43]=-0.1,s[47,44]=-0.8,s[47,45]=-0.1,s[47,46]=0.0,s[47,47]=-0.2,s[47,48]=-0.2,s[47,49]=0.1,s[47,50]=-0.2,s[47,51]=0.3,s[47,52]=0.6,s[47,53]=-0.8,s[47,54]=-0.1,s[47,55]=0.4,s[47,56]=1.0,s[47,57]=-0.7,s[47,58]=0.5,s[47,59]=-0.9,s[47,60]=0.7 s[48,1]=0.1,s[48,2]=-0.6,s[48,3]=1.2,s[48,4]=-0.8,s[48,5]=0.2,s[48,6]=-0.8,s[48,7]=-1.0,s[48,8]=0.8,s[48,9]=0.4,s[48,10]=-0.2,s[48,11]=1.0,s[48,12]=-0.4,s[48,13]=0.3,s[48,14]=-0.1,s[48,15]=0.0,s[48,16]=-0.3,s[48,17]=0.5,s[48,18]=-0.9,s[48,19]=0.7,s[48,20]=0.8,s[48,21]=0.5,s[48,22]=0.3,s[48,23]=0.3,s[48,24]=0.4,s[48,25]=0.2,s[48,26]=-0.1,s[48,27]=1.2,s[48,28]=-0.5,s[48,29]=-0.2,s[48,30]=-0.9,s[48,31]=-1.1,s[48,32]=-1.1,s[48,33]=0.8,s[48,34]=-1.1,s[48,35]=1.1,s[48,36]=-0.2,s[48,37]=-0.7,s[48,38]=-0.4,s[48,39]=-0.7,s[48,40]=0.0,s[48,41]=-1.1,s[48,42]=0.4,s[48,43]=-0.8,s[48,44]=-0.6,s[48,45]=-0.8,s[48,46]=-1.1,s[48,47]=-0.7,s[48,48]=-1.1,s[48,49]=0.9,s[48,50]=-0.6,s[48,51]=0.3,s[48,52]=0.8,s[48,53]=-0.5,s[48,54]=-1.0,s[48,55]=0.3,s[48,56]=-0.1,s[48,57]=0.7,s[48,58]=-0.1,s[48,59]=0.1,s[48,60]=0.4 s[49,1]=-1.0,s[49,2]=0.2,s[49,3]=0.4,s[49,4]=-0.6,s[49,5]=0.2,s[49,6]=-0.7,s[49,7]=-0.8,s[49,8]=0.4,s[49,9]=0.9,s[49,10]=0.5,s[49,11]=0.4,s[49,12]=0.6,s[49,13]=0.1,s[49,14]=-0.6,s[49,15]=-0.8,s[49,16]=-0.6,s[49,17]=0.1,s[49,18]=0.2,s[49,19]=-0.8,s[49,20]=-1.1,s[49,21]=0.4,s[49,22]=0.1,s[49,23]=-0.6,s[49,24]=-0.8,s[49,25]=-1.2,s[49,26]=0.7,s[49,27]=0.4,s[49,28]=0.3,s[49,29]=0.7,s[49,30]=0.7,s[49,31]=0.5,s[49,32]=0.7,s[49,33]=0.0,s[49,34]=1.2,s[49,35]=0.8,s[49,36]=0.8,s[49,37]=-0.9,s[49,38]=-1.0,s[49,39]=0.8,s[49,40]=-0.7,s[49,41]=0.0,s[49,42]=-1.2,s[49,43]=-1.2,s[49,44]=0.2,s[49,45]=0.7,s[49,46]=-0.2,s[49,47]=-1.1,s[49,48]=0.5,s[49,49]=0.9,s[49,50]=-1.1,s[49,51]=-1.1,s[49,52]=-1.2,s[49,53]=-0.7,s[49,54]=1.0,s[49,55]=-0.3,s[49,56]=-0.2,s[49,57]=1.2,s[49,58]=0.1,s[49,59]=-0.3,s[49,60]=-1.2 s[50,1]=-1.0,s[50,2]=-0.1,s[50,3]=0.8,s[50,4]=-0.1,s[50,5]=0.2,s[50,6]=1.0,s[50,7]=1.0,s[50,8]=0.1,s[50,9]=0.4,s[50,10]=0.6,s[50,11]=0.2,s[50,12]=0.5,s[50,13]=-1.1,s[50,14]=0.9,s[50,15]=0.9,s[50,16]=-1.0,s[50,17]=0.3,s[50,18]=-0.4,s[50,19]=0.9,s[50,20]=1.0,s[50,21]=0.3,s[50,22]=0.5,s[50,23]=0.6,s[50,24]=-0.5,s[50,25]=1.1,s[50,26]=0.9,s[50,27]=-0.2,s[50,28]=-0.3,s[50,29]=0.3,s[50,30]=-1.1,s[50,31]=1.1,s[50,32]=-0.4,s[50,33]=0.9,s[50,34]=-0.2,s[50,35]=1.1,s[50,36]=0.9,s[50,37]=-0.9,s[50,38]=0.5,s[50,39]=0.6,s[50,40]=1.0,s[50,41]=-0.3,s[50,42]=-0.7,s[50,43]=-0.2,s[50,44]=-0.1,s[50,45]=0.3,s[50,46]=0.7,s[50,47]=0.4,s[50,48]=-0.5,s[50,49]=0.0,s[50,50]=1.2,s[50,51]=-0.5,s[50,52]=-1.1,s[50,53]=-1.2,s[50,54]=-0.5,s[50,55]=1.0,s[50,56]=0.1,s[50,57]=0.9,s[50,58]=0.5,s[50,59]=0.4,s[50,60]=-0.7 s[51,1]=-1.1,s[51,2]=0.9,s[51,3]=0.9,s[51,4]=0.6,s[51,5]=-1.2,s[51,6]=-1.1,s[51,7]=0.1,s[51,8]=1.2,s[51,9]=-0.1,s[51,10]=0.9,s[51,11]=-0.4,s[51,12]=-0.2,s[51,13]=0.1,s[51,14]=-0.6,s[51,15]=-0.2,s[51,16]=-0.5,s[51,17]=1.2,s[51,18]=0.0,s[51,19]=0.9,s[51,20]=0.8,s[51,21]=0.7,s[51,22]=0.8,s[51,23]=0.3,s[51,24]=0.4,s[51,25]=0.1,s[51,26]=0.6,s[51,27]=0.4,s[51,28]=-0.3,s[51,29]=0.1,s[51,30]=-0.6,s[51,31]=0.9,s[51,32]=0.4,s[51,33]=0.3,s[51,34]=0.3,s[51,35]=-0.5,s[51,36]=-0.1,s[51,37]=0.2,s[51,38]=-0.3,s[51,39]=-1.1,s[51,40]=-0.5,s[51,41]=0.3,s[51,42]=-0.9,s[51,43]=-0.7,s[51,44]=0.8,s[51,45]=-0.7,s[51,46]=0.9,s[51,47]=0.3,s[51,48]=0.9,s[51,49]=-0.9,s[51,50]=0.2,s[51,51]=0.5,s[51,52]=-1.2,s[51,53]=-0.7,s[51,54]=0.3,s[51,55]=0.3,s[51,56]=-0.9,s[51,57]=-1.2,s[51,58]=-0.6,s[51,59]=-0.8,s[51,60]=0.6 s[52,1]=0.2,s[52,2]=-0.9,s[52,3]=0.9,s[52,4]=-1.0,s[52,5]=0.3,s[52,6]=-0.4,s[52,7]=1.0,s[52,8]=1.2,s[52,9]=-0.4,s[52,10]=-0.5,s[52,11]=0.0,s[52,12]=-0.4,s[52,13]=-0.1,s[52,14]=0.4,s[52,15]=1.0,s[52,16]=-0.5,s[52,17]=-0.8,s[52,18]=0.8,s[52,19]=-0.3,s[52,20]=0.9,s[52,21]=0.8,s[52,22]=-0.8,s[52,23]=-0.9,s[52,24]=1.1,s[52,25]=0.3,s[52,26]=-0.2,s[52,27]=0.0,s[52,28]=-0.3,s[52,29]=0.9,s[52,30]=-0.4,s[52,31]=-0.8,s[52,32]=-0.6,s[52,33]=1.1,s[52,34]=-0.3,s[52,35]=-0.7,s[52,36]=1.1,s[52,37]=0.8,s[52,38]=-0.5,s[52,39]=0.3,s[52,40]=1.2,s[52,41]=1.1,s[52,42]=0.8,s[52,43]=0.8,s[52,44]=0.3,s[52,45]=-0.4,s[52,46]=-1.2,s[52,47]=0.1,s[52,48]=-0.8,s[52,49]=-0.1,s[52,50]=0.7,s[52,51]=-0.3,s[52,52]=-0.7,s[52,53]=1.1,s[52,54]=1.1,s[52,55]=1.2,s[52,56]=-0.3,s[52,57]=0.2,s[52,58]=0.1,s[52,59]=0.7,s[52,60]=-0.3 s[53,1]=-0.1,s[53,2]=0.3,s[53,3]=0.0,s[53,4]=0.1,s[53,5]=0.1,s[53,6]=0.5,s[53,7]=1.1,s[53,8]=0.2,s[53,9]=-1.1,s[53,10]=-0.8,s[53,11]=0.0,s[53,12]=0.4,s[53,13]=-1.0,s[53,14]=-0.7,s[53,15]=0.7,s[53,16]=0.3,s[53,17]=-0.1,s[53,18]=-0.3,s[53,19]=0.5,s[53,20]=0.3,s[53,21]=1.1,s[53,22]=1.1,s[53,23]=0.0,s[53,24]=-0.4,s[53,25]=0.5,s[53,26]=1.2,s[53,27]=0.4,s[53,28]=-0.7,s[53,29]=-0.8,s[53,30]=-0.8,s[53,31]=-0.4,s[53,32]=-0.9,s[53,33]=0.2,s[53,34]=-1.2,s[53,35]=0.8,s[53,36]=0.0,s[53,37]=1.1,s[53,38]=0.5,s[53,39]=-0.3,s[53,40]=1.0,s[53,41]=-1.1,s[53,42]=0.5,s[53,43]=0.4,s[53,44]=0.6,s[53,45]=-0.1,s[53,46]=-1.0,s[53,47]=-1.1,s[53,48]=-0.9,s[53,49]=-0.5,s[53,50]=0.8,s[53,51]=-0.5,s[53,52]=1.1,s[53,53]=0.0,s[53,54]=1.1,s[53,55]=0.9,s[53,56]=-1.1,s[53,57]=1.1,s[53,58]=-0.8,s[53,59]=-0.8,s[53,60]=1.0 s[54,1]=-1.1,s[54,2]=0.1,s[54,3]=0.8,s[54,4]=0.5,s[54,5]=-0.4,s[54,6]=1.0,s[54,7]=0.1,s[54,8]=-0.5,s[54,9]=1.1,s[54,10]=1.1,s[54,11]=0.5,s[54,12]=0.2,s[54,13]=-1.1,s[54,14]=-0.9,s[54,15]=-0.2,s[54,16]=0.4,s[54,17]=1.1,s[54,18]=0.5,s[54,19]=0.0,s[54,20]=0.9,s[54,21]=-0.5,s[54,22]=-1.2,s[54,23]=-0.5,s[54,24]=-0.2,s[54,25]=-0.6,s[54,26]=-1.1,s[54,27]=0.5,s[54,28]=0.2,s[54,29]=-0.6,s[54,30]=0.8,s[54,31]=-1.2,s[54,32]=-0.9,s[54,33]=-0.1,s[54,34]=-1.2,s[54,35]=-0.8,s[54,36]=0.0,s[54,37]=1.1,s[54,38]=1.0,s[54,39]=-1.1,s[54,40]=0.3,s[54,41]=0.4,s[54,42]=-1.1,s[54,43]=1.2,s[54,44]=-1.0,s[54,45]=-0.7,s[54,46]=0.6,s[54,47]=0.1,s[54,48]=-0.4,s[54,49]=1.0,s[54,50]=1.2,s[54,51]=0.6,s[54,52]=0.7,s[54,53]=0.7,s[54,54]=0.3,s[54,55]=-0.4,s[54,56]=0.2,s[54,57]=-0.5,s[54,58]=0.9,s[54,59]=-0.4,s[54,60]=-0.1 s[55,1]=0.6,s[55,2]=-0.6,s[55,3]=-0.4,s[55,4]=1.0,s[55,5]=1.2,s[55,6]=0.4,s[55,7]=0.2,s[55,8]=0.9,s[55,9]=-0.1,s[55,10]=0.3,s[55,11]=1.2,s[55,12]=0.6,s[55,13]=0.0,s[55,14]=-1.1,s[55,15]=0.2,s[55,16]=0.8,s[55,17]=0.0,s[55,18]=-1.1,s[55,19]=-0.4,s[55,20]=-1.1,s[55,21]=-0.6,s[55,22]=-0.1,s[55,23]=-0.3,s[55,24]=0.5,s[55,25]=0.7,s[55,26]=1.2,s[55,27]=0.3,s[55,28]=0.3,s[55,29]=0.5,s[55,30]=0.7,s[55,31]=-0.1,s[55,32]=0.0,s[55,33]=-1.1,s[55,34]=0.1,s[55,35]=0.3,s[55,36]=-0.2,s[55,37]=0.7,s[55,38]=0.1,s[55,39]=-0.1,s[55,40]=0.9,s[55,41]=0.1,s[55,42]=0.8,s[55,43]=-0.4,s[55,44]=0.6,s[55,45]=0.0,s[55,46]=1.0,s[55,47]=-0.2,s[55,48]=0.8,s[55,49]=0.7,s[55,50]=0.3,s[55,51]=0.6,s[55,52]=0.1,s[55,53]=-1.2,s[55,54]=-1.0,s[55,55]=-0.8,s[55,56]=0.5,s[55,57]=0.3,s[55,58]=0.4,s[55,59]=-0.4,s[55,60]=-0.8 s[56,1]=-0.1,s[56,2]=0.0,s[56,3]=0.2,s[56,4]=0.9,s[56,5]=-0.5,s[56,6]=-0.4,s[56,7]=0.3,s[56,8]=0.6,s[56,9]=-0.7,s[56,10]=-0.5,s[56,11]=-1.2,s[56,12]=-0.9,s[56,13]=0.5,s[56,14]=0.0,s[56,15]=0.6,s[56,16]=0.5,s[56,17]=0.3,s[56,18]=-0.4,s[56,19]=-0.4,s[56,20]=-1.2,s[56,21]=1.2,s[56,22]=-1.1,s[56,23]=0.2,s[56,24]=0.1,s[56,25]=0.2,s[56,26]=-0.3,s[56,27]=0.6,s[56,28]=-0.2,s[56,29]=0.5,s[56,30]=0.3,s[56,31]=0.6,s[56,32]=0.7,s[56,33]=-0.2,s[56,34]=1.2,s[56,35]=1.2,s[56,36]=-1.1,s[56,37]=-0.1,s[56,38]=-1.2,s[56,39]=-0.9,s[56,40]=1.1,s[56,41]=1.2,s[56,42]=0.7,s[56,43]=-0.9,s[56,44]=0.1,s[56,45]=0.8,s[56,46]=1.2,s[56,47]=0.9,s[56,48]=-0.6,s[56,49]=0.3,s[56,50]=0.5,s[56,51]=0.3,s[56,52]=1.2,s[56,53]=0.9,s[56,54]=0.8,s[56,55]=-0.8,s[56,56]=-0.3,s[56,57]=1.2,s[56,58]=0.3,s[56,59]=-0.9,s[56,60]=-0.8 s[57,1]=0.4,s[57,2]=1.1,s[57,3]=-0.5,s[57,4]=-1.1,s[57,5]=-0.4,s[57,6]=0.7,s[57,7]=0.4,s[57,8]=0.7,s[57,9]=1.1,s[57,10]=-0.4,s[57,11]=-0.9,s[57,12]=-0.7,s[57,13]=-0.2,s[57,14]=-0.4,s[57,15]=-0.5,s[57,16]=0.9,s[57,17]=0.1,s[57,18]=0.9,s[57,19]=-0.3,s[57,20]=-1.0,s[57,21]=0.9,s[57,22]=-1.1,s[57,23]=-0.5,s[57,24]=-0.1,s[57,25]=-0.2,s[57,26]=0.2,s[57,27]=-0.7,s[57,28]=0.0,s[57,29]=-1.1,s[57,30]=-0.3,s[57,31]=0.7,s[57,32]=0.8,s[57,33]=0.4,s[57,34]=1.0,s[57,35]=1.2,s[57,36]=-0.4,s[57,37]=-0.9,s[57,38]=-0.7,s[57,39]=-0.9,s[57,40]=0.4,s[57,41]=-0.8,s[57,42]=1.0,s[57,43]=0.5,s[57,44]=-0.3,s[57,45]=0.4,s[57,46]=0.0,s[57,47]=-0.8,s[57,48]=-1.0,s[57,49]=0.2,s[57,50]=-0.6,s[57,51]=0.4,s[57,52]=0.9,s[57,53]=0.0,s[57,54]=0.1,s[57,55]=-0.9,s[57,56]=0.5,s[57,57]=-0.4,s[57,58]=0.7,s[57,59]=0.1,s[57,60]=1.1 s[58,1]=0.1,s[58,2]=-0.9,s[58,3]=-0.7,s[58,4]=0.8,s[58,5]=1.0,s[58,6]=0.6,s[58,7]=0.0,s[58,8]=1.1,s[58,9]=-1.1,s[58,10]=-0.9,s[58,11]=-0.6,s[58,12]=0.4,s[58,13]=1.0,s[58,14]=-0.5,s[58,15]=-0.6,s[58,16]=0.0,s[58,17]=-0.3,s[58,18]=-0.4,s[58,19]=-0.4,s[58,20]=-0.1,s[58,21]=0.1,s[58,22]=-0.6,s[58,23]=-0.6,s[58,24]=-0.4,s[58,25]=0.1,s[58,26]=0.0,s[58,27]=1.2,s[58,28]=0.3,s[58,29]=0.9,s[58,30]=-1.2,s[58,31]=-0.7,s[58,32]=0.9,s[58,33]=-0.8,s[58,34]=-1.1,s[58,35]=1.1,s[58,36]=-0.3,s[58,37]=-0.5,s[58,38]=0.0,s[58,39]=1.0,s[58,40]=-1.1,s[58,41]=0.2,s[58,42]=-0.5,s[58,43]=0.7,s[58,44]=-0.8,s[58,45]=0.0,s[58,46]=-0.9,s[58,47]=0.7,s[58,48]=-0.3,s[58,49]=-0.9,s[58,50]=-0.6,s[58,51]=-0.5,s[58,52]=-0.4,s[58,53]=0.2,s[58,54]=1.0,s[58,55]=0.2,s[58,56]=1.1,s[58,57]=-1.2,s[58,58]=-0.8,s[58,59]=-0.2,s[58,60]=1.1 s[59,1]=-0.6,s[59,2]=-1.0,s[59,3]=0.8,s[59,4]=-1.1,s[59,5]=-0.5,s[59,6]=-0.2,s[59,7]=-0.5,s[59,8]=-0.7,s[59,9]=0.9,s[59,10]=-0.8,s[59,11]=-0.7,s[59,12]=1.1,s[59,13]=-1.0,s[59,14]=0.5,s[59,15]=0.3,s[59,16]=0.7,s[59,17]=-1.1,s[59,18]=0.9,s[59,19]=0.8,s[59,20]=0.2,s[59,21]=-1.1,s[59,22]=1.0,s[59,23]=0.0,s[59,24]=1.0,s[59,25]=0.2,s[59,26]=1.0,s[59,27]=1.1,s[59,28]=-0.4,s[59,29]=0.8,s[59,30]=0.3,s[59,31]=-0.8,s[59,32]=-0.7,s[59,33]=0.0,s[59,34]=1.1,s[59,35]=-1.1,s[59,36]=0.4,s[59,37]=-0.9,s[59,38]=-0.4,s[59,39]=-1.1,s[59,40]=0.3,s[59,41]=0.0,s[59,42]=0.0,s[59,43]=-0.5,s[59,44]=0.6,s[59,45]=0.9,s[59,46]=-1.1,s[59,47]=-0.6,s[59,48]=0.5,s[59,49]=0.1,s[59,50]=1.2,s[59,51]=-0.2,s[59,52]=-0.9,s[59,53]=-0.5,s[59,54]=-0.3,s[59,55]=-0.3,s[59,56]=-1.1,s[59,57]=-0.5,s[59,58]=-0.9,s[59,59]=1.2,s[59,60]=1.1 s[60,1]=-0.3,s[60,2]=0.3,s[60,3]=0.1,s[60,4]=0.7,s[60,5]=1.2,s[60,6]=-0.4,s[60,7]=0.2,s[60,8]=1.1,s[60,9]=-0.4,s[60,10]=-1.2,s[60,11]=0.0,s[60,12]=1.2,s[60,13]=0.8,s[60,14]=-0.9,s[60,15]=-0.9,s[60,16]=-0.8,s[60,17]=0.2,s[60,18]=-0.8,s[60,19]=0.6,s[60,20]=-0.7,s[60,21]=-1.1,s[60,22]=-0.9,s[60,23]=0.2,s[60,24]=1.1,s[60,25]=0.3,s[60,26]=-1.1,s[60,27]=0.6,s[60,28]=-0.4,s[60,29]=0.1,s[60,30]=0.0,s[60,31]=-0.7,s[60,32]=-0.2,s[60,33]=1.1,s[60,34]=0.9,s[60,35]=-0.2,s[60,36]=-0.6,s[60,37]=0.9,s[60,38]=-0.2,s[60,39]=-0.7,s[60,40]=0.1,s[60,41]=-0.9,s[60,42]=0.6,s[60,43]=0.4,s[60,44]=-1.1,s[60,45]=1.0,s[60,46]=-0.5,s[60,47]=0.7,s[60,48]=0.0,s[60,49]=0.6,s[60,50]=-0.2,s[60,51]=0.7,s[60,52]=0.0,s[60,53]=1.2,s[60,54]=-1.1,s[60,55]=0.9,s[60,56]=0.3,s[60,57]=1.2,s[60,58]=-1.1,s[60,59]=-0.1,s[60,60]=-0.4 s[61,1]=0.2,s[61,2]=-0.7,s[61,3]=0.4,s[61,4]=-1.0,s[61,5]=0.0,s[61,6]=-0.9,s[61,7]=1.2,s[61,8]=0.6,s[61,9]=-0.3,s[61,10]=-0.8,s[61,11]=1.2,s[61,12]=0.2,s[61,13]=-0.9,s[61,14]=-0.5,s[61,15]=0.9,s[61,16]=0.8,s[61,17]=-1.1,s[61,18]=-0.8,s[61,19]=0.6,s[61,20]=0.9,s[61,21]=-0.6,s[61,22]=-1.0,s[61,23]=0.6,s[61,24]=0.3,s[61,25]=0.6,s[61,26]=0.2,s[61,27]=-0.9,s[61,28]=1.0,s[61,29]=-0.7,s[61,30]=0.7,s[61,31]=0.3,s[61,32]=-1.2,s[61,33]=0.2,s[61,34]=0.1,s[61,35]=1.0,s[61,36]=-0.3,s[61,37]=1.2,s[61,38]=-0.7,s[61,39]=1.0,s[61,40]=0.3,s[61,41]=-1.2,s[61,42]=-0.9,s[61,43]=0.2,s[61,44]=0.7,s[61,45]=1.2,s[61,46]=0.0,s[61,47]=0.8,s[61,48]=-1.1,s[61,49]=0.8,s[61,50]=-1.1,s[61,51]=-0.7,s[61,52]=0.6,s[61,53]=0.8,s[61,54]=-0.6,s[61,55]=0.0,s[61,56]=0.3,s[61,57]=-0.8,s[61,58]=0.3,s[61,59]=-0.9,s[61,60]=0.5 s[62,1]=-0.7,s[62,2]=1.2,s[62,3]=0.6,s[62,4]=0.9,s[62,5]=-1.0,s[62,6]=0.4,s[62,7]=-1.0,s[62,8]=-0.3,s[62,9]=-0.9,s[62,10]=-1.2,s[62,11]=0.6,s[62,12]=-1.1,s[62,13]=1.0,s[62,14]=-0.9,s[62,15]=0.6,s[62,16]=0.9,s[62,17]=0.0,s[62,18]=0.0,s[62,19]=0.8,s[62,20]=-0.4,s[62,21]=-0.4,s[62,22]=-0.3,s[62,23]=0.4,s[62,24]=1.1,s[62,25]=-0.9,s[62,26]=1.2,s[62,27]=0.8,s[62,28]=0.0,s[62,29]=-0.3,s[62,30]=-0.6,s[62,31]=0.3,s[62,32]=-0.1,s[62,33]=0.3,s[62,34]=0.5,s[62,35]=0.2,s[62,36]=0.9,s[62,37]=-0.3,s[62,38]=-0.4,s[62,39]=1.2,s[62,40]=0.5,s[62,41]=0.0,s[62,42]=-1.0,s[62,43]=-0.7,s[62,44]=1.2,s[62,45]=-0.7,s[62,46]=-0.3,s[62,47]=-0.5,s[62,48]=-0.2,s[62,49]=0.5,s[62,50]=-1.2,s[62,51]=0.2,s[62,52]=-0.7,s[62,53]=1.2,s[62,54]=0.7,s[62,55]=-0.8,s[62,56]=-0.4,s[62,57]=0.0,s[62,58]=-0.9,s[62,59]=0.9,s[62,60]=0.2 s[63,1]=1.2,s[63,2]=-0.2,s[63,3]=-1.2,s[63,4]=-0.4,s[63,5]=-0.5,s[63,6]=-0.7,s[63,7]=0.1,s[63,8]=0.9,s[63,9]=0.5,s[63,10]=-1.2,s[63,11]=-1.1,s[63,12]=-0.8,s[63,13]=0.0,s[63,14]=0.5,s[63,15]=1.1,s[63,16]=-1.2,s[63,17]=-0.5,s[63,18]=-0.1,s[63,19]=0.4,s[63,20]=0.9,s[63,21]=-0.1,s[63,22]=-1.2,s[63,23]=0.1,s[63,24]=-1.2,s[63,25]=0.0,s[63,26]=-0.4,s[63,27]=0.1,s[63,28]=0.4,s[63,29]=-0.2,s[63,30]=-0.6,s[63,31]=-1.2,s[63,32]=0.1,s[63,33]=1.1,s[63,34]=-0.7,s[63,35]=0.6,s[63,36]=-0.3,s[63,37]=-0.8,s[63,38]=0.5,s[63,39]=-1.0,s[63,40]=0.6,s[63,41]=-0.7,s[63,42]=-0.9,s[63,43]=-0.1,s[63,44]=-0.9,s[63,45]=0.6,s[63,46]=0.1,s[63,47]=-0.7,s[63,48]=1.1,s[63,49]=-0.8,s[63,50]=-1.2,s[63,51]=1.2,s[63,52]=1.2,s[63,53]=-0.6,s[63,54]=1.2,s[63,55]=0.6,s[63,56]=-0.6,s[63,57]=0.7,s[63,58]=-0.9,s[63,59]=-0.1,s[63,60]=1.0 s[64,1]=1.1,s[64,2]=0.8,s[64,3]=0.4,s[64,4]=0.8,s[64,5]=1.2,s[64,6]=0.5,s[64,7]=0.5,s[64,8]=-0.4,s[64,9]=0.0,s[64,10]=-0.2,s[64,11]=0.9,s[64,12]=-0.3,s[64,13]=-0.5,s[64,14]=0.0,s[64,15]=0.9,s[64,16]=-0.9,s[64,17]=-1.2,s[64,18]=-0.6,s[64,19]=-0.1,s[64,20]=0.9,s[64,21]=0.0,s[64,22]=-0.6,s[64,23]=-0.1,s[64,24]=0.3,s[64,25]=-0.6,s[64,26]=-0.9,s[64,27]=0.6,s[64,28]=1.2,s[64,29]=-1.1,s[64,30]=0.5,s[64,31]=0.8,s[64,32]=-0.8,s[64,33]=-0.7,s[64,34]=0.7,s[64,35]=0.1,s[64,36]=-0.6,s[64,37]=0.0,s[64,38]=-0.7,s[64,39]=-1.0,s[64,40]=0.3,s[64,41]=0.1,s[64,42]=1.0,s[64,43]=0.2,s[64,44]=1.0,s[64,45]=-1.0,s[64,46]=0.5,s[64,47]=-1.2,s[64,48]=0.3,s[64,49]=0.1,s[64,50]=1.2,s[64,51]=-0.9,s[64,52]=-0.3,s[64,53]=0.5,s[64,54]=0.1,s[64,55]=-0.8,s[64,56]=-0.6,s[64,57]=-1.1,s[64,58]=0.8,s[64,59]=-0.1,s[64,60]=-1.0 s[65,1]=0.9,s[65,2]=-1.1,s[65,3]=0.9,s[65,4]=0.8,s[65,5]=-0.7,s[65,6]=-0.1,s[65,7]=0.2,s[65,8]=0.5,s[65,9]=-0.6,s[65,10]=-1.0,s[65,11]=0.9,s[65,12]=-0.8,s[65,13]=0.5,s[65,14]=0.7,s[65,15]=-0.4,s[65,16]=0.0,s[65,17]=-1.0,s[65,18]=-1.1,s[65,19]=-0.5,s[65,20]=0.4,s[65,21]=-1.2,s[65,22]=-1.1,s[65,23]=1.2,s[65,24]=-0.9,s[65,25]=-0.7,s[65,26]=-0.5,s[65,27]=0.1,s[65,28]=-0.6,s[65,29]=0.1,s[65,30]=-0.7,s[65,31]=0.3,s[65,32]=-1.0,s[65,33]=0.6,s[65,34]=1.0,s[65,35]=0.7,s[65,36]=-0.1,s[65,37]=1.1,s[65,38]=-0.9,s[65,39]=0.5,s[65,40]=1.2,s[65,41]=0.0,s[65,42]=-0.1,s[65,43]=0.4,s[65,44]=0.3,s[65,45]=0.6,s[65,46]=0.5,s[65,47]=1.2,s[65,48]=-0.2,s[65,49]=-0.2,s[65,50]=-0.3,s[65,51]=0.9,s[65,52]=-0.6,s[65,53]=0.5,s[65,54]=-0.8,s[65,55]=0.4,s[65,56]=1.2,s[65,57]=0.6,s[65,58]=0.9,s[65,59]=0.7,s[65,60]=-1.0 s[66,1]=-0.8,s[66,2]=-0.9,s[66,3]=0.2,s[66,4]=0.8,s[66,5]=-1.2,s[66,6]=-0.8,s[66,7]=0.2,s[66,8]=-0.9,s[66,9]=-1.1,s[66,10]=-0.5,s[66,11]=-0.7,s[66,12]=1.0,s[66,13]=0.0,s[66,14]=0.8,s[66,15]=-1.0,s[66,16]=-1.2,s[66,17]=-0.4,s[66,18]=0.0,s[66,19]=0.7,s[66,20]=-1.2,s[66,21]=-0.4,s[66,22]=-1.1,s[66,23]=1.0,s[66,24]=0.2,s[66,25]=0.4,s[66,26]=0.0,s[66,27]=0.4,s[66,28]=0.0,s[66,29]=-0.3,s[66,30]=-0.2,s[66,31]=1.0,s[66,32]=0.9,s[66,33]=-0.8,s[66,34]=0.8,s[66,35]=0.8,s[66,36]=-0.8,s[66,37]=-0.6,s[66,38]=-0.5,s[66,39]=0.0,s[66,40]=0.0,s[66,41]=0.4,s[66,42]=0.3,s[66,43]=-0.2,s[66,44]=0.0,s[66,45]=-0.5,s[66,46]=0.0,s[66,47]=-0.5,s[66,48]=0.2,s[66,49]=1.2,s[66,50]=-0.3,s[66,51]=0.1,s[66,52]=0.4,s[66,53]=-0.8,s[66,54]=0.5,s[66,55]=1.1,s[66,56]=-0.6,s[66,57]=-0.8,s[66,58]=0.8,s[66,59]=-0.2,s[66,60]=0.0 s[67,1]=-1.0,s[67,2]=0.2,s[67,3]=0.5,s[67,4]=-0.5,s[67,5]=1.1,s[67,6]=-0.7,s[67,7]=0.2,s[67,8]=-0.3,s[67,9]=0.2,s[67,10]=0.7,s[67,11]=-0.8,s[67,12]=0.5,s[67,13]=1.2,s[67,14]=0.4,s[67,15]=-1.0,s[67,16]=0.9,s[67,17]=-0.8,s[67,18]=0.9,s[67,19]=0.5,s[67,20]=0.7,s[67,21]=0.1,s[67,22]=-1.1,s[67,23]=-0.9,s[67,24]=0.7,s[67,25]=0.2,s[67,26]=0.2,s[67,27]=0.8,s[67,28]=1.1,s[67,29]=-0.7,s[67,30]=0.6,s[67,31]=1.0,s[67,32]=-0.7,s[67,33]=-1.2,s[67,34]=0.6,s[67,35]=0.4,s[67,36]=-0.2,s[67,37]=-1.1,s[67,38]=-1.2,s[67,39]=0.2,s[67,40]=1.1,s[67,41]=1.1,s[67,42]=0.9,s[67,43]=0.1,s[67,44]=0.2,s[67,45]=0.7,s[67,46]=-0.7,s[67,47]=0.5,s[67,48]=0.5,s[67,49]=1.0,s[67,50]=0.0,s[67,51]=0.1,s[67,52]=-1.1,s[67,53]=1.0,s[67,54]=0.5,s[67,55]=-0.4,s[67,56]=0.8,s[67,57]=1.1,s[67,58]=-1.2,s[67,59]=-1.1,s[67,60]=-0.8 s[68,1]=0.4,s[68,2]=-0.4,s[68,3]=0.7,s[68,4]=0.4,s[68,5]=-0.6,s[68,6]=0.6,s[68,7]=-0.2,s[68,8]=-0.3,s[68,9]=0.3,s[68,10]=1.1,s[68,11]=0.0,s[68,12]=0.5,s[68,13]=-1.2,s[68,14]=-0.9,s[68,15]=-0.7,s[68,16]=-0.4,s[68,17]=-1.0,s[68,18]=-0.3,s[68,19]=0.7,s[68,20]=-0.9,s[68,21]=0.3,s[68,22]=1.2,s[68,23]=0.0,s[68,24]=1.2,s[68,25]=0.3,s[68,26]=-0.4,s[68,27]=0.5,s[68,28]=0.7,s[68,29]=-0.9,s[68,30]=0.1,s[68,31]=0.4,s[68,32]=0.3,s[68,33]=-1.0,s[68,34]=-1.2,s[68,35]=-0.9,s[68,36]=0.6,s[68,37]=1.0,s[68,38]=-1.1,s[68,39]=0.4,s[68,40]=-0.6,s[68,41]=-1.1,s[68,42]=0.8,s[68,43]=-0.5,s[68,44]=0.3,s[68,45]=-1.0,s[68,46]=0.7,s[68,47]=-0.7,s[68,48]=-1.1,s[68,49]=-0.4,s[68,50]=1.0,s[68,51]=-0.7,s[68,52]=1.1,s[68,53]=-1.0,s[68,54]=-0.6,s[68,55]=-1.2,s[68,56]=-0.4,s[68,57]=-0.6,s[68,58]=1.1,s[68,59]=1.1,s[68,60]=-0.7 s[69,1]=0.4,s[69,2]=0.7,s[69,3]=-0.5,s[69,4]=1.1,s[69,5]=-0.6,s[69,6]=-0.8,s[69,7]=-1.1,s[69,8]=0.4,s[69,9]=0.8,s[69,10]=-0.9,s[69,11]=-0.3,s[69,12]=0.2,s[69,13]=0.4,s[69,14]=-0.7,s[69,15]=0.7,s[69,16]=1.1,s[69,17]=-0.5,s[69,18]=0.4,s[69,19]=0.0,s[69,20]=-0.5,s[69,21]=1.2,s[69,22]=0.0,s[69,23]=0.7,s[69,24]=-0.6,s[69,25]=-0.7,s[69,26]=-0.6,s[69,27]=-0.2,s[69,28]=0.5,s[69,29]=-1.2,s[69,30]=0.3,s[69,31]=-0.8,s[69,32]=0.5,s[69,33]=-0.1,s[69,34]=-0.5,s[69,35]=1.1,s[69,36]=-0.7,s[69,37]=-0.4,s[69,38]=0.6,s[69,39]=-0.9,s[69,40]=0.1,s[69,41]=-1.1,s[69,42]=-0.5,s[69,43]=-1.2,s[69,44]=-0.2,s[69,45]=0.3,s[69,46]=-0.1,s[69,47]=0.8,s[69,48]=0.4,s[69,49]=-0.1,s[69,50]=0.5,s[69,51]=-0.9,s[69,52]=1.1,s[69,53]=1.0,s[69,54]=0.9,s[69,55]=1.2,s[69,56]=0.9,s[69,57]=-0.4,s[69,58]=-1.2,s[69,59]=-0.3,s[69,60]=-1.0 s[70,1]=0.7,s[70,2]=0.8,s[70,3]=-0.2,s[70,4]=0.3,s[70,5]=1.0,s[70,6]=-0.8,s[70,7]=0.8,s[70,8]=-0.9,s[70,9]=-0.6,s[70,10]=-0.8,s[70,11]=0.8,s[70,12]=-0.9,s[70,13]=-0.5,s[70,14]=0.9,s[70,15]=0.6,s[70,16]=-0.2,s[70,17]=0.5,s[70,18]=-0.6,s[70,19]=0.3,s[70,20]=0.5,s[70,21]=-1.0,s[70,22]=0.0,s[70,23]=0.6,s[70,24]=0.9,s[70,25]=-1.1,s[70,26]=0.9,s[70,27]=-0.9,s[70,28]=0.8,s[70,29]=-0.8,s[70,30]=-0.3,s[70,31]=0.4,s[70,32]=-1.1,s[70,33]=-0.8,s[70,34]=-0.4,s[70,35]=0.7,s[70,36]=-1.2,s[70,37]=-0.6,s[70,38]=-0.9,s[70,39]=0.3,s[70,40]=-1.0,s[70,41]=0.6,s[70,42]=0.9,s[70,43]=0.9,s[70,44]=-1.1,s[70,45]=-0.9,s[70,46]=-0.9,s[70,47]=0.8,s[70,48]=1.0,s[70,49]=-1.2,s[70,50]=0.4,s[70,51]=-0.6,s[70,52]=-0.4,s[70,53]=0.3,s[70,54]=1.0,s[70,55]=0.3,s[70,56]=0.1,s[70,57]=0.0,s[70,58]=0.6,s[70,59]=0.3,s[70,60]=-0.8 s[71,1]=-1.0,s[71,2]=0.5,s[71,3]=0.6,s[71,4]=-1.2,s[71,5]=-1.1,s[71,6]=0.0,s[71,7]=-0.4,s[71,8]=0.6,s[71,9]=0.6,s[71,10]=0.9,s[71,11]=-0.9,s[71,12]=0.5,s[71,13]=-1.2,s[71,14]=-0.9,s[71,15]=0.3,s[71,16]=1.1,s[71,17]=-0.2,s[71,18]=-0.8,s[71,19]=0.4,s[71,20]=0.9,s[71,21]=0.2,s[71,22]=-0.8,s[71,23]=-0.5,s[71,24]=-1.1,s[71,25]=-0.7,s[71,26]=0.7,s[71,27]=1.1,s[71,28]=-0.3,s[71,29]=0.4,s[71,30]=0.8,s[71,31]=0.1,s[71,32]=0.4,s[71,33]=0.3,s[71,34]=-1.1,s[71,35]=0.5,s[71,36]=-1.2,s[71,37]=0.0,s[71,38]=0.8,s[71,39]=-1.1,s[71,40]=1.2,s[71,41]=0.6,s[71,42]=-0.6,s[71,43]=0.1,s[71,44]=0.9,s[71,45]=-0.8,s[71,46]=0.5,s[71,47]=1.0,s[71,48]=-1.0,s[71,49]=0.6,s[71,50]=-0.2,s[71,51]=0.2,s[71,52]=-0.1,s[71,53]=1.2,s[71,54]=-0.6,s[71,55]=-1.1,s[71,56]=-1.2,s[71,57]=-1.2,s[71,58]=-0.6,s[71,59]=0.4,s[71,60]=-0.7 s[72,1]=-0.3,s[72,2]=-0.9,s[72,3]=-0.4,s[72,4]=-0.8,s[72,5]=-1.1,s[72,6]=0.8,s[72,7]=-0.6,s[72,8]=0.1,s[72,9]=-0.7,s[72,10]=1.2,s[72,11]=0.4,s[72,12]=-0.7,s[72,13]=0.8,s[72,14]=-0.7,s[72,15]=1.1,s[72,16]=0.9,s[72,17]=0.7,s[72,18]=-0.7,s[72,19]=-1.2,s[72,20]=-0.9,s[72,21]=1.1,s[72,22]=-0.6,s[72,23]=0.1,s[72,24]=-0.5,s[72,25]=0.9,s[72,26]=-1.1,s[72,27]=1.2,s[72,28]=0.5,s[72,29]=0.2,s[72,30]=-0.9,s[72,31]=-0.9,s[72,32]=0.3,s[72,33]=-0.2,s[72,34]=0.5,s[72,35]=-1.0,s[72,36]=0.1,s[72,37]=0.7,s[72,38]=0.6,s[72,39]=0.7,s[72,40]=1.1,s[72,41]=0.0,s[72,42]=-0.9,s[72,43]=1.0,s[72,44]=0.5,s[72,45]=1.1,s[72,46]=-1.2,s[72,47]=1.1,s[72,48]=0.0,s[72,49]=0.4,s[72,50]=-0.6,s[72,51]=-1.0,s[72,52]=-0.6,s[72,53]=-0.3,s[72,54]=-0.6,s[72,55]=0.7,s[72,56]=-0.7,s[72,57]=0.5,s[72,58]=-0.7,s[72,59]=-0.3,s[72,60]=-1.1 s[73,1]=-0.3,s[73,2]=0.7,s[73,3]=-0.8,s[73,4]=0.8,s[73,5]=1.2,s[73,6]=0.9,s[73,7]=-0.7,s[73,8]=0.4,s[73,9]=-0.2,s[73,10]=0.4,s[73,11]=0.6,s[73,12]=-0.2,s[73,13]=-0.9,s[73,14]=0.7,s[73,15]=1.2,s[73,16]=-0.8,s[73,17]=0.5,s[73,18]=0.4,s[73,19]=-0.7,s[73,20]=0.6,s[73,21]=0.7,s[73,22]=-1.1,s[73,23]=-0.6,s[73,24]=-0.8,s[73,25]=-0.6,s[73,26]=0.5,s[73,27]=0.3,s[73,28]=0.4,s[73,29]=0.4,s[73,30]=0.7 s[73,31]=-0.5,s[73,32]=-0.2,s[73,33]=-0.9,s[73,34]=0.1,s[73,35]=0.9,s[73,36]=-1.0,s[73,37]=0.3,s[73,38]=0.8,s[73,39]=0.1,s[73,40]=0.4,s[73,41]=-1.0,s[73,42]=0.1,s[73,43]=0.6,s[73,44]=1.1,s[73,45]=0.0,s[73,46]=0.4,s[73,47]=-0.6,s[73,48]=0.7,s[73,49]=0.7,s[73,50]=1.2,s[73,51]=0.0,s[73,52]=0.0,s[73,53]=-1.2,s[73,54]=-0.1,s[73,55]=-0.6,s[73,56]=-0.8,s[73,57]=-0.8,s[73,58]=0.6,s[73,59]=-0.9,s[73,60]=0.3 s[74,1]=-0.4,s[74,2]=1.0,s[74,3]=1.1,s[74,4]=0.8,s[74,5]=0.9,s[74,6]=1.1,s[74,7]=0.8,s[74,8]=1.1,s[74,9]=-0.6,s[74,10]=-0.9,s[74,11]=1.1,s[74,12]=-1.0,s[74,13]=-1.2,s[74,14]=0.2,s[74,15]=1.2,s[74,16]=0.2,s[74,17]=-0.4,s[74,18]=0.5,s[74,19]=1.2,s[74,20]=1.0,s[74,21]=1.2,s[74,22]=-0.5,s[74,23]=0.1,s[74,24]=0.8,s[74,25]=-1.1,s[74,26]=-0.6,s[74,27]=-0.6,s[74,28]=0.2,s[74,29]=-0.1,s[74,30]=-0.8 s[74,31]=-0.7,s[74,32]=-0.6,s[74,33]=1.0,s[74,34]=0.6,s[74,35]=1.1,s[74,36]=0.3,s[74,37]=1.0,s[74,38]=-1.2,s[74,39]=0.4,s[74,40]=-1.0,s[74,41]=0.1,s[74,42]=-0.7,s[74,43]=-0.9,s[74,44]=-0.4,s[74,45]=0.8,s[74,46]=-0.2,s[74,47]=-1.1,s[74,48]=-0.2,s[74,49]=0.9,s[74,50]=0.7,s[74,51]=-0.4,s[74,52]=-0.1,s[74,53]=0.4,s[74,54]=-1.0,s[74,55]=0.8,s[74,56]=-0.3,s[74,57]=-1.2,s[74,58]=-0.2,s[74,59]=-1.0,s[74,60]=-0.2 s[75,1]=0.9,s[75,2]=0.6,s[75,3]=0.8,s[75,4]=-1.1,s[75,5]=-0.1,s[75,6]=0.6,s[75,7]=0.0,s[75,8]=-0.9,s[75,9]=0.7,s[75,10]=-1.1,s[75,11]=-1.2,s[75,12]=0.3,s[75,13]=1.0,s[75,14]=-0.7,s[75,15]=-0.3,s[75,16]=0.6,s[75,17]=0.4,s[75,18]=1.2,s[75,19]=1.2,s[75,20]=-0.5,s[75,21]=-1.0,s[75,22]=-0.6,s[75,23]=-0.2,s[75,24]=-0.6,s[75,25]=-0.4,s[75,26]=0.2,s[75,27]=0.8,s[75,28]=0.9,s[75,29]=-0.3,s[75,30]=-1.0 s[75,31]=-0.1,s[75,32]=0.3,s[75,33]=0.8,s[75,34]=0.5,s[75,35]=0.3,s[75,36]=-1.2,s[75,37]=0.6,s[75,38]=0.4,s[75,39]=-0.3,s[75,40]=-1.1,s[75,41]=-0.3,s[75,42]=-0.5,s[75,43]=-0.6,s[75,44]=-0.7,s[75,45]=-1.0,s[75,46]=0.6,s[75,47]=1.1,s[75,48]=-1.2,s[75,49]=-0.5,s[75,50]=-0.2,s[75,51]=-0.8,s[75,52]=0.5,s[75,53]=-1.2,s[75,54]=1.0,s[75,55]=1.2,s[75,56]=1.1,s[75,57]=-0.2,s[75,58]=0.2,s[75,59]=-0.9,s[75,60]=-0.4 s[76,1]=0.2,s[76,2]=-0.5,s[76,3]=0.1,s[76,4]=-0.1,s[76,5]=-0.5,s[76,6]=0.4,s[76,7]=0.5,s[76,8]=-0.3,s[76,9]=0.1,s[76,10]=0.9,s[76,11]=-0.9,s[76,12]=1.2,s[76,13]=1.2,s[76,14]=0.4,s[76,15]=-0.5,s[76,16]=0.7,s[76,17]=0.5,s[76,18]=0.7,s[76,19]=-0.9,s[76,20]=0.6,s[76,21]=0.5,s[76,22]=0.1,s[76,23]=0.4,s[76,24]=-0.4,s[76,25]=1.1,s[76,26]=0.2,s[76,27]=-0.2,s[76,28]=-0.3,s[76,29]=-0.9,s[76,30]=-1.1 s[76,31]=-0.2,s[76,32]=0.1,s[76,33]=0.3,s[76,34]=0.3,s[76,35]=-0.7,s[76,36]=-1.2,s[76,37]=1.1,s[76,38]=0.6,s[76,39]=0.4,s[76,40]=1.1,s[76,41]=-0.5,s[76,42]=-0.7,s[76,43]=0.5,s[76,44]=0.5,s[76,45]=1.1,s[76,46]=-0.4,s[76,47]=0.9,s[76,48]=1.1,s[76,49]=-0.6,s[76,50]=-0.9,s[76,51]=1.1,s[76,52]=-1.2,s[76,53]=0.5,s[76,54]=-1.1,s[76,55]=-0.9,s[76,56]=-1.2,s[76,57]=-1.1,s[76,58]=-0.9,s[76,59]=0.2,s[76,60]=-0.4 s[77,1]=0.6,s[77,2]=-0.9,s[77,3]=0.9,s[77,4]=-0.6,s[77,5]=-0.6,s[77,6]=-0.3,s[77,7]=-0.1,s[77,8]=-1.2,s[77,9]=-1.1,s[77,10]=0.5,s[77,11]=0.6,s[77,12]=-0.2,s[77,13]=0.3,s[77,14]=0.1,s[77,15]=-0.6,s[77,16]=1.1,s[77,17]=-1.2,s[77,18]=-1.1,s[77,19]=-0.7,s[77,20]=0.9,s[77,21]=-0.6,s[77,22]=-1.1,s[77,23]=1.2,s[77,24]=0.0,s[77,25]=0.2,s[77,26]=-0.3,s[77,27]=-0.1,s[77,28]=-1.0,s[77,29]=1.2,s[77,30]=0.7 s[77,31]=0.4,s[77,32]=0.2,s[77,33]=-0.4,s[77,34]=-1.1,s[77,35]=1.0,s[77,36]=0.0,s[77,37]=-0.4,s[77,38]=0.4,s[77,39]=0.1,s[77,40]=-0.7,s[77,41]=1.0,s[77,42]=-0.2,s[77,43]=-0.8,s[77,44]=-1.0,s[77,45]=-0.2,s[77,46]=-0.7,s[77,47]=-0.8,s[77,48]=-0.2,s[77,49]=-1.0,s[77,50]=-0.8,s[77,51]=0.6,s[77,52]=-0.5,s[77,53]=-0.9,s[77,54]=-0.4,s[77,55]=0.3,s[77,56]=-1.2,s[77,57]=0.2,s[77,58]=1.2,s[77,59]=0.4,s[77,60]=0.9 s[78,1]=1.1,s[78,2]=-0.6,s[78,3]=1.2,s[78,4]=1.0,s[78,5]=0.9,s[78,6]=0.7,s[78,7]=0.5,s[78,8]=-1.1,s[78,9]=-1.2,s[78,10]=0.0,s[78,11]=-1.2,s[78,12]=-1.1,s[78,13]=-0.2,s[78,14]=0.4,s[78,15]=-0.1,s[78,16]=-0.9,s[78,17]=0.6,s[78,18]=-0.4,s[78,19]=1.2,s[78,20]=-0.3,s[78,21]=-1.1,s[78,22]=-0.1,s[78,23]=0.2,s[78,24]=-0.6,s[78,25]=0.6,s[78,26]=0.2,s[78,27]=-1.0,s[78,28]=-0.4,s[78,29]=-1.1,s[78,30]=1.0 s[78,31]=0.7,s[78,32]=-0.6,s[78,33]=-0.8,s[78,34]=0.5,s[78,35]=0.9,s[78,36]=0.7,s[78,37]=-0.6,s[78,38]=0.7,s[78,39]=-0.2,s[78,40]=0.7,s[78,41]=0.0,s[78,42]=0.5,s[78,43]=0.3,s[78,44]=0.2,s[78,45]=0.1,s[78,46]=-1.2,s[78,47]=-1.1,s[78,48]=0.8,s[78,49]=0.0,s[78,50]=-0.4,s[78,51]=1.1,s[78,52]=0.3,s[78,53]=-0.5,s[78,54]=-1.2,s[78,55]=-1.0,s[78,56]=-0.1,s[78,57]=-0.5,s[78,58]=-0.8,s[78,59]=-0.8,s[78,60]=-0.6 s[79,1]=0.4,s[79,2]=-1.0,s[79,3]=-0.9,s[79,4]=1.1,s[79,5]=0.4,s[79,6]=0.0,s[79,7]=0.1,s[79,8]=1.2,s[79,9]=-0.6,s[79,10]=0.4,s[79,11]=1.1,s[79,12]=-1.2,s[79,13]=0.4,s[79,14]=0.7,s[79,15]=1.1,s[79,16]=-0.6,s[79,17]=-0.5,s[79,18]=-1.1,s[79,19]=-1.0,s[79,20]=-0.4,s[79,21]=0.8,s[79,22]=-0.8,s[79,23]=1.1,s[79,24]=1.2,s[79,25]=0.4,s[79,26]=-0.8,s[79,27]=-0.3,s[79,28]=1.1,s[79,29]=-0.1,s[79,30]=0.1 s[79,31]=1.2,s[79,32]=-1.0,s[79,33]=-0.6,s[79,34]=0.4,s[79,35]=0.0,s[79,36]=0.1,s[79,37]=-0.1,s[79,38]=0.2,s[79,39]=0.0,s[79,40]=1.2,s[79,41]=0.2,s[79,42]=0.1,s[79,43]=-0.9,s[79,44]=-0.6,s[79,45]=-0.7,s[79,46]=-0.9,s[79,47]=-0.7,s[79,48]=0.5,s[79,49]=-0.3,s[79,50]=-0.2,s[79,51]=-0.8,s[79,52]=0.9,s[79,53]=0.8,s[79,54]=-0.6,s[79,55]=0.7,s[79,56]=-0.2,s[79,57]=-0.1,s[79,58]=-0.8,s[79,59]=-1.2,s[79,60]=0.1 s[80,1]=-0.8,s[80,2]=1.0,s[80,3]=-0.9,s[80,4]=0.2,s[80,5]=-0.3,s[80,6]=-0.9,s[80,7]=0.8,s[80,8]=0.4,s[80,9]=0.4,s[80,10]=0.3,s[80,11]=-1.0,s[80,12]=0.0,s[80,13]=-1.2,s[80,14]=1.2,s[80,15]=0.3,s[80,16]=1.1,s[80,17]=-1.1,s[80,18]=-0.2,s[80,19]=-1.2,s[80,20]=-1.0,s[80,21]=0.9,s[80,22]=-0.1,s[80,23]=0.8,s[80,24]=-1.1,s[80,25]=-0.2,s[80,26]=-0.5,s[80,27]=0.8,s[80,28]=-0.1,s[80,29]=-0.4,s[80,30]=-0.2 s[80,31]=0.8,s[80,32]=0.4,s[80,33]=-1.2,s[80,34]=-1.0,s[80,35]=0.9,s[80,36]=0.6,s[80,37]=0.8,s[80,38]=-0.5,s[80,39]=-0.9,s[80,40]=0.8,s[80,41]=0.8,s[80,42]=0.6,s[80,43]=-1.0,s[80,44]=1.0,s[80,45]=0.0,s[80,46]=-0.2,s[80,47]=0.4,s[80,48]=0.0,s[80,49]=1.0,s[80,50]=-0.6,s[80,51]=-1.1,s[80,52]=1.2,s[80,53]=0.4,s[80,54]=0.8,s[80,55]=0.2,s[80,56]=0.8,s[80,57]=0.6,s[80,58]=0.2,s[80,59]=-0.9,s[80,60]=0.0 s[81,1]=1.0,s[81,2]=-0.3,s[81,3]=-0.5,s[81,4]=-0.9,s[81,5]=1.1,s[81,6]=-0.3,s[81,7]=-0.1,s[81,8]=0.1,s[81,9]=1.0,s[81,10]=-1.0,s[81,11]=0.5,s[81,12]=-0.5,s[81,13]=1.2,s[81,14]=0.9,s[81,15]=-0.5,s[81,16]=-0.6,s[81,17]=1.0,s[81,18]=1.1,s[81,19]=-0.4,s[81,20]=-0.9,s[81,21]=0.9,s[81,22]=0.0,s[81,23]=-0.9,s[81,24]=-0.4,s[81,25]=1.0,s[81,26]=-1.0,s[81,27]=-0.3,s[81,28]=-1.2,s[81,29]=-0.1,s[81,30]=-0.6 s[81,31]=-0.3,s[81,32]=-0.6,s[81,33]=0.9,s[81,34]=1.1,s[81,35]=-0.5,s[81,36]=-1.0,s[81,37]=0.7,s[81,38]=0.2,s[81,39]=0.8,s[81,40]=-1.1,s[81,41]=-1.1,s[81,42]=0.3,s[81,43]=0.0,s[81,44]=-0.6,s[81,45]=-0.6,s[81,46]=1.0,s[81,47]=0.1,s[81,48]=-1.0,s[81,49]=-0.9,s[81,50]=-1.1,s[81,51]=-0.1,s[81,52]=-1.1,s[81,53]=-1.2,s[81,54]=1.1,s[81,55]=0.8,s[81,56]=0.3,s[81,57]=-1.1,s[81,58]=-0.4,s[81,59]=-0.5,s[81,60]=0.2 s[82,1]=-0.1,s[82,2]=0.5,s[82,3]=-0.3,s[82,4]=0.7,s[82,5]=-0.6,s[82,6]=-0.8,s[82,7]=-1.2,s[82,8]=-1.2,s[82,9]=0.8,s[82,10]=1.1,s[82,11]=1.0,s[82,12]=-0.4,s[82,13]=-0.1,s[82,14]=-0.3,s[82,15]=0.6,s[82,16]=-0.9,s[82,17]=0.2,s[82,18]=-1.2,s[82,19]=-0.2,s[82,20]=-1.2,s[82,21]=0.0,s[82,22]=0.4,s[82,23]=0.4,s[82,24]=-0.9,s[82,25]=0.2,s[82,26]=-0.1,s[82,27]=1.0,s[82,28]=1.1,s[82,29]=-1.1,s[82,30]=0.3 s[82,31]=0.5,s[82,32]=-0.8,s[82,33]=-0.2,s[82,34]=0.1,s[82,35]=0.7,s[82,36]=-0.6,s[82,37]=-0.3,s[82,38]=-0.6,s[82,39]=0.7,s[82,40]=0.5,s[82,41]=-0.2,s[82,42]=0.5,s[82,43]=-0.7,s[82,44]=0.7,s[82,45]=0.7,s[82,46]=0.6,s[82,47]=0.9,s[82,48]=-0.4,s[82,49]=-1.1,s[82,50]=0.8,s[82,51]=0.0,s[82,52]=1.0,s[82,53]=-0.6,s[82,54]=1.0,s[82,55]=0.3,s[82,56]=-0.6,s[82,57]=1.0,s[82,58]=0.5,s[82,59]=-0.2,s[82,60]=0.9 s[83,1]=-0.1,s[83,2]=0.0,s[83,3]=-0.8,s[83,4]=0.7,s[83,5]=0.2,s[83,6]=1.2,s[83,7]=-0.5,s[83,8]=0.7,s[83,9]=1.1,s[83,10]=1.2,s[83,11]=0.0,s[83,12]=0.1,s[83,13]=0.5,s[83,14]=-0.2,s[83,15]=0.5,s[83,16]=1.1,s[83,17]=-0.1,s[83,18]=-0.5,s[83,19]=-1.1,s[83,20]=0.7,s[83,21]=0.6,s[83,22]=-1.1,s[83,23]=0.4,s[83,24]=-0.5,s[83,25]=0.1,s[83,26]=-1.0,s[83,27]=-1.2,s[83,28]=0.1,s[83,29]=0.5,s[83,30]=0.8 s[83,31]=-0.6,s[83,32]=1.1,s[83,33]=-0.8,s[83,34]=-1.1,s[83,35]=-0.9,s[83,36]=0.8,s[83,37]=1.1,s[83,38]=-0.4,s[83,39]=-0.4,s[83,40]=-0.5,s[83,41]=-0.2,s[83,42]=1.2,s[83,43]=0.5,s[83,44]=1.1,s[83,45]=-0.8,s[83,46]=0.3,s[83,47]=0.0,s[83,48]=1.2,s[83,49]=0.4,s[83,50]=0.7,s[83,51]=-1.2,s[83,52]=0.6,s[83,53]=-0.5,s[83,54]=-0.4,s[83,55]=1.1,s[83,56]=-0.9,s[83,57]=0.2,s[83,58]=1.0,s[83,59]=0.9,s[83,60]=-0.1 s[84,1]=0.7,s[84,2]=-0.5,s[84,3]=-0.6,s[84,4]=-0.1,s[84,5]=-0.8,s[84,6]=0.2,s[84,7]=1.0,s[84,8]=0.1,s[84,9]=-0.2,s[84,10]=0.9,s[84,11]=0.4,s[84,12]=1.0,s[84,13]=1.1,s[84,14]=0.8,s[84,15]=0.3,s[84,16]=-0.5,s[84,17]=0.8,s[84,18]=-0.2,s[84,19]=0.6,s[84,20]=0.8,s[84,21]=-0.8,s[84,22]=0.3,s[84,23]=0.5,s[84,24]=-0.8,s[84,25]=0.1,s[84,26]=1.1,s[84,27]=-1.2,s[84,28]=-0.3,s[84,29]=-0.6,s[84,30]=0.1 s[84,31]=-1.0,s[84,32]=-0.5,s[84,33]=0.4,s[84,34]=0.0,s[84,35]=-0.8,s[84,36]=-0.7,s[84,37]=0.2,s[84,38]=0.5,s[84,39]=-0.2,s[84,40]=-0.4,s[84,41]=0.7,s[84,42]=-0.3,s[84,43]=-0.1,s[84,44]=0.2,s[84,45]=-0.7,s[84,46]=-0.8,s[84,47]=0.8,s[84,48]=-0.1,s[84,49]=-1.2,s[84,50]=0.6,s[84,51]=-0.5,s[84,52]=-0.6,s[84,53]=-0.9,s[84,54]=-0.4,s[84,55]=0.1,s[84,56]=-0.1,s[84,57]=0.5,s[84,58]=0.1,s[84,59]=-0.4,s[84,60]=-0.1 s[85,1]=0.4,s[85,2]=1.2,s[85,3]=-0.7,s[85,4]=-1.2,s[85,5]=-1.0,s[85,6]=0.2,s[85,7]=0.5,s[85,8]=1.0,s[85,9]=-1.2,s[85,10]=0.0,s[85,11]=0.1,s[85,12]=1.0,s[85,13]=0.3,s[85,14]=0.1,s[85,15]=-1.2,s[85,16]=-1.0,s[85,17]=-0.7,s[85,18]=1.1,s[85,19]=-0.8,s[85,20]=1.0,s[85,21]=-0.2,s[85,22]=-1.0,s[85,23]=-1.0,s[85,24]=0.7,s[85,25]=0.1,s[85,26]=-0.6,s[85,27]=-0.3,s[85,28]=1.2,s[85,29]=0.7,s[85,30]=0.4 s[85,31]=0.8,s[85,32]=0.2,s[85,33]=0.2,s[85,34]=0.3,s[85,35]=-0.1,s[85,36]=1.1,s[85,37]=-0.8,s[85,38]=0.0,s[85,39]=-0.4,s[85,40]=-0.7,s[85,41]=-0.7,s[85,42]=-0.2,s[85,43]=0.0,s[85,44]=1.1,s[85,45]=-0.1,s[85,46]=-1.1,s[85,47]=0.9,s[85,48]=0.3,s[85,49]=-0.7,s[85,50]=-0.6,s[85,51]=0.6,s[85,52]=-0.6,s[85,53]=-1.0,s[85,54]=0.3,s[85,55]=0.5,s[85,56]=-0.1,s[85,57]=-0.7,s[85,58]=-0.3,s[85,59]=0.6,s[85,60]=1.2 s[86,1]=-1.0,s[86,2]=0.5,s[86,3]=0.0,s[86,4]=-1.0,s[86,5]=0.1,s[86,6]=0.1,s[86,7]=-0.8,s[86,8]=-1.2,s[86,9]=1.0,s[86,10]=-0.4,s[86,11]=-0.3,s[86,12]=0.9,s[86,13]=1.0,s[86,14]=-0.4,s[86,15]=-1.2,s[86,16]=1.0,s[86,17]=-0.5,s[86,18]=-0.3,s[86,19]=1.0,s[86,20]=-0.9,s[86,21]=-0.5,s[86,22]=1.1,s[86,23]=0.3,s[86,24]=-0.5,s[86,25]=0.8,s[86,26]=0.8,s[86,27]=-0.1,s[86,28]=-0.2,s[86,29]=0.2,s[86,30]=0.0 s[86,31]=1.1,s[86,32]=-0.4,s[86,33]=1.1,s[86,34]=-1.1,s[86,35]=-0.7,s[86,36]=-0.5,s[86,37]=-1.0,s[86,38]=-0.1,s[86,39]=-0.8,s[86,40]=-0.1,s[86,41]=0.2,s[86,42]=-0.1,s[86,43]=-0.9,s[86,44]=-0.1,s[86,45]=-1.1,s[86,46]=0.1,s[86,47]=0.3,s[86,48]=-0.4,s[86,49]=-1.1,s[86,50]=0.5,s[86,51]=1.0,s[86,52]=-0.9,s[86,53]=-0.3,s[86,54]=-0.2,s[86,55]=0.2,s[86,56]=-0.8,s[86,57]=-0.2,s[86,58]=-1.2,s[86,59]=-1.0,s[86,60]=0.3 s[87,1]=1.0,s[87,2]=-0.1,s[87,3]=0.0,s[87,4]=-1.0,s[87,5]=1.1,s[87,6]=0.3,s[87,7]=-1.2,s[87,8]=-0.1,s[87,9]=1.0,s[87,10]=0.0,s[87,11]=0.2,s[87,12]=0.3,s[87,13]=1.1,s[87,14]=-0.6,s[87,15]=0.0,s[87,16]=-0.5,s[87,17]=0.0,s[87,18]=0.8,s[87,19]=-1.2,s[87,20]=0.3,s[87,21]=-0.1,s[87,22]=-0.9,s[87,23]=0.7,s[87,24]=1.2,s[87,25]=-0.3,s[87,26]=1.1,s[87,27]=0.8,s[87,28]=1.0,s[87,29]=1.0,s[87,30]=0.0 s[87,31]=-0.5,s[87,32]=1.0,s[87,33]=-0.2,s[87,34]=-0.1,s[87,35]=0.1,s[87,36]=-0.1,s[87,37]=-0.9,s[87,38]=0.0,s[87,39]=-0.2,s[87,40]=-0.4,s[87,41]=0.5,s[87,42]=-0.5,s[87,43]=-0.5,s[87,44]=-0.3,s[87,45]=-1.2,s[87,46]=-0.1,s[87,47]=-0.8,s[87,48]=-0.5,s[87,49]=0.8,s[87,50]=0.4,s[87,51]=-0.9,s[87,52]=-0.1,s[87,53]=0.7,s[87,54]=0.3,s[87,55]=-0.6,s[87,56]=-1.2,s[87,57]=-0.7,s[87,58]=1.0,s[87,59]=-1.2,s[87,60]=0.8 s[88,1]=-0.2,s[88,2]=-0.5,s[88,3]=1.1,s[88,4]=-0.1,s[88,5]=0.8,s[88,6]=0.6,s[88,7]=0.0,s[88,8]=0.6,s[88,9]=-0.7,s[88,10]=1.2,s[88,11]=0.3,s[88,12]=1.2,s[88,13]=0.8,s[88,14]=-0.7,s[88,15]=-0.2,s[88,16]=1.1,s[88,17]=-0.9,s[88,18]=-1.2,s[88,19]=0.0,s[88,20]=0.5,s[88,21]=-0.9,s[88,22]=0.3,s[88,23]=0.5,s[88,24]=-0.5,s[88,25]=0.7,s[88,26]=0.1,s[88,27]=0.2,s[88,28]=1.1,s[88,29]=-0.7,s[88,30]=0.2 s[88,31]=-1.1,s[88,32]=-0.5,s[88,33]=-0.4,s[88,34]=0.5,s[88,35]=0.2,s[88,36]=0.1,s[88,37]=-0.1,s[88,38]=0.3,s[88,39]=-0.1,s[88,40]=-0.4,s[88,41]=-0.8,s[88,42]=-0.9,s[88,43]=-0.6,s[88,44]=0.5,s[88,45]=0.0,s[88,46]=-0.4,s[88,47]=0.2,s[88,48]=-0.6,s[88,49]=-0.5,s[88,50]=0.2,s[88,51]=1.0,s[88,52]=-0.8,s[88,53]=-1.0,s[88,54]=-0.1,s[88,55]=-1.1,s[88,56]=-0.3,s[88,57]=-0.7,s[88,58]=0.0,s[88,59]=0.5,s[88,60]=0.4 s[89,1]=0.3,s[89,2]=-0.9,s[89,3]=0.7,s[89,4]=0.9,s[89,5]=1.0,s[89,6]=-0.3,s[89,7]=-0.2,s[89,8]=-1.1,s[89,9]=-1.1,s[89,10]=-1.0,s[89,11]=1.2,s[89,12]=1.2,s[89,13]=0.8,s[89,14]=0.4,s[89,15]=1.1,s[89,16]=0.5,s[89,17]=-1.0,s[89,18]=-0.8,s[89,19]=-0.1,s[89,20]=-0.9,s[89,21]=0.1,s[89,22]=-0.5,s[89,23]=0.1,s[89,24]=-0.5,s[89,25]=0.8,s[89,26]=1.2,s[89,27]=-0.9,s[89,28]=-0.8,s[89,29]=-0.9,s[89,30]=0.8 s[89,31]=-0.9,s[89,32]=-0.1,s[89,33]=-0.3,s[89,34]=-0.9,s[89,35]=-1.0,s[89,36]=0.5,s[89,37]=-0.7,s[89,38]=1.0,s[89,39]=0.9,s[89,40]=0.6,s[89,41]=-0.9,s[89,42]=-0.9,s[89,43]=0.2,s[89,44]=0.9,s[89,45]=-0.2,s[89,46]=-0.3,s[89,47]=-1.0,s[89,48]=1.2,s[89,49]=1.2,s[89,50]=0.9,s[89,51]=0.1,s[89,52]=1.2,s[89,53]=0.5,s[89,54]=0.5,s[89,55]=-1.1,s[89,56]=-0.2,s[89,57]=0.7,s[89,58]=0.3,s[89,59]=-0.3,s[89,60]=1.0 s[90,1]=0.8,s[90,2]=0.1,s[90,3]=-0.7,s[90,4]=-0.9,s[90,5]=0.4,s[90,6]=1.2,s[90,7]=0.8,s[90,8]=1.2,s[90,9]=-1.1,s[90,10]=0.4,s[90,11]=0.8,s[90,12]=-0.3,s[90,13]=-0.1,s[90,14]=1.2,s[90,15]=-1.1,s[90,16]=-0.6,s[90,17]=-0.3,s[90,18]=0.9,s[90,19]=-0.5,s[90,20]=0.3,s[90,21]=-1.1,s[90,22]=-0.6,s[90,23]=-0.2,s[90,24]=-0.9,s[90,25]=-0.6,s[90,26]=-1.1,s[90,27]=-0.9,s[90,28]=0.7,s[90,29]=-0.2,s[90,30]=-0.8 s[90,31]=-0.7,s[90,32]=-0.8,s[90,33]=0.2,s[90,34]=-1.2,s[90,35]=0.4,s[90,36]=0.9,s[90,37]=-0.3,s[90,38]=-1.2,s[90,39]=-0.3,s[90,40]=-1.2,s[90,41]=-0.7,s[90,42]=0.5,s[90,43]=0.0,s[90,44]=-0.7,s[90,45]=0.9,s[90,46]=0.3,s[90,47]=0.0,s[90,48]=-0.2,s[90,49]=0.6,s[90,50]=1.2,s[90,51]=0.4,s[90,52]=0.7,s[90,53]=0.3,s[90,54]=0.1,s[90,55]=-0.6,s[90,56]=1.0,s[90,57]=0.4,s[90,58]=0.5,s[90,59]=-1.2,s[90,60]=0.4 ; ; initialize coefficients ; if @sel > 0 b1 = s[@sel,1] b2 = s[@sel,2] b3 = s[@sel,3] b4 = s[@sel,4] b5 = s[@sel,5] b6 = s[@sel,6] b7 = s[@sel,7] b8 = s[@sel,8] b9 = s[@sel,9] b10 = s[@sel,10] b11 = s[@sel,11] b12 = s[@sel,12] b13 = s[@sel,13] b14 = s[@sel,14] b15 = s[@sel,15] b16 = s[@sel,16] b17 = s[@sel,17] b18 = s[@sel,18] b19 = s[@sel,19] b20 = s[@sel,20] b21 = s[@sel,21] b22 = s[@sel,22] b23 = s[@sel,23] b24 = s[@sel,24] b25 = s[@sel,25] b26 = s[@sel,26] b27 = s[@sel,27] b28 = s[@sel,28] b29 = s[@sel,29] b30 = s[@sel,30] b31 = s[@sel,31] b32 = s[@sel,32] b33 = s[@sel,33] b34 = s[@sel,34] b35 = s[@sel,35] b36 = s[@sel,36] b37 = s[@sel,37] b38 = s[@sel,38] b39 = s[@sel,39] b40 = s[@sel,40] b41 = s[@sel,41] b42 = s[@sel,42] b43 = s[@sel,43] b44 = s[@sel,44] b45 = s[@sel,45] b46 = s[@sel,46] b47 = s[@sel,47] b48 = s[@sel,48] b49 = s[@sel,49] b50 = s[@sel,50] b51 = s[@sel,51] b52 = s[@sel,52] b53 = s[@sel,53] b54 = s[@sel,54] b55 = s[@sel,55] b56 = s[@sel,56] b57 = s[@sel,57] b58 = s[@sel,58] b59 = s[@sel,59] b60 = s[@sel,60] endif ; ; fill the hit array ; while (iter < (iterate*sqr(#width*#magn/400))) xx = fx yy = fy zz = fz if @sel == 0 fx = fx + @ed*(@a1 + @a2*fx + @a3*fx*fx + @a4*fx*fy + @a5*fx*fz + @a6*fx*ww + @a7*fy + @a8*fy*fy + \ @a9*fy*fz + @a10*fy*ww + @a11*fz + @a12*fz*fz + @a13*fz*ww + @a14*ww + @a15*ww*ww) fy = fy + @ed*(@a16 + @a17*xx + @a18*xx*xx + @a19*xx*fy + @a20*xx*fz + @a21*xx*ww + @a22*fy + @a23*fy*fy + \ @a24*fy*fz + @a25*fy*ww + @a26*fz + @a27*fz*fz + @a28*fz*ww + @a29*ww + @a30*ww*ww) fz = fz + @ed*(@a31 + @a32*xx + @a33*xx*xx + @a34*xx*yy + @a35*xx*fz + @a36*xx*ww + @a37*yy + @a38*yy*yy + \ @a39*yy*fz + @a40*yy*ww + @a41*fz + @a42*fz*fz + @a43*fz*ww + @a44*ww + @a45*ww*ww) ww = ww + @ed*(@a46 + @a47*xx + @a48*xx*xx + @a49*xx*yy + @a50*xx*zz + @a51*xx*ww + @a52*yy + @a53*yy*yy + \ @a54*yy*zz + @a55*yy*ww + @a56*zz + @a57*zz*zz + @a58*zz*ww + @a59*ww + @a60*ww*ww) else fx = fx + @ed*(b1 + b2*fx + b3*fx*fx + b4*fx*fy + b5*fx*fz + b6*fx*ww + b7*fy + b8*fy*fy + \ b9*fy*fz + b10*fy*ww + b11*fz + b12*fz*fz + b13*fz*ww + b14*ww + b15*ww*ww) fy = fy + @ed*(b16 + b17*xx + b18*xx*xx + b19*xx*fy + b20*xx*fz + b21*xx*ww + b22*fy + b23*fy*fy + \ b24*fy*fz + b25*fy*ww + b26*fz + b27*fz*fz + b28*fz*ww + b29*ww + b30*ww*ww) fz = fz + @ed*(b31 + b32*xx + b33*xx*xx + b34*xx*yy + b35*xx*fz + b36*xx*ww + b37*yy + b38*yy*yy + \ b39*yy*fz + b40*yy*ww + b41*fz + b42*fz*fz + b43*fz*ww + b44*ww + b45*ww*ww) ww = ww + @ed*(b46 + b47*xx + b48*xx*xx + b49*xx*yy + b50*xx*zz + b51*xx*ww + b52*yy + b53*yy*yy + \ b54*yy*zz + b55*yy*ww + b56*zz + b57*zz*zz + b58*zz*ww + b59*ww + b60*ww*ww) endif ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax ffz = (zmin-fz)/sqrt(txmax^2+tymax^2) ffw = (wmin-ww)/sqrt(txmax^2+tymax^2) ; rotation in the XW Plane xx = ffx ffx = (0.5 - (ffw - 0.5 - @rotoffw/twmax)*sin(@xwangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@xwangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@xwangle*pi/180) + \ (xx - 0.5 - @rotoffw/twmax)*sin(@xwangle*pi/180)) ; rotation in the YW Plane yy = ffy ffy = (0.5 + (ffw - 0.5 - @rotoffw/txmax)*sin(@ywangle*pi/180) + \ (ffy - 0.5 - @rotoffy/tymax)*cos(@ywangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@ywangle*pi/180) - \ (yy - 0.5 - @rotoffw/twmax)*sin(@ywangle*pi/180)) ; rotation in the ZW Plane zz = ffz ffz = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*sin(@zwangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@zwangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@zwangle*pi/180) - \ (zz - 0.5 - @rotoffw/twmax)*sin(@zwangle*pi/180)) ; rotation in the XY Plane (from the Location TAB) ; xx = ffx ffx = 0.5 + (ffx - 0.5 - @rotoffx/txmax)*cos(#angle) - \ (ffy - 0.5 - @rotoffy/tymax)*sin(#angle)*#height/#width ffy = 0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(#angle) + \ (xx - 0.5 - @rotoffx/txmax)*sin(#angle)*#width/#height ; ; rotation in the XZ Plane ; xx = ffx ffx = (0.5 + (ffz - 0.5 - @rotoffz/txmax)*sin(@zangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@zangle*pi/180))*#width ffz = (0.5 + (ffz - 0.5 - @rotoffz/tzmax)*cos(@zangle*pi/180) - \ (xx - 0.5 - @rotoffx/txmax)*sin(@zangle*pi/180)) ; ; rotation in the YZ plane ; yy = ffy ffy = (0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(@xangle*pi/180) - \ (ffz - 0.5 - @rotoffz/tzmax)*sin(@xangle*pi/180))*#height if @oldver ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*#height/2 else ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*scrsize endif ; ; final translation ; ffx = ffx - @transx*#width ffy = ffy - @transy*#height if @oldver ffz = ffz - @transz*#height/2 else ffz = ffz - @transz*scrsize endif ; ; perspective application ; if @oldver if @useproj ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif else if @useprojn ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif endif px = trunc(ffx)+wd2 py = trunc(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+1+flip(ffz) if real(hits[px,py])>maxnhit maxnhit = real(hits[px,py]) endif if ffz > hits3[px,py] || hits3[px,py] == 0 hits3[px,py] = ffz endif hits2[px,py] = ffz endif iter = iter + 1 endwhile h = 0 w = 0 ; init: float nhit=0 float zave=0 float zlast=0 float zbiggest=0 float nhitx=0 float zavex=0 float zlastx=0 float zbiggestx=0 float nhity=0 float zavey=0 float zlasty=0 float zbiggesty=0 bool done = false float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 int i = 0 ;loop: int delta = ceil(@closeness) int xcrd = #x int ycrd = #y bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true if xcrd+@closeness < #width+wd && ycrd+@closeness < #height+ht && real(hits[xcrd,ycrd]) > @thresh if @filter == 0 if @value == 3 zbiggest = hits3[xcrd,ycrd] zbiggestx = hits3[xcrd+delta,ycrd] zbiggesty = hits3[xcrd,ycrd+delta] elseif @value == 0 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) elseif @value == 1 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) zave = imag(hits[xcrd,ycrd])/(nhit + 1) zavex = imag(hits[xcrd+delta,ycrd])/(nhitx + 1) zavey = imag(hits[xcrd,ycrd+delta])/(nhity + 1) elseif @value == 2 zlast = hits2[xcrd,ycrd] zlastx = hits2[xcrd+delta,ycrd] zlasty = hits2[xcrd,ycrd+delta] endif else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 zbiggest = 0 zbiggestx = 0 zbiggesty = 0 zave = 0 zavex = 0 zavey = 0 zlast = 0 zlastx = 0 zlasty = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter if @value == 0 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) elseif @value == 1 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) zave = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy])/(nhit+1) zavex = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx+delta,ycrd+gy])/(nhitx+1) zavey = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta])/(nhity+1) elseif @value == 2 zlast = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy] zlastx = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx+delta,ycrd+gy] zlasty = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy+delta] elseif @value == 3 zbiggest = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy] zbiggestx = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx+delta,ycrd+gy] zbiggesty = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy+delta] endif gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile if @value == 0 nhit = nhit/gweight nhitx = nhitx/gweight nhity = nhity/gweight elseif @value == 1 zave = zave/gweight zavex = zavex/gweight zavey = zavey/gweight elseif @value == 2 zlast = zlast/gweight zlastx = zlastx/gweight zlasty = zlasty/gweight elseif @value == 3 zbiggest = zbiggest/gweight zbiggestx = zbiggestx/gweight zbiggesty = zbiggesty/gweight endif endif endif endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = zave cenx = zavex ceny = zavey elseif @value == 2 cen = zlast cenx = zlastx ceny = zlasty else cen = zbiggest cenx = zbiggestx ceny = zbiggesty endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * zscale2 e2 = e2 * zscale2 e3 = e3 * zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxnhit elseif @value == 1 #z = (zave/(log(maxnhit)+1))^3 elseif @value == 2 #z = (zlast/(log(maxnhit)+1))^10 elseif @value == 3 #z = (zbiggest/(log(maxnhit)+1))^10 endif endif if @oldver if done == false done = true endif endif loop: i = i + 1 if !@oldver if cen < i if done == false done = true endif endif endif bailout: done == false default: heading caption="Sprott 4D Quadratic ODE G Attractors" endheading $ifdef VER40 heading text="Strange attractors from simultaneous ordinary differential \ equations using Euler's finite difference method to calculate. Color \ with Damien's Lighting, 3D Texturizer Enhanced III or Direct Color \ Slope." endheading $else heading caption="Strange attractors from simultaneous" endheading heading caption="ordinary differential equations using" endheading heading caption="Euler's finite difference method to" endheading heading caption="calculate." endheading heading caption="Color with Damien's Lighting" endheading heading caption="or one of the 3D Texturizer formulas" endheading heading caption="3D Texturizer III is needed for" endheading heading caption="the non-slope color options." endheading $endif title="Slope 4D Quadratic ODE G Attractor" maxiter=1000 method=multipass periodicity=0 float param version caption = "Version number" default = 1.1 hint = "This is for backwards compatibility with old versions \ of the formula." visible = false endparam bool param oldver caption = "Use original version" default = false endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 0.1 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 0 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param value caption = "Hit Value" enum = "Count" "Ave Z" "Last Z" "Largest Z" default = 3 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param pass caption = "Pass slope values" default = true endparam heading caption = "Slope Parameters" visible=@pass==true endheading param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 1.0 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible=@pass==true endparam heading caption = "Rotations and Translations" endheading $ifdef VER40 heading text = "Use the location tab for XY Plane Rotation." endheading $endif param xangle caption = "YZ Plane Rotation" default = 0.0 hint = "This is equivalent of a X Axis rotation in 3 Dimensions. \ It is performed after the normal fractal rotation(s) \ (XY Plane Rotation) and zooms." endparam param zangle caption = "XZ Plane Rotation" default = 0.0 hint = "This is equivalent of a Y Axis rotation in 3 Dimensions. \ It is performed after the normal fractal rotation(s) \ (XY Plane Rotation) and zooms." endparam param xwangle caption = "XW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param ywangle caption = "YW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param zwangle caption = "ZW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param rotoffx caption = "Rotation Center X Offset" default = 0.0 endparam param rotoffy caption = "Rotation Center Y Offset" default = 0.0 endparam param rotoffz caption = "Rotation Center Z Offset" default = 0.0 endparam param rotoffw caption = "Rotation Center W Offset" default = 0.0 endparam param transx caption = "X Final Translation" default = 0.0 endparam param transy caption = "Y Final Translation" default = 0.0 endparam param transz caption = "Z Final Translation" default = 0.0 endparam heading caption = "Perspective" endheading param useproj caption = "Use Perspective" default = false visible = @oldver endparam param useprojn caption = "Use Perspective" default = true visible = !@oldver endparam param cprojx caption = "X Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam param cprojy caption = "Y Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam float param cprojz caption = "Z Center of Projection" default = -1 visible = @useproj || @useprojn endparam heading caption = "Attractor Parameters" endheading param hideparam caption = "Hide Parameters" default = true endparam param ed caption = "Euler Difference" default = 0.1 endparam param sel caption = "select preset coeffs" enum = "no preset" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" \ "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" \ "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" \ "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" \ "41" "42" "43" "44" "45" "46" "47" "48" "49" "50" \ "51" "52" "53" "54" "55" "56" "57" "58" "59" "60" \ "61" "62" "63" "64" "65" "66" "67" "68" "69" "70" \ "71" "72" "73" "74" "75" "76" "77" "78" "79" "80" \ "81" "82" "83" "84" "85" "86" "87" "88" "89" "90" default = 0 endparam param a1 caption = "coefficient a1" default = 0.0 visible=@hideparam==false endparam param a2 caption = "coefficient a2" default = -0.6 visible=@hideparam==false endparam param a3 caption = "coefficient a3" default = 0.0 visible=@hideparam==false endparam param a4 caption = "coefficient a4" default = -0.8 visible=@hideparam==false endparam param a5 caption = "coefficient a5" default = -0.8 visible=@hideparam==false endparam param a6 caption = "coefficient a6" default = -0.6 visible=@hideparam==false endparam param a7 caption = "coefficient a7" default = 0.3 visible=@hideparam==false endparam param a8 caption = "coefficient a8" default = 0.1 visible=@hideparam==false endparam param a9 caption = "coefficient a9" default = 0.5 visible=@hideparam==false endparam param a10 caption = "coefficient a10" default = -0.4 visible=@hideparam==false endparam param a11 caption = "coefficient a11" default = 0.0 visible=@hideparam==false endparam param a12 caption = "coefficient a12" default = 0.4 visible=@hideparam==false endparam param a13 caption = "coefficient a13" default = 0.7 visible=@hideparam==false endparam param a14 caption = "coefficient a14" default = 0.4 visible=@hideparam==false endparam param a15 caption = "coefficient a15" default = 1.2 visible=@hideparam==false endparam param a16 caption = "coefficient a16" default = -0.6 visible=@hideparam==false endparam param a17 caption = "coefficient a17" default = 0.4 visible=@hideparam==false endparam param a18 caption = "coefficient a18" default = -0.2 visible=@hideparam==false endparam param a19 caption = "coefficient a19" default = -1.2 visible=@hideparam==false endparam param a20 caption = "coefficient a20" default = 0.2 visible=@hideparam==false endparam param a21 caption = "coefficient a21" default = -1.0 visible=@hideparam==false endparam param a22 caption = "coefficient a22" default = -0.6 visible=@hideparam==false endparam param a23 caption = "coefficient a23" default = -0.9 visible=@hideparam==false endparam param a24 caption = "coefficient a24" default = 0.7 visible=@hideparam==false endparam param a25 caption = "coefficient a25" default = -0.6 visible=@hideparam==false endparam param a26 caption = "coefficient a26" default = 1.2 visible=@hideparam==false endparam param a27 caption = "coefficient a27" default = 0.8 visible=@hideparam==false endparam param a28 caption = "coefficient a28" default = -0.3 visible=@hideparam==false endparam param a29 caption = "coefficient a29" default = 0.3 visible=@hideparam==false endparam param a30 caption = "coefficient a30" default = 0.3 visible=@hideparam==false endparam param a31 caption = "coefficient a31" default = -1.2 visible=@hideparam==false endparam param a32 caption = "coefficient a32" default = 0.6 visible=@hideparam==false endparam param a33 caption = "coefficient a33" default = 0.3 visible=@hideparam==false endparam param a34 caption = "coefficient a34" default = 0.6 visible=@hideparam==false endparam param a35 caption = "coefficient a35" default = -0.5 visible=@hideparam==false endparam param a36 caption = "coefficient a36" default = 0.4 visible=@hideparam==false endparam param a37 caption = "coefficient a37" default = -0.2 visible=@hideparam==false endparam param a38 caption = "coefficient a38" default = -0.4 visible=@hideparam==false endparam param a39 caption = "coefficient a39" default = -0.6 visible=@hideparam==false endparam param a40 caption = "coefficient a40" default = -0.3 visible=@hideparam==false endparam param a41 caption = "coefficient a41" default = -0.7 visible=@hideparam==false endparam param a42 caption = "coefficient a42" default = 0.0 visible=@hideparam==false endparam param a43 caption = "coefficient a43" default = 1.0 visible=@hideparam==false endparam param a44 caption = "coefficient a44" default = 0.8 visible=@hideparam==false endparam param a45 caption = "coefficient a45" default = 1.1 visible=@hideparam==false endparam param a46 caption = "coefficient a46" default = 0.7 visible=@hideparam==false endparam param a47 caption = "coefficient a47" default = 0.3 visible=@hideparam==false endparam param a48 caption = "coefficient a48" default = -0.3 visible=@hideparam==false endparam param a49 caption = "coefficient a49" default = -1.2 visible=@hideparam==false endparam param a50 caption = "coefficient a50" default = -0.6 visible=@hideparam==false endparam param a51 caption = "coefficient a51" default = -1.1 visible=@hideparam==false endparam param a52 caption = "coefficient a52" default = -0.3 visible=@hideparam==false endparam param a53 caption = "coefficient a53" default = -0.2 visible=@hideparam==false endparam param a54 caption = "coefficient a54" default = -0.7 visible=@hideparam==false endparam param a55 caption = "coefficient a55" default = -1.0 visible=@hideparam==false endparam param a56 caption = "coefficient a56" default = 1.2 visible=@hideparam==false endparam param a57 caption = "coefficient a57" default = -1.2 visible=@hideparam==false endparam param a58 caption = "coefficient a58" default = -0.7 visible=@hideparam==false endparam param a59 caption = "coefficient a59" default = 0.2 visible=@hideparam==false endparam param a60 caption = "coefficient a60" default = -0.2 visible=@hideparam==false endparam } Slope_4D_Special_Map_#1_G_Attractor { ; Ron Barnett December 12, 2004 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III; ; global: float zscale2 = 0 float cprojx = 0 float cprojy = 0 float cprojz = 0 float scrsize = sqrt(#width*#width+#height*#height) if !@oldver zscale2 = @zscale2*scrsize cprojx = @cprojx*#width cprojy = @cprojy*#height cprojz = @cprojz*scrsize else zscale2 = @zscale2 cprojx = @cprojx cprojy = @cprojy cprojz = @cprojz endif int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits2[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits3[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float s[61,19] float fx = 0.0 float ffx = 0.0 float xx = 0.0 float fy = 0.0 float ffy = 0.0 float yy = 0.0 float zz = 0.0 float fz = 0.0 float ffz = 0.0 float ww = 0.0 float ffw = 0.0 float b1 = 0 float b2 = 0 float b3 = 0 float b4 = 0 float b5 = 0 float b6 = 0 float b7 = 0 float b8 = 0 float b9 = 0 float b10 = 0 float b11 = 0 float b12 = 0 float b13 = 0 float b14 = 0 float b15 = 0 float b16 = 0 float b17 = 0 float b18 = 0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float tzmax = sqrt(txmax^2+tymax^2) float twmax = sqrt(txmax^2+tymax^2) float xmin = cx - txmax/2 float ymin = cy - tymax/2 float zmin = sqrt(xmin^2 + ymin^2) float wmin = sqrt(xmin^2 + ymin^2) float iterate = @density*10000000 float maxnhit = 0 ; ; initialize hit array ; while(h < #height+wd) while(w < #width+ht) hits[w,h] = 0 hits2[w,h] = 0 hits3[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; initialize presets ; s[1,1]=-1.2,s[1,2]=0.3,s[1,3]=-0.6,s[1,4]=-1.0,s[1,5]=-1.2,s[1,6]=0.7,s[1,7]=0.2,s[1,8]=-0.4,s[1,9]=0.6,s[1,10]=0.5,s[1,11]=0.5,s[1,12]=1.1,s[1,13]=1.1,s[1,14]=1.2,s[1,15]=-1.1,s[1,16]=-0.7,s[1,17]=0.1,s[1,18]=-0.7 s[2,1]=-0.5,s[2,2]=-0.7,s[2,3]=-1.2,s[2,4]=0.2,s[2,5]=0.2,s[2,6]=-0.4,s[2,7]=-1.2,s[2,8]=-1.0,s[2,9]=-1.0,s[2,10]=1.1,s[2,11]=0.1,s[2,12]=0.5,s[2,13]=1.0,s[2,14]=1.2,s[2,15]=0.8,s[2,16]=1.1,s[2,17]=1.0,s[2,18]=0.1 s[3,1]=0.9,s[3,2]=0.9,s[3,3]=0.8,s[3,4]=-1.0,s[3,5]=-0.8,s[3,6]=-0.2,s[3,7]=-1.1,s[3,8]=-0.6,s[3,9]=0.6,s[3,10]=0.2,s[3,11]=-1.1,s[3,12]=-0.2,s[3,13]=0.5,s[3,14]=0.8,s[3,15]=-0.6,s[3,16]=0.6,s[3,17]=1.1,s[3,18]=-0.2 s[4,1]=0.7,s[4,2]=0.6,s[4,3]=-1.1,s[4,4]=-0.3,s[4,5]=0.2,s[4,6]=-0.2,s[4,7]=0.3,s[4,8]=-1.1,s[4,9]=0.5,s[4,10]=-0.4,s[4,11]=0.7,s[4,12]=-0.8,s[4,13]=-1.2,s[4,14]=1.0,s[4,15]=0.5,s[4,16]=1.0,s[4,17]=1.1,s[4,18]=-0.3 s[5,1]=-0.9,s[5,2]=-0.5,s[5,3]=1.1,s[5,4]=0.5,s[5,5]=0.4,s[5,6]=0.9,s[5,7]=-1.0,s[5,8]=-1.1,s[5,9]=-0.4,s[5,10]=-0.5,s[5,11]=-0.4,s[5,12]=0.5,s[5,13]=1.2,s[5,14]=1.0,s[5,15]=-0.3,s[5,16]=0.4,s[5,17]=0.3,s[5,18]=0.7 s[6,1]=-1.0,s[6,2]=0.8,s[6,3]=1.2,s[6,4]=-0.7,s[6,5]=-1.2,s[6,6]=0.8,s[6,7]=-0.1,s[6,8]=-0.5,s[6,9]=-0.7,s[6,10]=0.5,s[6,11]=-1.0,s[6,12]=-0.4,s[6,13]=1.2,s[6,14]=1.2,s[6,15]=-0.3,s[6,16]=-0.4,s[6,17]=0.7,s[6,18]=0.1 s[7,1]=-0.9,s[7,2]=-0.5,s[7,3]=1.0,s[7,4]=-0.4,s[7,5]=0.9,s[7,6]=0.8,s[7,7]=0.9,s[7,8]=-0.8,s[7,9]=0.8,s[7,10]=0.9,s[7,11]=-1.0,s[7,12]=1.1,s[7,13]=-1.1,s[7,14]=-0.9,s[7,15]=-0.9,s[7,16]=-1.1,s[7,17]=0.8,s[7,18]=-1.1 s[8,1]=0.0,s[8,2]=-0.2,s[8,3]=0.2,s[8,4]=-1.2,s[8,5]=1.2,s[8,6]=-0.8,s[8,7]=0.0,s[8,8]=1.0,s[8,9]=0.9,s[8,10]=1.1,s[8,11]=-1.0,s[8,12]=-1.1,s[8,13]=0.2,s[8,14]=-0.3,s[8,15]=-1.1,s[8,16]=-1.0,s[8,17]=-0.7,s[8,18]=-1.0 s[9,1]=-0.7,s[9,2]=-0.7,s[9,3]=-0.1,s[9,4]=-0.4,s[9,5]=0.9,s[9,6]=0.1,s[9,7]=1.2,s[9,8]=-1.0,s[9,9]=-0.8,s[9,10]=-0.6,s[9,11]=1.1,s[9,12]=0.6,s[9,13]=-1.1,s[9,14]=-0.9,s[9,15]=-0.3,s[9,16]=-0.3,s[9,17]=-1.0,s[9,18]=0.8 s[10,1]=1.1,s[10,2]=1.0,s[10,3]=-1.0,s[10,4]=1.0,s[10,5]=0.6,s[10,6]=0.1,s[10,7]=-0.9,s[10,8]=1.1,s[10,9]=0.3,s[10,10]=-0.5,s[10,11]=1.2,s[10,12]=-0.3,s[10,13]=0.2,s[10,14]=-1.2,s[10,15]=-1.0,s[10,16]=0.9,s[10,17]=1.1,s[10,18]=0.0 s[11,1]=0.1,s[11,2]=1.0,s[11,3]=0.9,s[11,4]=0.6,s[11,5]=-0.7,s[11,6]=0.6,s[11,7]=-1.2,s[11,8]=-1.0,s[11,9]=-1.0,s[11,10]=1.1,s[11,11]=-0.8,s[11,12]=-0.3,s[11,13]=0.7,s[11,14]=1.1,s[11,15]=1.0,s[11,16]=-1.2,s[11,17]=0.8,s[11,18]=-1.2 s[12,1]=-0.3,s[12,2]=-1.0,s[12,3]=1.2,s[12,4]=-1.2,s[12,5]=-0.9,s[12,6]=-0.3,s[12,7]=-0.3,s[12,8]=-1.0,s[12,9]=-0.5,s[12,10]=0.7,s[12,11]=-0.6,s[12,12]=-0.2,s[12,13]=-1.2,s[12,14]=1.0,s[12,15]=0.2,s[12,16]=-0.4,s[12,17]=0.8,s[12,18]=-1.1 s[13,1]=-0.1,s[13,2]=-0.9,s[13,3]=-0.8,s[13,4]=-1.0,s[13,5]=1.0,s[13,6]=-1.1,s[13,7]=1.1,s[13,8]=-1.0,s[13,9]=0.7,s[13,10]=-1.2,s[13,11]=0.8,s[13,12]=0.4,s[13,13]=-1.1,s[13,14]=-0.7,s[13,15]=-0.6,s[13,16]=-0.9,s[13,17]=-0.7,s[13,18]=-0.4 s[14,1]=-0.4,s[14,2]=1.1,s[14,3]=-0.6,s[14,4]=-0.1,s[14,5]=-0.9,s[14,6]=1.0,s[14,7]=1.2,s[14,8]=-1.0,s[14,9]=-0.3,s[14,10]=-0.4,s[14,11]=0.5,s[14,12]=-0.3,s[14,13]=-1.2,s[14,14]=-1.2,s[14,15]=-0.4,s[14,16]=-1.1,s[14,17]=0.4,s[14,18]=0.2 s[15,1]=-0.3,s[15,2]=-0.8,s[15,3]=-1.0,s[15,4]=-0.6,s[15,5]=0.1,s[15,6]=0.1,s[15,7]=0.3,s[15,8]=-0.8,s[15,9]=0.3,s[15,10]=0.1,s[15,11]=0.0,s[15,12]=-0.7,s[15,13]=1.2,s[15,14]=-1.2,s[15,15]=0.4,s[15,16]=-1.1,s[15,17]=1.2,s[15,18]=-0.2 s[16,1]=1.1,s[16,2]=-1.0,s[16,3]=1.2,s[16,4]=1.0,s[16,5]=-1.0,s[16,6]=0.8,s[16,7]=0.3,s[16,8]=0.8,s[16,9]=-1.1,s[16,10]=-0.4,s[16,11]=-1.2,s[16,12]=0.8,s[16,13]=-0.9,s[16,14]=-0.9,s[16,15]=1.2,s[16,16]=-0.9,s[16,17]=-1.0,s[16,18]=-1.1 s[17,1]=-0.3,s[17,2]=0.1,s[17,3]=-0.7,s[17,4]=-1.0,s[17,5]=0.0,s[17,6]=-0.1,s[17,7]=-1.0,s[17,8]=-1.2,s[17,9]=-0.3,s[17,10]=0.3,s[17,11]=1.2,s[17,12]=0.7,s[17,13]=-1.0,s[17,14]=-0.1,s[17,15]=-0.2,s[17,16]=-1.1,s[17,17]=-0.3,s[17,18]=-0.2 s[18,1]=0.4,s[18,2]=0.7,s[18,3]=-0.9,s[18,4]=0.9,s[18,5]=1.1,s[18,6]=0.3,s[18,7]=1.1,s[18,8]=-0.9,s[18,9]=0.4,s[18,10]=-1.2,s[18,11]=0.2,s[18,12]=1.1,s[18,13]=-1.0,s[18,14]=0.2,s[18,15]=1.1,s[18,16]=-1.1,s[18,17]=0.9,s[18,18]=-0.7 s[19,1]=0.3,s[19,2]=-1.2,s[19,3]=-1.0,s[19,4]=0.3,s[19,5]=-0.5,s[19,6]=-0.8,s[19,7]=-0.5,s[19,8]=0.8,s[19,9]=1.0,s[19,10]=-0.7,s[19,11]=0.9,s[19,12]=0.5,s[19,13]=-0.2,s[19,14]=0.4,s[19,15]=0.6,s[19,16]=1.2,s[19,17]=-1.2,s[19,18]=-0.7 s[20,1]=-0.5,s[20,2]=-1.2,s[20,3]=0.1,s[20,4]=-0.5,s[20,5]=-0.9,s[20,6]=0.4,s[20,7]=1.1,s[20,8]=-0.8,s[20,9]=-0.8,s[20,10]=0.8,s[20,11]=0.1,s[20,12]=-0.4,s[20,13]=0.8,s[20,14]=-1.2,s[20,15]=-0.5,s[20,16]=1.2,s[20,17]=1.0,s[20,18]=0.9 s[21,1]=-0.8,s[21,2]=1.2,s[21,3]=-0.8,s[21,4]=1.1,s[21,5]=0.2,s[21,6]=0.5,s[21,7]=0.5,s[21,8]=-1.1,s[21,9]=-0.8,s[21,10]=0.8,s[21,11]=0.2,s[21,12]=0.7,s[21,13]=0.7,s[21,14]=1.1,s[21,15]=0.9,s[21,16]=0.4,s[21,17]=0.2,s[21,18]=-0.4 s[22,1]=1.1,s[22,2]=-0.1,s[22,3]=-0.8,s[22,4]=0.4,s[22,5]=-0.2,s[22,6]=0.8,s[22,7]=-1.0,s[22,8]=-0.1,s[22,9]=-0.8,s[22,10]=-0.9,s[22,11]=1.2,s[22,12]=-0.6,s[22,13]=0.7,s[22,14]=0.4,s[22,15]=-0.2,s[22,16]=1.2,s[22,17]=-1.0,s[22,18]=0.9 s[23,1]=-0.8,s[23,2]=1.0,s[23,3]=-0.9,s[23,4]=0.7,s[23,5]=1.2,s[23,6]=0.7,s[23,7]=0.9,s[23,8]=-1.2,s[23,9]=-0.2,s[23,10]=1.0,s[23,11]=0.2,s[23,12]=-0.3,s[23,13]=-1.1,s[23,14]=-1.1,s[23,15]=1.0,s[23,16]=1.1,s[23,17]=0.5,s[23,18]=-1.1 s[24,1]=1.2,s[24,2]=-0.8,s[24,3]=1.1,s[24,4]=1.0,s[24,5]=-1.1,s[24,6]=-0.1,s[24,7]=0.4,s[24,8]=-1.2,s[24,9]=-1.2,s[24,10]=-0.7,s[24,11]=-0.8,s[24,12]=1.0,s[24,13]=1.1,s[24,14]=0.9,s[24,15]=0.4,s[24,16]=-1.2,s[24,17]=-0.2,s[24,18]=0.4 s[25,1]=-0.1,s[25,2]=-1.0,s[25,3]=-1.1,s[25,4]=-0.8,s[25,5]=-0.6,s[25,6]=-1.2,s[25,7]=0.6,s[25,8]=1.1,s[25,9]=0.9,s[25,10]=0.4,s[25,11]=1.0,s[25,12]=0.6,s[25,13]=1.1,s[25,14]=1.0,s[25,15]=0.5,s[25,16]=-1.1,s[25,17]=0.1,s[25,18]=0.7 s[26,1]=0.8,s[26,2]=-1.1,s[26,3]=0.5,s[26,4]=0.8,s[26,5]=0.0,s[26,6]=-0.6,s[26,7]=-0.3,s[26,8]=0.0,s[26,9]=-0.8,s[26,10]=0.7,s[26,11]=-0.9,s[26,12]=-0.3,s[26,13]=-0.7,s[26,14]=0.9,s[26,15]=-0.6,s[26,16]=-1.1,s[26,17]=1.2,s[26,18]=0.7 s[27,1]=0.2,s[27,2]=-0.4,s[27,3]=0.1,s[27,4]=-0.6,s[27,5]=0.4,s[27,6]=0.3,s[27,7]=-1.2,s[27,8]=-1.1,s[27,9]=0.0,s[27,10]=0.4,s[27,11]=1.0,s[27,12]=-0.4,s[27,13]=0.6,s[27,14]=0.5,s[27,15]=0.1,s[27,16]=-0.5,s[27,17]=-0.1,s[27,18]=-0.5 s[28,1]=-0.8,s[28,2]=0.0,s[28,3]=0.5,s[28,4]=-0.7,s[28,5]=0.5,s[28,6]=0.9,s[28,7]=-1.2,s[28,8]=-1.2,s[28,9]=1.1,s[28,10]=-0.7,s[28,11]=-1.2,s[28,12]=0.2,s[28,13]=-1.2,s[28,14]=0.7,s[28,15]=0.0,s[28,16]=1.1,s[28,17]=-0.5,s[28,18]=-1.2 s[29,1]=-0.7,s[29,2]=-0.4,s[29,3]=-0.5,s[29,4]=0.0,s[29,5]=-0.1,s[29,6]=-0.5,s[29,7]=1.1,s[29,8]=1.1,s[29,9]=0.6,s[29,10]=-0.2,s[29,11]=0.8,s[29,12]=-0.5,s[29,13]=-1.0,s[29,14]=-1.1,s[29,15]=0.0,s[29,16]=-0.2,s[29,17]=0.7,s[29,18]=1.0 s[30,1]=0.8,s[30,2]=1.1,s[30,3]=-1.2,s[30,4]=-1.1,s[30,5]=-0.4,s[30,6]=0.9,s[30,7]=1.0,s[30,8]=-0.7,s[30,9]=-0.4,s[30,10]=1.1,s[30,11]=0.8,s[30,12]=-0.9,s[30,13]=1.2,s[30,14]=1.2,s[30,15]=1.1,s[30,16]=0.8,s[30,17]=0.7,s[30,18]=0.4 s[31,1]=-0.9,s[31,2]=-0.1,s[31,3]=0.6,s[31,4]=-1.0,s[31,5]=0.5,s[31,6]=-0.8,s[31,7]=1.2,s[31,8]=1.1,s[31,9]=0.1,s[31,10]=1.2,s[31,11]=-0.6,s[31,12]=0.3,s[31,13]=-1.0,s[31,14]=0.5,s[31,15]=-0.5,s[31,16]=0.5,s[31,17]=-1.1,s[31,18]=0.0 s[32,1]=0.2,s[32,2]=0.2,s[32,3]=1.0,s[32,4]=0.1,s[32,5]=-0.4,s[32,6]=0.1,s[32,7]=-0.8,s[32,8]=-1.0,s[32,9]=-1.0,s[32,10]=0.8,s[32,11]=-0.1,s[32,12]=0.3,s[32,13]=1.1,s[32,14]=-1.0,s[32,15]=-0.8,s[32,16]=0.8,s[32,17]=-0.2,s[32,18]=-1.1 s[33,1]=-0.2,s[33,2]=-1.2,s[33,3]=-1.1,s[33,4]=-0.8,s[33,5]=-0.9,s[33,6]=0.9,s[33,7]=-1.1,s[33,8]=0.3,s[33,9]=0.5,s[33,10]=-1.1,s[33,11]=0.2,s[33,12]=-0.5,s[33,13]=-0.9,s[33,14]=0.8,s[33,15]=0.1,s[33,16]=1.2,s[33,17]=-0.8,s[33,18]=0.6 s[34,1]=-0.4,s[34,2]=0.0,s[34,3]=1.0,s[34,4]=1.1,s[34,5]=1.1,s[34,6]=-1.1,s[34,7]=0.3,s[34,8]=-0.4,s[34,9]=0.2,s[34,10]=-1.2,s[34,11]=-1.0,s[34,12]=-0.2,s[34,13]=-0.5,s[34,14]=0.6,s[34,15]=0.2,s[34,16]=-0.4,s[34,17]=-0.3,s[34,18]=-0.1 s[35,1]=0.9,s[35,2]=0.4,s[35,3]=-0.4,s[35,4]=0.9,s[35,5]=-0.7,s[35,6]=0.3,s[35,7]=1.1,s[35,8]=-1.1,s[35,9]=-1.1,s[35,10]=-0.6,s[35,11]=1.2,s[35,12]=0.2,s[35,13]=-1.2,s[35,14]=0.9,s[35,15]=1.1,s[35,16]=-0.1,s[35,17]=0.0,s[35,18]=0.2 s[36,1]=0.1,s[36,2]=-0.8,s[36,3]=0.2,s[36,4]=-0.9,s[36,5]=-0.3,s[36,6]=0.6,s[36,7]=1.1,s[36,8]=-1.0,s[36,9]=0.4,s[36,10]=0.6,s[36,11]=1.2,s[36,12]=-0.6,s[36,13]=0.0,s[36,14]=1.0,s[36,15]=0.3,s[36,16]=1.2,s[36,17]=-1.2,s[36,18]=0.8 s[37,1]=1.1,s[37,2]=-0.1,s[37,3]=0.2,s[37,4]=-0.7,s[37,5]=0.5,s[37,6]=0.5,s[37,7]=-1.2,s[37,8]=1.2,s[37,9]=-0.4,s[37,10]=0.8,s[37,11]=0.7,s[37,12]=0.7,s[37,13]=1.2,s[37,14]=0.9,s[37,15]=-0.9,s[37,16]=-0.4,s[37,17]=0.2,s[37,18]=0.5 s[38,1]=-1.1,s[38,2]=-0.3,s[38,3]=-0.9,s[38,4]=1.2,s[38,5]=-1.0,s[38,6]=-0.9,s[38,7]=0.1,s[38,8]=0.4,s[38,9]=0.1,s[38,10]=-1.2,s[38,11]=0.8,s[38,12]=0.9,s[38,13]=-0.8,s[38,14]=-1.2,s[38,15]=1.1,s[38,16]=0.0,s[38,17]=-0.6,s[38,18]=-0.8 s[39,1]=0.5,s[39,2]=1.1,s[39,3]=1.1,s[39,4]=0.9,s[39,5]=1.1,s[39,6]=-1.2,s[39,7]=-1.0,s[39,8]=-1.2,s[39,9]=-0.4,s[39,10]=-0.2,s[39,11]=-0.2,s[39,12]=0.2,s[39,13]=-1.0,s[39,14]=1.0,s[39,15]=0.7,s[39,16]=0.3,s[39,17]=-0.8,s[39,18]=0.6 s[40,1]=0.8,s[40,2]=-0.6,s[40,3]=-0.8,s[40,4]=1.0,s[40,5]=0.0,s[40,6]=-0.3,s[40,7]=1.0,s[40,8]=1.2,s[40,9]=0.3,s[40,10]=1.1,s[40,11]=1.1,s[40,12]=0.5,s[40,13]=-0.8,s[40,14]=-1.1,s[40,15]=-0.7,s[40,16]=-0.8,s[40,17]=0.2,s[40,18]=0.7 s[41,1]=1.1,s[41,2]=0.0,s[41,3]=0.4,s[41,4]=-1.1,s[41,5]=1.1,s[41,6]=0.5,s[41,7]=-1.2,s[41,8]=-1.2,s[41,9]=-0.1,s[41,10]=0.5,s[41,11]=-0.8,s[41,12]=0.6,s[41,13]=-1.2,s[41,14]=-1.2,s[41,15]=-1.1,s[41,16]=-1.2,s[41,17]=0.4,s[41,18]=1.1 s[42,1]=0.3,s[42,2]=1.1,s[42,3]=-0.9,s[42,4]=1.2,s[42,5]=-1.2,s[42,6]=0.8,s[42,7]=1.1,s[42,8]=-1.0,s[42,9]=-0.6,s[42,10]=-0.9,s[42,11]=0.3,s[42,12]=-1.0,s[42,13]=-1.1,s[42,14]=1.2,s[42,15]=0.3,s[42,16]=-1.0,s[42,17]=-0.6,s[42,18]=0.8 s[43,1]=-0.3,s[43,2]=-0.9,s[43,3]=-1.2,s[43,4]=-1.0,s[43,5]=-0.1,s[43,6]=-0.3,s[43,7]=0.3,s[43,8]=0.2,s[43,9]=-0.3,s[43,10]=0.4,s[43,11]=0.1,s[43,12]=-0.9,s[43,13]=1.0,s[43,14]=-1.2,s[43,15]=0.6,s[43,16]=-0.7,s[43,17]=0.9,s[43,18]=-0.9 s[44,1]=0.0,s[44,2]=-0.3,s[44,3]=-1.2,s[44,4]=0.5,s[44,5]=-1.2,s[44,6]=1.0,s[44,7]=1.1,s[44,8]=-0.6,s[44,9]=0.5,s[44,10]=-0.5,s[44,11]=0.5,s[44,12]=-0.4,s[44,13]=1.2,s[44,14]=0.8,s[44,15]=-1.1,s[44,16]=0.4,s[44,17]=0.9,s[44,18]=0.2 s[45,1]=0.8,s[45,2]=-0.6,s[45,3]=0.1,s[45,4]=-0.6,s[45,5]=-1.2,s[45,6]=-1.2,s[45,7]=-1.2,s[45,8]=1.0,s[45,9]=-1.2,s[45,10]=-0.6,s[45,11]=-1.2,s[45,12]=-0.7,s[45,13]=0.9,s[45,14]=-0.1,s[45,15]=-0.9,s[45,16]=-0.6,s[45,17]=-1.2,s[45,18]=0.4 s[46,1]=0.8,s[46,2]=0.3,s[46,3]=-1.2,s[46,4]=0.7,s[46,5]=-0.3,s[46,6]=-0.7,s[46,7]=0.7,s[46,8]=0.4,s[46,9]=0.3,s[46,10]=1.1,s[46,11]=0.5,s[46,12]=1.0,s[46,13]=-1.1,s[46,14]=-1.1,s[46,15]=-1.2,s[46,16]=1.1,s[46,17]=1.1,s[46,18]=0.1 s[47,1]=0.9,s[47,2]=-0.2,s[47,3]=-0.7,s[47,4]=0.4,s[47,5]=-0.5,s[47,6]=-0.2,s[47,7]=1.2,s[47,8]=1.0,s[47,9]=0.2,s[47,10]=0.6,s[47,11]=1.1,s[47,12]=1.1,s[47,13]=-0.5,s[47,14]=-0.5,s[47,15]=0.6,s[47,16]=0.2,s[47,17]=-0.1,s[47,18]=-1.2 s[48,1]=0.3,s[48,2]=0.4,s[48,3]=-1.0,s[48,4]=-0.6,s[48,5]=-1.2,s[48,6]=-0.1,s[48,7]=0.8,s[48,8]=-0.2,s[48,9]=0.4,s[48,10]=-0.5,s[48,11]=0.9,s[48,12]=-0.4,s[48,13]=-1.2,s[48,14]=1.1,s[48,15]=0.5,s[48,16]=0.9,s[48,17]=-1.0,s[48,18]=-0.6 s[49,1]=-0.6,s[49,2]=0.5,s[49,3]=-1.2,s[49,4]=1.1,s[49,5]=-1.2,s[49,6]=0.7,s[49,7]=-0.8,s[49,8]=-0.2,s[49,9]=-0.3,s[49,10]=0.5,s[49,11]=0.6,s[49,12]=-1.2,s[49,13]=-0.1,s[49,14]=-0.3,s[49,15]=0.1,s[49,16]=-1.1,s[49,17]=0.1,s[49,18]=0.2 s[50,1]=-0.5,s[50,2]=0.9,s[50,3]=-1.0,s[50,4]=-1.1,s[50,5]=1.0,s[50,6]=-1.0,s[50,7]=0.4,s[50,8]=-0.5,s[50,9]=0.2,s[50,10]=-0.8,s[50,11]=0.9,s[50,12]=-0.9,s[50,13]=-1.2,s[50,14]=-1.2,s[50,15]=-0.9,s[50,16]=0.1,s[50,17]=-0.9,s[50,18]=0.6 s[51,1]=-0.9,s[51,2]=0.7,s[51,3]=-0.5,s[51,4]=1.2,s[51,5]=0.9,s[51,6]=-0.9,s[51,7]=0.4,s[51,8]=-0.2,s[51,9]=-0.2,s[51,10]=-0.5,s[51,11]=0.3,s[51,12]=1.2,s[51,13]=1.2,s[51,14]=1.2,s[51,15]=0.2,s[51,16]=0.4,s[51,17]=-1.2,s[51,18]=0.9 s[52,1]=0.8,s[52,2]=-0.1,s[52,3]=-0.9,s[52,4]=-1.1,s[52,5]=-0.8,s[52,6]=1.0,s[52,7]=1.0,s[52,8]=0.6,s[52,9]=-1.2,s[52,10]=-1.1,s[52,11]=1.2,s[52,12]=-1.1,s[52,13]=-0.4,s[52,14]=-0.7,s[52,15]=-1.1,s[52,16]=1.2,s[52,17]=1.0,s[52,18]=0.6 s[53,1]=-1.2,s[53,2]=1.0,s[53,3]=-0.6,s[53,4]=-0.8,s[53,5]=0.1,s[53,6]=0.1,s[53,7]=1.2,s[53,8]=-1.2,s[53,9]=-0.3,s[53,10]=-0.8,s[53,11]=1.1,s[53,12]=-0.8,s[53,13]=0.5,s[53,14]=0.3,s[53,15]=-0.9,s[53,16]=1.2,s[53,17]=0.5,s[53,18]=-0.2 s[54,1]=0.9,s[54,2]=-0.3,s[54,3]=0.3,s[54,4]=1.1,s[54,5]=1.1,s[54,6]=0.7,s[54,7]=-1.2,s[54,8]=-1.0,s[54,9]=-0.9,s[54,10]=-0.2,s[54,11]=-0.2,s[54,12]=-1.1,s[54,13]=-1.2,s[54,14]=0.6,s[54,15]=-0.2,s[54,16]=0.1,s[54,17]=0.0,s[54,18]=0.8 s[55,1]=-1.2,s[55,2]=-1.2,s[55,3]=1.1,s[55,4]=-0.8,s[55,5]=1.2,s[55,6]=-0.3,s[55,7]=-1.2,s[55,8]=-1.2,s[55,9]=0.6,s[55,10]=-0.9,s[55,11]=-0.7,s[55,12]=-0.1,s[55,13]=-0.6,s[55,14]=-0.3,s[55,15]=0.7,s[55,16]=-1.1,s[55,17]=1.1,s[55,18]=-0.2 s[56,1]=-1.2,s[56,2]=0.1,s[56,3]=-1.2,s[56,4]=0.6,s[56,5]=1.0,s[56,6]=-1.0,s[56,7]=-1.1,s[56,8]=1.0,s[56,9]=0.4,s[56,10]=-0.6,s[56,11]=0.1,s[56,12]=-0.7,s[56,13]=-1.1,s[56,14]=-1.1,s[56,15]=0.0,s[56,16]=-0.7,s[56,17]=-0.3,s[56,18]=0.4 s[57,1]=1.0,s[57,2]=1.2,s[57,3]=1.1,s[57,4]=-1.1,s[57,5]=-0.3,s[57,6]=-1.0,s[57,7]=-1.0,s[57,8]=-0.6,s[57,9]=-0.7,s[57,10]=1.2,s[57,11]=-0.3,s[57,12]=0.4,s[57,13]=-1.1,s[57,14]=-0.4,s[57,15]=-1.2,s[57,16]=-1.0,s[57,17]=1.2,s[57,18]=0.7 s[58,1]=0.5,s[58,2]=-0.4,s[58,3]=1.0,s[58,4]=1.1,s[58,5]=1.2,s[58,6]=-1.1,s[58,7]=0.9,s[58,8]=0.4,s[58,9]=0.0,s[58,10]=-1.0,s[58,11]=-0.7,s[58,12]=-0.1,s[58,13]=1.2,s[58,14]=-1.2,s[58,15]=-1.2,s[58,16]=-0.7,s[58,17]=-0.6,s[58,18]=0.8 s[59,1]=0.3,s[59,2]=-1.1,s[59,3]=-1.2,s[59,4]=1.1,s[59,5]=0.8,s[59,6]=-0.2,s[59,7]=0.6,s[59,8]=0.9,s[59,9]=1.2,s[59,10]=-0.1,s[59,11]=1.2,s[59,12]=1.0,s[59,13]=0.9,s[59,14]=1.2,s[59,15]=0.3,s[59,16]=0.3,s[59,17]=1.1,s[59,18]=-0.5 s[60,1]=-0.5,s[60,2]=-0.6,s[60,3]=0.1,s[60,4]=-1.2,s[60,5]=0.8,s[60,6]=-1.1,s[60,7]=0.7,s[60,8]=1.0,s[60,9]=-0.5,s[60,10]=0.8,s[60,11]=-1.1,s[60,12]=-1.0,s[60,13]=0.1,s[60,14]=0.3,s[60,15]=0.6,s[60,16]=-1.1,s[60,17]=0.1,s[60,18]=0.5 ; ; initialize coefficients ; if @sel > 0 b1 = s[@sel,1] b2 = s[@sel,2] b3 = s[@sel,3] b4 = s[@sel,4] b5 = s[@sel,5] b6 = s[@sel,6] b7 = s[@sel,7] b8 = s[@sel,8] b9 = s[@sel,9] b10 = s[@sel,10] b11 = s[@sel,11] b12 = s[@sel,12] b13 = s[@sel,13] b14 = s[@sel,14] b15 = s[@sel,15] b16 = s[@sel,16] b17 = s[@sel,17] b18 = s[@sel,18] endif ; ; fill the hit array ; while (iter < (iterate*sqr(#width*#magn/400))) xx = fx yy = fy zz = fz if @sel == 0 fx = @a1 + @a2*fx + @a3*fy + @a4*sin(@a5*fx + @a6) + @a7*sin(@a8*fy + @a9) fy = @a10 + @a11*xx + @a12*fy + @a13*sin(@a14*xx + @a15) + @a16*sin(@a17*fy + @a18) fz = sqrt(xx*xx + yy*yy) ww = zz*iter/ (iterate*sqr(#width*#magn/400)) else fx = b1 + b2*fx + b3*fy + b4*sin(b5*fx + b6) + b7*sin(b8*fy + b9) fy = b10 + b11*xx + b12*fy + b13*sin(b14*xx + b15) + b16*sin(b17*fy + b18) fz = sqrt(xx*xx + yy*yy) ww = zz*iter / (iterate*sqr(#width*#magn/400)) endif ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax ffz = (zmin-fz)/sqrt(txmax^2+tymax^2) ffw = (wmin-ww)/sqrt(txmax^2+tymax^2) ; rotation in the XW Plane xx = ffx ffx = (0.5 - (ffw - 0.5 - @rotoffw/twmax)*sin(@xwangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@xwangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@xwangle*pi/180) + \ (xx - 0.5 - @rotoffw/twmax)*sin(@xwangle*pi/180)) ; rotation in the YW Plane yy = ffy ffy = (0.5 + (ffw - 0.5 - @rotoffw/txmax)*sin(@ywangle*pi/180) + \ (ffy - 0.5 - @rotoffy/tymax)*cos(@ywangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@ywangle*pi/180) - \ (yy - 0.5 - @rotoffw/twmax)*sin(@ywangle*pi/180)) ; rotation in the ZW Plane zz = ffz ffz = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*sin(@zwangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@zwangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@zwangle*pi/180) - \ (zz - 0.5 - @rotoffw/twmax)*sin(@zwangle*pi/180)) ; rotation in the XY Plane (from the Location TAB) ; xx = ffx ffx = 0.5 + (ffx - 0.5 - @rotoffx/txmax)*cos(#angle) - \ (ffy - 0.5 - @rotoffy/tymax)*sin(#angle)*#height/#width ffy = 0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(#angle) + \ (xx - 0.5 - @rotoffx/txmax)*sin(#angle)*#width/#height ; ; rotation in the XZ Plane ; xx = ffx ffx = (0.5 + (ffz - 0.5 - @rotoffz/txmax)*sin(@zangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@zangle*pi/180))*#width ffz = (0.5 + (ffz - 0.5 - @rotoffz/tzmax)*cos(@zangle*pi/180) - \ (xx - 0.5 - @rotoffx/txmax)*sin(@zangle*pi/180)) ; ; rotation in the YZ plane ; yy = ffy ffy = (0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(@xangle*pi/180) - \ (ffz - 0.5 - @rotoffz/tzmax)*sin(@xangle*pi/180))*#height if @oldver ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*#height/2 else ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*scrsize endif ; ; final translation ; ffx = ffx - @transx*#width ffy = ffy - @transy*#height if @oldver ffz = ffz - @transz*#height/2 else ffz = ffz - @transz*scrsize endif ; ; perspective application ; if @oldver if @useproj ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif else if @useprojn ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif endif px = trunc(ffx)+wd2 py = trunc(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+1+flip(ffz) if real(hits[px,py])>maxnhit maxnhit = real(hits[px,py]) endif if ffz > hits3[px,py] || hits3[px,py] == 0 hits3[px,py] = ffz endif hits2[px,py] = ffz endif iter = iter + 1 endwhile h = 0 w = 0 ; init: float nhit=0 float zave=0 float zlast=0 float zbiggest=0 float nhitx=0 float zavex=0 float zlastx=0 float zbiggestx=0 float nhity=0 float zavey=0 float zlasty=0 float zbiggesty=0 bool done = false float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 int i = 0 ;loop: int delta = ceil(@closeness) int xcrd = #x int ycrd = #y bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true if xcrd+@closeness < #width+wd && ycrd+@closeness < #height+ht && real(hits[xcrd,ycrd]) > @thresh if @filter == 0 if @value == 3 zbiggest = hits3[xcrd,ycrd] zbiggestx = hits3[xcrd+delta,ycrd] zbiggesty = hits3[xcrd,ycrd+delta] elseif @value == 0 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) elseif @value == 1 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) zave = imag(hits[xcrd,ycrd])/(nhit + 1) zavex = imag(hits[xcrd+delta,ycrd])/(nhitx + 1) zavey = imag(hits[xcrd,ycrd+delta])/(nhity + 1) elseif @value == 2 zlast = hits2[xcrd,ycrd] zlastx = hits2[xcrd+delta,ycrd] zlasty = hits2[xcrd,ycrd+delta] endif else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 zbiggest = 0 zbiggestx = 0 zbiggesty = 0 zave = 0 zavex = 0 zavey = 0 zlast = 0 zlastx = 0 zlasty = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter if @value == 0 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) elseif @value == 1 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) zave = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy])/(nhit+1) zavex = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx+delta,ycrd+gy])/(nhitx+1) zavey = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta])/(nhity+1) elseif @value == 2 zlast = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy] zlastx = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx+delta,ycrd+gy] zlasty = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy+delta] elseif @value == 3 zbiggest = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy] zbiggestx = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx+delta,ycrd+gy] zbiggesty = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy+delta] endif gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile if @value == 0 nhit = nhit/gweight nhitx = nhitx/gweight nhity = nhity/gweight elseif @value == 1 zave = zave/gweight zavex = zavex/gweight zavey = zavey/gweight elseif @value == 2 zlast = zlast/gweight zlastx = zlastx/gweight zlasty = zlasty/gweight elseif @value == 3 zbiggest = zbiggest/gweight zbiggestx = zbiggestx/gweight zbiggesty = zbiggesty/gweight endif endif endif endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = zave cenx = zavex ceny = zavey elseif @value == 2 cen = zlast cenx = zlastx ceny = zlasty else cen = zbiggest cenx = zbiggestx ceny = zbiggesty endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * zscale2 e2 = e2 * zscale2 e3 = e3 * zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxnhit elseif @value == 1 #z = (zave/(log(maxnhit)+1))^3 elseif @value == 2 #z = (zlast/(log(maxnhit)+1))^10 elseif @value == 3 #z = (zbiggest/(log(maxnhit)+1))^10 endif endif if @oldver if done == false done = true endif endif loop: i = i + 1 if !@oldver if cen < i if done == false done = true endif endif endif bailout: done == false default: heading caption="Sprott 4D Special Map #1 G Attractors" endheading $ifdef VER40 heading text=" x -> Sin series in x and y" endheading heading text=" y -> Sin series in x and y" endheading heading text=" z -> sqrt(x*x+y*y)" endheading heading text=" w -> Proportional to iterations" endheading heading text="Color with Damien's Lighting, 3D Texturizer Enhanced III or \ Direct Color Slope." endheading $else heading caption="x -> Sin series in x and y" endheading heading caption="y -> Sin series in x and y" endheading heading caption="z -> sqrt(x*x+y*y)" endheading heading caption="w -> Proportional to iterations" endheading heading caption="Color with Damien's Lighting" endheading heading caption="or one of the 3D Texturizer formulas" endheading heading caption="3D Texturizer III is needed for" endheading heading caption="the non-slope color options." endheading $endif title="Slope 4D Special Map #1 G Attractor" maxiter=1000 method=multipass periodicity=0 magn=0.3 float param version caption = "Version number" default = 1.1 hint = "This is for backwards compatibility with old versions \ of the formula." visible = false endparam bool param oldver caption = "Use original version" default = false endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 0.1 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 0 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param value caption = "Hit Value" enum = "Count" "Ave Z" "Last Z" "Largest Z" default = 3 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param pass caption = "Pass slope values" default = true endparam heading caption = "Slope Parameters" visible=@pass==true endheading param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 1.0 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible=@pass==true endparam heading caption = "Rotations and Translations" endheading $ifdef VER40 heading text = "Use the location tab XY Plane Rotation." endheading $endif param xangle caption = "YZ Plane Rotation" default = 0.0 hint = "This is equivalent of a X Axis rotation in 3 Dimensions. \ It is performed after the normal fractal rotation(s) \ (XY Plane Rotation) and zooms." endparam param zangle caption = "XZ Plane Rotation" default = 0.0 hint = "This is equivalent of a Y Axis rotation in 3 Dimensions. \ It is performed after the normal fractal rotation(s) \ (XY Plane Rotation) and zooms." endparam param xwangle caption = "XW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param ywangle caption = "YW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param zwangle caption = "ZW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param rotoffx caption = "Rotation Center X Offset" default = 0.0 endparam param rotoffy caption = "Rotation Center Y Offset" default = 0.0 endparam param rotoffz caption = "Rotation Center Z Offset" default = 0.0 endparam param rotoffw caption = "Rotation Center W Offset" default = 0.0 endparam param transx caption = "X Final Translation" default = 0.0 endparam param transy caption = "Y Final Translation" default = 0.0 endparam param transz caption = "Z Final Translation" default = 0.0 endparam heading caption = "Perspective" endheading param useproj caption = "Use Perspective" default = false visible = @oldver endparam param useprojn caption = "Use Perspective" default = true visible = !@oldver endparam param cprojx caption = "X Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam param cprojy caption = "Y Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam float param cprojz caption = "Z Center of Projection" default = -1 visible = @useproj || @useprojn endparam heading caption = "Attractor Parameters" endheading param hideparam caption = "Hide Parameters" default = true endparam param sel caption = "select preset coeffs" enum = "no preset" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" \ "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" \ "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" \ "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" \ "41" "42" "43" "44" "45" "46" "47" "48" "49" "50" \ "51" "52" "53" "54" "55" "56" "57" "58" "59" "60" default = 0 endparam param a1 caption = "coefficient a1" default = 0.8 visible=@hideparam==false endparam param a2 caption = "coefficient a2" default = 0.5 visible=@hideparam==false endparam param a3 caption = "coefficient a3" default = -1.2 visible=@hideparam==false endparam param a4 caption = "coefficient a4" default = -0.8 visible=@hideparam==false endparam param a5 caption = "coefficient a5" default = 0.8 visible=@hideparam==false endparam param a6 caption = "coefficient a6" default = -0.5 visible=@hideparam==false endparam param a7 caption = "coefficient a7" default = 0.1 visible=@hideparam==false endparam param a8 caption = "coefficient a8" default = 0.0 visible=@hideparam==false endparam param a9 caption = "coefficient a9" default = -0.7 visible=@hideparam==false endparam param a10 caption = "coefficient a10" default = -0.6 visible=@hideparam==false endparam param a11 caption = "coefficient a11" default = 0.8 visible=@hideparam==false endparam param a12 caption = "coefficient a12" default = -0.1 visible=@hideparam==false endparam param a13 caption = "coefficient a13" default = -1.2 visible=@hideparam==false endparam param a14 caption = "coefficient a14" default = -0.8 visible=@hideparam==false endparam param a15 caption = "coefficient a15" default = -0.7 visible=@hideparam==false endparam param a16 caption = "coefficient a16" default = -0.9 visible=@hideparam==false endparam param a17 caption = "coefficient a17" default = -1.2 visible=@hideparam==false endparam param a18 caption = "coefficient a18" default = -1.1 visible=@hideparam==false endparam } Slope_4D_Special_Map_#Y_G_Attractor { ; Ron Barnett June 10, 2010 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III; ; $define debug global: float zscale2 = 0 float cprojx = 0 float cprojy = 0 float cprojz = 0 float scrsize = sqrt(#width*#width+#height*#height) if !@oldver zscale2 = @zscale2*scrsize cprojx = @cprojx*#width cprojy = @cprojy*#height cprojz = @cprojz*scrsize else zscale2 = @zscale2 cprojx = @cprojx cprojy = @cprojy cprojz = @cprojz endif int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits2[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits3[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float s[61,11] float fx = 0.0 float ffx = 0.0 float xx = 0.0 float fy = 0.0 float ffy = 0.0 float yy = 0.0 float zz = 0.0 float fz = 0.0 float ffz = 0.0 float ww = 0.0 float ffw = 0.0 float b1 = 0 float b2 = 0 float b3 = 0 float b4 = 0 float b5 = 0 float b6 = 0 float b7 = 0 float b8 = 0 float b9 = 0 float b10 = 0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float tzmax = sqrt(txmax^2+tymax^2) float twmax = sqrt(txmax^2+tymax^2) float xmin = cx - txmax/2 float ymin = cy - tymax/2 float zmin = sqrt(xmin^2 + ymin^2) float wmin = sqrt(xmin^2 + ymin^2) float iterate = @density*10000000 float maxnhit = 0 ; ; initialize hit array ; while(h < #height+wd) while(w < #width+ht) hits[w,h] = 0 hits2[w,h] = 0 hits3[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; initialize presets ; s[1,1]=-0.6,s[1,2]=-0.8,s[1,3]=-0.9,s[1,4]=+0.9,s[1,5]=+0.6,s[1,6]=-0.4,s[1,7]=+0.1,s[1,8]=+0.9,s[1,9]=+0.6,s[1,10]=-0.9 s[2,1]=+0.2,s[2,2]=-0.1,s[2,3]=+0.5,s[2,4]=+0.3,s[2,5]=+1.1,s[2,6]=+0.6,s[2,7]=-0.3,s[2,8]=-0.2,s[2,9]=-0.6,s[2,10]=+1.0 s[3,1]=-0.1,s[3,2]=+0.2,s[3,3]=+1.0,s[3,4]=-0.5,s[3,5]=+0.3,s[3,6]=-0.7,s[3,7]=-0.2,s[3,8]=+1.0,s[3,9]=+0.5,s[3,10]=-0.8 s[4,1]=+1.1,s[4,2]=+0.2,s[4,3]=+0.6,s[4,4]=-0.3,s[4,5]=-1.1,s[4,6]=-0.5,s[4,7]=-0.7,s[4,8]=-0.5,s[4,9]=-1.2,s[4,10]=+0.5 s[5,1]=-0.6,s[5,2]=-0.2,s[5,3]=-0.5,s[5,4]=+0.6,s[5,5]=+1.2,s[5,6]=+0.4,s[5,7]=+1.0,s[5,8]=-0.9,s[5,9]=+0.3,s[5,10]=-1.0 s[6,1]=-1.2,s[6,2]=-0.2,s[6,3]=-0.9,s[6,4]=+0.8,s[6,5]=-0.9,s[6,6]=+1.1,s[6,7]=-0.2,s[6,8]=+0.4,s[6,9]=-1.0,s[6,10]=-0.2 s[7,1]=+1.0,s[7,2]=-0.8,s[7,3]=+0.0,s[7,4]=-0.8,s[7,5]=+0.7,s[7,6]=+0.6,s[7,7]=+0.8,s[7,8]=-0.7,s[7,9]=-1.0,s[7,10]=-1.2 s[8,1]=+0.4,s[8,2]=+0.2,s[8,3]=+0.1,s[8,4]=+1.2,s[8,5]=-0.7,s[8,6]=-0.4,s[8,7]=+1.0,s[8,8]=+0.0,s[8,9]=+0.3,s[8,10]=+1.0 s[9,1]=-0.9,s[9,2]=+0.9,s[9,3]=+0.3,s[9,4]=+1.2,s[9,5]=+0.7,s[9,6]=+0.0,s[9,7]=-0.9,s[9,8]=-1.0,s[9,9]=+0.5,s[9,10]=-0.1 s[10,1]=-0.1,s[10,2]=+0.2,s[10,3]=+1.2,s[10,4]=-1.0,s[10,5]=-0.2,s[10,6]=+0.0,s[10,7]=-0.5,s[10,8]=+0.8,s[10,9]=+0.7,s[10,10]=-0.4 s[11,1]=+0.0,s[11,2]=+0.1,s[11,3]=+1.0,s[11,4]=-1.0,s[11,5]=+0.1,s[11,6]=+0.6,s[11,7]=+0.2,s[11,8]=-0.5,s[11,9]=-1.0,s[11,10]=+0.0 s[12,1]=-0.7,s[12,2]=-0.6,s[12,3]=+0.6,s[12,4]=+1.0,s[12,5]=+0.5,s[12,6]=+0.5,s[12,7]=-0.2,s[12,8]=+0.6,s[12,9]=-0.9,s[12,10]=+0.6 s[13,1]=-1.0,s[13,2]=-0.3,s[13,3]=-0.8,s[13,4]=-1.0,s[13,5]=+0.5,s[13,6]=+0.9,s[13,7]=-0.7,s[13,8]=-0.4,s[13,9]=-1.2,s[13,10]=-1.2 s[14,1]=+0.1,s[14,2]=-1.0,s[14,3]=+0.1,s[14,4]=-1.1,s[14,5]=+0.8,s[14,6]=-0.4,s[14,7]=-0.9,s[14,8]=-0.8,s[14,9]=+0.5,s[14,10]=+0.7 s[15,1]=+0.1,s[15,2]=-0.8,s[15,3]=-0.2,s[15,4]=-0.6,s[15,5]=-0.7,s[15,6]=-0.2,s[15,7]=-1.1,s[15,8]=-0.5,s[15,9]=-0.9,s[15,10]=+0.9 s[16,1]=+0.5,s[16,2]=+0.9,s[16,3]=-0.9,s[16,4]=-0.3,s[16,5]=+1.2,s[16,6]=-0.4,s[16,7]=-0.6,s[16,8]=-0.1,s[16,9]=+1.0,s[16,10]=-1.2 s[17,1]=-0.3,s[17,2]=-0.4,s[17,3]=-0.5,s[17,4]=+1.0,s[17,5]=+0.8,s[17,6]=+0.5,s[17,7]=-1.2,s[17,8]=-0.1,s[17,9]=+0.4,s[17,10]=-1.0 s[18,1]=-0.6,s[18,2]=+0.9,s[18,3]=+0.5,s[18,4]=-1.1,s[18,5]=+0.6,s[18,6]=-0.3,s[18,7]=-0.2,s[18,8]=-0.3,s[18,9]=+1.0,s[18,10]=+0.6 s[19,1]=+0.6,s[19,2]=-0.6,s[19,3]=+0.6,s[19,4]=-1.0,s[19,5]=-1.0,s[19,6]=-0.9,s[19,7]=-1.2,s[19,8]=-0.7,s[19,9]=+0.3,s[19,10]=-0.5 ; ; initialize coefficients ; if @sel > 0 b1 = s[@sel,1] b2 = s[@sel,2] b3 = s[@sel,3] b4 = s[@sel,4] b5 = s[@sel,5] b6 = s[@sel,6] b7 = s[@sel,7] b8 = s[@sel,8] b9 = s[@sel,9] b10 = s[@sel,10] endif ; ; fill the hit array ; float xsum = 0 float ysum = 0 float zsum = 0 float wsum = 0 float loopiter = 0 while (iter < (iterate*sqr(#width*#magn/400))) xx = fx yy = fy zz = fz if @sel == 0 fx = @a1 + @a2*fx + @a3*fy + @a4*abs(fx) + @a5*abs(fy) fy = @a6 + @a7*xx + @a8*fy + @a9*abs(xx) + @a10*abs(fy) fz = sqrt(xx*xx + yy*yy) ww = zz*iter/ (iterate*sqr(#width*#magn/400)) else fx = b1 + b2*fx + b3*fy + b4*abs(fx) + b5*abs(fy) fy = b6 + b7*xx + b8*fy + b9*abs(xx) + b10*abs(fy) fz = sqrt(xx*xx + yy*yy) ww = zz*iter / (iterate*sqr(#width*#magn/400)) endif xsum = xsum + fx ysum = ysum + fy zsum = zsum + fz wsum = wsum + ww loopiter = loopiter + 1 ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax ffz = (zmin-fz)/sqrt(txmax^2+tymax^2) ffw = (wmin-ww)/sqrt(txmax^2+tymax^2) ; rotation in the XW Plane xx = ffx ffx = (0.5 - (ffw - 0.5 - @rotoffw/twmax)*sin(@xwangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@xwangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@xwangle*pi/180) + \ (xx - 0.5 - @rotoffw/twmax)*sin(@xwangle*pi/180)) ; rotation in the YW Plane yy = ffy ffy = (0.5 + (ffw - 0.5 - @rotoffw/txmax)*sin(@ywangle*pi/180) + \ (ffy - 0.5 - @rotoffy/tymax)*cos(@ywangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@ywangle*pi/180) - \ (yy - 0.5 - @rotoffw/twmax)*sin(@ywangle*pi/180)) ; rotation in the ZW Plane zz = ffz ffz = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*sin(@zwangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@zwangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@zwangle*pi/180) - \ (zz - 0.5 - @rotoffw/twmax)*sin(@zwangle*pi/180)) ; rotation in the XY Plane (from the Location TAB) ; xx = ffx ffx = 0.5 + (ffx - 0.5 - @rotoffx/txmax)*cos(#angle) - \ (ffy - 0.5 - @rotoffy/tymax)*sin(#angle)*#height/#width ffy = 0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(#angle) + \ (xx - 0.5 - @rotoffx/txmax)*sin(#angle)*#width/#height ; ; rotation in the XZ Plane ; xx = ffx ffx = (0.5 + (ffz - 0.5 - @rotoffz/txmax)*sin(@zangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@zangle*pi/180))*#width ffz = (0.5 + (ffz - 0.5 - @rotoffz/tzmax)*cos(@zangle*pi/180) - \ (xx - 0.5 - @rotoffx/txmax)*sin(@zangle*pi/180)) ; ; rotation in the YZ plane ; yy = ffy ffy = (0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(@xangle*pi/180) - \ (ffz - 0.5 - @rotoffz/tzmax)*sin(@xangle*pi/180))*#height if @oldver ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*#height/2 else ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*scrsize endif ; ; final translation ; ffx = ffx - @transx*#width ffy = ffy - @transy*#height if @oldver ffz = ffz - @transz*#height/2 else ffz = ffz - @transz*scrsize endif ; ; perspective application ; if @oldver if @useproj ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif else if @useprojn ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif endif px = trunc(ffx)+wd2 py = trunc(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+1+flip(ffz) if real(hits[px,py])>maxnhit maxnhit = real(hits[px,py]) endif if ffz > hits3[px,py] || hits3[px,py] == 0 hits3[px,py] = ffz endif hits2[px,py] = ffz endif iter = iter + 1 endwhile xsum = xsum/loopiter ysum = ysum/loopiter zsum = zsum/loopiter wsum = wsum/loopiter ffx = xsum - xmin ffy = ysum - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax ffz = (zmin-zsum)/sqrt(txmax^2+tymax^2) ffw = (wmin-wsum)/sqrt(txmax^2+tymax^2) ; rotation in the XW Plane xx = ffx ffx = (0.5 - (ffw - 0.5 - @rotoffw/twmax)*sin(@xwangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@xwangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@xwangle*pi/180) + \ (xx - 0.5 - @rotoffw/twmax)*sin(@xwangle*pi/180)) ; rotation in the YW Plane yy = ffy ffy = (0.5 + (ffw - 0.5 - @rotoffw/txmax)*sin(@ywangle*pi/180) + \ (ffy - 0.5 - @rotoffy/tymax)*cos(@ywangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@ywangle*pi/180) - \ (yy - 0.5 - @rotoffw/twmax)*sin(@ywangle*pi/180)) ; rotation in the ZW Plane zz = ffz ffz = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*sin(@zwangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@zwangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@zwangle*pi/180) - \ (zz - 0.5 - @rotoffw/twmax)*sin(@zwangle*pi/180)) ; rotation in the XY Plane (from the Location TAB) ; xx = ffx ffx = 0.5 + (ffx - 0.5 - @rotoffx/txmax)*cos(#angle) - \ (ffy - 0.5 - @rotoffy/tymax)*sin(#angle)*#height/#width ffy = 0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(#angle) + \ (xx - 0.5 - @rotoffx/txmax)*sin(#angle)*#width/#height ; ; rotation in the XZ Plane ; xx = ffx ffx = (0.5 + (ffz - 0.5 - @rotoffz/txmax)*sin(@zangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@zangle*pi/180))*#width ffz = (0.5 + (ffz - 0.5 - @rotoffz/tzmax)*cos(@zangle*pi/180) - \ (xx - 0.5 - @rotoffx/txmax)*sin(@zangle*pi/180)) ; ; rotation in the YZ plane ; yy = ffy ffy = (0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(@xangle*pi/180) - \ (ffz - 0.5 - @rotoffz/tzmax)*sin(@xangle*pi/180))*#height if @oldver ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*#height/2 else ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*scrsize endif ; ; final translation ; ffx = ffx - @transx*#width ffy = ffy - @transy*#height if @oldver ffz = ffz - @transz*#height/2 else ffz = ffz - @transz*scrsize endif ; ; perspective application ; if @oldver if @useproj ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif else if @useprojn ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif endif int cpx = trunc(ffx) int cpy = trunc(ffy) h = 0 w = 0 ; init: float nhit=0 float zave=0 float zlast=0 float zbiggest=0 float nhitx=0 float zavex=0 float zlastx=0 float zbiggestx=0 float nhity=0 float zavey=0 float zlasty=0 float zbiggesty=0 bool done = false float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 int i = 0 ;loop: int delta = ceil(@closeness) ; int xcrd = #x ; int ycrd = #y int xcrd = #x+trunc(cpx-#width/2) int ycrd = #y+trunc(cpy-#height/2) bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan)))+trunc(cpx-#width/2) ycrd = round((transy + (dxx*sinan - dyy*cosan)))+trunc(cpy-#height/2) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true if xcrd+@closeness < #width+wd && ycrd+@closeness < #height+ht && real(hits[xcrd,ycrd]) > @thresh if @filter == 0 if @value == 3 zbiggest = hits3[xcrd,ycrd] zbiggestx = hits3[xcrd+delta,ycrd] zbiggesty = hits3[xcrd,ycrd+delta] elseif @value == 0 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) elseif @value == 1 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) zave = imag(hits[xcrd,ycrd])/(nhit + 1) zavex = imag(hits[xcrd+delta,ycrd])/(nhitx + 1) zavey = imag(hits[xcrd,ycrd+delta])/(nhity + 1) elseif @value == 2 zlast = hits2[xcrd,ycrd] zlastx = hits2[xcrd+delta,ycrd] zlasty = hits2[xcrd,ycrd+delta] endif else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 zbiggest = 0 zbiggestx = 0 zbiggesty = 0 zave = 0 zavex = 0 zavey = 0 zlast = 0 zlastx = 0 zlasty = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter if @value == 0 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) elseif @value == 1 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) zave = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy])/(nhit+1) zavex = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx+delta,ycrd+gy])/(nhitx+1) zavey = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta])/(nhity+1) elseif @value == 2 zlast = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy] zlastx = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx+delta,ycrd+gy] zlasty = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy+delta] elseif @value == 3 zbiggest = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy] zbiggestx = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx+delta,ycrd+gy] zbiggesty = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy+delta] endif gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile if @value == 0 nhit = nhit/gweight nhitx = nhitx/gweight nhity = nhity/gweight elseif @value == 1 zave = zave/gweight zavex = zavex/gweight zavey = zavey/gweight elseif @value == 2 zlast = zlast/gweight zlastx = zlastx/gweight zlasty = zlasty/gweight elseif @value == 3 zbiggest = zbiggest/gweight zbiggestx = zbiggestx/gweight zbiggesty = zbiggesty/gweight endif endif endif endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = zave cenx = zavex ceny = zavey elseif @value == 2 cen = zlast cenx = zlastx ceny = zlasty else cen = zbiggest cenx = zbiggestx ceny = zbiggesty endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * zscale2 e2 = e2 * zscale2 e3 = e3 * zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxnhit elseif @value == 1 #z = (zave/(log(maxnhit)+1))^3 elseif @value == 2 #z = (zlast/(log(maxnhit)+1))^10 elseif @value == 3 #z = (zbiggest/(log(maxnhit)+1))^10 endif endif if @oldver if done == false done = true endif endif loop: i = i + 1 if !@oldver if cen < i if done == false done = true endif endif endif bailout: done == false default: heading caption="Sprott 4D Special Map Y G Attractors" endheading $ifdef VER40 heading text=" x -> a + b*x + c*y + d*abs(x) + f*abs(y)" endheading heading text=" x -> g + h*x + i*y + j*abs(x) + k*abs(y)" endheading heading text=" z -> sqrt(x*x+y*y)" endheading heading text=" w -> Proportional to iterations" endheading heading text="Color with Damien's Lighting, 3D Texturizer Enhanced III or \ Direct Color Slope." endheading $else heading caption="x -> a + b*x + c*y + d*abs(x) + f*abs(y)" endheading heading caption="y -> x -> g + h*x + i*y + j*abs(x) + k*abs(y)" endheading heading caption="z -> sqrt(x*x+y*y)" endheading heading caption="w -> Proportional to iterations" endheading heading caption="Color with Damien's Lighting" endheading heading caption="or one of the 3D Texturizer formulas" endheading heading caption="3D Texturizer III is needed for" endheading heading caption="the non-slope color options." endheading $endif title="Slope 4D Special Map Y G Attractor" maxiter=1000 method=multipass periodicity=0 magn=0.3 float param version caption = "Version number" default = 1.1 hint = "This is for backwards compatibility with old versions \ of the formula." visible = false endparam bool param oldver caption = "Use original version" default = false endparam param applyMapping caption = "Apply Mapping" default = true endparam param percentInc caption = "Oversize by (%)" default = 10.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 0.1 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 0 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param value caption = "Hit Value" enum = "Count" "Ave Z" "Last Z" "Largest Z" default = 3 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param pass caption = "Pass slope values" default = true endparam heading caption = "Slope Parameters" visible=@pass==true endheading param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 1.0 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible=@pass==true endparam heading caption = "Rotations and Translations" endheading $ifdef VER40 heading text = "Use the location tab XY Plane Rotation." endheading $endif param xangle caption = "YZ Plane Rotation" default = 0.0 hint = "This is equivalent of a X Axis rotation in 3 Dimensions. \ It is performed after the normal fractal rotation(s) \ (XY Plane Rotation) and zooms." endparam param zangle caption = "XZ Plane Rotation" default = 0.0 hint = "This is equivalent of a Y Axis rotation in 3 Dimensions. \ It is performed after the normal fractal rotation(s) \ (XY Plane Rotation) and zooms." endparam param xwangle caption = "XW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param ywangle caption = "YW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param zwangle caption = "ZW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param rotoffx caption = "Rotation Center X Offset" default = 0.0 endparam param rotoffy caption = "Rotation Center Y Offset" default = 0.0 endparam param rotoffz caption = "Rotation Center Z Offset" default = 0.0 endparam param rotoffw caption = "Rotation Center W Offset" default = 0.0 endparam param transx caption = "X Final Translation" default = 0.0 endparam param transy caption = "Y Final Translation" default = 0.0 endparam param transz caption = "Z Final Translation" default = 0.0 endparam heading caption = "Perspective" endheading param useproj caption = "Use Perspective" default = false visible = @oldver endparam param useprojn caption = "Use Perspective" default = true visible = !@oldver endparam param cprojx caption = "X Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam param cprojy caption = "Y Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam float param cprojz caption = "Z Center of Projection" default = -1 visible = @useproj || @useprojn endparam heading caption = "Attractor Parameters" endheading param hideparam caption = "Hide Parameters" default = true endparam param sel caption = "select preset coeffs" enum = "no preset" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" \ "11" "12" "13" "14" "15" "16" "17" "18" "19" default = 0 endparam param a1 caption = "coefficient a1" default = 1.1 visible=@hideparam==false endparam param a2 caption = "coefficient a2" default = 1.2 visible=@hideparam==false endparam param a3 caption = "coefficient a3" default = -0.8 visible=@hideparam==false endparam param a4 caption = "coefficient a4" default = 0.4 visible=@hideparam==false endparam param a5 caption = "coefficient a5" default = -1.0 visible=@hideparam==false endparam param a6 caption = "coefficient a6" default = -1.0 visible=@hideparam==false endparam param a7 caption = "coefficient a7" default = 1.0 visible=@hideparam==false endparam param a8 caption = "coefficient a8" default = -0.4 visible=@hideparam==false endparam param a9 caption = "coefficient a9" default = 0.0 visible=@hideparam==false endparam param a10 caption = "coefficient a10" default = 0.2 visible=@hideparam==false endparam } Slope_4D_Special_Map_#2_G_Attractor { ; Ron Barnett December 12, 2004 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III; ; global: float zscale2 = 0 float cprojx = 0 float cprojy = 0 float cprojz = 0 float scrsize = sqrt(#width*#width+#height*#height) if !@oldver zscale2 = @zscale2*scrsize cprojx = @cprojx*#width cprojy = @cprojy*#height cprojz = @cprojz*scrsize else zscale2 = @zscale2 cprojx = @cprojx cprojy = @cprojy cprojz = @cprojz endif int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits2[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits3[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float s[70,7] float fx = 0.0 float ffx = 0.0 float xx = 0.0 float fy = 0.0 float ffy = 0.0 float yy = 0.0 float zz = 0.0 float fz = 0.0 float ffz = 0.0 float ww = 0.0 float ffw = 0.0 float b1 = 0 float b2 = 0 float b3 = 0 float b4 = 0 float b5 = 0 float b6 = 0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float tzmax = sqrt(txmax^2+tymax^2) float twmax = sqrt(txmax^2+tymax^2) float xmin = cx - txmax/2 float ymin = cy - tymax/2 float zmin = sqrt(xmin^2 + ymin^2) float wmin = sqrt(xmin^2 + ymin^2) float iterate = @density*10000000 float maxnhit = 0 ; ; initialize hit array ; while(h < #height+wd) while(w < #width+ht) hits[w,h] = 0 hits2[w,h] = 0 hits3[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; initialize presets ; s[1,1]=-0.8,s[1,2]=1.0,s[1,3]=-0.5,s[1,4]=-0.4,s[1,5]=0.7,s[1,6]=0.7 s[2,1]=-0.5,s[2,2]=-0.8,s[2,3]=1.0,s[2,4]=0.3,s[2,5]=-0.9,s[2,6]=0.4 s[3,1]=1.1,s[3,2]=-0.8,s[3,3]=-0.6,s[3,4]=-0.2,s[3,5]=0.2,s[3,6]=-0.4 s[4,1]=0.9,s[4,2]=0.6,s[4,3]=0.8,s[4,4]=0.4,s[4,5]=0.5,s[4,6]=0.0 s[5,1]=0.6,s[5,2]=-0.7,s[5,3]=-0.8,s[5,4]=0.5,s[5,5]=1.1,s[5,6]=0.1 s[6,1]=-0.3,s[6,2]=1.0,s[6,3]=-0.6,s[6,4]=1.0,s[6,5]=-0.9,s[6,6]=-0.3 s[7,1]=1.0,s[7,2]=-0.5,s[7,3]=-1.2,s[7,4]=0.4,s[7,5]=0.9,s[7,6]=1.2 s[8,1]=-1.1,s[8,2]=-0.7,s[8,3]=0.7,s[8,4]=-1.2,s[8,5]=0.4,s[8,6]=1.1 s[9,1]=-0.4,s[9,2]=-1.0,s[9,3]=0.8,s[9,4]=-0.4,s[9,5]=0.9,s[9,6]=0.3 s[10,1]=-0.9,s[10,2]=0.7,s[10,3]=0.9,s[10,4]=-0.5,s[10,5]=-0.5,s[10,6]=-0.2 s[11,1]=0.6,s[11,2]=-0.6,s[11,3]=0.9,s[11,4]=-1.0,s[11,5]=0.3,s[11,6]=-0.4 s[12,1]=-0.5,s[12,2]=1.0,s[12,3]=-0.7,s[12,4]=1.1,s[12,5]=0.2,s[12,6]=-0.8 s[13,1]=0.7,s[13,2]=-0.6,s[13,3]=-1.2,s[13,4]=-1.1,s[13,5]=0.5,s[13,6]=0.2 s[14,1]=-1.1,s[14,2]=-1.0,s[14,3]=0.6,s[14,4]=-0.5,s[14,5]=0.5,s[14,6]=0.3 s[15,1]=-0.6,s[15,2]=0.6,s[15,3]=-0.6,s[15,4]=-0.2,s[15,5]=1.2,s[15,6]=0.3 s[16,1]=-0.9,s[16,2]=0.9,s[16,3]=-0.8,s[16,4]=0.3,s[16,5]=0.3,s[16,6]=0.6 s[17,1]=-1.2,s[17,2]=0.4,s[17,3]=-1.1,s[17,4]=-0.6,s[17,5]=1.1,s[17,6]=0.0 s[18,1]=0.6,s[18,2]=-0.9,s[18,3]=0.8,s[18,4]=0.2,s[18,5]=-0.7,s[18,6]=-0.1 s[19,1]=1.1,s[19,2]=-0.4,s[19,3]=-1.2,s[19,4]=-0.8,s[19,5]=-0.2,s[19,6]=1.0 s[20,1]=-0.4,s[20,2]=-1.0,s[20,3]=-0.5,s[20,4]=-1.2,s[20,5]=1.1,s[20,6]=0.6 s[21,1]=0.9,s[21,2]=-0.6,s[21,3]=1.0,s[21,4]=1.0,s[21,5]=0.6,s[21,6]=-0.8 s[22,1]=0.3,s[22,2]=-0.9,s[22,3]=0.5,s[22,4]=1.0,s[22,5]=0.8,s[22,6]=-0.4 s[23,1]=-0.1,s[23,2]=-0.5,s[23,3]=-1.1,s[23,4]=0.2,s[23,5]=-0.8,s[23,6]=0.6 s[24,1]=0.8,s[24,2]=-0.5,s[24,3]=-1.1,s[24,4]=-0.9,s[24,5]=0.5,s[24,6]=-0.5 s[25,1]=1.2,s[25,2]=1.1,s[25,3]=-0.4,s[25,4]=1.0,s[25,5]=0.5,s[25,6]=0.2 s[26,1]=-1.1,s[26,2]=0.9,s[26,3]=0.5,s[26,4]=1.0,s[26,5]=-0.6,s[26,6]=-0.1 s[27,1]=0.4,s[27,2]=0.3,s[27,3]=-1.1,s[27,4]=-1.1,s[27,5]=0.4,s[27,6]=0.4 s[28,1]=-0.3,s[28,2]=-0.6,s[28,3]=0.7,s[28,4]=-0.1,s[28,5]=0.7,s[28,6]=-0.6 s[29,1]=1.2,s[29,2]=-0.5,s[29,3]=0.6,s[29,4]=-0.1,s[29,5]=0.6,s[29,6]=0.4 s[30,1]=1.0,s[30,2]=-0.6,s[30,3]=1.0,s[30,4]=0.8,s[30,5]=0.7,s[30,6]=-0.4 s[31,1]=-0.1,s[31,2]=-1.2,s[31,3]=-1.0,s[31,4]=0.6,s[31,5]=-0.2,s[31,6]=0.4 s[32,1]=-0.1,s[32,2]=-0.7,s[32,3]=1.0,s[32,4]=-1.2,s[32,5]=-0.8,s[32,6]=0.1 s[33,1]=-0.5,s[33,2]=-0.6,s[33,3]=0.9,s[33,4]=1.0,s[33,5]=0.6,s[33,6]=0.8 s[34,1]=0.8,s[34,2]=-0.7,s[34,3]=-0.8,s[34,4]=0.2,s[34,5]=0.3,s[34,6]=1.0 s[35,1]=0.3,s[35,2]=-1.0,s[35,3]=1.0,s[35,4]=-0.3,s[35,5]=-0.5,s[35,6]=0.1 s[36,1]=-0.6,s[36,2]=-0.7,s[36,3]=-0.8,s[36,4]=0.8,s[36,5]=0.6,s[36,6]=1.0 s[37,1]=-1.1,s[37,2]=0.8,s[37,3]=-0.8,s[37,4]=0.9,s[37,5]=-0.3,s[37,6]=-0.8 s[38,1]=-1.0,s[38,2]=0.9,s[38,3]=-0.6,s[38,4]=-0.5,s[38,5]=-0.9,s[38,6]=-0.2 s[39,1]=0.2,s[39,2]=-0.6,s[39,3]=-1.0,s[39,4]=0.9,s[39,5]=-0.9,s[39,6]=0.2 s[40,1]=0.9,s[40,2]=0.9,s[40,3]=0.7,s[40,4]=-1.1,s[40,5]=0.7,s[40,6]=0.3 s[41,1]=1.1,s[41,2]=-1.0,s[41,3]=-0.7,s[41,4]=1.1,s[41,5]=0.8,s[41,6]=1.1 s[42,1]=0.9,s[42,2]=0.6,s[42,3]=-1.2,s[42,4]=-0.9,s[42,5]=-0.7,s[42,6]=0.6 s[43,1]=1.2,s[43,2]=1.0,s[43,3]=0.5,s[43,4]=-0.8,s[43,5]=-1.1,s[43,6]=0.1 s[44,1]=-0.8,s[44,2]=-1.2,s[44,3]=-0.6,s[44,4]=0.0,s[44,5]=1.1,s[44,6]=0.0 s[45,1]=0.5,s[45,2]=-0.9,s[45,3]=1.2,s[45,4]=-0.8,s[45,5]=0.5,s[45,6]=-0.6 s[46,1]=0.5,s[46,2]=-0.5,s[46,3]=1.1,s[46,4]=0.9,s[46,5]=1.0,s[46,6]=0.5 s[47,1]=1.1,s[47,2]=0.5,s[47,3]=1.0,s[47,4]=-0.9,s[47,5]=0.9,s[47,6]=0.3 s[48,1]=-0.2,s[48,2]=1.2,s[48,3]=0.4,s[48,4]=-0.7,s[48,5]=-0.7,s[48,6]=-0.8 s[49,1]=-0.6,s[49,2]=-0.4,s[49,3]=1.1,s[49,4]=0.2,s[49,5]=0.5,s[49,6]=0.8 s[50,1]=-0.6,s[50,2]=-1.0,s[50,3]=-0.7,s[50,4]=0.6,s[50,5]=-0.9,s[50,6]=-0.2 s[51,1]=-0.5,s[51,2]=-0.5,s[51,3]=0.7,s[51,4]=1.1,s[51,5]=1.1,s[51,6]=0.6 s[52,1]=-0.2,s[52,2]=-0.5,s[52,3]=1.2,s[52,4]=0.1,s[52,5]=1.1,s[52,6]=0.7 s[53,1]=-0.3,s[53,2]=0.6,s[53,3]=0.9,s[53,4]=0.3,s[53,5]=-1.2,s[53,6]=-0.6 s[54,1]=-0.4,s[54,2]=-1.0,s[54,3]=0.6,s[54,4]=0.8,s[54,5]=-1.2,s[54,6]=0.9 s[55,1]=-1.1,s[55,2]=0.4,s[55,3]=-1.1,s[55,4]=0.6,s[55,5]=0.2,s[55,6]=0.8 s[56,1]=0.5,s[56,2]=-0.6,s[56,3]=0.9,s[56,4]=0.1,s[56,5]=0.5,s[56,6]=0.3 s[57,1]=-0.4,s[57,2]=-0.6,s[57,3]=-1.2,s[57,4]=0.7,s[57,5]=0.5,s[57,6]=0.5 s[58,1]=1.2,s[58,2]=-0.8,s[58,3]=0.6,s[58,4]=0.9,s[58,5]=-0.2,s[58,6]=1.1 s[59,1]=-1.0,s[59,2]=-0.9,s[59,3]=0.6,s[59,4]=-0.1,s[59,5]=-0.1,s[59,6]=-0.5 s[60,1]=1.0,s[60,2]=1.2,s[60,3]=-0.6,s[60,4]=-0.4,s[60,5]=-0.7,s[60,6]=-0.4 s[61,1]=0.4,s[61,2]=0.9,s[61,3]=0.5,s[61,4]=-1.2,s[61,5]=-0.7,s[61,6]=-0.6 s[62,1]=-1.2,s[62,2]=-0.8,s[62,3]=0.6,s[62,4]=0.0,s[62,5]=0.8,s[62,6]=-0.2 s[63,1]=-1.2,s[63,2]=-0.9,s[63,3]=0.7,s[63,4]=0.5,s[63,5]=0.6,s[63,6]=1.1 s[64,1]=-0.5,s[64,2]=-0.4,s[64,3]=0.8,s[64,4]=-1.2,s[64,5]=0.7,s[64,6]=1.2 s[65,1]=-0.2,s[65,2]=0.2,s[65,3]=-1.2,s[65,4]=0.4,s[65,5]=-0.4,s[65,6]=0.8 s[66,1]=-1.1,s[66,2]=1.0,s[66,3]=0.4,s[66,4]=-0.4,s[66,5]=0.9,s[66,6]=0.3 s[67,1]=-1.0,s[67,2]=0.6,s[67,3]=0.6,s[67,4]=0.0,s[67,5]=-0.9,s[67,6]=0.2 s[68,1]=-0.4,s[68,2]=-1.2,s[68,3]=-0.5,s[68,4]=-0.2,s[68,5]=0.7,s[68,6]=-0.4 s[69,1]=-0.1,s[69,2]=-0.4,s[69,3]=-1.1,s[69,4]=1.2,s[69,5]=-0.6,s[69,6]=1.2 ; ; initialize coefficients ; if @sel > 0 b1 = s[@sel,1] b2 = s[@sel,2] b3 = s[@sel,3] b4 = s[@sel,4] b5 = s[@sel,5] b6 = s[@sel,6] endif ; ; ; fill the hit array ; while (iter < (iterate*sqr(#width*#magn/400))) xx = fx yy = fy zz = fz if @sel == 0 fx = 10*@a1 + (fx + @a2*sin(@a3*fy + @a4))*cos(2*#pi/(13 + 10*@a6)) + fy*sin(2*#pi/(13 + 10*@a6)) fy = 10*@a5 - (xx + @a2*sin(@a3*fy + @a4))*sin(2*#pi/(13 + 10*@a6)) + fy*cos(2*#pi/(13 + 10*@a6)) fz = sqrt(xx*xx + yy*yy) ww = zz*iter / (iterate*sqr(#width*#magn/400)) else fx = 10*b1 + (fx + b2*sin(b3*fy + b4))*cos(2*#pi/(13 + 10*b6)) + fy*sin(2*#pi/(13 + 10*b6)) fy = 10*b5 - (xx + b2*sin(b3*fy + b4))*sin(2*#pi/(13 + 10*b6)) + fy*cos(2*#pi/(13 + 10*b6)) fz = sqrt(xx*xx + yy*yy) ww = zz*iter / (iterate*sqr(#width*#magn/400)) endif ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax ffz = (zmin-fz)/sqrt(txmax^2+tymax^2) ffw = (wmin-ww)/sqrt(txmax^2+tymax^2) ; rotation in the XW Plane xx = ffx ffx = (0.5 - (ffw - 0.5 - @rotoffw/twmax)*sin(@xwangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@xwangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@xwangle*pi/180) + \ (xx - 0.5 - @rotoffw/twmax)*sin(@xwangle*pi/180)) ; rotation in the YW Plane yy = ffy ffy = (0.5 + (ffw - 0.5 - @rotoffw/txmax)*sin(@ywangle*pi/180) + \ (ffy - 0.5 - @rotoffy/tymax)*cos(@ywangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@ywangle*pi/180) - \ (yy - 0.5 - @rotoffw/twmax)*sin(@ywangle*pi/180)) ; rotation in the ZW Plane zz = ffz ffz = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*sin(@zwangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@zwangle*pi/180)) ffw = (0.5 + (ffw - 0.5 - @rotoffw/twmax)*cos(@zwangle*pi/180) - \ (zz - 0.5 - @rotoffw/twmax)*sin(@zwangle*pi/180)) ; rotation in the XY Plane (from the Location TAB) ; xx = ffx ffx = 0.5 + (ffx - 0.5 - @rotoffx/txmax)*cos(#angle) - \ (ffy - 0.5 - @rotoffy/tymax)*sin(#angle)*#height/#width ffy = 0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(#angle) + \ (xx - 0.5 - @rotoffx/txmax)*sin(#angle)*#width/#height ; ; rotation in the XZ Plane ; xx = ffx ffx = (0.5 + (ffz - 0.5 - @rotoffz/txmax)*sin(@zangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@zangle*pi/180))*#width ffz = (0.5 + (ffz - 0.5 - @rotoffz/tzmax)*cos(@zangle*pi/180) - \ (xx - 0.5 - @rotoffx/txmax)*sin(@zangle*pi/180)) ; ; rotation in the YZ plane ; yy = ffy ffy = (0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(@xangle*pi/180) - \ (ffz - 0.5 - @rotoffz/tzmax)*sin(@xangle*pi/180))*#height if @oldver ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*#height/2 else ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*scrsize endif ; ; final translation ; ffx = ffx - @transx*#width ffy = ffy - @transy*#height if @oldver ffz = ffz - @transz*#height/2 else ffz = ffz - @transz*scrsize endif ; ; perspective application ; if @oldver if @useproj ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif else if @useprojn ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif endif px = trunc(ffx)+wd2 py = trunc(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+1+flip(ffz) if real(hits[px,py])>maxnhit maxnhit = real(hits[px,py]) endif if ffz > hits3[px,py] || hits3[px,py] == 0 hits3[px,py] = ffz endif hits2[px,py] = ffz endif iter = iter + 1 endwhile h = 0 w = 0 ; init: float nhit=0 float zave=0 float zlast=0 float zbiggest=0 float nhitx=0 float zavex=0 float zlastx=0 float zbiggestx=0 float nhity=0 float zavey=0 float zlasty=0 float zbiggesty=0 bool done = false float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 int i = 0 ;loop: int delta = ceil(@closeness) int xcrd = #x int ycrd = #y bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true if xcrd+@closeness < #width+wd && ycrd+@closeness < #height+ht && real(hits[xcrd,ycrd]) > @thresh if @filter == 0 if @value == 3 zbiggest = hits3[xcrd,ycrd] zbiggestx = hits3[xcrd+delta,ycrd] zbiggesty = hits3[xcrd,ycrd+delta] elseif @value == 0 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) elseif @value == 1 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) zave = imag(hits[xcrd,ycrd])/(nhit + 1) zavex = imag(hits[xcrd+delta,ycrd])/(nhitx + 1) zavey = imag(hits[xcrd,ycrd+delta])/(nhity + 1) elseif @value == 2 zlast = hits2[xcrd,ycrd] zlastx = hits2[xcrd+delta,ycrd] zlasty = hits2[xcrd,ycrd+delta] endif else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 zbiggest = 0 zbiggestx = 0 zbiggesty = 0 zave = 0 zavex = 0 zavey = 0 zlast = 0 zlastx = 0 zlasty = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter if @value == 0 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) elseif @value == 1 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) zave = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy])/(nhit+1) zavex = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx+delta,ycrd+gy])/(nhitx+1) zavey = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta])/(nhity+1) elseif @value == 2 zlast = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy] zlastx = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx+delta,ycrd+gy] zlasty = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy+delta] elseif @value == 3 zbiggest = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy] zbiggestx = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx+delta,ycrd+gy] zbiggesty = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy+delta] endif gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile if @value == 0 nhit = nhit/gweight nhitx = nhitx/gweight nhity = nhity/gweight elseif @value == 1 zave = zave/gweight zavex = zavex/gweight zavey = zavey/gweight elseif @value == 2 zlast = zlast/gweight zlastx = zlastx/gweight zlasty = zlasty/gweight elseif @value == 3 zbiggest = zbiggest/gweight zbiggestx = zbiggestx/gweight zbiggesty = zbiggesty/gweight endif endif endif endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = zave cenx = zavex ceny = zavey elseif @value == 2 cen = zlast cenx = zlastx ceny = zlasty else cen = zbiggest cenx = zbiggestx ceny = zbiggesty endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * zscale2 e2 = e2 * zscale2 e3 = e3 * zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxnhit elseif @value == 1 #z = (zave/(log(maxnhit)+1))^3 elseif @value == 2 #z = (zlast/(log(maxnhit)+1))^10 elseif @value == 3 #z = (zbiggest/(log(maxnhit)+1))^10 endif endif if @oldver if done == false done = true endif endif loop: i = i + 1 if !@oldver if cen < i if done == false done = true endif endif endif bailout: done == false default: heading caption="Sprott 4D Special Map #2 G Attractors" endheading $ifdef VER40 heading text=" x -> Sin and Cos series in x and y" endheading heading text=" y -> Sin and Cos series in x and y" endheading heading text=" z -> sqrt(x*x+y*y)" endheading heading text=" w -> Proportional to iterations" endheading heading text="Color with Damien's Lighting, 3D Texturizer Enhanced III or \ Direct Color Slope." endheading $else heading caption="x -> Sin and Cos series in x and y" endheading heading caption="y -> Sin and Cos series in x and y" endheading heading caption="z -> sqrt(x*x+y*y)" endheading heading caption="w -> Proportional to iterations" endheading heading caption="Color with Damien's Lighting" endheading heading caption="or one of the 3D Texturizer formulas" endheading heading caption="3D Texturizer III is needed for" endheading heading caption="the non-slope color options." endheading $endif title="Slope 4D Special Map #2 G Attractor" maxiter=1000 method=multipass periodicity=0 magn=0.03 float param version caption = "Version number" default = 1.1 hint = "This is for backwards compatibility with old versions \ of the formula." visible = false endparam bool param oldver caption = "Use original version" default = false endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 10 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 0 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param value caption = "Hit Value" enum = "Count" "Ave Z" "Last Z" "Largest Z" default = 3 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param pass caption = "Pass slope values" default = true endparam heading caption = "Slope Parameters" visible=@pass==true endheading param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 1.0 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible=@pass==true endparam heading caption = "Rotations and Translations" endheading $ifdef VER40 heading text = "Use the location tab XY Plane Rotation." endheading $endif param xangle caption = "YZ Plane Rotation" default = 0.0 hint = "This is equivalent of a X Axis rotation in 3 Dimensions. \ It is performed after the normal fractal rotation(s) \ (XY Plane Rotation) and zooms." endparam param zangle caption = "XZ Plane Rotation" default = 0.0 hint = "This is equivalent of a Y Axis rotation in 3 Dimensions. \ It is performed after the normal fractal rotation(s) \ (XY Plane Rotation) and zooms." endparam param xwangle caption = "XW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param ywangle caption = "YW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param zwangle caption = "ZW Plane Rotation" default = 0.0 hint = "This rotates the 4th Dimension into view. It should be \ performed before any othe rotations" endparam param rotoffx caption = "Rotation Center X Offset" default = 0.0 endparam param rotoffy caption = "Rotation Center Y Offset" default = 0.0 endparam param rotoffz caption = "Rotation Center Z Offset" default = 0.0 endparam param rotoffw caption = "Rotation Center W Offset" default = 0.0 endparam param transx caption = "X Final Translation" default = 0.0 endparam param transy caption = "Y Final Translation" default = 0.0 endparam param transz caption = "Z Final Translation" default = 0.0 endparam heading caption = "Perspective" endheading param useproj caption = "Use Perspective" default = false visible = @oldver endparam param useprojn caption = "Use Perspective" default = true visible = !@oldver endparam param cprojx caption = "X Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam param cprojy caption = "Y Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam float param cprojz caption = "Z Center of Projection" default = -1 visible = @useproj || @useprojn endparam heading caption = "Attractor Parameters" endheading param hideparam caption = "Hide Parameters" default = true endparam param sel caption = "select preset coeffs" enum = "no preset" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" \ "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" \ "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" \ "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" \ "41" "42" "43" "44" "45" "46" "47" "48" "49" "50" \ "51" "52" "53" "54" "55" "56" "57" "58" "59" "60" \ "61" "62" "63" "64" "65" "66" "67" "68" "69" default = 0 endparam param a1 caption = "coefficient a1" default = 0.4 visible=@hideparam==false endparam param a2 caption = "coefficient a2" default = 0.8 visible=@hideparam==false endparam param a3 caption = "coefficient a3" default = -0.6 visible=@hideparam==false endparam param a4 caption = "coefficient a4" default = 0.0 visible=@hideparam==false endparam param a5 caption = "coefficient a5" default = -1.2 visible=@hideparam==false endparam param a6 caption = "coefficient a6" default = 0.3 visible=@hideparam==false endparam } Slope_Pickover_G_Attractor { ; Ron Barnett December 6, 2004 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III global: float zscale2 = 0 float cprojx = 0 float cprojy = 0 float cprojz = 0 float scrsize = sqrt(#width*#width+#height*#height) if !@oldver zscale2 = @zscale2*scrsize cprojx = @cprojx*#width cprojy = @cprojy*#height cprojz = @cprojz*scrsize else zscale2 = @zscale2 cprojx = @cprojx cprojy = @cprojy cprojz = @cprojz endif int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits2[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits3[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float fx = 0.0 float ffx = 0.0 float xx = 0.0 float fy = 0.0 float yy = 0.0 float ffy = 0.0 float zz = 0.0 float ffz = 0.0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float tzmax = sqrt(txmax^2+tymax^2) float xmin = cx - txmax/2 float ymin = cy - tymax/2 float zmin = sqrt(xmin^2 + ymin^2) float iterate = @density*10000000 float maxnhit = 0 ; ; initialize hit array ; while(h < #height+wd) while(w < #width+ht) hits[w,h] = 0 hits2[w,h] = 0 hits3[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; fill the hit array ; while (iter < (iterate*sqr(#width*#magn/400))) xx = fx fx = real(@fn1(@a*fy)) - zz*real(@fn2(@b*fx)) fy = zz*real(@fn3(@c*xx)) - real(@fn4(@d*fy)) zz = @pe*real(@fn5(xx)) ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax ffz = (zmin-zz)/sqrt(txmax^2+tymax^2) xx = ffx ; ; rotation around the z axis ; xx = ffx ffx = 0.5 + (ffx - 0.5 - @rotoffx/txmax)*cos(#angle) - \ (ffy - 0.5 - @rotoffy/tymax)*sin(#angle)*#height/#width ffy = 0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(#angle) + \ (xx - 0.5 - @rotoffx/txmax)*sin(#angle)*#width/#height; ; rotation around the y axis ; xx = ffx ffx = (0.5 + (ffz - 0.5 - @rotoffz/txmax)*sin(@zangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@zangle*pi/180))*#width ffz = (0.5 + (ffz - 0.5 - @rotoffz/tzmax)*cos(@zangle*pi/180) - \ (xx - 0.5 - @rotoffx/txmax)*sin(@zangle*pi/180)) ; ; rotation around the x axis ; yy = ffy ffy = (0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(@xangle*pi/180) - \ (ffz - 0.5 - @rotoffz/tzmax)*sin(@xangle*pi/180))*#height if @oldver ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*#height/2 else ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*scrsize endif ; ; final translation ; ffx = ffx - @transx*#width ffy = ffy - @transy*#height if @oldver ffz = ffz - @transz*#height/2 else ffz = ffz - @transz*scrsize endif ; ; perspective application ; if @oldver if @useproj ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif else if @useprojn ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif endif px = trunc(ffx)+wd2 py = trunc(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+1+flip(ffz) if real(hits[px,py])>maxnhit maxnhit = real(hits[px,py]) endif if ffz > hits3[px,py] || hits3[px,py] == 0 hits3[px,py] = ffz endif hits2[px,py] = ffz endif iter = iter + 1 endwhile h = 0 w = 0 ; init: float nhit=0 float zave=0 float zlast=0 float zbiggest=0 float nhitx=0 float zavex=0 float zlastx=0 float zbiggestx=0 float nhity=0 float zavey=0 float zlasty=0 float zbiggesty=0 bool done = false float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 loop: int delta = ceil(@closeness) int xcrd = #x int ycrd = #y bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true if xcrd+@closeness < #width+wd && ycrd+@closeness < #height+ht && real(hits[xcrd,ycrd]) > @thresh if @filter == 0 if @value == 3 zbiggest = hits3[xcrd,ycrd] zbiggestx = hits3[xcrd+delta,ycrd] zbiggesty = hits3[xcrd,ycrd+delta] elseif @value == 0 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) elseif @value == 1 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) zave = imag(hits[xcrd,ycrd])/(nhit + 1) zavex = imag(hits[xcrd+delta,ycrd])/(nhitx + 1) zavey = imag(hits[xcrd,ycrd+delta])/(nhity + 1) elseif @value == 2 zlast = hits2[xcrd,ycrd] zlastx = hits2[xcrd+delta,ycrd] zlasty = hits2[xcrd,ycrd+delta] endif else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 zbiggest = 0 zbiggestx = 0 zbiggesty = 0 zave = 0 zavex = 0 zavey = 0 zlast = 0 zlastx = 0 zlasty = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter if @value == 0 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) elseif @value == 1 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) zave = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy])/(nhit+1) zavex = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx+delta,ycrd+gy])/(nhitx+1) zavey = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta])/(nhity+1) elseif @value == 2 zlast = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy] zlastx = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx+delta,ycrd+gy] zlasty = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy+delta] elseif @value == 3 zbiggest = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy] zbiggestx = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx+delta,ycrd+gy] zbiggesty = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy+delta] endif gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile if @value == 0 nhit = nhit/gweight nhitx = nhitx/gweight nhity = nhity/gweight elseif @value == 1 zave = zave/gweight zavex = zavex/gweight zavey = zavey/gweight elseif @value == 2 zlast = zlast/gweight zlastx = zlastx/gweight zlasty = zlasty/gweight elseif @value == 3 zbiggest = zbiggest/gweight zbiggestx = zbiggestx/gweight zbiggesty = zbiggesty/gweight endif endif endif endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = zave cenx = zavex ceny = zavey elseif @value == 2 cen = zlast cenx = zlastx ceny = zlasty else cen = zbiggest cenx = zbiggestx ceny = zbiggesty endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * zscale2 e2 = e2 * zscale2 e3 = e3 * zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxnhit elseif @value == 1 #z = (zave/(log(maxnhit)+1))^3 elseif @value == 2 #z = (zlast/(log(maxnhit)+1))^10 elseif @value == 3 #z = (zbiggest/(log(maxnhit)+1))^10 endif endif if done == false done = true endif bailout: done = false default: heading caption="Slope Pickover Attractor" endheading $ifdef VER40 heading text="This is a 3-Dimensional Attractor" endheading heading text=" x -> fn1(a*y) - z*fn2(b*x)" endheading heading text=" y -> z*fn3(c*x) - fn4(d*y)" endheading heading text=" z -> e*fn5(x)" endheading heading text="Color with Damien's Lighting formula or 3D Texturizer Enhanced \ III. 3D Texturizer III is needed for the non-slope color options." endheading $endif title="Slope Pickover G Attractor" maxiter=1 method=onepass periodicity=0 float param version caption = "Version number" default = 1.1 hint = "This is for backwards compatibility with old versions \ of the formula." visible = false endparam bool param oldver caption = "Use original version" default = false endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 0.2 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 1 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param value caption = "Hit Value" enum = "Count" "Ave Z" "Last Z" "Largest Z" default = 3 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param pass caption = "Pass slope values" default = true endparam heading caption = "Slope Parameters" visible=@pass==true endheading param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 1.0 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function, and it is scaled to the screen size" visible=@pass==true endparam heading caption = "Rotations and Translations" endheading $ifdef VER40 heading text = "Use the location tab for rotation around the Z Axis." endheading $endif param xangle caption = "X Axis Rotation" default = 0.0 hint = "This is the fixed (horizontal) Y Axis. It is performed \ after the normal fractal rotation(s) and zooms." endparam param zangle caption = "Y Axis Rotation" default = 0.0 ; min = 0.0 ; max = 180.0 hint = "This is the fixed (vertical) Y Axis. It is performed \ after the normal fractal rotation(s) and zooms." endparam param rotoffx caption = "Rotation Center X Offset" default = 0.0 endparam param rotoffy caption = "Rotation Center Y Offset" default = 0.0 endparam param rotoffz caption = "Rotation Center Z Offset" default = 0.0 endparam param transx caption = "X Final Translation" default = 0.0 endparam param transy caption = "Y Final Translation" default = 0.0 endparam param transz caption = "Z Final Translation" default = 0.0 endparam heading caption = "Perspective" endheading param useproj caption = "Use Perspective" default = false visible = @oldver endparam param useprojn caption = "Use Perspective" default = true visible = !@oldver endparam param cprojx caption = "X Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam param cprojy caption = "Y Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam param cprojz caption = "Z Center of Projection" default = -1 visible = @useproj || @useprojn endparam heading caption = "Pickover Parameters" endheading param a caption = "parameter a" default = 2.24 endparam param b caption = "parameter b" default = 0.43 endparam param c caption = "parameter c" default = -0.65 endparam param d caption = "parameter d" default = -2.43 endparam param pe caption = "parameter e" default = 1.00 endparam func fn1 caption = "function 1" default = sin() endfunc func fn2 caption = "function 2" default = cos() endfunc func fn3 caption = "function 3" default = sin() endfunc func fn4 caption = "function 4" default = cos() endfunc func fn5 caption = "function 5" default = sin() endfunc } Slope_Zito_G_Attractor { ; Ron Barnett December 6, 2004 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III $define debug global: int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] int count[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float fx = 0.1 float ffx = 0.0 float xx = 0.0 float fy = 0.1 float ffy = 0.0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float xmin = cx - txmax/2 float ymin = cy - tymax/2 float iterate = @density*10000000 float maxhit = 0 float maxx = 0 float maxy = 0 ; ; initialize hit array ; while(h < #height+wd) while(w < #width+ht) hits[w,h] = 0 count[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; fill the hit array ; while (iter < (iterate*sqr(#width*#magn/400))) xx = fx fx = fx*fy +@a*fx - fy fy = xx+fy ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax xx = ffx ffx = (0.5*#width + (ffx - 0.5)*cos(#angle)*#width - (ffy - 0.5)*sin(#angle)*#height) ffy = (0.5*#height + (ffy - 0.5)*cos(#angle)*#height + (xx - 0.5)*sin(#angle)*#width) px = round(ffx)+wd2 py = round(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+ffx+flip(ffy) if real(hits[px,py]) > maxx maxx = real(hits[px,py]) endif if imag(hits[px,py]) > maxy maxy = imag(hits[px,py]) endif count[px,py] = count[px,py] + 1 if count[px,py] > maxhit maxhit = count[px,py] endif endif iter = iter + 1 endwhile ; ; init: float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 complex z1 = 0 complex z2 = 0 complex z3 = 0 float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float nhit=0 float nhitx=0 float nhity=0 float xhit=0 float xhitx=0 float yhit=0 float yhity=0 bool done = false float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 loop: int delta = round(@closeness) int xcrd = #x int ycrd = #y bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true && count[xcrd,ycrd] > @thresh if xcrd+delta < #width+wd && ycrd+delta < #height+ht if @filter == 0 nhit=count[xcrd,ycrd] nhitx=count[xcrd+delta,ycrd] nhity=count[xcrd,ycrd+delta] xhit=real(hits[xcrd,ycrd]) xhitx=real(hits[xcrd+delta,ycrd]) yhit=imag(hits[xcrd,ycrd]) yhity=imag(hits[xcrd,ycrd+delta]) else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 xhit=0 xhitx=0 yhit=0 yhity=0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter nhit = nhit + gauss[gx+@filter,gy+@filter]*count[xcrd+gx,ycrd+gy] xhit = xhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) yhit = yhit + gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*count[xcrd+gx+delta,ycrd+gy] xhitx = xhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*count[xcrd+gx,ycrd+gy+delta+delta] yhity = yhity + gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta]) gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile nhit = nhit/gweight xhit = xhit/gweight yhit = yhit/gweight nhitx = nhitx/gweight xhitx = xhitx/gweight nhity = nhity/gweight yhity = yhity/gweight endif endif z1 = xhit + flip(yhit) z2 = xhitx + flip(yhit) z3 = xhit + flip(yhity) d1 = |z1| d2 = |z2| d3 = |z3| endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = d1 cenx = d2 ceny = d3 endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd #z = xhit + flip(yhit) if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxhit else #z = |xhit/maxx + flip(yhit/maxy)| endif endif if done == false done = true endif bailout: done = false default: heading caption="Zito Attractor" endheading heading caption="x -> x*y + a*x - y" endheading heading caption="y -> x + y" endheading heading caption="Color with Damien's Lighting" endheading heading caption="or one of the 3D Texturizer formulas" endheading heading caption="3D Texturizer III is needed for" endheading heading caption="the non-slope color options." endheading title="Slope Zito G Attractor" maxiter=1 method=onepass periodicity=0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 0.1 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 1 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param pass caption = "Pass slope values" default = true endparam param value caption = "Height Value" enum = "Count" "X Y Surface" default = 0 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible=@pass==true endparam param a caption = "parameter a" default = 0.357057 endparam } Slope_Latoocarfian_G_attractor { ; Ron Barnett December 22, 2004 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III global: int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] int count[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float fx = 0.1 float ffx = 0.0 float xx = 0.0 float fy = 0.1 float ffy = 0.0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float xmin = cx - txmax/2 float ymin = cy - tymax/2 float iterate = @density*10000000 float maxhit = 0 float maxx = 0 float maxy = 0 ; ; initialize hit array ; while(h < #height+wd) while(w < #width+ht) hits[w,h] = 0 count[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; fill the hit array ; while (iter < (iterate*sqr(#width*#magn/400))) xx = fx fx = real(@fn1(@b*fy) + @c*@fn2(@b*fx)) fy = real(@fn3(@a*xx) + @d*@fn4(@a*fy)) ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax xx = ffx ffx = (0.5*#width + (ffx - 0.5)*cos(#angle)*#width - (ffy - 0.5)*sin(#angle)*#height) ffy = (0.5*#height + (ffy - 0.5)*cos(#angle)*#height + (xx - 0.5)*sin(#angle)*#width) px = round(ffx)+wd2 py = round(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+ffx+flip(ffy) if real(hits[px,py]) > maxx maxx = real(hits[px,py]) endif if imag(hits[px,py]) > maxy maxy = imag(hits[px,py]) endif count[px,py] = count[px,py] + 1 if count[px,py] > maxhit maxhit = count[px,py] endif endif iter = iter + 1 endwhile ; ; init: float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 complex z1 = 0 complex z2 = 0 complex z3 = 0 float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float nhit=0 float nhitx=0 float nhity=0 float xhit=0 float xhitx=0 float yhit=0 float yhity=0 bool done = false float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 loop: int delta = round(@closeness) int xcrd = #x int ycrd = #y bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true && count[xcrd,ycrd] > @thresh if xcrd+delta < #width+wd && ycrd+delta < #height+ht if @filter == 0 nhit=count[xcrd,ycrd] nhitx=count[xcrd+delta,ycrd] nhity=count[xcrd,ycrd+delta] xhit=real(hits[xcrd,ycrd]) xhitx=real(hits[xcrd+delta,ycrd]) yhit=imag(hits[xcrd,ycrd]) yhity=imag(hits[xcrd,ycrd+delta]) else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 xhit=0 xhitx=0 yhit=0 yhity=0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter nhit = nhit + gauss[gx+@filter,gy+@filter]*count[xcrd+gx,ycrd+gy] xhit = xhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) yhit = yhit + gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*count[xcrd+gx+delta,ycrd+gy] xhitx = xhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*count[xcrd+gx,ycrd+gy+delta+delta] yhity = yhity + gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta]) gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile nhit = nhit/gweight xhit = xhit/gweight yhit = yhit/gweight nhitx = nhitx/gweight xhitx = xhitx/gweight nhity = nhity/gweight yhity = yhity/gweight endif endif z1 = xhit + flip(yhit) z2 = xhitx + flip(yhit) z3 = xhit + flip(yhity) d1 = |z1| d2 = |z2| d3 = |z3| endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = d1 cenx = d2 ceny = d3 endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxhit else #z = |xhit/maxx + flip(yhit/maxy)| endif endif if done == false done = true endif bailout: done = false default: heading caption="Latoocarfian Attractor" endheading heading caption="x -> fn1(b*y) + c*fn2(b*x)" endheading heading caption="y -> fn3(a*x) + d*fn4(a*y)" endheading heading caption="Color with Damien's Lighting" endheading heading caption="or one of the 3D Texturizer formulas" endheading heading caption="3D Texturizer III is needed for" endheading heading caption="the non-slope color options." endheading title="Slope Latoocarfian G Attractor" maxiter=1 method=onepass periodicity=0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 0.1 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 1 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param pass caption = "Pass slope values" default = true endparam param value caption = "Height Value" enum = "Count" "X Y Surface" default = 0 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible=@pass==true endparam param a caption = "parameter a" default = -0.960918 endparam param b caption = "parameter b" default = 2.879879 endparam param c caption = "parameter c" default = 0.765145 endparam param d caption = "parameter d" default = 0.744728 endparam func fn1 caption = "function 1" default = sin() endfunc func fn2 caption = "function 2" default = sin() endfunc func fn3 caption = "function 3" default = sin() endfunc func fn4 caption = "function 4" default = sin() endfunc } 3RDIMMagnet1 { ; Ron Barnett December 31, 2004 init: #z = @p1*real(@start)+flip(imag(@start)) complex c = @p2+real(#pixel)+flip(imag(#pixel)*@p1) complex num = 0 complex denom = 0 loop: num = #z^2 + c-1 denom = 2*#z + c-2 #z = (num/denom)^2 bailout: |#z| <= @bailout && |#z-1| > @bailout2 default: title = "4D Magnet1 3RDIM" maxiter = 1000 periodicity = 0 method = multipass center = (1, 0) magn = 0.5 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Start" default = (0,0) endparam param bailout caption = "Bailout (div)" default = 100.0 min = 1 endparam param bailout2 caption = "Bailout (conv)" default = 0.000001 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam switch: type = "3RDIMMagnet1J" bailout = @bailout bailout2 = @bailout2 p1 = @p1 p2 = @p2 p3 = #pixel } 3RDIMMagnet1J { ; Ron Barnett December 31, 2004 init: complex zold = 0 #z = @p1*real(#pixel)+flip(imag(#pixel)) complex c = @p2+real(@p3)+flip(imag(@p3)*@p1) loop: zold = #z num = #z^2 + c-1 denom = 2*#z + c-2 #z = (num/denom)^2 bailout: |#z| <= @bailout && |#z-zold| > @bailout2 default: title = "4D Magnet1 3RDIM Julia" maxiter = 1000 magn = 0.25 periodicity = 0 method = multipass center = (-1, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout (div)" default = 100.0 min = 1 endparam param bailout2 caption = "Bailout (conv)" default = 0.000001 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "seed" default = (-0.1375, 0.1625) endparam switch: type = "3RDIMMagnet1" bailout = @bailout baiout2 = @bailout2 p1 = @p1 p2 = @p2 } SJMagnet1 { ; Ron Barnett December 31, 2004 init: #z = real(@start) + flip(imag(@start)*@p1) complex c = @p2 + @p1*real(#pixel) + flip(imag(#pixel)) complex num = 0 complex denom = 0 loop: num = #z^2 + c-1 denom = 2*#z + c-2 #z = (num/denom)^2 bailout: |#z| <= @bailout && |#z-1| > @bailout2 default: title = "4D Magnet1 SJ" maxiter = 1000 periodicity = 0 method = multipass center = (1, 0) magn = 0.5 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Start" default = (0,0) endparam param bailout caption = "Bailout (div)" default = 100.0 min = 1 endparam param bailout2 caption = "Bailout (conv)" default = 0.000001 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam switch: type = "SJMagnet1J" bailout = @bailout bailout2 = @bailout2 p1 = @p1 p2 = @p2 p3 = #pixel } SJMagnet1J { ; Ron Barnett December 31, 2004 init: complex zold = 0 #z = real(#pixel) + flip(imag(#pixel)*@p1) complex c = @p2 + @p1*real(@p3) + flip(imag(@p3)) loop: zold = #z num = #z^2 + c-1 denom = 2*#z + c-2 #z = (num/denom)^2 bailout: |#z| <= @bailout && |#z-zold| > @bailout2 default: title = "4D Magnet1 SJ Julia" maxiter = 1000 center = (-1, 0) magn = 0.25 periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout (div)" default = 100.0 min = 1 endparam param bailout2 caption = "Bailout (conv)" default = 0.000001 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "seed" default = (-0.45, 0.1625) endparam switch: type = "SJMagnet1" bailout = @bailout baiout2 = @bailout2 p1 = @p1 p2 = @p2 } 3RDIMMagnet2 { ; Ron Barnett December 31, 2004 init: #z = @p1*real(@start)+flip(imag(@start)) complex c = @p2+real(#pixel)+flip(imag(#pixel)*@p1) complex num = 0 complex denom = 0 loop: num = #z^3 + 3*(c-1)*#z + (c-1)*(c-2) denom = 3*#z^2 + 3*(c-2)*#z + (c-1)*(c-2) + 1 #z = (num/denom)^2 bailout: |#z| <= @bailout && |#z-1| > @bailout2 default: title = "4D Magnet2 3RDIM" maxiter = 1000 periodicity = 0 method = multipass center = (1, 0) magn = 0.75 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Start" default = (0,0) endparam param bailout caption = "Bailout (div)" default = 100.0 min = 1 endparam param bailout2 caption = "Bailout (conv)" default = 0.000001 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam switch: type = "3RDIMMagnet2J" bailout = @bailout bailout2 = @bailout2 p1 = @p1 p2 = @p2 p3 = #pixel } 3RDIMMagnet2J { ; Ron Barnett December 31, 2004 init: complex zold = 0 #z = @p1*real(#pixel)+flip(imag(#pixel)) complex c = @p2+real(@p3)+flip(imag(@p3)*@p1) loop: zold = #z num = #z^3 + 3*(c-1)*#z + (c-1)*(c-2) denom = 3*#z^2 + 3*(c-2)*#z + (c-1)*(c-2) + 1 #z = (num/denom)^2 bailout: |#z| <= @bailout && |#z-zold| > @bailout2 default: title = "4D Magnet2 3RDIM Julia" maxiter = 1000 magn = 0.125 periodicity = 0 method = multipass center = (-1, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout (div)" default = 100.0 min = 1 endparam param bailout2 caption = "Bailout (conv)" default = 0.000001 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "seed" default = (1.1833, -.6833) endparam switch: type = "3RDIMMagnet2" bailout = @bailout baiout2 = @bailout2 p1 = @p1 p2 = @p2 } SlopeExp3RDI01 { ; based upon the slope (Mandelbrot) ; formula of Damien Jones ; Ron Barnett, December 1999 ; Modified with more height values December 31 2004 ; January 3, 2005 bug fixes init: complex c1 = @p2 + real(#pixel) + flip(imag(#pixel)*@p1) complex c2 = @p2 + real(#pixel) + flip(imag(#pixel)*@p1) + @offset complex c3 = @p2 + real(#pixel) + flip(imag(#pixel)*@p1) + flip(@offset) complex z1 = @p1*real(#pixel) + flip(imag(#pixel)) complex z2 = z1 complex z3 = z1 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float theta = 0.0 float r = 0.0 complex qa = 0 complex qb = 0 complex qc = 0 complex qy = 0 complex qx = 0 complex cx = 0 complex cy = 0 loop: z1 = z1*z1 + c1 z2 = z2*z2 + c2 z3 = z3*z3 + c3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (3RDI01)" helpfile = "Classical Slope Formulas.chm" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 method = multipass heading caption = "4D Mandelbrot 3RDIM" endheading heading caption = "Use Damien's Lighting Coloring" endheading heading caption = "or 3D Texturizer Enhanced III." endheading heading caption = "Most other coloring formulas" endheading heading caption = "can also be used." endheading param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandel set anymore." endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExp3RDI01J" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeExp3RDI01J { ; Ron Barnett, December 31, 2004 ; January 3, 2005 bug fixes init: complex c1 = @p2 + real(@p3) + flip(imag(@p3)*@p1) complex c2 = @p2 + real(@p3) + flip(imag(@p3)*@p1) + @offset complex c3 = @p2 + real(@p3) + flip(imag(@p3)*@p1) + flip(@offset) complex z1 = @p1*real(#pixel) + flip(imag(#pixel)) complex z2 = z1 complex z3 = z1 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float theta = 0.0 float r = 0.0 complex qa = 0 complex qb = 0 complex qc = 0 complex qy = 0 complex qx = 0 complex cx = 0 complex cy = 0 loop: z1 = z1*z1 + c1 z2 = z2*z2 + c2 z3 = z3*z3 + c3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (3RDI01J)" helpfile = "Classical Slope Formulas.chm" center = (0.0, 0.0) maxiter = 1000 heading caption = "4D Mandelbrot 3RDIM Julia" endheading heading caption = "Use Damien's Lighting Coloring" endheading heading caption = "or 3D Texturizer Enhanced III." endheading heading caption = "Most other coloring formulas" endheading heading caption = "can also be used." endheading param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandel set anymore." endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "Seed" default = (-0.75625,-0.34375) endparam heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExp3RDI01" bailout = @bailout p1 = @p1 p2 = @p2 offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeExp3RDIMMagnet1 { ; Ron Barnett January 1, 2005 ; January 3, 2005 bug fixes init: complex c1 = @p2 + real(#pixel) + flip(imag(#pixel)*@p1) complex c2 = @p2 + real(#pixel) + flip(imag(#pixel)*@p1) + @offset complex c3 = @p2 + real(#pixel) + flip(imag(#pixel)*@p1) + flip(@offset) complex z1 = @p1*real(@start) + flip(imag(@start)) complex z2 = z1 complex z3 = z1 complex num1 = 0 complex denom1 = 0 complex num2 = 0 complex denom2 = 0 complex num3 = 0 complex denom3 = 0 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float theta = 0.0 float r = 0.0 complex qa = 0 complex qb = 0 complex qc = 0 complex qy = 0 complex qx = 0 complex cx = 0 complex cy = 0 loop: num1 = z1^2 + c1-1 denom1 = 2*z1 + c1-2 z1 = (num1/denom1)^2 num2 = z2^2 + c2-1 denom2 = 2*z2 + c2-2 z2 = (num2/denom2)^2 num3 = z3^2 + c3-1 denom3 = 2*z3 + c3-2 z3 = (num3/denom3)^2 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout || |z1-1|< @bailout2 ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout || |z1-1| < @bailout2); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (3RDIMMagnet1)" helpfile = "Classical Slope Formulas.chm" center = (1.0, 0.0) maxiter = 1000 magn = 0.5 periodicity = 0 method = multipass heading caption = "4D Magnet1 3RDIM" endheading heading caption = "Use Damien's Lighting Coloring" endheading heading caption = "or 3D Texturizer Enhanced III." endheading heading caption = "Most other coloring formulas" endheading heading caption = "can also be used." endheading param start caption = "Start" default = (0,0) endparam param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout (div)" default = 10000.0 min = 1 endparam param bailout2 caption = "Bailout (conv)" default = 0.000001 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExp3RDIMMagnet1J" bailout = @bailout bailout2 = @bailout2 p1 = @p1 p2 = @p2 p3 = #pixel offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeExp3RDIMMagnet1J { ; Ron Barnett January 1, 2005 ; January 3, 2005 bug fixes init: complex c1 = @p2 + real(@p3) + flip(imag(@p3)*@p1) complex c2 = @p2 + real(@p3) + flip(imag(@p3)*@p1) + @offset complex c3 = @p2 + real(@p3) + flip(imag(@p3)*@p1) + flip(@offset) complex z1 = @p1*real(#pixel) + flip(imag(#pixel)) complex z2 = z1 complex z3 = z1 complex num1 = 0 complex denom1 = 0 complex num2 = 0 complex denom2 = 0 complex num3 = 0 complex denom3 = 0 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float theta = 0.0 float r = 0.0 complex qa = 0 complex qb = 0 complex qc = 0 complex qy = 0 complex qx = 0 complex cx = 0 complex cy = 0 loop: num1 = z1^2 + c1-1 denom1 = 2*z1 + c1-2 z1 = (num1/denom1)^2 num2 = z2^2 + c2-1 denom2 = 2*z2 + c2-2 z2 = (num2/denom2)^2 num3 = z3^2 + c3-1 denom3 = 2*z3 + c3-2 z3 = (num3/denom3)^2 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout || |z1-1|< @bailout2 ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout || |z1-1| < @bailout2); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (3RDIMMagnet1J)" helpfile = "Classical Slope Formulas.chm" center = (-1.0, 0.0) maxiter = 1000 magn = 0.25 periodicity = 0 method = multipass heading caption = "4D Magnet1 3RDIM Julia" endheading heading caption = "Use Damien's Lighting Coloring" endheading heading caption = "Or 3D Texturizer Enhanced III" endheading heading caption = "Most other coloring formulas" endheading heading caption = "can also be used." endheading param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout (div)" default = 10000.0 min = 1 endparam param bailout2 caption = "Bailout (conv)" default = 0.000001 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "Seed" default = (-0.3375,0.75625) endparam heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExp3RDIMMagnet1" bailout = @bailout bailout2 = @bailout2 p1 = @p1 p2 = @p2 offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeExpSJMagnet1 { ; Ron Barnett January 1, 2005 ; January 4 2005 bug fixes init: complex c1 = @p2 + @p1*real(#pixel) + flip(imag(#pixel)) complex c2 = @p2 + @p1*real(#pixel) + flip(imag(#pixel)) + @offset complex c3 = @p2 + @p1*real(#pixel) + flip(imag(#pixel)) + flip(@offset) complex z1 = real(@start) + flip(imag(@start)*@p1) complex z2 = z1 complex z3 = z1 complex num1 = 0 complex denom1 = 0 complex num2 = 0 complex denom2 = 0 complex num3 = 0 complex denom3 = 0 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float theta = 0.0 float r = 0.0 complex qa = 0 complex qb = 0 complex qc = 0 complex qy = 0 complex qx = 0 complex cx = 0 complex cy = 0 loop: num1 = z1^2 + c1-1 denom1 = 2*z1 + c1-2 z1 = (num1/denom1)^2 num2 = z2^2 + c2-1 denom2 = 2*z2 + c2-2 z2 = (num2/denom2)^2 num3 = z3^2 + c3-1 denom3 = 2*z3 + c3-2 z3 = (num3/denom3)^2 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout || |z1-1|< @bailout2 ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout || |z1-1| < @bailout2); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (SJMagnet1)" helpfile = "Classical Slope Formulas.chm" center = (1.0, 0.0) maxiter = 1000 magn = 0.5 periodicity = 0 method = multipass heading caption = "4D Magnet1 SJ" endheading heading caption = "Use Damien's Lighting Coloring" endheading heading caption = "or 3D Texturizer Enhanced III." endheading heading caption = "Most other coloring formulas" endheading heading caption = "can also be used." endheading param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Start" default = (0,0) endparam param bailout caption = "Bailout (div)" default = 10000.0 min = 1 endparam param bailout2 caption = "Bailout (conv)" default = 0.000001 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpSJMagnet1J" bailout = @bailout bailout2 = @bailout2 p1 = @p1 p2 = @p2 p3 = #pixel offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeExpSJMagnet1J { ; Ron Barnett January 1, 2005 ; January 5, 2005 bug fixes init: complex c1 = @p2 + @p1*real(@p3) + flip(imag(@p3)) complex c2 = @p2 + @p1*real(@p3) + flip(imag(@p3)) + @offset complex c3 = @p2 + @p1*real(@p3) + flip(imag(@p3)) + flip(@offset) complex z1 = real(#pixel) + flip(imag(#pixel)*@p1) complex z2 = z1 complex z3 = z1 complex num1 = 0 complex denom1 = 0 complex num2 = 0 complex denom2 = 0 complex num3 = 0 complex denom3 = 0 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float theta = 0.0 float r = 0.0 complex qa = 0 complex qb = 0 complex qc = 0 complex qy = 0 complex qx = 0 complex cx = 0 complex cy = 0 loop: num1 = z1^2 + c1-1 denom1 = 2*z1 + c1-2 z1 = (num1/denom1)^2 num2 = z2^2 + c2-1 denom2 = 2*z2 + c2-2 z2 = (num2/denom2)^2 num3 = z3^2 + c3-1 denom3 = 2*z3 + c3-2 z3 = (num3/denom3)^2 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout || |z1-1|< @bailout2 ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout || |z1-1| < @bailout2); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (SJMagnet1J)" helpfile = "Classical Slope Formulas.chm" center = (-1.0, 0.0) maxiter = 1000 magn = 0.25 periodicity = 0 method = multipass heading caption = "4D Magnet1 SJ Julia" endheading heading caption = "Use Damien's Lighting Coloring" endheading heading caption = "or 3D Texturizer Enhanced III." endheading heading caption = "Most other coloring formulas" endheading heading caption = "can also be used." endheading param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout (div)" default = 10000.0 min = 1 endparam param bailout2 caption = "Bailout (conv)" default = 0.000001 endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "Seed" default = (-0.4375,0.1625) endparam heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpSJMagnet1" bailout = @bailout bailout2 = @bailout2 p1 = @p1 p2 = @p2 offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeExpSJMand01 { ; based upon the slope (Mandelbrot) ; formula of Damien Jones ; Ron Barnett, November 1999 ; Modified with more height values and bug fixes January 5, 2005 init: complex c1 = @p2 + @p1*real(#pixel) + flip(imag(#pixel)) complex c2 = @p2 + @p1*real(#pixel) + flip(imag(#pixel)) + @offset complex c3 = @p2 + @p1*real(#pixel) + flip(imag(#pixel)) + flip(@offset) complex z1 = real(#pixel) + flip(imag(#pixel)*@p1) complex z2 = z1 complex z3 = z1 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float theta = 0.0 float r = 0.0 complex qa = 0 complex qb = 0 complex qc = 0 complex qy = 0 complex qx = 0 complex cx = 0 complex cy = 0 loop: z1 = z1*z1 + c1 z2 = z2*z2 + c2 z3 = z3*z3 + c3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (SJMand01)" helpfile = "Classical Slope Formulas.chm" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 method = multipass $ifdef VER40 heading caption = "4D Mandelbrot SJ" endheading heading text = "Use Damien's Lighting Coloring \ or 3D Texturizer Enhanced III. \ Most other coloring formulas \ can also be used." endheading $else heading caption = "4D Mandelbrot SJ" endheading heading caption = "Use Damien's Lighting Coloring" endheading heading caption = "or 3D Texturizer Enhanced III." endheading heading caption = "Most other coloring formulas" endheading heading caption = "can also be used." endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandel set anymore." endparam param p1 caption = "Plane rotation" default = (0.0,0.0) endparam param p2 caption = "Plane position" default = (-0.75,0.0) endparam heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpSJMand01J" bailout = @bailout p1 = @p1 p2 = @p2 p3 = #pixel offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } SlopeExpSJMand01J {; Ron Barnett January 5, 2005 init: complex c1 = @p2 + @p1*real(@p3) + flip(imag(@p3)) complex c2 = @p2 + @p1*real(@p3) + flip(imag(@p3)) + @offset complex c3 = @p2 + @p1*real(@p3) + flip(imag(@p3)) + flip(@offset) complex z1 = real(#pixel) + flip(imag(#pixel)*@p1) complex z2 = z1 complex z3 = z1 int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float theta = 0.0 float r = 0.0 complex qa = 0 complex qb = 0 complex qc = 0 complex qy = 0 complex qx = 0 complex cx = 0 complex cy = 0 loop: z1 = z1*z1 + c1 z2 = z2*z2 + c2 z3 = z3*z3 + c3 iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: title = "SlopeExp (SJMand01J)" helpfile = "Classical Slope Formulas.chm" center = (0.0, 0.0) maxiter = 1000 periodicity = 0 method = multipass $ifdef VER40 heading caption = "4D Mandelbrot SJ Julia" endheading heading text = "Use Damien's Lighting Coloring \ or 3D Texturizer Enhanced III. \ Most other coloring formulas \ can also be used." endheading $else heading caption = "4D Mandelbrot SJ Julia" endheading heading caption = "Use Damien's Lighting Coloring" endheading heading caption = "or 3D Texturizer Enhanced III." endheading heading caption = "Most other coloring formulas" endheading heading caption = "can also be used." endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandel set anymore." endparam param p1 caption = "Plane rotation" default = (0.5,0.0) endparam param p2 caption = "Plane position" default = (0.0,0.0) endparam param p3 caption = "Seed" default = (-0.13125,0.66875) endparam heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpSJMand01" bailout = @bailout p1 = @p1 p2 = @p2 offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot } FunctionMand {; Ron Barnett, February 21, 2005 ; init: #z = #pixel loop: #z = @fn1(#z) + #pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Function Mand" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam func fn1 caption = "Function" default = sin() endfunc switch: type = "FunctionJulia" bailout = @bailout p1 = #pixel test = @test fn1 = @fn1 } FunctionJulia {; Ron Barnett, February 21, 2005 ; init: #z = #pixel loop: #z = @fn1(#z) + @p1 bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Function Julia" maxiter = 255 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "seed" default = (-0.1, 0.4) endparam func fn1 caption = "Function" default = sin() endfunc switch: type = "FunctionMand" bailout = @bailout test = @test fn1 = @fn1 } FormulaTracer { ; Ron Barnett ;Based upon the formulas of Stig Pettersson ;March 22, 2005 init: bool setflag=true bool tflag=false int m=0 int count2=0 float xf = 0 float yf = 0 float zf = 0 float wf = 0 float t = 0 complex zh=0 float color1=-1.23456789e20 float color2=1.23456789e20 float temp0=0 float lightdx=0 float lightdy=0 float lightdz=0 float lightlength=0 float flength=0 float fx=0 float fy=0 float fz=0 float tangle=0 float buff0=0 float buff1=0 float buff2=0 float buff3=0 float buff4=0 float diffx=0 float diffy=0 float count=0 float count0=0 float xx=0 float yy=0 float zz=0 float ww=0 float length=0.0 float xscreen=real(#screenmax) float yscreen=imag(#screenmax) float zscreen=@zscreen float xmin=0 float ymin=0 float xmax=0 float ymax=0 float fx = 0 float fy = 0 if xscreen/yscreen>4/3 temp0=3/#magn float temp0=-3/#magn ymin=imag(#center)-temp0/2 ymax=ymin+temp0 temp0=-xscreen/yscreen*temp0 xmin=real(#center)-temp0/2 xmax=xmin+temp0 else temp0=4/#magn xmin=real(#center)-temp0/2 xmax=xmin+temp0 temp0=-yscreen/xscreen*temp0 ymin=imag(#center)-temp0/2 ymax=ymin+temp0 endif float zmax=@zorig+@zdist/2 float zmin=zmax-@zdist if @zmagn==true zmax=@zorig+@zdist/2/#magn zmin=zmax-@zdist/#magn endif if @autoscale==true zscreen=xscreen/(xmax-xmin)*(zmax-zmin) endif float dx=(xmax-xmin)/xscreen float dy=(ymax-ymin)/yscreen float dz=(zmax-zmin)/zscreen float origx=real(#center) float origy=imag(#center) float origz=@zorig float vx=@xrot/180.0*#pi float vy=@yrot/180.0*#pi float vz=@zrot/180.0*#pi float cosx=0 float cosy=0 float cosz=0 float sinx=0 float siny=0 float sinz=0 if @xrot==90.0 sinx=1.0 cosx=0 elseif @xrot==-90 sinx=-1.0 cosx=0 elseif abs(@xrot)==180 sinx=0 cosx=-1 else cosx=cos(vx) sinx=sin(vx) endif if @yrot==90.0 siny=1.0 cosy=0 elseif @yrot==-90 siny=-1.0 cosy=0 elseif abs(@yrot)==180 siny=0 cosy=-1 else cosy=cos(vy) siny=sin(vy) endif if @zrot==90.0 sinz=1.0 cosz=0 elseif @zrot==-90 sinz=-1.0 cosz=0 elseif abs(@zrot)==180 sinz=0 cosz=-1 else cosz=cos(vz) sinz=sin(vz) endif float rminx=0 float rminy=0 float rminz=0 float xy=0 float xz=0 float yx=0 float yz=0 float zx=0 float zy=0 float tempx=0 float tempy=0 float tempz=0 float dxx=0 float dxy=0 float dxz=0 float dyx=0 float dyy=0 float dyz=0 float dzx=0 float dzy=0 float dzz=0 float dzx=0 float dzy=0 float dzz=0 float dzx1=0 float dzy1=0 float dzz1=0 ; rotating the space and creation of unit-vectors xx=rminx=xmin yy=rminy=ymin zz=rminz=zmin if @local==true xx=xx-origx yy=yy-origy zz=zz-origz endif xy=yy*cosx-zz*sinx xz=yy*sinx+zz*cosx yy=xy zz=xz yx=xx*cosy+zz*siny yz=-xx*siny+zz*cosy xx=yx zz=yz zx=xx*cosz-yy*sinz zy=xx*sinz+yy*cosz xx=zx yy=zy if @local==true xx=xx+origx yy=yy+origy zz=zz+origz endif rminx=xx rminy=yy rminz=zz xx=tempx=xmax yy=tempy=ymin zz=tempz=zmin if @local==true xx=xx-origx yy=yy-origy zz=zz-origz endif xy=yy*cosx-zz*sinx xz=yy*sinx+zz*cosx yy=xy zz=xz yx=xx*cosy+zz*siny yz=-xx*siny+zz*cosy xx=yx zz=yz zx=xx*cosz-yy*sinz zy=xx*sinz+yy*cosz xx=zx yy=zy if @local==true xx=xx+origx yy=yy+origy zz=zz+origz endif tempx=xx tempy=yy tempz=zz dxx=(tempx-rminx)/xscreen dxy=(tempy-rminy)/xscreen dxz=(tempz-rminz)/xscreen xx=tempx=xmin yy=tempy=ymax zz=tempz=zmin if @local==true xx=xx-origx yy=yy-origy zz=zz-origz endif xy=yy*cosx-zz*sinx xz=yy*sinx+zz*cosx yy=xy zz=xz yx=xx*cosy+zz*siny yz=-xx*siny+zz*cosy xx=yx zz=yz zx=xx*cosz-yy*sinz zy=xx*sinz+yy*cosz xx=zx yy=zy if @local==true xx=xx+origx yy=yy+origy zz=zz+origz endif tempx=xx tempy=yy tempz=zz dyx=(tempx-rminx)/yscreen dyy=(tempy-rminy)/yscreen dyz=(tempz-rminz)/yscreen xx=tempx=xmin yy=tempy=ymin zz=tempz=zmax if @local==true xx=xx-origx yy=yy-origy zz=zz-origz endif xy=yy*cosx-zz*sinx xz=yy*sinx+zz*cosx yy=xy zz=xz yx=xx*cosy+zz*siny yz=-xx*siny+zz*cosy xx=yx zz=yz zx=xx*cosz-yy*sinz zy=xx*sinz+yy*cosz xx=zx yy=zy if @local==true xx=xx+origx yy=yy+origy zz=zz+origz endif tempx=xx tempy=yy tempz=zz dzx=(tempx-rminx)/zscreen dzy=(tempy-rminy)/zscreen dzz=(tempz-rminz)/zscreen dzx1=dzx/@prec dzy1=dzy/@prec dzz1=dzz/@prec ; end rotation and creating unit-vectors 'puuh' if @formula==0 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (xf^2+yf^2+zf^2-@a*@c^2)^2-@b*((zf-@c)^2-2*xf^2)*((zf+@c)^2-2*yf^2) length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (xf^2+yf^2+zf^2-@a*@c^2)^2-@b*((zf-@c)^2-2*xf^2)*((zf+@c)^2-2*yf^2) length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==1 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4-5*xf^2+yf^4-5*yf^2+zf^4-5*zf^2+11.8 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4-5*xf^2+yf^4-5*yf^2+zf^4-5*zf^2+11.8 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==2 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (xf^2+yf^2+zf^2+2*yf-1)*((xf^2+yf^2+zf^2-2*yf-1)^2-8*zf^2)+ \ 16*xf*zf*(xf^2+yf^2+zf^2-2*yf-1) length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (xf^2+yf^2+zf^2+2*yf-1)*((xf^2+yf^2+zf^2-2*yf-1)^2-8*zf^2)+ \ 16*xf*zf*(xf^2+yf^2+zf^2-2*yf-1) length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==3 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 64*(1-zf)^3*zf^3-48*(1-zf)^2*zf^2*(3*xf^2+3*yf^2+2*zf^2)+ \ 12*(1-zf)*zf*(27*(xf^2+yf^2)^2-24*zf^2*(xf^2+yf^2)+ \ 36*sqrt(2)*yf*zf*(yf^2-3*xf^2)+4*zf^4)+ \ (9*xf^2+9*yf^2-2*zf^2)*(-81*(xf^2+yf^2)^2-72*zf^2*(xf^2+yf^2)+ \ 108*sqrt(2)*xf*zf*(xf^2-3*yf^2)+4*zf^4) length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 64*(1-zf)^3*zf^3-48*(1-zf)^2*zf^2*(3*xf^2+3*yf^2+2*zf^2)+ \ 12*(1-zf)*zf*(27*(xf^2+yf^2)^2-24*zf^2*(xf^2+yf^2)+ \ 36*sqrt(2)*yf*zf*(yf^2-3*xf^2)+4*zf^4)+ \ (9*xf^2+9*yf^2-2*zf^2)*(-81*(xf^2+yf^2)^2-72*zf^2*(xf^2+yf^2)+ \ 108*sqrt(2)*xf*zf*(xf^2-3*yf^2)+4*zf^4) length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==4 t = 0.5*(1 + sqrt(5)) count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 4*(t^2*xf^2 - yf^2)*(t^2*yf^2 - zf^2)*(t^2*zf^2 - xf^2) - \ (1+2*t)*(xf^2 + yf^2 + zf^2 - 1)^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 4*(t^2*xf^2 - yf^2)*(t^2*yf^2 - zf^2)*(t^2*zf^2 - xf^2) - \ (1+2*t)*(xf^2 + yf^2 + zf^2 - 1)^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==5 t = 0.5*(1 + sqrt(5)) count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=@fourthdim count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) wf = imag(zh) z = 8*(xf^2-t^4*yf^2)*(yf^2-t^4*zf^2)*(zf^2-t^4*xf^2)* \ (xf^4+yf^4+zf^4-2*xf^2*yf^2-2*xf^2*zf^2-2*yf^2*zf^2)+ \ +(3+5*t)*(xf^2+yf^2+zf^2-wf^2)^2*(xf^2+yf^2+zf^2-(2-t)*wf^2)^2*wf^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) wf = imag(zh) z = 8*(xf^2-t^4*yf^2)*(yf^2-t^4*zf^2)*(zf^2-t^4*xf^2)* \ (xf^4+yf^4+zf^4-2*xf^2*yf^2-2*xf^2*zf^2-2*yf^2*zf^2)+ \ +(3+5*t)*(xf^2+yf^2+zf^2-wf^2)^2*(xf^2+yf^2+zf^2-(2-t)*wf^2)^2*wf^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==6 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = yf^2*(@a^2 - (xf^2 + zf^2)) - (xf^2 + zf^2 + 2*@a*yf - @a^2)^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = yf^2*(@a^2 - (xf^2 + zf^2)) - (xf^2 + zf^2 + 2*@a*yf - @a^2)^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==7 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (xf^2 + yf^2 + zf^2)^2 - @a*(xf^2 + zf^2)*yf length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (xf^2 + yf^2 + zf^2)^2 - @a*(xf^2 + zf^2)*yf length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==8 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (xf^2 + yf^2 + zf^2 + @a^2)^2 - @c*@a^2*(xf^2 + zf^2) - @b^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (xf^2 + yf^2 + zf^2 + @a^2)^2 - @c*@a^2*(xf^2 + zf^2) - @b^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==9 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = -5*(xf^2*yf+xf^2*zf+yf^2*xf+yf^2*zf+zf^2*yf+zf^2*xf)+ \ 2*(xf*yf+xf*zf+yf*zf) length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = -5*(xf^2*yf+xf^2*zf+yf^2*xf+yf^2*zf+zf^2*yf+zf^2*xf)+ \ 2*(xf*yf+xf*zf+yf*zf) length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==10 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 81*(xf^3+yf^3+zf^3)-189*(xf^2*yf+xf^2*zf+yf^2*xf+yf^2*zf+zf^2*xf+zf^2*yf)+ \ 54*(xf*yf*zf)+126*(xf*yf+xf*zf+yf*zf)-9*(xf^2+yf^2+zf^2)-9*(xf+yf+zf)+1 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 81*(xf^3+yf^3+zf^3)-189*(xf^2*yf+xf^2*zf+yf^2*xf+yf^2*zf+zf^2*xf+zf^2*yf)+ \ 54*(xf*yf*zf)+126*(xf*yf+xf*zf+yf*zf)-9*(xf^2+yf^2+zf^2)-9*(xf+yf+zf)+1 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==11 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = zf^2*xf^2 - zf^4 - 2*zf*xf^2 + 2*zf^3 + xf^2 - zf^2 \ -(xf^2 - zf)^2 - yf^4 - 2*xf^2*yf^2 - yf^2*zf^2 + 2*yf^2*zf + yf^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = zf^2*xf^2 - zf^4 - 2*zf*xf^2 + 2*zf^3 + xf^2 - zf^2 \ -(xf^2 - zf)^2 - yf^4 - 2*xf^2*yf^2 - yf^2*zf^2 + 2*yf^2*zf + yf^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==12 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4 + 2*xf^2*zf^2 - 0.36*xf^2 - yf^4 + 0.25*yf^2 + zf^4 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4 + 2*xf^2*zf^2 - 0.36*xf^2 - yf^4 + 0.25*yf^2 + zf^4 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==13 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = ((yf^2-xf^2)/(2*zf)+2*zf^2/9+2/3)^3- \ 6*((yf^2-xf^2)/(4*zf)-(1/4)*(xf^2+yf^2+(8/9)*zf^2)+2/9)^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = ((yf^2-xf^2)/(2*zf)+2*zf^2/9+2/3)^3- \ 6*((yf^2-xf^2)/(4*zf)-(1/4)*(xf^2+yf^2+(8/9)*zf^2)+2/9)^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==14 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (yf^2 + zf^2) * (1 + (@b - 4*@a)*xf) + xf^2*(1 + @b) length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (yf^2 + zf^2) * (1 + (@b - 4*@a)*xf) + xf^2*(1 + @b) length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==15 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 0.5*xf^5 + 0.5*xf^4 - (yf^2 + zf^2) length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 0.5*xf^5 + 0.5*xf^4 - (yf^2 + zf^2) length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==16 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (2*xf^2+yf^2+zf^2-1)^3-(1/10)*xf^2*zf^3-yf^2*zf^3 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (2*xf^2+yf^2+zf^2-1)^3-(1/10)*xf^2*zf^3-yf^2*zf^3 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==17 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 4*(xf^2+yf^2+zf^2-13)^3 + 27*(3*xf^2+yf^2-4*zf^2-12)^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 4*(xf^2+yf^2+zf^2-13)^3 + 27*(3*xf^2+yf^2-4*zf^2-12)^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==18 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4 + 2*xf^2*yf^2 - 2*xf^2*zf^2 - 2*(@a^2+@b^2)*xf^2 + yf^4 - \ 2*yf^2*zf^2 + 2*(@a^2-@b^2)*yf^2 + zf^4 + 2*(@a^2+@b^2)*zf^2 + \ (@a^2-@b^2)^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4 + 2*xf^2*yf^2 - 2*xf^2*zf^2 - 2*(@a^2+@b^2)*xf^2 + yf^4 - \ 2*yf^2*zf^2 + 2*(@a^2-@b^2)*yf^2 + zf^4 + 2*(@a^2+@b^2)*zf^2 + \ (@a^2-@b^2)^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==19 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (yf^2 + zf^2) - @b^2 * xf^4 + @b^2 * @a^2 * xf^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (yf^2 + zf^2) - @b^2 * xf^4 + @b^2 * @a^2 * xf^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==20 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4+yf^4+zf^4+@a*(xf^2+yf^2+zf^2)+@b*(xf^2*yf^2+xf^2*zf^2+yf^2*zf^2)+ \ @c*xf*yf*zf-1 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4+yf^4+zf^4+@a*(xf^2+yf^2+zf^2)+@b*(xf^2*yf^2+xf^2*zf^2+yf^2*zf^2)+ \ @c*xf*yf*zf-1 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==21 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4 - xf^2 + yf^2 + zf^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4 - xf^2 + yf^2 + zf^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==22 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 4*xf^2*(xf^2 + yf^2 + zf^2) - yf^2*(1 - yf^2 - zf^2) length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 4*xf^2*(xf^2 + yf^2 + zf^2) - yf^2*(1 - yf^2 - zf^2) length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==23 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = yf^3 + zf^3 - 6*yf*zf length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = yf^3 + zf^3 - 6*yf*zf length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==24 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = zf^2*xf^2-zf^4-2*zf*xf^2+2*zf^3+xf^2-zf^2-(xf^2-zf)^2-yf^4 - \ 2*yf^2*xf^2-yf^2*zf^2+2*yf^2*zf+yf^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = zf^2*xf^2-zf^4-2*zf*xf^2+2*zf^3+xf^2-zf^2-(xf^2-zf)^2-yf^4 - \ 2*yf^2*xf^2-yf^2*zf^2+2*yf^2*zf+yf^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==25 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4 + 2*xf^2*yf^2-2*xf^2*zf-(@a^2+@b^2)*xf^2+yf^4-2*yf^2*zf+ \ (@a^2-@b^2)*yf^2+zf^2+(@a^2+@b^2)*zf+(@a^2-@b^2)^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4 + 2*xf^2*yf^2-2*xf^2*zf-(@a^2+@b^2)*xf^2+yf^4-2*yf^2*zf+ \ (@a^2-@b^2)*yf^2+zf^2+(@a^2+@b^2)*zf+(@a^2-@b^2)^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==26 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4 + yf^4 + zf^4 - (xf^2 + yf^2 + zf^2) length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4 + yf^4 + zf^4 - (xf^2 + yf^2 + zf^2) length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==27 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^2*yf^2 + xf^2*zf^2 + yf^2*zf^2 + xf*yf*zf length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^2*yf^2 + xf^2*zf^2 + yf^2*zf^2 + xf*yf*zf length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==28 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^2*yf^2-xf^2*zf^2+yf^2*zf^2-xf*yf*zf length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^2*yf^2-xf^2*zf^2+yf^2*zf^2-xf*yf*zf length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==29 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = yf^2-2*xf*yf^2-xf*zf^2+xf^2*yf^2+xf^2*zf^2-zf^4 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = yf^2-2*xf*yf^2-xf*zf^2+xf^2*yf^2+xf^2*zf^2-zf^4 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==30 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (@b - xf)*(yf^2 + zf^2) - @c^2*@a*xf^2 - @c^2*xf^3 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (@b - xf)*(yf^2 + zf^2) - @c^2*@a*xf^2 - @c^2*xf^3 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==31 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4 + yf^4 + zf^4 + 2*xf^2*yf^2 + 2*xf^2*zf^2 + 2*yf^2*zf^2 \ -2*(@a^2 + @b^2)*xf^2 + 2*(@a^2 - @b^2)*yf^2 \ -2*(@a^2 + @b^2)*zf^2 + (@a^2 - @b^2)^2 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = xf^4 + yf^4 + zf^4 + 2*xf^2*yf^2 + 2*xf^2*zf^2 + 2*yf^2*zf^2 \ -2*(@a^2 + @b^2)*xf^2 + 2*(@a^2 - @b^2)*yf^2 \ -2*(@a^2 + @b^2)*zf^2 + (@a^2 - @b^2)^2 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==32 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 4*(xf^4 + (yf^2 + zf^2)^2) + 17 * xf^2 * (yf^2 + zf^2) - \ 20 * (xf^2 + yf^2 + zf^2) + 17 length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = 4*(xf^4 + (yf^2 + zf^2)^2) + 17 * xf^2 * (yf^2 + zf^2) - \ 20 * (xf^2 + yf^2 + zf^2) + 17 length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==33 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = @a * (yf - 1) + (xf^2 + zf^2) * yf length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = @a * (yf - 1) + (xf^2 + zf^2) * yf length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 elseif @formula==34 count0=0 repeat diffx=0 diffy=0 if count0==1 diffx=-@delta elseif count0==2 diffx=@delta elseif count0==3 diffy=@delta elseif count0==4 diffy=-@delta endif tempx=rminx+(real(#screenpixel)+diffx)*dxx+(imag(#screenpixel)+diffy)*dyx tempy=rminy+(real(#screenpixel)+diffx)*dxy+(imag(#screenpixel)+diffy)*dyy tempz=rminz+(real(#screenpixel)+diffx)*dxz+(imag(#screenpixel)+diffy)*dyz xx=tempx yy=tempy zz=tempz ww=0.0 count=0.0 repeat xx=xx+dzx yy=yy+dzy zz=zz+dzz z1=xx+flip(yy) zh=zz+flip(ww) m=0 z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (@b^2/@c^2*(@c^2-zf^2)+@a^2-xf^2-yf^2)^2 - \ 4*@b^2/@c^2*(@c^2-fz^2)*(@a^2-xf^2) length=|z| m=m+1 until m>=#maxiter || length>=@bailout count=count+1 until (count>=zscreen || length<@bailout) if count==1 if m>=#maxiter&&@touchscreen==true tflag=true endif endif if (length<@bailout)&&(count>1) count2=0 repeat xx=xx-dzx1 yy=yy-dzy1 zz=zz-dzz1 m=0 z1=xx+flip(yy) zh=zz+flip(ww) z=z1 repeat xf = real(z) yf = imag(z) zf = real(zh) z = (@b^2/@c^2*(@c^2-zf^2)+@a^2-xf^2-yf^2)^2 - \ 4*@b^2/@c^2*(@c^2-fz^2)*(@a^2-xf^2) length=|z| m=m+1 until m>=#maxiter || length>@bailout count2=count2+1 until length>=@bailout if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif elseif count==1 if count0==0 buff0=zmin+count*dz-(count2-1)*dz/@prec elseif count0==1 buff1=zmin+count*dz-(count2-1)*dz/@prec elseif count0==2 buff2=zmin+count*dz-(count2-1)*dz/@prec elseif count0==3 buff3=zmin+count*dz-(count2-1)*dz/@prec elseif count0==4 buff4=zmin+count*dz-(count2-1)*dz/@prec endif else if count0==0 buff0=zmax+dz count0=6 elseif count0==1 buff1=zmax+dz elseif count0==2 buff2=zmax+dz elseif count0==3 buff3=zmax+dz elseif count0==4 buff4=zmax+dz endif endif count0=count0+1 until count0>=5 endif ; tracing if buff0>zmax&&@background>0 setflag=false else lightdx=real(#screenpixel)*dx+xmin-@lightx lightdy=imag(#screenpixel)*dy+ymin-@lighty lightdz=buff0-@lightz lightlength=sqrt(lightdx*lightdx+lightdy*lightdy+lightdz*lightdz) fx=(buff2-buff1)*2*dy fy=-2*dx*(buff4-buff3) fz=-4*dx*dy flength=sqrt(fx*fx+fy*fy+fz*fz) tangle=(fx*lightdx+fy*lightdy+fz*lightdz)/(flength*lightlength) endif if tflag==true setflag=false endif loop: if buff0>zmax if @background==0 z=tangle+flip(color2) elseif @background==1 setflag=false endif elseif tflag==true setflag=false else z=tangle+flip(color1) endif bailout: setflag==false default: heading caption="Requires Raytrace in spr.ucl" endheading heading caption="or Texture Raytrace in reb.ucl" endheading heading caption = "Based upon the formulas of" endheading heading caption = "Stig Pettersson" endheading title = "Formula Tracer" method=onepass periodicity=0 maxiter=1 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param formula enum= "Chair" "Tangle Cube" "Klein Bottle" "Boy Surface" "Barth Sextic" \ "Barth Decic" "Bicorn" "Bifolium" "Cassini Ovals" "Cayley Cubic" \ "Clebsch Diagonal Cubic" "Cushion" "3D Devil's Curve" "Ennepers Surface" \ "Folium Surface" "Glob" "Heart" "Hunt Surface" "Hyperbolic Torus" \ "Kampyle of Eudoxus" "Kummer Surface" "Eight Curve" "Mitre surface" \ "Nodal Cubic" "Odd Surface" "Parabolic Torus" "Tooth" "Steiners Roman Surface" \ "Steiner Variant #1" "Steiner Variant #2" "Strophoid" "Torus" \ "Sorta Torus" "Witch of Agnesi" "Bohemian Dome" default=3 endparam param fourthdim caption="4D value" default=0.0 visible=@formula==5 endparam param zorig caption="z-center" default=0.0 hint="Center of z-axis." endparam param a caption = "Param a" default = 1.0 visible=@formula==0 ||@formula==6 || @formula==7 || @formula==8 || @formula==14 \ || @formula==18 || @formula==19 || @formula==20 || @formula==25 \ || @formula==30 || @formula==31 || @formula==33 || @formula==34 endparam param b caption = "Param b" default = 1.0 visible=@formula==0 ||@formula==8 || @formula==14 || @formula==18 || @formula==19 \ || @formula==20 || @formula==25 || @formula==30 || @formula==31 \ || @formula==34 endparam param c caption = "Param c" default = 1.0 visible=@formula==0 ||@formula==8 || @formula==20 || @formula==30 \ || @formula==34 endparam param background enum="outside" "inside" default=1 hint="What type of background-coloring you want. With inside only one colour or inside \ coloring filter" endparam param touchscreen caption="Screen-touch" default=false hint="Those structures that goes out of the screen, or touches it, is colored with \ inside colouring." endparam heading caption = "" endheading param xrot caption="x-rotation" default=0.0 hint="Rotates the system through the x-axis." endparam param yrot caption="y-rotation" default=0.0 hint="Rotates the system through the y-axis." endparam param zrot caption="z-rotation" default=0.0 hint="Rotates the system through the z-axis." endparam param local caption="Local rotation" default=true hint="Sets local rotation. Otherwise location around zero." endparam param lightx caption="Light-x" default=0.0 hint="x-coord of lightsource" endparam param lighty caption="Light-y" default=0.0 hint="y-coord of lightsource" endparam param lightz caption="Light-z" default=-6.0 hint="z-coord of lightsource" endparam param zscreen caption="Screen-depth" default=320.0 hint="Screendepth in virtual pixels." min=0 endparam param zdist caption="z-distance" default=4.0 hint="Length of z-axis." endparam param zmagn caption="z-magnify" default=false hint="If set then the fractal will be magnified in the third dimension too." endparam param autoscale caption="Auto scaling" default=false hint="If set then the screendepth in virtual pixels will be set to hold the same scalar \ proportions as the x-axis. Take it easy with this as you don't have to \ magnify the screensurface very much to get a very long z-axis in pixels. If \ z-magnify is set too then there is no danger in overproportions." endparam param prec caption="Precision" default=10.0 min=1.0 hint="Precision for the fine tracing. The lower, the faster but with less precision. \ Smallest value allowed is 1.0" endparam param delta caption="Delta" default=1.0 hint="The difference between the points that builds the normal-plane to the lightsource. \ Should normally be 1.0" endparam param bailout caption="Trace Width" default=0.5 endparam } Slope_Apollonian { ; Ron Barnett April 23, 2005 ; Implements the mapping algorithm of Susan Chambless ; Implements fBm in the global section using a noise array ; and modification of Damien's fBm code ; Circle perturbations added August 13, 2005 ; improved duplicate removal code, November 18, 2005 global: int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) float count[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float agree = 100 float thresh = @scircle/agree int l = 0 int ir = 0 int si = 0 int sj = 0 bool continue = true complex rra = 0 float rrb = 0 float c = 0 float ddx = 0 float fx = 0.0 float ffx = 0.0 float xx = 0.0 float fy = 0.0 float ffy = 0.0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float xmin = cx - txmax/2 float ymin = cy - tymax/2 int MaxLevel = @level int level = MaxLevel complex cs[1000000] float rad[1000000] float ang = 2*#pi/3 complex ipi = flip(#pi); float ar = 0 float br = 0 complex a = 0 complex b = 0 float temp = 0 int ii = 0 int i = 0 int j = 0 int k = 0 int ib = 0 int start = 0 int finish = 0 int lev = 2 float ddx = 0 float ddy = 0 float ddr = 0 int pert = @pert pert = 11 - pert float scle2 = 0 float scle = 0 if (@ptype == "None") scle = 2 + sqrt(3) scle2 = 1 elseif (@ptype == "Outer Circles") scle = (2 + sqrt(3))*cos(#pi/(pert+6)) scle2 = (scle-sqrt(3)-1.5)/0.5 else ; distance to origin for base spheres scle = 2 + sqrt(3) if pert == 10 scle2 = 1.0041268407 elseif pert == 9 scle2 = 1.0049465720 elseif pert == 8 scle2 = 1.0060422243 elseif pert == 7 scle2 = 1.0075560883 elseif pert == 6 scle2 = 1.0097381547 elseif pert == 5 scle2 = 1.0130643119 elseif pert == 4 scle2 = 1.0185254 elseif pert == 3 scle2 = 1.0286754 elseif pert == 2 scle2 = 1.0515254 elseif pert == 1 scle2 = 1.1277437913 endif endif int maxi float gsum[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] complex gr = (1,1) complex gr2 = (0,1) ^ 0.411111111111 float gfreq = 1.0 int gi = 0 complex gp = 0 float gbx0 = 0 float gby0 = 0 float gbx1 = 0 float gby1 = 0 float grx0 = 0 float gry0 = 0 float grx1 = 0 float gry1 = 0 float gb00 = 0 float gb10 = 0 float gb01 = 0 float gb11 = 0 float gg_b00_0 = 0 float gg_b10_0 = 0 float gg_b01_0 = 0 float gg_b11_0 = 0 float gg_b00_1 = 0 float gg_b10_1 = 0 float gg_b01_1 = 0 float gg_b11_1 = 0 float gd = 0.0 float gu1 = 0 float gv1 = 0 float gu2 = 0 float gv2 = 0 float gsx = 0 float gsy = 0 float ga = 0 float gb = 0 complex gpixel=0 complex gp = 0 float fsum = 0 ; while (h < #height+ht) while (w < #width+wd) gpixel = w/(#width+wd) + flip(h/(#height+ht)) gp = gpixel * @gnscale * gr + @gnoffset gi = @giter gfreq = @gfreq gsum[w,h] = 0 WHILE (gi > 0) gbx0 = floor(real(gp)) % 256 gby0 = floor(imag(gp)) % 256 IF (gbx0 < 0) gbx0 = gbx0 + 256 ENDIF IF (gby0 < 0) gby0 = gby0 + 256 ENDIF gbx1 = (gbx0 + 1) % 256 gby1 = (gby0 + 1) % 256 grx0 = real(gp) - floor(real(gp)) gry0 = imag(gp) - floor(imag(gp)) grx1 = grx0 - 1 gry1 = gry0 - 1 gb00 = (gbx0^2 % 65536 + gby0)^2 % 65536 gb10 = (gbx1^2 % 65536 + gby0)^2 % 65536 gb01 = (gbx0^2 % 65536 + gby1)^2 % 65536 gb11 = (gbx1^2 % 65536 + gby1)^2 % 65536 gg_b00_0 = (gb00)^2*0.25 % 512 - 256 gg_b10_0 = (gb10)^2*0.25 % 512 - 256 gg_b01_0 = (gb01)^2*0.25 % 512 - 256 gg_b11_0 = (gb11)^2*0.25 % 512 - 256 gg_b00_1 = (gb00+1)^2*0.25 % 512 - 256 gg_b10_1 = (gb10+1)^2*0.25 % 512 - 256 gg_b01_1 = (gb01+1)^2*0.25 % 512 - 256 gg_b11_1 = (gb11+1)^2*0.25 % 512 - 256 gd = 1 / sqrt(sqr(gg_b00_0) + sqr(gg_b00_1)) gg_b00_0 = gg_b00_0 * gd gg_b00_1 = gg_b00_1 * gd gd = 1 / sqrt(sqr(gg_b10_0) + sqr(gg_b10_1)) gg_b10_0 = gg_b10_0 * gd gg_b10_1 = gg_b10_1 * gd gd = 1 / sqrt(sqr(gg_b01_0) + sqr(gg_b01_1)) gg_b01_0 = gg_b01_0 * gd gg_b01_1 = gg_b01_1 * gd gd = 1 / sqrt(sqr(gg_b11_0) + sqr(gg_b11_1)) gg_b11_0 = gg_b11_0 * gd gg_b11_1 = gg_b11_1 * gd gu1 = grx0 * gg_b00_0 + gry0 * gg_b00_1 gv1 = grx1 * gg_b10_0 + gry0 * gg_b10_1 gu2 = grx0 * gg_b01_0 + gry1 * gg_b01_1 gv2 = grx1 * gg_b11_0 + gry1 * gg_b11_1 gsx = sqr(grx0) * (3 - grx0*2) gsy = sqr(gry0) * (3 - gry0*2) ga = gu1 + gsx*(gv1-gu1) gb = gu2 + gsx*(gv2-gu2) gsum[w,h] = gsum[w,h] + (ga + gsy*(gb-ga))*gfreq gfreq = gfreq / 2 gp = gp * gr2 * 2 gi = gi - 1 ENDWHILE w = w + 1 endwhile w = 0 h = h + 1 endwhile w = 0 h = 0 ; ; initialize count array ; while(h < #height+wd) while(w < #width+ht) count[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; cs[1] = exp((0,0)*ang+ipi)*scle cs[2] = exp((0,1)*ang+ipi)*scle cs[3] = exp((0,2)*ang+ipi)*scle cs[4] = 0 rad[1] = sqrt(3)+1.5 rad[2] = rad[1] rad[3] = rad[1] if (@ptype == "None") rad[4] = 0.5 elseif (@ptype == "Outer Circles") rad[4] = scle-sqrt(3)-1.5 else ; inner inversion circle radius if pert == 10 rad[4] = 0.5151714074 elseif pert == 9 rad[4] = 0.5181320854 elseif pert == 8 rad[4] = 0.5220631074 elseif pert == 7 rad[4] = 0.5274464005 elseif pert == 6 rad[4] = 0.5351105381 elseif pert == 5 rad[4] = 0.5465863845 elseif pert == 4 rad[4] = 0.564987 elseif pert == 3 rad[4] = 0.597588 elseif pert == 2 rad[4] = 0.665053 elseif pert == 1 rad[4] = 0.8524941755 endif endif cs[5] = exp((0,0)*ang)*scle2 cs[6] = exp((0,1)*ang)*scle2 cs[7] = exp((0,2)*ang)*scle2 cs[8] = 0 if (@ptype == "None")||(@ptype == "Outer Circles") rad[5] = sqrt(3)/2*scle2 rad[6] = rad[5] rad[7] = rad[5] rad[8] = rad[5]+1*scle2 else ; base sphere radii if pert == 10 rad[5] = 0.8618985631 elseif pert == 9 rad[5] = 0.8610788318 elseif pert == 8 rad[5] = 0.8599831795 elseif pert == 7 rad[5] = 0.8584693155 elseif pert == 6 rad[5] = 0.8562872491 elseif pert == 5 rad[5] = 0.8529610919 elseif pert == 4 rad[5] = 0.8475 elseif pert == 3 rad[5] = 0.83735 elseif pert == 2 rad[5] = 0.8145 elseif pert == 1 rad[5] = 0.7382816125 endif rad[6] = rad[5] rad[7] = rad[5] rad[8] = rad[5]+1 endif ; ; Traverse the levels i = 4 ii = 9 int iii = 0 ; level 1 while ib < 8 if ib >= 0 && ib < 4 i = ib + 5 j = i - 4 else i = ib + 1 j = i - 3 if i == 8 j = 1 endif endif ar = rad[j], br = rad[i], a = cs[j], b = cs[i] temp = ar^2/(|a-b|-br^2), rad[ii] = temp*br, cs[ii] = temp*(b-a) + a ii = ii + 1 ib = ib + 1 endwhile start = 9 finish = 13 while lev <= level if lev == 2 || lev == 3 iii = start endif k = 1 while iii < finish while k <=4 ar = rad[k], br = rad[iii], a = cs[k], b = cs[iii] temp = ar^2/(|a-b|-br^2), rad[ii] = (temp*br) if abs(rad[ii]) < abs(rad[iii]) cs[ii] = temp*(b-a) + a if abs(rad[ii]) < @scircle ii = ii - 1 endif ii = ii + 1 endif ; duplicate removal if lev < 4 i = 5 while i < ii-1 ddx = real(cs[i])-real(cs[ii-1]) ddy = imag(cs[i])-imag(cs[ii-1]) ddr = rad[i]-rad[ii-1] if ddx < -thresh c = -1 elseif ddx > thresh c = 1 elseif ddy < -thresh c = -1 elseif ddy > thresh c = 1 elseif ddr < -thresh c = -1 elseif ddr > thresh c = 1 else c = 0 endif if c == 0 ||((rad[ii-1]<0) && lev > 2 && @lace) i = ii-1 ii = ii-1 endif i = i + 1 endwhile endif k = k + 1 endwhile k = 1 iii= iii + 1 endwhile if lev == 2 start = ii-12 finish = ii else if finish == ii lev = level+1 endif finish = ii endif lev = lev + 1 j = ii-finish if j > 0 l = round((j)/2) + 1 ir = j continue = true repeat if l > 1 l = l-1 rra = cs[l-1+finish] rrb = rad[l-1+finish] else rra = cs[ir-1+finish] rrb = rad[ir-1+finish] cs[ir-1+finish] = cs[finish] rad[ir-1+finish] = rad[finish] ir = ir-1 if ir == 0 cs[finish] = rra rad[finish] = rrb continue = false endif endif if continue == true si = l sj = 2*l endif while (sj <= ir) && (continue == true) if sj < ir ddx = real(cs[sj-1+finish])-real(cs[sj+finish]) ddy = imag(cs[sj-1+finish])-imag(cs[sj+finish]) ddr = rad[sj-1+finish]-rad[sj+finish] if ddx < -thresh c = -1 elseif ddx > thresh c = 1 elseif ddy < -thresh c = -1 elseif ddy > thresh c = 1 elseif ddr < -thresh c = -1 elseif ddr > thresh c = 1 else c = 0 endif if c < 0 sj = sj + 1 endif endif ddx = real(rra)-real(cs[sj-1+finish]) ddy = imag(rra)-imag(cs[sj-1+finish]) ddr = rrb-rad[sj-1+finish] if ddx < -thresh c = -1 elseif ddx > thresh c = 1 elseif ddy < -thresh c = -1 elseif ddy > thresh c = 1 elseif ddr < -thresh c = -1 elseif ddr > thresh c = 1 else c = 0 endif if c < 0 cs[si-1+finish] = cs[sj-1+finish] rad[si-1+finish] = rad[sj-1+finish] si = sj sj = sj + sj else sj = ir + 1 endif endwhile if (continue == true) cs[si-1+finish] = rra rad[si-1+finish] = rrb endif until continue == false ; eliminate duplicates in place for index 'finish' to index 'ii' ir = finish l = finish while ir < ii ddx = real(cs[ir])-real(cs[ir-1]) ddy = imag(cs[ir])-imag(cs[ir-1]) ddr = rad[ir]-rad[ir-1] if ddx < -thresh c = -1 elseif ddx > thresh c = 1 elseif ddy < -thresh c = -1 elseif ddy > thresh c = 1 elseif ddr < -thresh c = -1 elseif ddr > thresh c = 1 else c = 0 endif if c == 0 ir = ir + 1 else cs[l] = cs[ir] rad[l] = rad[ir] ir = ir +1 l = l + 1 endif endwhile ii = l endif finish = ii endwhile maxi = ii-1 ; ; translate circles to pixels ; ii = 9 int pxx = 0 int pyy = 0 int rds = 0 while ii <= maxi ; rad[ii] = abs(rad[ii]) ; if ((rad[ii] < (sqrt(3)/2-.01))||@base)&&(rad[ii] < (sqrt(3)/2+1-.01)) rad[ii] = abs((rad[ii])) if (rad[ii] > 0)&&((@ptype==0)&&((rad[ii] < (sqrt(3)/2*scle2-.0001))||@base)&& \ (rad[ii] < (sqrt(3)/2+1*scle2-.0001))) || \ ((@ptype==1)&&((rad[ii] < (sqrt(3)/2*scle2-.0001))||@base)&& \ (rad[ii] < (sqrt(3)/2+1*scle2-.0001)) && \ (rad[ii] < (sqrt(3)/2*scle2+.0001))) || \ ((@ptype==2)&&((rad[ii] < (rad[5]-.01))||@base)&& \ (rad[ii] < (sqrt(3)/2+1-.01)) && (rad[ii] < (rad[5]+.01))) fx = real(cs[ii]) fy = imag(cs[ii]) ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax xx = ffx ffx = (0.5*#width + (ffx - 0.5)*cos(#angle)*#width - (ffy - 0.5)*sin(#angle)*#height) ffy = (0.5*#height + (ffy - 0.5)*cos(#angle)*#height + (xx - 0.5)*sin(#angle)*#width) px = round(ffx)+wd2 py = round(ffy)+ht2 rds = round(rad[ii]*#width/txmax) pxx = px-rds while pxx < px+rds pyy = py-rds while pyy < py+rds if pxx > 0 && pyy > 0 && pxx < #width+wd && pyy < #height+ht if @fill == 0 fsum = gsum[pxx,pyy]/rds*100 if ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^2-((pxx-px))^2-((pyy-py))^2) >=0 count[pxx,pyy] = ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^@pwr-(@alpha*(pxx-px))^@pwr-(@beta*(pyy-py))^@pwr)^ \ (1/@pwr)/@gamma endif elseif @fill == 1 fsum = gsum[pxx,pyy]/rds*100 if ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^2-((pxx-px))^2-((pyy-py))^2) >=0 count[pxx,pyy] = ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^@pwr+(@alpha*(pxx-px))^@pwr-(@beta*(pyy-py))^@pwr)^ \ (1/@pwr)/@gamma endif elseif @fill == 2 fsum = gsum[pxx,pyy]/rds*100 if ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^2-((pxx-px))^2-((pyy-py))^2) >=0 count[pxx,pyy] = ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^@pwr+(@alpha*(pxx-px))^@pwr+(@beta*(pyy-py))^@pwr)^ \ (1/@pwr)/@gamma endif elseif @fill == 3 fsum = gsum[pxx,pyy]/rds*100 if ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^2-((pxx-px))^2-((pyy-py))^2) >=0 count[pxx,pyy] = ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^@pwr-(@alpha*(pxx-px))^@pwr+(@beta*(pyy-py))^@pwr)^ \ (1/@pwr)/@gamma endif endif endif pyy = pyy + 1 endwhile pxx = pxx + 1 endwhile endif ii = ii + 1 endwhile ; init: float nhit=0 float nhitx=0 float nhity=0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 bool done = false ; loop: int delta = 1 ;final: int xcrd = #x int ycrd = #y bool inside = true ; if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true && count[xcrd,ycrd] >= 0 if xcrd+delta < #width+wd && ycrd+delta < #height+ht nhit=count[xcrd,ycrd] nhitx=count[xcrd+delta,ycrd] nhity=count[xcrd,ycrd+delta] endif endif cen = nhit cenx = nhitx ceny = nhity e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -delta/100.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd #z = vx + flip(vy); fudge z from vector if done == false done = true endif bailout: done == false default: param version caption = "Formula Version" default = 200 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam method = multipass $ifdef VER40 heading text="Use with Damien's lighting formula \ or one of my 3D Texturizer formulas." endheading $else heading caption="Slope Apollonian Gasket" endheading heading caption="Use with Damien's lighting formula" endheading heading caption="or one of my 3D Texturizer formulas." endheading $endif title="Slope Apollonian Gasket" render=false param solid caption="solid background?" default=true endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam $ifdef VER40 heading text="The actual number of iterations may be less than \ 'Max Iters' if all new generations are smaller \ than the 'Smallest Circle' setting." endheading $endif param level caption = "Max iters (1-100)" default = 100 min = 1 max = 100 endparam $ifdef VER40 heading text="Decreasing 'Smallest Circle' will increase the \ amount of detail, but rending speed will decrease. For \ the 'Inner Circle' perturb type, use caution when decreasing \ the value as artifacts can be generated." endheading $endif param scircle caption = "Smallest Circle" default = 0.01 max = 0.01 min = 0.0001 endparam bool param base caption = "Show Base Set" default = false endparam param lace caption = "Display as Lace" default = false visible = @ptype == "Inner Circle" && (@pert >=8) endparam $ifdef VER40 heading text = "Perturbation of Inversion Circles by overlap." endheading $else heading caption = "Perturbation of Inversion Circles" endheading heading caption = "by overlap." endheading $endif param ptype caption = "Perturb Type" default = 0 enum = "None" "Outer Circles" "Inner Circle" endparam param pert caption = "Perturb Level (1-10)" default = 1 min = 1 max = 10 visible = @ptype != "None" endparam heading caption = "Coloring" endheading param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 0.4 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param fill caption = "Fill Type" enum = "quartic 1" "quartic 2" "quartic 3" "quartic 4" default = 0 endparam float param pwr caption = "Power" default = 2.0 endparam float param alpha caption = "alpha" default = 1.0 endparam float param beta caption = "beta" default = 1.0 endparam float param gamma caption = "gamma" default = 1.0 endparam heading caption = "fBm Textures" endheading param gnoffset caption = "global fBm Offset" default = (0,0) hint = "This is the offset of the pattern. You can use this to shift \ the pattern around on the complex plane." endparam float param gfbmf caption = "global fBm weight" default = 0.1 endparam float param gnscale caption = "global fBm Scale" default = 0.0 hint = "This is the overall scale of the noise." endparam float param gfreq caption = "global fBm freq" default = 1.0 endparam int param giter caption = "global fBm iter" default = 7 min = 1 endparam } pixel_offset { ; Ron Barnett, August 14, 2005 ; ; init: #z = #pixel-@offset loop: ; Nothing here bailout: false default: title = "Pixel Offset" method= multipass maxiter=1 periodicity=0 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param offset caption="Offset values" default = (0.0314159,0.0693147) endparam } 3DFractalRayTrace { ; Ron Barnett May 2006 ; based upon the algorithm of Hart, Sandin and Kauffman ; Potential and gradient functions from the work of ; Linas Vepstas ; Gaussian filtering and Brute force potental method added ; All major bugs (I hope) fixed except for floor shadows ; Floor shadows are fine except when the fractal object is 'sliced' ; September 2006 ; Cutting planes fixed November 2006 $define debug global: complex fracri[#width+1,#height+1] complex fracjdist[#width+1,#height+1] float fdist[#width+1,#height+1] bool flr[#width+1,#height+1] float scrsize = sqrt(#width*#width+#height*#height) float checkscale = 2/@checkscale complex zri = 0 complex oldzri = 0 complex oldzjk = 0 complex zjk = 0 complex zrid = 0 complex zjkd = 0 complex ztemp = 0 complex ztempd = 0 complex rtemp = 0 complex cri = 0 complex cjk = 0 bool brot = false if @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" || @fractal == \ "JuliaBrot" || @fractal == "GopalsamyBrot" || @fractal == \ "PhoenixBrot" || @fractal == "IkenagaBrot" || @fractal == "LambdaBrot" brot = true endif if @version < 1.8 cri = @cri cjk = @cjk else if @fractal == "HyperJulia" || @fractal == "QuatJulia" cri = @criqj cjk = @cjkqj elseif @fractal == "QuatPowerJulia" cri = @criqpj cjk = @cjkqpj elseif @fractal == "QuatExpJulia" cri = @criqej cjk = @cjkqej elseif @fractal == "QuatSinJulia" cri = @criqsj cjk = @cjkqsj elseif @fractal == "QuatLambda" cri = @criql cjk = @cjkql elseif @fractal == "QuatIkenagaJulia" cri = @criqij cjk = @cjkqij elseif @fractal == "QuatManowarJulia" cri = @criqm cjk = @cjkqm elseif @fractal == "QuatSpiderJulia" cri = @criqs cjk = @cjkqs endif endif float vpr = 0 float vpi = 0 float vpj = @vpj float fvpr = 0 float fvpi = 0 float fvpj = 0 ; ray normal float vr = 0 float vi = 0 float vj = 0 float vd = 0 float camr = @camr float cami = @cami float camj = @camj float ucamr = 0 float ucami = 0 float ucamj = 0 float modH = 0 float modHd = 0 float d = 0 float dist = 0 int i = 0 int j = 0 ; initialize the arrays while i <#width while j < #height fracri[i,j] = (0,0) fracjdist[i,j] = (0,0) fdist[i,j] = 0 flr[i,j] = false j = j + 1 endwhile i = i + 1 j = 0 endwhile i = 0 j = 0 int fr = 0 int fi = 0 bool infinity = true float dfactor = @dfactor float epsilon = @epsilon/scrsize float d2r = 0 float ci = imag(#center) float cr = real(#center) float trmax = 4.0/#magn float timax = trmax*#height/#width float rmin = cr - trmax/2 float imax = ci + timax/2 ; light origin float lpointx = @lpointx float lpointy = @lpointy float lpointz = @lplane ; light point at float lightx = @lightx float lighty = @lighty float lightz = @lightz ; light vector float lx = 0 float ly = 0 float lz = 0 if @ltype == "Infinite light" d2r = #pi/180; degrees to radians conversion factor lx = -cos(@angle*d2r) * cos(-@elevation*d2r) ly = -sin(@angle*d2r) * cos(-@elevation*d2r) lz = sin(-@elevation*d2r) else lx = lightx-lpointx ly = lighty-lpointy lz = lightz-lpointz endif vd = sqrt(lx^2+ly^2+lz^2) lx = lx/vd ly = ly/vd lz = lz/vd float xangle = -@xangle*#pi/180 float yangle = @yangle*#pi/180 complex zrot = cos(#angle) + flip(sin(#angle)) if @version < 2.0 zrot = cos(@zangle*#pi/180) + flip(sin(@zangle*#pi/180)) endif float temp = 0 complex a = 0 complex a1 = 0 complex a2 = 0 complex b = 0 complex b1 = 0 complex b2 = 0 complex im = (0,1) complex hrotp = exp(im*@hangle*#pi/180) complex hrotn = exp(-im*@hangle*#pi/180) complex z1 = 0 complex z2 = 0 complex zh = 0 complex t = 0 float len = 0 float nn = 0 complex fx = 0 complex fy = 0 float bailout = sqrt(@bailout) float pot = 0 float grad = 0 float siter = 0 ; initialize floor intersection point float xf = 0 float yf = 0 float zf = 0 ; initialize normal vector for intersection point on floor float lxtf = 0 float lytf = 0 float lztf = 0 ; floor parameters float fa = @fa float fb = @fb float fc = @fc float fd = @fd*scrsize float dirtheta = 0 float ortheta = 0 float td = 0 complex fp = 0 float xlf = 0 float ylf = 0 float zlf = 0 float ld = 0 float reduce = 0 float mindist = 0 float mindistr = 0 float mindisti = 0 float mindistj = 0 if @version < 1.8 mindistr = @mindistr mindisti = @mindisti mindistj = @mindist else if @fractal == "HyperJulia" || @fractal == \ "QuatJulia" || @fractal == "QuatPowerJulia" || @fractal == \ "QuatMandel" || @fractal == "HyperMandel" || @fractal == \ "QuatLambda" || @fractal == "QuatIkenagaJulia" || @fractal \ == "JuliaBrot" || @fractal == "GopalsamyBrot" || @fractal == \ "PhoenixBrot" || @fractal == "IkenagaBrot" || @fractal == \ "QuatManowarJulia" || @fractal == "QuatSpiderJulia" mindistr = @mindistrqj mindisti = @mindistiqj mindistj = @mindistqj elseif @fractal == "QuatExpJulia" mindistr = @mindistrqej mindisti = @mindistiqej mindistj = @mindistqej elseif @fractal == "QuatSinJulia" mindistr = @mindistrqsj mindisti = @mindistiqsj mindistj = @mindistqsj elseif @fractal == "LambdaBrot" mindistr = @mindistrl mindisti = @mindistil mindistj = @mindistl endif endif float maxdist = 0 float maxdistr = 0 float maxdisti = 0 float maxdistj = 0 if @version < 1.8 maxdistr = @maxdistr maxdisti = @maxdisti maxdistj = @maxdist else if @fractal == "HyperJulia" || @fractal == "QuatJulia" || @fractal == \ "QuatPowerJulia" || @fractal == "QuatMandel" || \ @fractal == "HyperMandel" || @fractal == "QuatExpJulia" || \ @fractal == "QuatLambda" || @fractal == "QuatIkenagaJulia" \ || @fractal == "JuliaBrot" || @fractal == "GopalsamyBrot" || \ @fractal == "PhoenixBrot" || @fractal == "IkenagaBrot"|| @fractal == \ "QuatManowarJulia" || @fractal == "QuatSpiderJulia" maxdistr = @maxdistrqj maxdisti = @maxdistiqj maxdistj = @maxdistqj elseif @fractal == "QuatSinJulia" maxdistr = @maxdistrqsj maxdisti = @maxdistiqsj maxdistj = @maxdistqsj elseif @fractal == "LambdaBrot" maxdistr = @maxdistrl maxdisti = @maxdistil maxdistj = @maxdistl endif endif float camd = sqrt((@camr-@cpointx)^2 + (@cami-@cpointy)^2 + (@camj-@vpj)^2) if @version >= 1.9 mindistr = mindistr*camd mindisti = mindisti*camd maxdistr = maxdistr*camd maxdisti = maxdisti*camd endif bool firstpass = true float bepsilon = 10*epsilon ; camera position ;rotate around x axis temp = cami cami = cami*cos(xangle)-camj*sin(xangle) camj = camj*cos(xangle)+temp*sin(xangle) ;rotate around y axis temp = camr camr = camr*cos(yangle)-camj*sin(yangle) camj = camj*cos(yangle)+temp*sin(yangle) ;rotate around z axis rtemp = camr + flip(cami) rtemp = rtemp*zrot camr = real(rtemp) cami = imag(rtemp) ; minimum distance position ;rotate around x axis temp = mindisti mindisti = mindisti*cos(xangle)-mindistj*sin(xangle) mindistj = mindistj*cos(xangle)+temp*sin(xangle) ;rotate around y axis temp = mindistr mindistr = mindistr*cos(yangle)-mindistj*sin(yangle) mindistj = mindistj*cos(yangle)+temp*sin(yangle) ;rotate around z axis rtemp = mindistr + flip(mindisti) rtemp = rtemp*zrot mindistr = real(rtemp) mindisti = imag(rtemp) ; maximum distance position ;rotate around x axis temp = maxdisti maxdisti = maxdisti*cos(xangle)-maxdistj*sin(xangle) maxdistj = maxdistj*cos(xangle)+temp*sin(xangle) ;rotate around y axis temp = maxdistr maxdistr = maxdistr*cos(yangle)-maxdistj*sin(yangle) maxdistj = maxdistj*cos(yangle)+temp*sin(yangle) ;rotate around z axis rtemp = maxdistr + flip(maxdisti) rtemp = rtemp*zrot maxdistr = real(rtemp) maxdisti = imag(rtemp) repeat repeat ; calculate screen position vpr = rmin + (fr*trmax-@cpointx*#width)/#width vpi = imax - (fi*timax-@cpointy*#height)/#height vpj = @vpj ; unrotated position used for calcs fvpr = vpr fvpi = vpi fvpj = vpj ; screen position ; rotate around x axis temp = vpi vpi = vpi*cos(xangle)-vpj*sin(xangle) vpj = vpj*cos(xangle)+temp*sin(xangle) ; rotate around y axis temp = vpr vpr = vpr*cos(yangle)-vpj*sin(yangle) vpj = vpj*cos(yangle)+temp*sin(yangle) ; rotate around z axis rtemp = vpr + flip(vpi) rtemp = rtemp*zrot vpr = real(rtemp) vpi = imag(rtemp) ; create camera vector vr = camr-vpr vi = cami-vpi vj = camj-vpj vd = sqrt(vr*vr+vi*vi+vj*vj) vr = vr/vd vi = vi/vd vj = vj/vd mindist = mindistr*vr+mindisti*vi+mindistj*vj maxdist = maxdistr*vr+maxdisti*vi+maxdistj*vj ; distance camera correction if vd > mindist ucamr = camr-(vd-mindist)*vr ucami = cami-(vd-mindist)*vi ucamj = camj-(vd-mindist)*vj reduce = vd-mindist else ucamr = camr ucami = cami ucamj = camj reduce = 0 endif if @view == "3D" ; calculate distance from camera to quaternion zrid = 1 zjkd = 0 if @fractal == "QuatJulia" || @fractal == "HyperJulia" || \ @fractal == "QuatPowerJulia" || @fractal == "quatlambda" || \ @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" || \ @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia" || \ @fractal == "QuatSpiderJulia" if @fourth == "zk" zri = ucamr + flip(ucami) zjk = ucamj + flip(@ck) elseif @fourth == "zj" zri = ucamr + flip(ucami) zjk = flip(ucamj) + @ck elseif @fourth == "zi" zri = ucamj + flip(@ck) zjk = ucamr + flip(ucami) elseif @fourth == "zr" zri = flip(ucamj) + @ck zjk = ucamr + flip(ucami) endif elseif @fractal == "QuatMandel" || @fractal == "HyperMandel" if @fourth == "zk" cri = ucamr + flip(ucami) cjk = ucamj + flip(@ck) elseif @fourth == "zj" cri = ucamr + flip(ucami) cjk = flip(ucamj) + @ck elseif @fourth == "zi" cri = ucamj + flip(@ck) cjk = ucamr + flip(ucami) elseif @fourth == "zr" cri = flip(ucamj) + @ck cjk = ucamr + flip(ucami) endif zri = @zri zjk = @zjk elseif @fractal == "Juliabrot" if @fourthjb == "ci" zri = ucamr + flip(ucami) zjk = ucamj + flip(@ckjb) elseif @fourthjb == "cr" zri = ucamr + flip(ucami) zjk = flip(ucamj) + @ckjb elseif @fourthjb == "zi" zri = ucamj + flip(@ckjb) zjk = ucamr + flip(ucami) elseif @fourthjb == "zr" zri = flip(ucamj) + @ckjb zjk = ucamr + flip(ucami) endif elseif @fractal == "GopalsamyBrot" if @fourthg == "ci" zri = ucamr + flip(ucami) zjk = ucamj + flip(@ckg) elseif @fourthg == "cr" zri = ucamr + flip(ucami) zjk = flip(ucamj) + @ckg elseif @fourthg == "zi" zri = ucamj + flip(@ckg) zjk = ucamr + flip(ucami) elseif @fourthg == "zr" zri = flip(ucamj) + @ckg zjk = ucamr + flip(ucami) endif elseif @fractal == "Phoenixbrot" if @fourthp == "ci" zri = ucamr + flip(ucami) zjk = ucamj + flip(@ckp) elseif @fourthp == "cr" zri = ucamr + flip(ucami) zjk = flip(ucamj) + @ckp elseif @fourthp == "zi" zri = ucamj + flip(@ckp) zjk = ucamr + flip(ucami) elseif @fourthp == "zr" zri = flip(ucamj) + @ckp zjk = ucamr + flip(ucami) endif elseif @fractal == "Ikenagabrot" if @fourthi == "ci" zri = ucamr + flip(ucami) zjk = ucamj + flip(@cki) elseif @fourthi == "cr" zri = ucamr + flip(ucami) zjk = flip(ucamj) + @cki elseif @fourthi == "zi" zri = ucamj + flip(@cki) zjk = ucamr + flip(ucami) elseif @fourthi == "zr" zri = flip(ucamj) + @cki zjk = ucamr + flip(ucami) endif elseif @fractal == "Lambdabrot" if @fourthl == "ci" zri = ucamr + flip(ucami) zjk = ucamj + flip(@ckl) elseif @fourthl == "cr" zri = ucamr + flip(ucami) zjk = flip(ucamj) + @ckl elseif @fourthl == "zi" zri = ucamj + flip(@ckl) zjk = ucamr + flip(ucami) elseif @fourthl == "zr" zri = flip(ucamj) + @ckl zjk = ucamr + flip(ucami) endif endif oldzri = zri oldzjk = zjk a = zri b = zjk spidercri = cri spidercjk = cjk i = 0 j = 0 dist = 0 infinity = true siter = 0 if (@potmeth == "Brute Force" && !brot) || (@potmeth2 == "Brute Force" \ && brot) firstpass = true bepsilon = epsilon*@velocity else firstpass = false endif repeat repeat if @fractal == "QuatJulia" if @potmeth != "Brute Force" ; calculate derivative ztempd = zrid zrid = hrotn*2*(zri*zrid - zjk*conj(zjkd)) zjkd = hrotn*2*(zri*zjkd + conj(ztempd)*zjk) endif ; calculate fractal ztemp = zri zri = hrotn*(zri*zri - zjk*conj(zjk)) + hrotp*cri zjk = hrotn*(ztemp*zjk + conj(ztemp)*zjk) + hrotp*cjk elseif @fractal == "QuatMandel" if @potmeth != "Brute Force" ; calculate derivative ztempd = zrid zrid = hrotn*2*(zri*zrid - zjk*conj(zjkd))+ 1 zjkd = hrotn*2*(zri*zjkd + conj(ztempd)*zjk) endif ; calculate fractal ztemp = zri zri = hrotn*(zri*zri - zjk*conj(zjk)) + hrotp*cri zjk = hrotn*(ztemp*zjk + conj(ztemp)*zjk) + hrotp*cjk elseif @fractal == "HyperJulia" a1 = zri - conj(flip(zjk)) b1 = zri + conj(flip(zjk)) a2 = zrid - conj(flip(zjkd)) b2 = zrid + conj(flip(zjkd)) if @potmeth != "Brute Force" ; calculate the derivative a = 2*a1*a2 b = 2*b1*b2 zrid = 0.5*(a + b) zjkd = 0.5*(conj(flip(a)) - conj(flip(b))) endif ; calculate fractal a = a1*a1 b = b1*b1 zri = 0.5*(a + b) + cri zjk = 0.5*(conj(flip(a)) - conj(flip(b))) + cjk elseif @fractal == "HyperMandel" a1 = zri - conj(flip(zjk)) b1 = zri + conj(flip(zjk)) a2 = zrid - conj(flip(zjkd)) b2 = zrid + conj(flip(zjkd)) if @potmeth != "Brute Force" ; calculate the derivative a = 2*a1*a2 b = 2*b1*b2 zrid = 0.5*(a + b) + 1 zjkd = 0.5*(conj(flip(a)) - conj(flip(b))) endif ; calculate fractal a = a1*a1 b = b1*b1 zri = 0.5*(a + b) + cri zjk = 0.5*(conj(flip(a)) - conj(flip(b))) + cjk elseif @fractal == "Juliabrot" if @potmeth2 != "Brute Force" ; calculate the derivative zrid = @power2*zri^(@power2-1)*zrid + 1 endif ; calculate the fractal zri = zri^@power2 + zjk elseif @fractal == "GopalsamyBrot" if @potmeth2 != "Brute Force" ; calculate the derivative zrid = -2*(0,1)*conj(zri)*zrid + 1 endif ; calculate the fractal zri = -(0,1)*conj(zri)*conj(zri) + zjk elseif @fractal == "PhoenixBrot" if @potmeth2 != "Brute Force" ; calculate the derivative zrid = (2*zri+imag(zjk))*zrid + 1 endif ; calculate the fractal b = zri*zri + real(zjk) + imag(zjk)*oldzri oldzri = zri zri = b elseif @fractal == "IkenagaBrot" if @potmeth2 != "Brute Force" ; calculate the derivative zrid = 3*zri^2*zrid + (zjk-1)*zrid -1 endif ; calculate the fractal zri = zri^3 + (zjk-1)*zri - zjk elseif @fractal == "LambdaBrot" if @potmeth2 != "Brute Force" ; calculate the derivative zrid = zjk*zrid*(1-@power*zri^(@power-1)) endif ; calculate the fractal zri = zjk*zri*(1-zri^(@power2-1)) elseif @fractal=="QuatPowerJulia" if @potmeth != "Brute Force" ;calculate the derivative z1 = zri zh = zjk nn = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if nn == 0 nn = 1e-20 endif z2 = real(z1) + flip(nn) t = atan2(z2)/nn len = |z1|+|zh| if len == 0 len = 1e-20 endif a = (@power-1)*(0.5*log(len) + t*flip(imag(z1))) b = (@power-1)*t*zh z1 = a zh = b nn = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if nn == 0 nn = 1e-20 endif fx = exp(real(z1)) fy = sin(nn)/nn a = fx*cos(nn) + fx*fy*flip(imag(z1)) b = fx*fy*zh ztempd = zrid zrid = hrotn*@power*(a*zrid - b*conj(zjkd)) zjkd = hrotn*@power*(a*zjkd + conj(ztempd)*b) endif ; calculate the fractal z1 = zri zh = zjk nn = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if nn == 0 nn = 1e-20 endif z2 = real(z1) + flip(nn) t = atan2(z2)/nn len = |z1|+|zh| if len == 0 len = 1e-20 endif a = @power*(0.5*log(len) + t*flip(imag(z1))) b = @power*t*zh z1 = a zh = b nn = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if nn == 0 nn = 1e-20 endif fx = exp(real(z1)) fy = sin(nn)/nn a = fx*cos(nn) + fx*fy*flip(imag(z1)) b = fx*fy*zh zri = hrotn*a + hrotp*cri zjk = hrotn*b + hrotp*cjk elseif @fractal=="quatlambda" if @potmeth != "Brute Force" ; calculate the derivative a = 1-2*zri b = 1-2*zjk ztempd = a a = cri*a - cjk*conj(b) b = cri*b + conj(ztempd)*cjk ztempd = zrid zrid = a*zrid - b*conj(zjkd) zjkd = a*zjkd + conj(ztempd)*b endif ; calculate fractal ztemp = zri zri = zri-(zri*zri - zjk*conj(zjk)) ;z-z^2 zjk = zjk-(ztemp*zjk + conj(ztemp)*zjk) ;z-z^2 ztemp = zri zri = cri*zri - cjk*conj(zjk) zjk = cri*zjk + conj(ztemp)*cjk elseif @fractal == "QuatExpJulia" ; calculate fractal z1 = zri zh = zjk nn = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if nn == 0 nn = 1e-20 endif fx = exp(real(z1)) fy = sin(nn)/nn a = fx*cos(nn) + fx*fy*flip(imag(z1)) b = fx*fy*zh zri = a + cri zjk = b + cjk if @potmeth2 != "Brute Force" ; calculate derivative ztempd = zrid zrid = a*zrid - b*conj(zjkd) zjkd = a*zjkd + conj(ztempd)*b endif elseif @fractal == "QuatSinJulia" if @potmeth2 != "brute force" ; calculate the derivative z1 = zri zh = zjk nn = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if nn == 0 nn = 1e-20 endif a = cos(real(z1))*cosh(nn) - sin(real(z1))*sinh(nn)/nn*flip(imag(z1)) b = -sin(real(z1))*sinh(nn)/nn*zh ztempd = zrid zrid = (a*zrid - b*conj(zjkd)) zjkd = (a*zjkd + conj(ztempd)*b) endif ; calculate fractal z1 = zri zh = zjk nn = sqrt(imag(z1)^2 + real(zh)^2 + imag(zh)^2) if nn == 0 nn = 1e-20 endif a = sin(real(z1))*cosh(nn) + cos(real(z1))*sinh(nn)/nn*flip(imag(z1)) b = cos(real(z1))*sinh(nn)/nn*zh zri = a + cri zjk = b + cjk elseif @fractal == "QuatIkenagaJulia" ; 3*z*z*z' + c*z' - z' ; calculate the fractal z1 = zri zh = zjk a = z1*z1 - zh*conj(zh) ; z*z b = (z1 + conj(z1))*zh ; z*z a1 = z1*a - zh*conj(b) ; z*z*z b1 = z1*b + conj(a)*zh ; z*z*z a2 = cri*z1 - cjk*conj(zh) ; c*z b2 = cri*zh + conj(z1)*cjk ; c*z zri = a1 + a2 -z1 - cri zjk = b1 + b2 - zh - cjk if @potmeth != "Brute Force" ; calculate the derivative ztempd = a a = 3*(a*zrid - b*conj(zjkd)) ; 3*z*z*z' b = 3*(ztempd*zjkd + conj(zrid)*b) ; 3*z*z*z' a1 = cri*zrid - cjk*conj(zjkd) ; c*z' b1 = cri*zjkd + conj(ztempd)*cjk ; c*z' zrid = a + a1 - zrid zjkd = b + b1 - zjkd endif elseif @fractal == "QuatManowarJulia" if @potmeth != "Brute Force" ; calculate the derivative ztempd = zrid zrid = 2*hrotn*(zri*zrid - zjk*conj(zjkd)) zjkd = 2*hrotn*(zri*zjkd + conj(ztempd)*zjk) endif ; calculate the fractal oldzri = zri oldzjk = zjk zri = hrotn*((oldzri*oldzri - oldzjk*conj(oldzjk)) + a) + hrotp*cri zjk = hrotn*((oldzri*oldzjk + conj(oldzri)*oldzjk) + b) + hrotp*cjk a = oldzri b = oldzjk elseif @fractal == "QuatSpiderJulia" if @potmeth != "Brute Force" ; calculate the derivative ztempd = zrid zrid = 2*hrotn*(zri*zrid - zjk*conj(zjkd)) zjkd = 2*hrotn*(zri*zjkd + conj(ztempd)*zjk) endif ; calculate the fractal ztemp = zri zri = hrotn*(zri*zri - zjk*conj(zjk)) + hrotp*spidercri zjk = hrotn*(ztemp*zjk + conj(ztemp)*zjk) + hrotp*spidercjk spidercri = spidercri/2 + zri spidercjk = spidercjk/2 + zjk endif if @fractal == "Juliabrot" || @fractal == "GopalsamyBrot" || \ @fractal == "PhoenixBrot" || @fractal == "IkenagaBrot" || \ @fractal == "LambdaBrot" modh = cabs(zri) else modh = sqrt(|zri|+|zjk|) endif if (@potmeth == "exponential smoothing" && !brot) || (@potmeth2 == \ "exponential smoothing" && brot) siter = siter + exp(-modh) endif i = i + 1 until i == @iter || (modh > bailout) if @fractal == "Juliabrot" || @fractal == "GopalsamyBrot" || \ @fractal == "PhoenixBrot" || @fractal == "IkenagaBrot" || \ @fractal == "LambdaBrot" modhd = cabs(zrid) else modhd = sqrt(|zrid|+|zjkd|) endif if (@potmeth == "Vepstas" && !brot) || (@potmeth2 == \ "Vepstas" && brot) siter = i-1-log(log(modh))/log(2) endif if (modh <= bailout) if (@potmeth == "Brute Force" && !brot) || (@potmeth2 == "Brute Force" \ && brot) if firstpass dist = dist - bepsilon bepsilon = epsilon firstpass = false else d = 0 endif else dist = dist - d d = 0 endif else if (@potmeth != "Brute Force" && !brot) || (@potmeth2 != "Brute Force" \ && brot) pot = exp(-siter*log(2)) grad = pot*modhd/(modh*log(modh)) if @limitgrad && !@constgrad if grad < @limvallow grad = @limvallow endif if grad > @limvalhigh grad = @limvalhigh endif endif if !@limitgrad && @constgrad grad = @gradval endif d = dfactor*sinh(pot)/(2*exp(pot)*grad) if d > @maxstep d = @maxstep endif else d = bepsilon*1.1 endif dist = d + dist endif zrid = 1 zjkd = 0 if @fractal == "QuatJulia" || @fractal == "HyperJulia" ||\ @fractal == "QuatPowerJulia" || @fractal == "QuatLambda" ||\ @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" || \ @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia" || \ @fractal == "QuatSpiderJulia" if @fourth == "zk" zri = ucamr-dist*vr + flip(ucami-dist*vi) zjk = ucamj-dist*vj + flip(@ck) elseif @fourth == "zj" zri = ucamr-dist*vr + flip(ucami-dist*vi) zjk = flip(ucamj-dist*vj) + @ck elseif @fourth == "zi" zri = ucamj-dist*vj + flip(@ck) zjk = ucamr-dist*vr + flip(ucami-dist*vi) elseif @fourth == "zr" zri = flip(ucamj-dist*vj) + @ck zjk = ucamr-dist*vr + flip(ucami-dist*vi) endif elseif @fractal == "QuatMandel" || @fractal == "HyperMandel" if @fourth == "zk" cri = ucamr-dist*vr + flip(ucami-dist*vi) cjk = ucamj-dist*vj + flip(@ck) elseif @fourth == "zj" cri = ucamr-dist*vr + flip(ucami-dist*vi) cjk = flip(ucamj-dist*vj) + @ck elseif @fourth == "zi" cri = ucamj-dist*vj + flip(@ck) cjk = ucamr-dist*vr + flip(ucami-dist*vi) elseif @fourth == "zr" cri = flip(ucamj-dist*vj) + @ck cjk = ucamr-dist*vr + flip(ucami-dist*vi) endif zri = @zri zjk = @zjk elseif @fractal == "Juliabrot" if @fourthjb == "ci" zri = ucamr-dist*vr + flip(ucami-dist*vi) zjk = ucamj-dist*vj + flip(@ckjb) elseif @fourthjb == "cr" zri = ucamr-dist*vr + flip(ucami-dist*vi) zjk = flip(ucamj-dist*vj) + @ckjb elseif @fourthjb == "zi" zri = ucamj-dist*vj + flip(@ckjb) zjk = ucamr-dist*vr + flip(ucami-dist*vi) elseif @fourthjb == "zr" zri = flip(ucamj-dist*vj) + @ckjb zjk = ucamr-dist*vr + flip(ucami-dist*vi) endif elseif @fractal == "Gopalsamybrot" if @fourthg == "ci" zri = ucamr-dist*vr + flip(ucami-dist*vi) zjk = ucamj-dist*vj + flip(@ckg) elseif @fourthg == "cr" zri = ucamr-dist*vr + flip(ucami-dist*vi) zjk = flip(ucamj-dist*vj) + @ckg elseif @fourthg == "zi" zri = ucamj-dist*vj + flip(@ckg) zjk = ucamr-dist*vr + flip(ucami-dist*vi) elseif @fourthg == "zr" zri = flip(ucamj-dist*vj) + @ckg zjk = ucamr-dist*vr + flip(ucami-dist*vi) endif elseif @fractal == "PhoenixBrot" if @fourthp == "ci" zri = ucamr-dist*vr + flip(ucami-dist*vi) zjk = ucamj-dist*vj + flip(@ckp) elseif @fourthp == "cr" zri = ucamr-dist*vr + flip(ucami-dist*vi) zjk = flip(ucamj-dist*vj) + @ckp elseif @fourthp == "zi" zri = ucamj-dist*vj + flip(@ckp) zjk = ucamr-dist*vr + flip(ucami-dist*vi) elseif @fourthp == "zr" zri = flip(ucamj-dist*vj) + @ckp zjk = ucamr-dist*vr + flip(ucami-dist*vi) endif elseif @fractal == "IkenagaBrot" if @fourthi == "ci" zri = ucamr-dist*vr + flip(ucami-dist*vi) zjk = ucamj-dist*vj + flip(@cki) elseif @fourthi == "cr" zri = ucamr-dist*vr + flip(ucami-dist*vi) zjk = flip(ucamj-dist*vj) + @cki elseif @fourthi == "zi" zri = ucamj-dist*vj + flip(@cki) zjk = ucamr-dist*vr + flip(ucami-dist*vi) elseif @fourthi == "zr" zri = flip(ucamj-dist*vj) + @cki zjk = ucamr-dist*vr + flip(ucami-dist*vi) endif elseif @fractal == "LambdaBrot" if @fourthl == "ci" zri = ucamr-dist*vr + flip(ucami-dist*vi) zjk = ucamj-dist*vj + flip(@ckl) elseif @fourthl == "cr" zri = ucamr-dist*vr + flip(ucami-dist*vi) zjk = flip(ucamj-dist*vj) + @ckl elseif @fourthl == "zi" zri = ucamj-dist*vj + flip(@ckl) zjk = ucamr-dist*vr + flip(ucami-dist*vi) elseif @fourthl == "zr" zri = flip(ucamj-dist*vj) + @ckl zjk = ucamr-dist*vr + flip(ucami-dist*vi) endif endif oldzri = zri oldzjk = zjk a = zri b = zjk spidercri = cri spidercjk = cjk j = j + 1 i = 0 siter = 0 until (d <= epsilon || dist > maxdist) && \ (firstpass == false || dist > maxdist) if (dist > 0 && dist <= maxdist) || d == 0 infinity = false endif if !infinity ; set the intersection point and distance fracri[fr,fi] = camr-(dist+reduce)*vr + flip(cami-(dist+reduce)*vi) if dist != 0 fracjdist[fr,fi] = camj-(dist+reduce)*vj + flip((dist+reduce)) else fracjdist[fr,fi] = camj-(dist+reduce)*vj + flip((1)) fdist[fr,fi] = dist+reduce endif endif endif if @floor ; create unrotated camera vector vr = @camr-fvpr vi = @cami-fvpi vj = @camj-fvpj vd = sqrt(vr*vr+vi*vi+vj*vj) vr = vr/vd vi = vi/vd vj = vj/vd ; floor normal lxtf = fa lytf = fb lztf = fc vd = 1/sqrt(lxtf*lxtf+lytf*lytf+lztf*lztf) lxtf = lxtf*vd lytf = lytf*vd lztf = lztf*vd ; dot product with ray origin ortheta = lxtf*@camr+lytf*@cami+lztf*@camj ; dot product with camera vector dirtheta = lxtf*vr+lytf*vi+lztf*vj ; distance from camera to intersection td = -(ortheta+fd)/dirtheta/scrsize ; intersection point with camera ray ld = 0 if td > 0 xf = @camr+vr*td yf = @cami+vi*td zf = @camj-vj*td if td < imag(fracjdist[fr,fi])|| cabs(fracri[fr,fi]) == 0 fracri[fr,fi] = xf + flip(yf) flr[fr,fi] = true fracjdist[fr,fi] = zf + flip(-4) fp = (lytf+lztf)*xf + lxtf*yf + \ flip((lxtf+lytf)*zf + lztf*yf)+ \ real(@poffset) + flip(imag(@poffset)) ; vector from light to point on floor xlf = lpointx - xf ylf = lpointy - yf zlf = lpointz - zf vd = 1/sqrt(xlf*xlf+ylf*ylf+zlf*zlf) xlf = xlf*vd ylf = ylf*vd zlf = -zlf*vd ld = vd^@fade*(xlf*lx+ylf*ly+zlf*lz)*@dis*scrsize*10*20^(@fade-3) ; have floor fade according to lighting model if @ltype == "Point source" if ld >= 1 ld = 0.99 endif if ld < 0 ld = 0 endif else ld = 0.99 endif if @flrtype == "Checkerboard" fp = floor(fp*checkscale) if ((real(fp) + imag(fp)) % 2 == 0) fracjdist[fr,fi] = zf + flip(-4-ld) else fracjdist[fr,fi] = zf + flip(-5-ld) endif else fracjdist[fr,fi] = zf + flip(-4-ld) endif endif endif endif fr = fr + 1 until fr == #width fr = 0 fi = fi + 1 until fi == #height init: float svpr = 0 float svpi = 0 float svpj = 0 float svr = 0 float svi = 0 float svj = 0 float svd = 0 float stemp = 0 int iii = 0 float mycolor = 0 bool shad = false int xcrd = #x int ycrd = #y complex srtemp = 0 complex szri = 0 complex soldzri = 0 complex soldzjk = 0 complex sspidercri = 0 complex sspidercjk = 0 complex szjk = 0 complex sztemp = 0 complex szrid = 0 complex szjkd = 0 complex sztempd = 0 complex scri = 0 complex scjk = 0 complex sa = 0 complex sa1 = 0 complex sa2 = 0 complex sb = 0 complex sb1 = 0 complex sb2 = 0 float smodH = 0 float smodHd = 0 float sdist = 0 float sgrad = 0 float spot = 0 float sreduce = 0 float smindist = 0 float smindistr = mindistr float smindisti = mindisti float smindistj = mindistj float sd = 0 float ssiter = 0 int sj = 0 int si = 0 complex sz1 = 0 complex sz2 = 0 complex szh = 0 complex st = 0 float slen = 0 float snn = 0 complex sfx = 0 complex sfy = 0 ; light origin float lightr = 0 float lighti = 0 float lightj = 0 if @ltype == "Infinite Light" ; assumes light points at (0,0,0) float lightr = -lx*1000 float lighti = -ly*1000 float lightj = -lz*1000 else lightr = lpointx lighti = lpointy lightj = lpointz endif float ulightr = 0 float ulighti = 0 float ulightj = 0 float slr = 0 float sli = 0 float slj = 0 float sld = 0 float l = 0 float svr = 0 float svi = 0 float svj = 0 float svd = 0 float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float ga = 0 float rr = 0 float ri = 0 float rj = 0 float rr1 = 0 float ri1 = 0 float rj1 = 0 float ir = 0 float ii = 0 float ij = 0 float ir1 = 0 float ii1 = 0 float ij1 = 0 float nr = 0 float ni = 0 float nj = 0 complex fri = 0 complex frj = 0 float temp1 = 0 float temp2 = 0 float temp3 = 0 bool outside = false float outtest = 0 bool sfirstpass = false float sbepsilon = 0 float n = 0 ; create the filter array and weight ; gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter ga = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-ga) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width)*0.5; float transy = (#height)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) if @view == "3D" && imag(fracjdist[xcrd,ycrd]) > -3 if xcrd <#width-1-@filter && ycrd <#height-1-@filter && xcrd > @filter && \ ycrd > @filter ; find any points outside the object outside = false gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter outtest = cabs(fracri[xcrd+gx,ycrd+gy]) if outtest == 0 || flr[xcrd+gx,ycrd+gy] == true outside = true endif gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile if @filter != 0 && !outside gx = -@filter gy = -@filter rr = 0 ri = 0 rj = 0 ir = 0 ii = 0 ij = 0 while gy <= @filter while gx <= @filter fri = fracri[xcrd+gx,ycrd+gy] frj = fracjdist[xcrd+gx,ycrd+gy] rr = rr+gauss[gx+@filter,gy+@filter]*real(fri) ri = ri+gauss[gx+@filter,gy+@filter]*imag(fri) rj = rj+gauss[gx+@filter,gy+@filter]*real(frj) gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile rr = rr/gweight ri = ri/gweight rj = rj/gweight temp1 = rr temp2 = ri temp3 = rj gx = -@filter gy = -@filter rr1 = 0 ri1 = 0 rj1 = 0 ir1 = 0 ii1 = 0 ij1 = 0 while gy <= @filter while gx <= @filter fri = fracri[xcrd+gx+1,ycrd+gy] frj = fracjdist[xcrd+gx+1,ycrd+gy] rr1 = rr1+gauss[gx+@filter,gy+@filter]*real(fri) ri1 = ri1+gauss[gx+@filter,gy+@filter]*imag(fri) rj1 = rj1+gauss[gx+@filter,gy+@filter]*real(frj) fri = fracri[xcrd+gx,ycrd+gy+1] frj = fracjdist[xcrd+gx,ycrd+gy+1] ir1 = ir1+gauss[gx+@filter,gy+@filter]*real(fri) ii1 = ii1+gauss[gx+@filter,gy+@filter]*imag(fri) ij1 = ij1+gauss[gx+@filter,gy+@filter]*real(frj) gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile rr = rr1/gweight-rr ri = ri1/gweight-ri rj = rj1/gweight-rj ir = ir1/gweight-temp1 ii = ii1/gweight-temp2 ij = ij1/gweight-temp3 n = sqrt(rr^2+ri^2+rj^2) rr = rr/n ri = ri/n rj = rj/n n = sqrt(ir^2+ii^2+ij^2) ir = ir/n ii = ii/n ij = ij/n ; cross product to give normal vector nr = ri*ij - rj*ii ni = rj*ir - rr*ij nj = rr*ii - ri*ir gx = -@filter gy = -@filter rr1 = 0 ri1 = 0 rj1 = 0 ir1 = 0 ii1 = 0 ij1 = 0 while gy <= @filter while gx <= @filter fri = fracri[xcrd+gx-1,ycrd+gy] frj = fracjdist[xcrd+gx-1,ycrd+gy] rr1 = rr1+gauss[gx+@filter,gy+@filter]*real(fri) ri1 = ri1+gauss[gx+@filter,gy+@filter]*imag(fri) rj1 = rj1+gauss[gx+@filter,gy+@filter]*real(frj) fri = fracri[xcrd+gx,ycrd+gy-1] frj = fracjdist[xcrd+gx,ycrd+gy-1] ir1 = ir1+gauss[gx+@filter,gy+@filter]*real(fri) ii1 = ii1+gauss[gx+@filter,gy+@filter]*imag(fri) ij1 = ij1+gauss[gx+@filter,gy+@filter]*real(frj) gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile rr = rr1/gweight-temp1 ri = ri1/gweight-temp2 rj = rj1/gweight-temp3 ir = ir1/gweight-temp1 ii = ii1/gweight-temp2 ij = ij1/gweight-temp3 n = sqrt(rr^2+ri^2+rj^2) rr = rr/n ri = ri/n rj = rj/n n = sqrt(ir^2+ii^2+ij^2) ir = ir/n ii = ii/n ij = ij/n n = sqrt(rr^2+ri^2+rj^2) rr = rr/n ri = ri/n rj = rj/n n = sqrt(ir^2+ii^2+ij^2) ir = ir/n ii = ii/n ij = ij/n else fri = fracri[xcrd,ycrd] frj = fracjdist[xcrd,ycrd] rr = real(fracri[xcrd+1,ycrd]-fri) ri = imag(fracri[xcrd+1,ycrd]-fri) rj = real(fracjdist[xcrd+1,ycrd]-frj) n = sqrt(rr^2+ri^2+rj^2) rr = rr/n ri = ri/n rj = rj/n ir = real(fracri[xcrd,ycrd+1]-fri) ii = imag(fracri[xcrd,ycrd+1]-fri) ij = real(fracjdist[xcrd,ycrd+1]-frj) n = sqrt(ir^2+ii^2+ij^2) ir = ir/n ii = ii/n ij = ij/n nr = ri*ij - rj*ii ni = rj*ir - rr*ij nj = rr*ii - ri*ir if @version >= 1.8 rr = real(fracri[xcrd-1,ycrd]-fri) ri = imag(fracri[xcrd-1,ycrd]-fri) rj = real(fracjdist[xcrd-1,ycrd]-frj) n = sqrt(rr^2+ri^2+rj^2) rr = rr/n ri = ri/n rj = rj/n ir = real(fracri[xcrd,ycrd-1]-fri) ii = imag(fracri[xcrd,ycrd-1]-fri) ij = real(fracjdist[xcrd,ycrd-1]-frj) n = sqrt(ir^2+ii^2+ij^2) ir = ir/n ii = ii/n ij = ij/n endif endif if @version >= 1.8 || @filter > 0 nr = (nr+ri*ij - rj*ii)/2 ni = (ni+rj*ir - rr*ij)/2 nj = (nj+rr*ii - ri*ir)/2 endif float ntemp = 0 ; rotate around z axis in opposite direction from other z axis ; rotations srtemp = nr + flip(ni) srtemp = srtemp*conj(zrot) nr = real(srtemp) ni = imag(srtemp) ; rotate around y axis ntemp = nr nr = nr*cos(yangle)+nj*sin(yangle) nj = nj*cos(yangle)-ntemp*sin(yangle) ; rotate around x axis ntemp = ni ni = ni*cos(xangle)+nj*sin(xangle) nj = nj*cos(xangle)-ntemp*sin(xangle) n = sqrt(nr^2+ni^2+nj^2) nr = nr/n ni = ni/n nj = nj/n l = abs(lx*nr + ly*ni + lz*nj) if l < 0 ; this corrects for l being not a number (NAN) l = 0 endif endif if @shadows &&((imag(fracjdist[xcrd,ycrd]) > 0 && imag(fracjdist[xcrd,ycrd])-reduce\ <= maxdist)) shad = false ; calculate light vector ; rotate around x axis ntemp = lighti lighti = lighti*cos(xangle)-lightj*sin(xangle) lightj = lightj*cos(xangle)+ntemp*sin(xangle) ; rotate around y axis ntemp = lightr lightr = lightr*cos(yangle)-lightj*sin(yangle) lightj = lightj*cos(yangle)+ntemp*sin(yangle) ; rotate around z axis srtemp = lightr + flip(lighti) srtemp = srtemp*zrot lightr = real(srtemp) lighti = imag(srtemp) slr = lightr - real(fracri[xcrd,ycrd]) sli = lighti - imag(fracri[xcrd,ycrd]) slj = lightj - real(fracjdist[xcrd,ycrd]) sld = sqrt(slr^2+sli^2+slj^2) slr = slr/sld sli = sli/sld slj = slj/sld svr = camr-real(fracri[xcrd,ycrd]) svi = cami-imag(fracri[xcrd,ycrd]) svj = camj-real(fracjdist[xcrd,ycrd]) svd = sqrt(svr*svr+svi*svi+svj*svj) svr = svr/svd svi = svi/svd svj = svj/svd smindist = (smindistr*svr+smindisti*svi+smindistj*svj) if sld >= smindist ulightr = lightr - (sld-smindist)*slr ulighti = lighti - (sld-smindist)*sli ulightj = lightj - (sld-smindist)*slj sreduce = sld-smindist else ulightr = lightr ulighti = lighti ulightj = lightj sreduce = 0 endif szrid = 1 szjkd = 0 if @fractal == "QuatJulia" || @fractal == "HyperJulia" || \ @fractal=="QuatPowerJulia" || @fractal == "QuatLambda" || \ @fractal=="QuatExpJulia" || @fractal == "QuatSinJulia" || \ @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia" || \ @fractal == "QuatSpiderJulia" if @fourth == "zk" szri = ulightr + flip(ulighti) szjk = ulightj + flip(@ck) elseif @fourth == "zj" szri = ulightr + flip(ulighti) szjk = flip(ulightj) + @ck elseif @fourth == "zi" szri = ulightj + flip(@ck) szjk = ulightr + flip(ulighti) elseif @fourth == "zr" szri = flip(ulightj) + @ck szjk = ulightr + flip(ulighti) endif elseif @fractal == "QuatMandel" || @fractal == "HyperMandel" if @fourth == "zk" scri = ulightr + flip(ulighti) scjk = ulightj + flip(@ck) elseif @fourth == "zj" scri = ulightr + flip(ulighti) scjk = flip(ulightj) + @ck elseif @fourth == "zi" scri = ulightj + flip(@ck) scjk = ulightr + flip(ulighti) elseif @fourth == "zr" scri = flip(ulightj) + @ck scjk = ulightr + flip(ulighti) endif szri = @zri szjk = @zjk elseif @fractal == "Juliabrot" if @fourthjb == "ci" szri = ulightr + flip(ulighti) szjk = ulightj + flip(@ckjb) elseif @fourthjb == "cr" szri = ulightr + flip(ulighti) szjk = flip(ulightj) + @ckjb elseif @fourthjb == "zi" szri = ulightj + flip(@ckjb) szjk = ulightr + flip(ulighti) elseif @fourthjb == "zr" szri = flip(ulightj) + @ckjb szjk = ulightr + flip(ulighti) endif elseif @fractal == "Gopalsamybrot" if @fourthg == "ci" szri = ulightr + flip(ulighti) szjk = ulightj + flip(@ckg) elseif @fourthg == "cr" szri = ulightr + flip(ulighti) szjk = flip(ulightj) + @ckg elseif @fourthg == "zi" szri = ulightj + flip(@ckg) szjk = ulightr + flip(ulighti) elseif @fourthg == "zr" szri = flip(ulightj) + @ckg szjk = ulightr + flip(ulighti) endif elseif @fractal == "Phoenixbrot" if @fourthp == "ci" szri = ulightr + flip(ulighti) szjk = ulightj + flip(@ckp) elseif @fourthp == "cr" szri = ulightr + flip(ulighti) szjk = flip(ulightj) + @ckp elseif @fourthp == "zi" szri = ulightj + flip(@ckp) szjk = ulightr + flip(ulighti) elseif @fourthp == "zr" szri = flip(ulightj) + @ckp szjk = ulightr + flip(ulighti) endif elseif @fractal == "Ikenagabrot" if @fourthi == "ci" szri = ulightr + flip(ulighti) szjk = ulightj + flip(@cki) elseif @fourthi == "cr" szri = ulightr + flip(ulighti) szjk = flip(ulightj) + @cki elseif @fourthi == "zi" szri = ulightj + flip(@cki) szjk = ulightr + flip(ulighti) elseif @fourthi == "zr" szri = flip(ulightj) + @cki szjk = ulightr + flip(ulighti) endif elseif @fractal == "Lambdabrot" if @fourthl == "ci" szri = ulightr + flip(ulighti) szjk = ulightj + flip(@ckl) elseif @fourthl == "cr" szri = ulightr + flip(ulighti) szjk = flip(ulightj) + @ckl elseif @fourthl == "zi" szri = ulightj + flip(@ckl) szjk = ulightr + flip(ulighti) elseif @fourthl == "zr" szri = flip(ulightj) + @ckl szjk = ulightr + flip(ulighti) endif endif soldzri = szri soldzjk = szjk sa = szri sb = szjk sspidercri = cri sspidercjk = cjk si = 0 sj = 0 sdist = 0 ssiter = 0 if (@potmeth == "Brute Force" && !brot) || (@potmeth2 == "Brute Force" \ && brot) sfirstpass = true sbepsilon = epsilon*@velocity else sfirstpass = false endif repeat repeat if @fractal == "QuatJulia" if @potmeth != "Brute Force" ; calculate derivative sztempd = szrid szrid = hrotn*2*(szri*szrid - szjk*conj(szjkd)) szjkd = hrotn*2*(szri*szjkd + conj(sztempd)*szjk) endif ; calculate fractal sztemp = szri szri = hrotn*(szri*szri - szjk*conj(szjk)) + hrotp*cri szjk = hrotn*(sztemp*szjk + conj(sztemp)*szjk) + hrotp*cjk elseif @fractal == "QuatMandel" if @potmeth != "Brute Force" ; calculate derivative sztempd = szrid szrid = hrotn*2*(szri*szrid - szjk*conj(szjkd))+ 1 szjkd = hrotn*2*(szri*szjkd + conj(sztempd)*szjk) endif ; calculate fractal sztemp = szri szri = hrotn*(szri*szri - szjk*conj(szjk)) + hrotp*scri szjk = hrotn*(sztemp*szjk + conj(sztemp)*szjk) + hrotp*scjk elseif @fractal == "HyperJulia" sa1 = szri - conj(flip(szjk)) sb1 = szri + conj(flip(szjk)) sa2 = szrid - conj(flip(szjkd)) sb2 = szrid + conj(flip(szjkd)) ; calculate the derivative if @potmeth != "Brute Force" sa = 2*sa1*sa2 sb = 2*sb1*sb2 szrid = 0.5*(sa + sb) szjkd = 0.5*(conj(flip(sa)) - conj(flip(sb))) endif ; calculate fractal sa = sa1*sa1 sb = sb1*sb1 szri = 0.5*(sa + sb) + cri szjk = 0.5*(conj(flip(sa)) - conj(flip(sb))) + cjk elseif @fractal == "HyperMandel" sa1 = szri - conj(flip(szjk)) sb1 = szri + conj(flip(szjk)) sa2 = szrid - conj(flip(szjkd)) sb2 = szrid + conj(flip(szjkd)) if @potmeth != "Brute Force" ; calculate the derivative sa = 2*sa1*sa2 sb = 2*sb1*sb2 szrid = 0.5*(sa + sb) + scri szjkd = 0.5*(conj(flip(sa)) - conj(flip(sb))) + scjk endif ; calculate fractal sa = sa1*sa1 sb = sb1*sb1 szri = 0.5*(sa + sb) + scri szjk = 0.5*(conj(flip(sa)) - conj(flip(sb))) + scjk elseif @fractal == "Juliabrot" if @potmeth2 != "Brute Force" ; calculate the derivative szrid = @power2*szri^(@power2-1)*szrid + 1 endif ; calculate the fractal szri = szri^@power2 + szjk elseif @fractal == "Gopalsamybrot" if @potmeth2 != "Brute Force" ; calculate the derivative szrid = -2*(0,1)*conj(szri)*szrid + 1 endif ; calculate the fractal szri = -(0,1)*conj(szri)*conj(szri) + szjk elseif @fractal == "PhoenixBrot" if @potmeth2 != "Brute Force" ; calculate the derivative szrid = (2*szri+imag(zjk))*szrid + 1 endif ; calculate the fractal sb = szri*szri + real(szjk) + imag(szjk)*soldzri soldzri = szri szri = sb elseif @fractal == "IkenagaBrot" if @potmeth2 != "Brute Force" ; calculate the derivative szrid = 3*szri^2*szrid + (szjk-1)*szrid -1 endif ; calculate the fractal szri = szri^3 + (szjk-1)*szri - szjk elseif @fractal == "LambdaBrot" if @potmeth2 != "Brute Force" ; calculate the derivative szrid = szjk*szrid*(1-@power*szri^(@power-1)) endif ; calculate the fractal szri = szjk*szri*(1-szri^(@power2-1)) elseif @fractal=="QuatPowerJulia" if @potmeth != "Brute Force" ;calculate the derivative sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sz2 = real(sz1) + flip(snn) st = atan2(sz2)/snn slen = |sz1|+|szh| if slen == 0 slen = 1e-20 endif sa = (@power-1)*(0.5*log(slen) + t*flip(imag(sz1))) sb = (@power-1)*st*szh sz1 = sa szh = sb snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sfx = exp(real(sz1)) sfy = sin(snn)/snn sa = sfx*cos(snn) + sfx*sfy*flip(imag(sz1)) sb = sfx*sfy*szh sztempd = szrid szrid = hrotn*@power*(sa*szrid - sb*conj(szjkd)) szjkd = hrotn*@power*(sa*szjkd + conj(sztempd)*sb) endif ; calculate the fractal sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sz2 = real(sz1) + flip(snn) st = atan2(sz2)/snn slen = |sz1|+|szh| if slen == 0 slen = 1e-20 endif sa = @power*(0.5*log(slen) + st*flip(imag(sz1))) sb = @power*st*szh sz1 = sa szh = sb snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sfx = exp(real(sz1)) sfy = sin(snn)/snn sa = sfx*cos(snn) + sfx*sfy*flip(imag(sz1)) sb = sfx*sfy*szh szri = hrotn*sa + hrotp*cri szjk = hrotn*sb + hrotp*cjk elseif @fractal=="quatlambda" if @potmeth != "Brute Force" ; calculate the derivative sa = 1-2*szri sb = 1-2*szjk sztempd = sa sa = cri*sa - cjk*conj(sb) sb = cri*sb + conj(sztempd)*cjk sztempd = szrid szrid = sa*szrid - sb*conj(szjkd) szjkd = sa*szjkd + conj(sztempd)*sb endif ; calculate fractal sztemp = szri szri = szri-(szri*szri - szjk*conj(szjk)) ;z-z^2 szjk = szjk-(sztemp*szjk + conj(sztemp)*szjk) ;z-z^2 sztemp = szri szri = cri*szri - cjk*conj(szjk) szjk = cri*szjk + conj(sztemp)*cjk elseif @fractal=="QuatExpJulia" ; calculate fractal sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sfx = exp(real(sz1)) sfy = sin(snn)/snn sa = sfx*cos(snn) + sfx*sfy*flip(imag(sz1)) sb = sfx*sfy*szh szri = sa + cri szjk = sb + cjk if @potmeth2 != "Brute Force" ; calculate derivative sztempd = szrid szrid = sa*szrid - sb*conj(szjkd) szjkd = sa*szjkd + conj(sztempd)*sb endif elseif @fractal=="QuatSinJulia" if @potmeth2 != "Brute Force" ; calculate the derivative sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sa = cos(real(sz1))*cosh(snn) - sin(real(sz1))*sinh(snn)/snn*flip(imag(sz1)) sb = -sin(real(sz1))*sinh(snn)/snn*szh sztempd = szrid szrid = (sa*szrid - sb*conj(szjkd)) szjkd = (sa*szjkd + conj(sztempd)*sb) endif ; calculate fractal sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sa = sin(real(sz1))*cosh(snn) + cos(real(sz1))*sinh(snn)/snn*flip(imag(sz1)) sb = cos(real(sz1))*sinh(snn)/snn*szh szri = sa + cri szjk = sb + cjk elseif @fractal == "QuatIkenagaJulia" ; 3*z*z*z' + c*z' - z' ; calculate the fractal sz1 = szri szh = szjk sa = sz1*sz1 - szh*conj(szh) ; z*z sb = (sz1 + conj(sz1))*szh ; z*z sa1 = sz1*sa - szh*conj(sb) ; z*z*z sb1 = sz1*sb + conj(sa)*szh ; z*z*z sa2 = cri*sz1 - cjk*conj(szh) ; c*z sb2 = cri*szh + conj(sz1)*cjk ; c*z szri = sa1 + sa2 -sz1 - cri szjk = sb1 + sb2 - szh - cjk if @potmeth != "Brute Force" ; calculate the derivative sztempd = sa sa = 3*(sa*szrid - sb*conj(szjkd)) ; 3*z*z*z' sb = 3*(sztempd*szjkd + conj(szrid)*sb) ; 3*z*z*z' sa1 = cri*szrid - cjk*conj(szjkd) ; c*z' sb1 = cri*szjkd + conj(sztempd)*cjk ; c*z' szrid = sa + sa1 - zrid szjkd = sb + sb1 - zjkd endif elseif @fractal == "QuatManowarJulia" if @potmeth != "Brute Force" ; calculate the derivative sztempd = szrid szrid = 2*hrotn*(szri*szrid - szjk*conj(szjkd)) szjkd = 2*hrotn*(szri*szjkd + conj(sztempd)*szjk) endif ; calculate the fractal soldzri = szri soldzjk = szjk szri = hrotn*((soldzri*soldzri - soldzjk*conj(soldzjk)) + sa) + \ hrotp*cri szjk = hrotn*((soldzri*soldzjk + conj(soldzri)*soldzjk) + sb) + \ hrotp*cjk sa = soldzri sb = soldzjk elseif @fractal == "QuatSpiderJulia" if @potmeth != "Brute Force" ; calculate the derivative sztempd = szrid szrid = 2*hrotn*(szri*szrid - szjk*conj(szjkd)) szjkd = 2*hrotn*(szri*szjkd + conj(sztempd)*szjk) endif ; calculate the fractal sztemp = szri szri = hrotn*(szri*szri - szjk*conj(szjk)) + hrotp*sspidercri szjk = hrotn*(sztemp*szjk + conj(sztemp)*szjk) + hrotp*sspidercjk sspidercri = sspidercri/2 + szri sspidercjk = sspidercjk/2 + szjk endif if @fractal == "Juliabrot" || @fractal == "GopalsamyBrot" || \ @fractal == "PhoenixBrot" || @fractal == "IkenagaBrot" || \ @fractal == "LambdaBrot" smodh = cabs(szri) else smodh = sqrt(|szri|+|szjk|) endif if (@potmeth == "exponential smoothing" && !brot) || (@potmeth2 == \ "exponential smoothing" && brot) ssiter = ssiter + exp(-smodh) endif si = si + 1 until si == @iter || smodh > bailout if @fractal == "Juliabrot" || @fractal == "GopalsamyBrot" || \ @fractal == "PhoenixBrot" || @fractal == "IkenagaBrot" || \ @fractal == "LambdaBrot" smodhd = cabs(szrid) else smodhd = sqrt(|szrid|+|szjkd|) endif if (@potmeth == "Vepstas" && !brot) || (@potmeth2 == "Vepstas" && brot) ssiter = si-1-log(log(smodh))/log(2) endif if smodh <= bailout if (@potmeth == "Brute Force" && !brot) || (@potmeth2 == "Brute Force" \ && brot) if sfirstpass sdist = sdist - sbepsilon sbepsilon = epsilon sfirstpass = false else sd = 0 endif else sdist = sdist - sd sd = 0 endif else if (@potmeth != "Brute Force" && !brot) || (@potmeth2 != "Brute Force" \ && brot) spot = 2^(-ssiter) sgrad = spot*smodhd/(smodh*log(smodh)) if @limitgrad && !@constgrad if sgrad < @limvallow sgrad = @limvallow endif if sgrad > @limvalhigh sgrad = @limvalhigh endif endif if !@limitgrad && @constgrad sgrad = @gradval endif sd = dfactor*sinh(spot)/(2*exp(spot)*sgrad) if sd > @maxstep sd = @maxstep endif else sd = bepsilon*1.1 endif sdist = sd + sdist endif szrid = 1 szjkd = 0 if @fractal == "QuatJulia" || @fractal == "HyperJulia" || \ @fractal=="QuatPowerJulia" || @fractal == "QuatLambda" || \ @fractal=="QuatExpJulia" || @fractal == "QuatSinJulia" || \ @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia" || \ @fractal == "QuatSpiderJulia" if @fourth == "zk" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = ulightj-sdist*slj + flip(@ck) elseif @fourth == "zj" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = flip(ulightj-sdist*slj) + @ck elseif @fourth == "zi" szri = ulightj-sdist*slj + flip(@ck) szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourth == "zr" szri = flip(ulightj-sdist*slj) + @ck szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif elseif @fractal == "QuatMandel" || @fractal == "HyperMandel" if @fourth == "zk" scri = ulightr-sdist*slr + flip(ulighti-sdist*sli) scjk = ulightj-sdist*slj + flip(@ck) elseif @fourth == "zj" scri = ulightr-sdist*slr + flip(ulighti-sdist*sli) scjk = flip(ulightj-sdist*slj) + @ck elseif @fourth == "zi" scri = ulightj-sdist*slj + flip(@ck) scjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourth == "zr" scri = flip(ulightj-sdist*slj) + @ck scjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif szri = @zri szjk = @zjk elseif @fractal == "Juliabrot" if @fourthjb == "ci" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = ulightj-sdist*slj + flip(@ckjb) elseif @fourthjb == "cr" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = flip(ulightj-sdist*slj) + @ckjb elseif @fourthjb == "zi" szri = ulightj-sdist*slj + flip(@ckjb) szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourthjb == "zr" szri = flip(ulightj-sdist*slj) + @ckjb szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif elseif @fractal == "Gopalsamybrot" if @fourthg == "ci" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = ulightj-sdist*slj + flip(@ckg) elseif @fourthg == "cr" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = flip(ulightj-sdist*slj) + @ckg elseif @fourthg == "zi" szri = ulightj-sdist*slj + flip(@ckg) szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourthg == "zr" szri = flip(ulightj-sdist*slj) + @ckg szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif elseif @fractal == "Phoenixbrot" if @fourthp == "ci" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = ulightj-sdist*slj + flip(@ckp) elseif @fourthp == "cr" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = flip(ulightj-sdist*slj) + @ckp elseif @fourthp == "zi" szri = ulightj-sdist*slj + flip(@ckp) szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourthp == "zr" szri = flip(ulightj-sdist*slj) + @ckp szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif elseif @fractal == "Ikenagabrot" if @fourthi == "ci" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = ulightj-sdist*slj + flip(@cki) elseif @fourthi == "cr" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = flip(ulightj-sdist*slj) + @cki elseif @fourthi == "zi" szri = ulightj-sdist*slj + flip(@cki) szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourthi == "zr" szri = flip(ulightj-sdist*slj) + @cki szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif elseif @fractal == "Lambdabrot" if @fourthl == "ci" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = ulightj-sdist*slj + flip(@ckl) elseif @fourthl == "cr" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = flip(ulightj-sdist*slj) + @ckl elseif @fourthl == "zi" szri = ulightj-sdist*slj + flip(@ckl) szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourthl == "zr" szri = flip(ulightj-sdist*slj) + @ckl szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif endif soldzri = szri soldzjk = szjk sa = szri sb = szjk sspidercri = cri sspidercjk = cjk sj = sj + 1 si = 0 ssiter = 0 until (sd <= @objshadsens*epsilon || sdist > maxdist) && \ (sfirstpass == false || sdist > maxdist) if sreduce != 0 sdist = sdist+sreduce endif if sdist < sld*@srough && sd <= @objshadsens*epsilon && imag(fracjdist[xcrd,ycrd]) != 1 shad = true endif endif mycolor = l*#maxiter/2 if (imag(fracjdist[xcrd,ycrd]) != 0) || (imag(fracjdist[xcrd,ycrd])-reduce <= maxdist) \ || imag(fracjdist[xcrd,ycrd]) == 1 if @type == "Raytrace" #z = l + flip(imag(fracjdist[xcrd,ycrd])) if imag(fracjdist[xcrd,ycrd]) == 1 #z = l + flip(fdist[xcrd,ycrd]) endif elseif @type == "Distance" if imag(fracjdist[xcrd,ycrd]) == 1 #z = fdist[xcrd,ycrd] + flip(l) else #z = imag(fracjdist[xcrd,ycrd]) + flip(l) endif endif endif if cabs(#z) != 0 if @type == "Raytrace" #z = real(#z) + (0,-1) if shad #z = real(#z) + (0,-2) endif elseif @type == "Distance" #z = real(#z) + (0,1) endif endif elseif @view == "3D" && imag(fracjdist[xcrd,ycrd]) <= -3 if @shadows shad = false if @ltype == "Infinite Light" ; assumes light points at (0,0,0) lightr = -lx*1000 lighti = -ly*1000 lightj = -lz*1000 else lightr = lpointx lighti = lpointy lightj = lpointz endif ; calculate light vector slr = lightr - (rmin + (xcrd*trmax)/#width) sli = lighti - (imax - (ycrd*timax)/#height) slj = lightj - real(fracjdist[xcrd,ycrd]) ; rotate around x axis ntemp = sli sli = sli*cos(xangle)-slj*sin(xangle) slj = slj*cos(xangle)+ntemp*sin(xangle) ; rotate around y axis ntemp = slr slr = slr*cos(yangle)-slj*sin(yangle) slj = slj*cos(yangle)+ntemp*sin(yangle) ; rotate around z axis srtemp = slr + flip(sli) srtemp = srtemp*zrot slr = real(srtemp) sli = imag(srtemp) sld = sqrt(slr^2+sli^2+slj^2) slr = slr/sld sli = sli/sld slj = slj/sld ; rotate around x axis ntemp = lighti lighti = lighti*cos(xangle)-lightj*sin(xangle) lightj = lightj*cos(xangle)+ntemp*sin(xangle) ; rotate around y axis ntemp = lightr lightr = lightr*cos(yangle)-lightj*sin(yangle) lightj = lightj*cos(yangle)+ntemp*sin(yangle) ; rotate around z axis srtemp = lightr + flip(lighti) srtemp = srtemp*zrot lightr = real(srtemp) lighti = imag(srtemp) ulightr = lightr ulighti = lighti ulightj = lightj szrid = 1 szjkd = 0 if @fractal == "QuatJulia" || @fractal == "HyperJulia" || \ @fractal=="QuatPowerJulia" || @fractal == "QuatLambda" || \ @fractal=="QuatSinJulia" || @fractal == "QuatExpJulia" || \ @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia" || \ @fractal == "QuatSpiderJulia" if @fourth == "zk" szri = ulightr + flip(ulighti) szjk = ulightj + flip(@ck) elseif @fourth == "zj" szri = ulightr + flip(ulighti) szjk = flip(ulightj) + @ck elseif @fourth == "zi" szri = ulightj + flip(@ck) szjk = ulightr + flip(ulighti) elseif @fourth == "zr" szri = flip(ulightj) + @ck szjk = ulightr + flip(ulighti) endif elseif @fractal == "QuatMandel" || @fractal == "HyperMandel" if @fourth == "zk" scri = ulightr + flip(ulighti) scjk = ulightj + flip(@ck) elseif @fourth == "zj" scri = ulightr + flip(ulighti) scjk = flip(ulightj) + @ck elseif @fourth == "zi" scri = ulightj + flip(@ck) scjk = ulightr + flip(ulighti) elseif @fourth == "zr" scri = flip(ulightj) + @ck scjk = ulightr + flip(ulighti) endif szri = @zri szjk = @zjk elseif @fractal == "Juliabrot" if @fourthjb == "ci" szri = ulightr + flip(ulighti) szjk = ulightj + flip(@ckjb) elseif @fourthjb == "cr" szri = ulightr + flip(ulighti) szjk = flip(ulightj) + @ckjb elseif @fourthjb == "zi" szri = ulightj + flip(@ckjb) szjk = ulightr + flip(ulighti) elseif @fourthjb == "zr" szri = flip(ulightj) + @ckjb szjk = ulightr + flip(ulighti) endif elseif @fractal == "Gopalsamybrot" if @fourthg == "ci" szri = ulightr + flip(ulighti) szjk = ulightj + flip(@ckg) elseif @fourthg == "cr" szri = ulightr + flip(ulighti) szjk = flip(ulightj) + @ckg elseif @fourthg == "zi" szri = ulightj + flip(@ckg) szjk = ulightr + flip(ulighti) elseif @fourthg == "zr" szri = flip(ulightj) + @ckg szjk = ulightr + flip(ulighti) endif elseif @fractal == "Phoenixbrot" if @fourthp == "ci" szri = ulightr + flip(ulighti) szjk = ulightj + flip(@ckp) elseif @fourthp == "cr" szri = ulightr + flip(ulighti) szjk = flip(ulightj) + @ckp elseif @fourthp == "zi" szri = ulightj + flip(@ckp) szjk = ulightr + flip(ulighti) elseif @fourthp == "zr" szri = flip(ulightj) + @ckp szjk = ulightr + flip(ulighti) endif elseif @fractal == "Ikenagabrot" if @fourthi == "ci" szri = ulightr + flip(ulighti) szjk = ulightj + flip(@cki) elseif @fourthi == "cr" szri = ulightr + flip(ulighti) szjk = flip(ulightj) + @cki elseif @fourthi == "zi" szri = ulightj + flip(@cki) szjk = ulightr + flip(ulighti) elseif @fourthi == "zr" szri = flip(ulightj) + @cki szjk = ulightr + flip(ulighti) endif elseif @fractal == "Lambdabrot" if @fourthl == "ci" szri = ulightr + flip(ulighti) szjk = ulightj + flip(@ckl) elseif @fourthl == "cr" szri = ulightr + flip(ulighti) szjk = flip(ulightj) + @ckl elseif @fourthl == "zi" szri = ulightj + flip(@ckl) szjk = ulightr + flip(ulighti) elseif @fourthl == "zr" szri = flip(ulightj) + @ckl szjk = ulightr + flip(ulighti) endif endif soldzri = szri soldzjk = szjk sa = szri sb = szjk sspidercri = cri sspidercjk = cjk si = 0 sj = 0 sdist = 0 ssiter = 0 if (@potmeth == "Brute Force" && !brot) || (@potmeth2 == \ "Brute Force" && brot) sfirstpass = true sbepsilon = epsilon*@velocity else sfirstpass = false endif repeat repeat if @fractal == "QuatJulia" if @potmeth != "Brute Force" ; calculate derivative sztempd = szrid szrid = hrotn*2*(szri*szrid - szjk*conj(szjkd)) szjkd = hrotn*2*(szri*szjkd + conj(sztempd)*szjk) endif ; calculate fractal sztemp = szri szri = hrotn*(szri*szri - szjk*conj(szjk)) + hrotp*cri szjk = hrotn*(sztemp*szjk + conj(sztemp)*szjk) + hrotp*cjk elseif @fractal == "QuatMandel" if @potmeth != "Brute Force" ; calculate derivative sztempd = szrid szrid = hrotn*2*(szri*szrid - szjk*conj(szjkd))+ 1 szjkd = hrotn*2*(szri*szjkd + conj(sztempd)*szjk) endif ; calculate fractal sztemp = szri szri = hrotn*(szri*szri - szjk*conj(szjk)) + hrotp*scri szjk = hrotn*(sztemp*szjk + conj(sztemp)*szjk) + hrotp*scjk elseif @fractal == "HyperJulia" sa1 = szri - conj(flip(szjk)) sb1 = szri + conj(flip(szjk)) sa2 = szrid - conj(flip(szjkd)) sb2 = szrid + conj(flip(szjkd)) ; calculate the derivative if @potmeth != "Brute Force" sa = 2*sa1*sa2 sb = 2*sb1*sb2 szrid = 0.5*(sa + sb) szjkd = 0.5*(conj(flip(sa)) - conj(flip(sb))) endif ; calculate fractal sa = sa1*sa1 sb = sb1*sb1 szri = 0.5*(sa + sb) + cri szjk = 0.5*(conj(flip(sa)) - conj(flip(sb))) + cjk elseif @fractal == "HyperMandel" sa1 = szri - conj(flip(szjk)) sb1 = szri + conj(flip(szjk)) sa2 = szrid - conj(flip(szjkd)) sb2 = szrid + conj(flip(szjkd)) if @potmeth != "Brute Force" ; calculate the derivative sa = 2*sa1*sa2 sb = 2*sb1*sb2 szrid = 0.5*(sa + sb) + scri szjkd = 0.5*(conj(flip(sa)) - conj(flip(sb))) + scjk endif ; calculate fractal sa = sa1*sa1 sb = sb1*sb1 szri = 0.5*(sa + sb) + scri szjk = 0.5*(conj(flip(sa)) - conj(flip(sb))) + scjk elseif @fractal == "Juliabrot" if @potmeth2 != "Brute Force" ; calculate the derivative szrid = @power2*szri^(@power2-1)*szrid + 1 endif ; calculate the fractal szri = szri^@power2 + szjk elseif @fractal == "Gopalsamybrot" if @potmeth2 != "Brute Force" ; calculate the derivative szrid = -2*(0,1)*conj(szri)*szrid + 1 endif ; calculate the fractal szri = -(0,1)*conj(szri)*conj(szri) + szjk elseif @fractal == "PhoenixBrot" if @potmeth2 != "Brute Force" ; calculate the derivative szrid = (2*szri+imag(zjk))*szrid + 1 endif ; calculate the fractal sb = szri*szri + real(szjk) + imag(szjk)*soldzri soldzri = szri szri = sb elseif @fractal == "IkenagaBrot" if @potmeth2 != "Brute Force" ; calculate the derivative szrid = 3*szri^2*szrid + (szjk-1)*szrid -1 endif ; calculate the fractal szri = szri^3 + (szjk-1)*szri - szjk elseif @fractal == "LambdaBrot" if @potmeth2 != "Brute Force" ; calculate the derivative szrid = szjk*szrid*(1-@power*szri^(@power-1)) endif ; calculate the fractal szri = szjk*szri*(1-szri^(@power2-1)) elseif @fractal=="QuatPowerJulia" if @potmeth != "Brute Force" ;calculate the derivative sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sz2 = real(sz1) + flip(snn) st = atan2(sz2)/snn slen = |sz1|+|szh| if slen == 0 slen = 1e-20 endif sa = (@power-1)*(0.5*log(slen) + t*flip(imag(sz1))) sb = (@power-1)*st*szh sz1 = sa szh = sb snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sfx = exp(real(sz1)) sfy = sin(snn)/snn sa = sfx*cos(snn) + sfx*sfy*flip(imag(sz1)) sb = sfx*sfy*szh sztempd = szrid szrid = hrotn*@power*(sa*szrid - sb*conj(szjkd)) szjkd = hrotn*@power*(sa*szjkd + conj(sztempd)*sb) endif ; calculate the fractal sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sz2 = real(sz1) + flip(snn) st = atan2(sz2)/snn slen = |sz1|+|szh| if slen == 0 slen = 1e-20 endif sa = @power*(0.5*log(slen) + st*flip(imag(sz1))) sb = @power*st*szh sz1 = sa szh = sb snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sfx = exp(real(sz1)) sfy = sin(snn)/snn sa = sfx*cos(snn) + sfx*sfy*flip(imag(sz1)) sb = sfx*sfy*szh szri = hrotn*sa + hrotp*cri szjk = hrotn*sb + hrotp*cjk elseif @fractal=="quatlambda" if @potmeth != "Brute Force" ; calculate the derivative sa = 1-2*szri sb = 1-2*szjk sztempd = sa sa = cri*sa - cjk*conj(sb) sb = cri*sb + conj(sztempd)*cjk sztempd = szrid szrid = sa*szrid - sb*conj(szjkd) szjkd = sa*szjkd + conj(sztempd)*sb endif ; calculate fractal sztemp = szri szri = szri-(szri*szri - szjk*conj(szjk)) ;z-z^2 szjk = szjk-(sztemp*szjk + conj(sztemp)*szjk) ;z-z^2 sztemp = szri szri = cri*szri - cjk*conj(szjk) szjk = cri*szjk + conj(sztemp)*cjk elseif @fractal=="QuatExpJulia" ; calculate fractal sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sfx = exp(real(sz1)) sfy = sin(snn)/snn sa = sfx*cos(snn) + sfx*sfy*flip(imag(sz1)) sb = sfx*sfy*szh szri = sa + cri szjk = sb + cjk if @potmeth2 != "Brute Force" ; calculate derivative sztempd = szrid szrid = sa*szrid - sb*conj(szjkd) szjkd = sa*szjkd + conj(sztempd)*sb endif elseif @fractal=="QuatSinJulia" if @potmeth2 != "Brute Force" ; calculate the derivative sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sa = cos(real(sz1))*cosh(snn) - sin(real(sz1))*sinh(snn)/snn*flip(imag(sz1)) sb = -sin(real(sz1))*sinh(snn)/snn*szh sztempd = szrid szrid = (sa*szrid - sb*conj(szjkd)) szjkd = (sa*szjkd + conj(sztempd)*sb) endif ; calculate fractal sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sa = sin(real(sz1))*cosh(snn) + cos(real(sz1))*sinh(snn)/snn*flip(imag(sz1)) sb = cos(real(sz1))*sinh(snn)/snn*szh szri = sa + cri szjk = sb + cjk elseif @fractal == "QuatIkenagaJulia" ; 3*z*z*z' + c*z' - z' ; calculate the fractal sz1 = szri szh = szjk sa = sz1*sz1 - szh*conj(szh) ; z*z sb = (sz1 + conj(sz1))*szh ; z*z sa1 = sz1*sa - szh*conj(sb) ; z*z*z sb1 = sz1*sb + conj(sa)*szh ; z*z*z sa2 = cri*sz1 - cjk*conj(szh) ; c*z sb2 = cri*szh + conj(sz1)*cjk ; c*z szri = sa1 + sa2 -sz1 - cri szjk = sb1 + sb2 - szh - cjk if (@potmeth != "Brute Force" && !brot) || (@potmeth2 != \ "Brute Force" && brot) ; calculate the derivative sztempd = sa sa = 3*(sa*szrid - sb*conj(szjkd)) ; 3*z*z*z' sb = 3*(sztempd*szjkd + conj(szrid)*sb) ; 3*z*z*z' sa1 = cri*szrid - cjk*conj(szjkd) ; c*z' sb1 = cri*szjkd + conj(sztempd)*cjk ; c*z' szrid = sa + sa1 - zrid szjkd = sb + sb1 - zjkd endif elseif @fractal == "QuatManowarJulia" if @potmeth != "Brute Force" ; calculate the derivative sztempd = szrid szrid = 2*hrotn*(szri*szrid - szjk*conj(szjkd)) szjkd = 2*hrotn*(szri*szjkd + conj(sztempd)*szjk) endif ; calculate the fractal soldzri = szri soldzjk = szjk szri = hrotn*((soldzri*soldzri - soldzjk*conj(soldzjk)) + sa) + \ hrotp*cri szjk = hrotn*((soldzri*soldzjk + conj(soldzri)*soldzjk) + sb) + \ hrotp*cjk sa = soldzri sb = soldzjk elseif @fractal == "QuatSpiderJulia" if @potmeth != "Brute Force" ; calculate the derivative sztempd = szrid szrid = 2*hrotn*(szri*szrid - szjk*conj(szjkd)) szjkd = 2*hrotn*(szri*szjkd + conj(sztempd)*szjk) endif ; calculate the fractal sztemp = szri szri = hrotn*(szri*szri - szjk*conj(szjk)) + hrotp*sspidercri szjk = hrotn*(sztemp*szjk + conj(sztemp)*szjk) + hrotp*sspidercjk sspidercri = sspidercri/2 + szri sspidercjk = sspidercjk/2 + szjk endif if @fractal == "Juliabrot" || @fractal == "Gopalsamybrot" || \ @fractal == "PhoenixBrot" || @fractal == "IkenagaBrot" || \ @fractal == "LambdaBrot" smodh = cabs(szri) else smodh = sqrt(|szri|+|szjk|) endif if (@potmeth == "exponential smoothing" && !brot) || (@potmeth2 == \ "exponential smoothing" && brot) ssiter = ssiter + exp(-smodh) endif si = si + 1 until si == @iter || smodh > bailout if @fractal == "Juliabrot" || @fractal == "Gopalsamybrot" || \ @fractal == "PhoenixBrot" || @fractal == "IkenagaBrot" || \ @fractal == "LambdaBrot" smodhd = cabs(szrid) else smodhd = sqrt(|szrid|+|szjkd|) endif if (@potmeth == "Vepstas" && !brot) || (@potmeth2 == "Vepstas" && brot) ssiter = si-1-log(log(smodh))/log(2) endif if smodh <= bailout if (@potmeth == "Brute Force" && !brot) || (@potmeth2 == \ "Brute Force" && brot) if sfirstpass sdist = sdist - sbepsilon sbepsilon = epsilon sfirstpass = false else sd = 0 endif else sdist = sdist - sd sd = 0 endif else if (@potmeth != "Brute Force" && !brot) || (@potmeth2 != \ "Brute Force" && brot) spot = 2^(-ssiter) sgrad = spot*smodhd/(smodh*log(smodh)) if @limitgrad && !@constgrad if sgrad < @limvallow sgrad = @limvallow endif if sgrad > @limvalhigh sgrad = @limvalhigh endif endif if !@limitgrad && @constgrad sgrad = @gradval endif sd = dfactor*sinh(spot)/(2*exp(spot)*sgrad) if sd > @maxstep sd = @maxstep endif else sd = epsilon*1.1 endif sdist = sd + sdist endif szrid = 1 szjkd = 0 if @fractal == "QuatJulia" || @fractal == "HyperJulia" || \ @fractal=="QuatPowerJulia" || @fractal == "QuatLambda" || \ @fractal=="QuatExpJulia" || @fractal == "QuatSinJulia" || \ @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia" || \ @fractal == "QuatSpiderJulia" if @fourth == "zk" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = ulightj-sdist*slj + flip(@ck) elseif @fourth == "zj" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = flip(ulightj-sdist*slj) + @ck elseif @fourth == "zi" szri = ulightj-sdist*slj + flip(@ck) szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourth == "zr" szri = flip(ulightj-sdist*slj) + @ck szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif elseif @fractal == "QuatMandel" || @fractal == "HyperMandel" if @fourth == "zk" scri = ulightr-sdist*slr + flip(ulighti-sdist*sli) scjk = ulightj-sdist*slj + flip(@ck) elseif @fourth == "zj" scri = ulightr-sdist*slr + flip(ulighti-sdist*sli) scjk = flip(ulightj-sdist*slj) + @ck elseif @fourth == "zi" scri = ulightj-sdist*slj + flip(@ck) scjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourth == "zr" scri = flip(ulightj-sdist*slj) + @ck scjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif szri = @zri szjk = @zjk elseif @fractal == "Juliabrot" if @fourthjb == "ci" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = ulightj-sdist*slj + flip(@ckjb) elseif @fourthjb == "cr" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = flip(ulightj-sdist*slj) + @ckjb elseif @fourthjb == "zi" szri = ulightj-sdist*slj + flip(@ckjb) szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourthjb == "zr" szri = flip(ulightj-sdist*slj) + @ckjb szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif elseif @fractal == "Gopalsamybrot" if @fourthg == "ci" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = ulightj-sdist*slj + flip(@ckg) elseif @fourthg == "cr" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = flip(ulightj-sdist*slj) + @ckg elseif @fourthg == "zi" szri = ulightj-sdist*slj + flip(@ckg) szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourthg == "zr" szri = flip(ulightj-sdist*slj) + @ckg szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif elseif @fractal == "Phoenixbrot" if @fourthp == "ci" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = ulightj-sdist*slj + flip(@ckp) elseif @fourthp == "cr" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = flip(ulightj-sdist*slj) + @ckp elseif @fourthp == "zi" szri = ulightj-sdist*slj + flip(@ckp) szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourthp == "zr" szri = flip(ulightj-sdist*slj) + @ckp szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif elseif @fractal == "Ikenagabrot" if @fourthi == "ci" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = ulightj-sdist*slj + flip(@cki) elseif @fourthi == "cr" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = flip(ulightj-sdist*slj) + @cki elseif @fourthi == "zi" szri = ulightj-sdist*slj + flip(@cki) szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourthi == "zr" szri = flip(ulightj-sdist*slj) + @cki szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif elseif @fractal == "Lambdabrot" if @fourthl == "ci" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = ulightj-sdist*slj + flip(@ckl) elseif @fourthl == "cr" szri = ulightr-sdist*slr + flip(ulighti-sdist*sli) szjk = flip(ulightj-sdist*slj) + @ckl elseif @fourthl == "zi" szri = ulightj-sdist*slj + flip(@ckl) szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) elseif @fourthl == "zr" szri = flip(ulightj-sdist*slj) + @ckl szjk = ulightr-sdist*slr + flip(ulighti-sdist*sli) endif endif soldzri = szri soldzjk = szjk sa = szri sb = szjk sspidercri = cri sspidercjk = cjk sj = sj + 1 si = 0 ssiter = 0 until (sd <= @floorshadsens*epsilon || sdist > sld) && \ (sfirstpass == false || sdist > maxdist) if sdist < sld&& sd <= @floorshadsens*epsilon shad = true endif endif else ; initialize loop parameters for 2D svpr = rmin + (xcrd*trmax-@cpointx*#width)/#width svpi = imax - (ycrd*timax-@cpointy*#height)/#height svpj = @vpj ; rotate around x axis stemp = svpi svpi = svpi*cos(xangle)-svpj*sin(xangle) svpj = svpj*cos(xangle)+stemp*sin(xangle) ; rotate around y axis stemp = svpr svpr = svpr*cos(yangle)-svpj*sin(yangle) svpj = svpj*cos(yangle)+stemp*sin(yangle) ; rotate around z axis srtemp = svpr + flip(svpi) srtemp = srtemp*zrot svpr = real(srtemp) svpi = imag(srtemp) svr = camr-svpr svi = cami-svpi svj = camj-svpj svd = sqrt(svr*svr+svi*svi+svj*svj) svr = svr/svd svi = -svi/svd svj = -svj/svd smindist = svr*smindistr-svi*smindisti-svj*smindistj if @fractal == "QuatJulia" || @fractal == "HyperJulia" ||\ @fractal == "QuatPowerJulia" || @fractal == "QuatLambda" || \ @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" || \ @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia" || \ @fractal == "QuatSpiderJulia" if @fourth == "zk" szri = camr - (svd-smindist)*svr + flip(cami +(svd-smindist)*svi) szjk = camj + (svd-smindist)*svj + flip(@ck) elseif @fourth == "zj" szri = camr- (svd-smindist)*svr - flip(cami+ (svd-smindist)*svi) szjk = flip(camj+ (svd-smindist)*svj) + @ck elseif @fourth == "zi" szri = camj+ (svd-smindist)*svj + flip(@ck) szjk = camr- (svd-smindist)*svr + flip(cami- (svd-smindist)*svi) elseif @fourth == "zr" szri = flip(camj+ (svd-smindist)*svj) + @ck szjk = camr- (svd-smindist)*svr + flip(cami- (svd-smindist)*svi) endif elseif @fractal == "QuatMandel" || @fractal == "HyperMandel" if @fourth == "zk" scri = camr - (svd-smindist)*svr - flip(cami + (svd-smindist)*svi) scjk = camj + (svd-smindist)*svj + flip(@ck) elseif @fourth == "zj" scri = camr - (svd-smindist)*svr - flip(cami + (svd-smindist)*svi) scjk = flip(camj + (svd-smindist)*svj) + @ck elseif @fourth == "zi" scri = camj + (svd-smindist)*svj + flip(@ck) scjk = camr - (svd-smindist)*svr - flip(cami + (svd-smindist)*svi) elseif @fourth == "zr" scri = flip(camj + (svd-smindist)*svj) + @ck scjk = camr - (svd-smindist)*svr - flip(cami + (svd-smindist)*svi) endif szri = @zri szjk = @zjk elseif @fractal == "Juliabrot" if @fourthjb == "ci" szri = camr - (svd-smindist)*svr - flip(cami + (svd-smindist)*svi) szjk = camj + (svd-smindist)*svj - flip(@ckjb) elseif @fourthjb == "cr" szri = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) szjk = flip(camj + (svd-smindist)*svj) + @ckjb elseif @fourthjb == "zi" szri = camj + (svd-smindist)*svj - flip(@ckjb) szjk = camr - (svd-smindist)*svr - flip(cami + (svd-smindist)*svi) elseif @fourthjb == "zr" szri = flip(camj + (svd-smindist)*svj) - @ckjb szjk = camr - (svd-smindist)*svr - flip(cami + (svd-smindist)*svi) endif elseif @fractal == "Gopalsamybrot" if @fourthg == "ci" szri = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) szjk = camj + (svd-smindist)*svj + flip(@ckg) elseif @fourthg == "cr" szri = (camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi)) szjk = (flip(camj + (svd-smindist)*svj) + @ckg) elseif @fourthg == "zi" szri = camj + (svd-smindist)*svj + flip(@ckg) szjk = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) elseif @fourthg == "zr" szri = flip(camj + (svd-smindist)*svj) + @ckg szjk = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) endif elseif @fractal == "Phoenixbrot" if @fourthp == "ci" szri = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) szjk = camj + (svd-smindist)*svj + flip(@ckp) elseif @fourthp == "cr" szri = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) szjk = flip(camj + (svd-smindist)*svj) + @ckp elseif @fourthp == "zi" szri = camj + (svd-smindist)*svj + flip(@ckp) szjk = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) elseif @fourthp == "zr" szri = flip(camj + (svd-smindist)*svj) + @ckp szjk = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) endif elseif @fractal == "Ikenagabrot" if @fourthi == "ci" szri = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) szjk = camj + (svd-smindist)*svj + flip(@cki) elseif @fourthi == "cr" szri = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) szjk = flip(camj + (svd-smindist)*svj) + @cki elseif @fourthi == "zi" szri = camj + (svd-smindist)*svj + flip(@cki) szjk = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) elseif @fourthi == "zr" szri = flip(camj + (svd-smindist)*svj) + @cki szjk = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) endif elseif @fractal == "Lambdabrot" if @fourthl == "ci" szri = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) szjk = camj + (svd-smindist)*svj + flip(@ckl) elseif @fourthl == "cr" szri = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) szjk = flip(camj + (svd-smindist)*svj) + @ckl elseif @fourthl == "zi" szri = camj + (svd-smindist)*svj + flip(@ckl) szjk = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) elseif @fourthl == "zr" szri = flip(camj + (svd-smindist)*svj) + @ckl szjk = camr - (svd-smindist)*svr + flip(cami + (svd-smindist)*svi) endif endif endif soldzri = szri soldzjk = szjk sa = szri sb = szjk sspidercri = cri sspidercjk = cjk ; floor values if @view == "3D" && imag(fracjdist[xcrd,ycrd]) < -3 && @floor l = real(fracri[xcrd,ycrd])*lx + imag(fracri[xcrd,ycrd])*ly + \ imag(fracjdist[xcrd,ycrd])*lz #z = l + flip(imag(fracjdist[xcrd,ycrd])) if shad #z = l + flip(imag(fracjdist[xcrd,ycrd])-2) endif endif loop: iii = iii + 1 if @view == "2D" if @fractal == "QuatJulia" sztemp = szri szri = hrotn*(szri*szri - szjk*conj(szjk)) + hrotp*cri szjk = hrotn*(sztemp*szjk + conj(sztemp)*szjk) + hrotp*cjk elseif @fractal == "HyperJulia" sa1 = szri - conj(flip(szjk)) sb1 = szri + conj(flip(szjk)) sa = sa1*sa1 sb = sb1*sb1 szri = 0.5*(sa + sb) + cri szjk = 0.5*(conj(flip(sa)) - conj(flip(sb))) + cjk elseif @fractal == "QuatPowerJulia" sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sz2 = real(sz1) + flip(snn) st = atan2(sz2)/snn slen = |sz1|+|szh| if slen == 0 slen = 1e-20 endif sa = @power*(0.5*log(slen) + st*flip(imag(sz1))) sb = @power*st*szh sz1 = sa szh = sb snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sfx = exp(real(sz1)) sfy = sin(snn)/snn sa = sfx*cos(snn) + sfx*sfy*flip(imag(sz1)) sb = sfx*sfy*szh szri = hrotn*sa + hrotp*cri szjk = hrotn*sb + hrotp*cjk elseif @fractal == "QuatLambda" sztemp = szri szri = szri-(szri*szri - szjk*conj(szjk)) ;z-z^2 szjk = szjk-(sztemp*szjk + conj(sztemp)*szjk) ;z-z^2 sztemp = szri szri = cri*szri - cjk*conj(szjk) szjk = cri*szjk + conj(sztemp)*cjk elseif @fractal == "QuatMandel" sztemp = szri szri = hrotn*(szri*szri - szjk*conj(szjk)) + hrotp*scri szjk = hrotn*(sztemp*szjk + conj(sztemp)*szjk) + hrotp*scjk elseif @fractal == "HyperMandel" sa1 = szri - conj(flip(szjk)) sb1 = szri + conj(flip(szjk)) sa = sa1*sa1 sb = sb1*sb1 szri = 0.5*(sa + sb) + scri szjk = 0.5*(conj(flip(sa)) - conj(flip(sb))) + scjk elseif @fractal == "Juliabrot" szri = szri^@power2 + szjk elseif @fractal == "Gopalsamybrot" szri = -(0,1)*conj(szri)*conj(szri) + szjk elseif @fractal == "Phoenixbrot" sb = szri*szri + real(szjk) + imag(szjk)*soldzri soldzri = szri szri = sb elseif @fractal == "Ikenagabrot" szri = szri^3 + (szjk-1)*szri - szjk elseif @fractal == "LambdaBrot" szri = szjk*szri*(1-szri^(@power2-1)) elseif @fractal == "QuatExpJulia" sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sfx = exp(real(sz1)) sfy = sin(snn)/snn sa = sfx*cos(snn) + sfx*sfy*flip(imag(sz1)) sb = sfx*sfy*szh szri = sa + cri szjk = sb + cjk elseif @fractal == "QuatSinJulia" sz1 = szri szh = szjk snn = sqrt(imag(sz1)^2 + real(szh)^2 + imag(szh)^2) if snn == 0 snn = 1e-20 endif sa = sin(real(sz1))*cosh(snn) + cos(real(sz1))*sinh(snn)/snn*flip(imag(sz1)) sb = cos(real(sz1))*sinh(snn)/snn*szh szri = sa + cri szjk = sb + cjk elseif @fractal == "QuatIkenagaJulia" ; 3*z*z*z' + c*z' - z' ; calculate the fractal sz1 = szri szh = szjk sa = sz1*sz1 - szh*conj(szh) ; z*z sb = (sz1 + conj(sz1))*szh ; z*z sa1 = sz1*sa - szh*conj(sb) ; z*z*z sb1 = sz1*sb + conj(sa)*szh ; z*z*z sa2 = cri*sz1 - cjk*conj(szh) ; c*z sb2 = cri*szh + conj(sz1)*cjk ; c*z szri = sa1 + sa2 -sz1 - cri szjk = sb1 + sb2 - szh - cjk elseif @fractal == "QuatManowarJulia" soldzri = szri soldzjk = szjk szri = hrotn*((soldzri*soldzri - soldzjk*conj(soldzjk)) + sa) + \ hrotp*cri szjk = hrotn*((soldzri*soldzjk + conj(soldzri)*soldzjk) + sb) + \ hrotp*cjk sa = soldzri sb = soldzjk elseif @fractal == "QuatSpiderJulia" sztemp = szri szri = hrotn*(szri*szri - szjk*conj(szjk)) + hrotp*sspidercri szjk = hrotn*(sztemp*szjk + conj(sztemp)*szjk) + hrotp*sspidercjk sspidercri = sspidercri/2 + szri sspidercjk = sspidercjk/2 + szjk endif if @fractal == "Juliabrot" || @fractal == "GopalsamyBrot" || \ @fractal == "PhoenixBrot" smodh = cabs(szri) else smodh = sqrt(|szri|+|szjk|) endif #z = szri endif bailout: ((@view == "3D")&&(iii <= mycolor)) || \ ((@view == "2D")&&(smodh <= bailout && iii <= @iter)) default: title = "3D Fractal RayTrace" render = false periodicity = 0 $ifdef VER40 heading text = "Based upon an article by Hart, Sandin and Kauffman for estimating \ the distance from a point to a fractal surface. The potential and \ gradient functions derived from work of Linas Vepstas. An exponential \ smoothing potential function is also available." endheading heading text = "This formula can be used with most coloring formulas. For optimal \ Raytracing results, use the coloring formula 3D Fractal Coloring \ Direct." endheading $endif param version default = 2.0 visible = false hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." endparam heading caption = "Fractal parameters" endheading $ifdef VER40 heading text = "Uses quaternion mathematics." visible = @fractal == "QuatJulia" || @fractal == "QuatMandel" \ || @fractal == "QuatPowerJulia" || @fractal == "quatlambda" \ || @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" \ || @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia" \ || @fractal == "QuatSpiderJulia" endheading heading text = "z = zr + i*zi + j*zj + k*zk" visible = @fractal == "QuatJulia" || @fractal == "QuatMandel" \ || @fractal == "QuatPowerJulia" || @fractal == "quatlambda" \ || @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" \ || @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia" \ || @fractal == "QuatSpiderJulia" endheading heading text = "where i, j and k are the imaginary vectors. Multiplication is \ noncommutative and the inverse of any nonzero element is unique." visible = @fractal == "QuatJulia" || @fractal == "QuatMandel" \ || @fractal == "QuatPowerJulia" || @fractal == "quatlambda" \ || @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" \ || @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia" \ || @fractal == "QuatSpiderJulia" endheading heading text = "Uses hypercomplex mathematics." visible = @fractal == "HyperJulia" || @fractal == "HyperMandel" endheading heading text = "z = zr + i*zi + j*zj + k*zk" visible = @fractal == "HyperJulia" || @fractal == "HyperMandel" endheading heading text = "where i, j and k are the imaginary vectors. Multiplication is \ commutative and the inverse is not always defined. This was first\ developed extensively by Clyde Davenport." visible = @fractal == "HyperJulia" || @fractal == "HyperMandel" endheading heading text = "Uses two complex planes. The type was named by Mark Peterson, \ one of the original developers of Fractint." visible = @fractal == "Juliabrot" || @fractal == "GopalsamyBrot" || \ @fractal == "PhoenixBrot" || @fractal == "IkenagaBrot" || \ @fractal == "LambdaBrot" endheading heading text = "z = zr + i*zi; c = cr + i*ci" visible = @fractal == "Juliabrot" || @fractal == "GopalsamyBrot" || \ @fractal == "PhoenixBrot" || @fractal == "IkenagaBrot" || \ @fractal == "LambdaBrot" endheading $endif param fractal caption = "Fractal" enum = "GopalsamyBrot" "HyperJulia" "HyperMandel" "IkenagaBrot" "JuliaBrot" \ "LambdaBrot" "PhoenixBrot" "QuatExpJulia"\ "QuatIkenagaJulia" "QuatJulia" "QuatLambda" "QuatMandel" \ "QuatManowarJulia" "QuatPowerJulia" "QuatSinJulia" "QuatSpiderJulia" default = 9 endparam int param iter caption = "# of Iterations" default = 15 endparam float param bailout caption = "Bailout" default = 100 endparam complex param power caption = "Power" default = (3,0) visible = @fractal == "QuatPowerJulia" endparam complex param power2 caption = "Power" default = (2,0) visible = @fractal == "JuliaBrot" || @fractal == "LambdaBrot" endparam $ifdef VER40 heading text = "The 'Hart angle' rotates the fractal in the r-i plane. Because \ quaternian math is noncommutative, unusual shapes and forms are \ created." visible = (@fractal == "QuatJulia" || @fractal == "QuatMandel" \ || @fractal == "QuatPowerJulia" || @fractal == "QuatSpiderJulia" \ || @fractal == "QuatManowarJulia") && @view == "3D" endheading $endif float param hangle caption = "Hart angle" default = 0.0 visible = (@fractal == "QuatJulia" || @fractal == "QuatMandel" \ || @fractal == "QuatPowerJulia" || @fractal == "QuatSpiderJulia" \ || @fractal == "QuatManowarJulia") && @view == "3D" hint = "The 'Hart angle' rotates the r-i plane. This is not the same \ as rotating the object." endparam param fourth caption = "4th Dimension" default = 3 enum = "zr" "zi" "zj" "zk" visible = @fractal == "HyperJulia" || @fractal == "HyperMandel" \ || @fractal == "QuatJulia" || @fractal == "QuatMandel" \ || @fractal == "QuatPowerJulia" || @fractal == "quatlambda" \ || @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" \ || @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia"\ || @fractal == "QuatSpiderJulia" endparam float param ck caption = "4th Dimension Value" default = 0.0 visible = @fractal == "HyperJulia" || @fractal == "HyperMandel" \ || @fractal == "QuatJulia" || @fractal == "QuatMandel" \ || @fractal == "QuatPowerJulia" || @fractal == "quatlambda" \ || @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" \ || @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia"\ || @fractal == "QuatSpiderJulia" endparam param fourthjb caption = "4th Dimension" default = 3 enum = "zr" "zi" "cr" "ci" visible = @fractal == "Juliabrot" endparam float param ckjb caption = "4th Dimension Value" default = 0.5 visible = @fractal == "Juliabrot" endparam param fourthg caption = "4th Dimension" default = 3 enum = "zr" "zi" "cr" "ci" visible = @fractal == "GopalsamyBrot" endparam float param ckg caption = "4th Dimension Value" default = -0.19 visible = @fractal == "GopalsamyBrot" endparam param fourthp caption = "4th Dimension" default = 3 enum = "zr" "zi" "cr" "ci" visible = @fractal == "PhoenixBrot" endparam float param ckp caption = "4th Dimension Value" default = -0.5 visible = @fractal == "PhoenixBrot" endparam param fourthi caption = "4th Dimension" default = 3 enum = "zr" "zi" "cr" "ci" visible = @fractal == "IkenagaBrot" endparam float param cki caption = "4th Dimension Value" default = -0.3 visible = @fractal == "IkenagaBrot" endparam param fourthl caption = "4th Dimension" default = 3 enum = "zr" "zi" "cr" "ci" visible = @fractal == "LambdaBrot" endparam float param ckl caption = "4th Dimension Value" default = -0.7 visible = @fractal == "LambdaBrot" endparam heading caption = "Julia Parameters" visible = @fractal == "HyperJulia" || @fractal == "QuatJulia" \ || @fractal == "QuatPowerJulia" || @fractal == "quatlambda" \ || @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" \ || @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia"\ || @fractal == "QuatSpiderJulia" endheading $ifdef VER40 heading text = "The 'r-i plane' is the traditional complex plane. The 'j-k plane \ contains the 3rd and 4th dimensions." visible = @fractal == "HyperJulia" || @fractal == "QuatJulia" \ || @fractal == "QuatPowerJulia" || @fractal == "quatlambda" \ || @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" \ || @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia"\ || @fractal == "QuatSpiderJulia" endheading $endif complex param cri caption = "r-i plane" default = (-.5,-0.5) visible = (@fractal == "HyperJulia" || @fractal == "QuatJulia" \ || @fractal == "QuatPowerJulia" || @fractal == "quatlambda" \ || @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" \ || @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia"\ || @fractal == "QuatSpiderJulia") && @version < 1.8 endparam complex param cjk caption = "j-k plane" default = (0.0,0.0) visible = (@fractal == "HyperJulia" || @fractal == "QuatJulia" \ || @fractal == "QuatPowerJulia" || @fractal == "quatlambda" \ || @fractal == "QuatExpJulia" || @fractal == "QuatSinJulia" \ || @fractal == "QuatIkenagaJulia" || @fractal == "QuatManowarJulia"\ || @fractal == "QuatSpiderJulia") && @version < 1.8 endparam complex param criqj caption = "r-i plane" default = (-0.75,0.25) visible = (@fractal == "HyperJulia" || @fractal == "QuatJulia") && @version >= 1.8 endparam complex param cjkqj caption = "j-k plane" default = (0.0,0.0) visible = (@fractal == "HyperJulia" || @fractal == "QuatJulia") && @version >= 1.8 endparam complex param criqpj caption = "r-i plane" default = (-0.1,0.8) visible = @fractal == "QuatPowerJulia" && @version >= 1.8 endparam complex param cjkqpj caption = "j-k plane" default = (0.0,0.0) visible = @fractal == "QuatPowerJulia" && @version >= 1.8 endparam complex param criqej caption = "r-i plane" default = (0.1,0.4) visible = @fractal == "QuatExpJulia" && @version >= 1.8 endparam complex param cjkqej caption = "j-k plane" default = (0.0,0.0) visible = @fractal == "QuatExpJulia" && @version >= 1.8 endparam complex param criqsj caption = "r-i plane" default = (0.1,0.4) visible = @fractal == "QuatSinJulia" && @version >= 1.8 endparam complex param cjkqsj caption = "j-k plane" default = (0.0,0.0) visible = @fractal == "QuatSinJulia" && @version >= 1.8 endparam complex param criql caption = "r-i plane" default = (-1.0,0.25) visible = @fractal == "QuatLambda" && @version >= 1.8 endparam complex param cjkql caption = "j-k plane" default = (0.0,0.0) visible = @fractal == "QuatLambda" && @version >= 1.8 endparam complex param criqij caption = "r-i plane" default = (0.0,0.3) visible = @fractal == "QuatIkenagaJulia" && @version >= 1.8 endparam complex param cjkqij caption = "j-k plane" default = (0.0,0.0) visible = @fractal == "QuatIkenagaJulia" && @version >= 1.8 endparam complex param criqm caption = "r-i plane" default = (0.0,0.3) visible = @fractal == "QuatManowarJulia" && @version >= 1.8 endparam complex param cjkqm caption = "j-k plane" default = (0.0,0.0) visible = @fractal == "QuatManowarJulia" && @version >= 1.8 endparam complex param criqs caption = "r-i plane" default = (0.15,0.25) visible = @fractal == "QuatSpiderJulia" && @version >= 1.8 endparam complex param cjkqs caption = "j-k plane" default = (0.0,0.0) visible = @fractal == "QuatSpiderJulia" && @version >= 1.8 endparam heading caption = "Mandel Initialization" visible = @fractal == "QuatMandel" || @fractal == "HyperMandel" endheading $ifdef VER40 heading text = "The 'r-i plane' is the traditional complex plane. The 'j-k plane \ contains the 3rd and 4th dimensions." visible = @fractal == "QuatMandel" || @fractal == "HyperMandel" endheading $endif complex param zri caption = "r-i plane" default = (0.0,0.0) visible = @fractal == "QuatMandel" || @fractal == "HyperMandel" endparam complex param zjk caption = "j-k plane" default = (0.0,0.0) visible = @fractal == "QuatMandel" || @fractal == "HyperMandel" endparam heading caption = "Rotations" endheading $ifdef VER40 heading text = "For rotation around the Z axis use the Location tab setting." visible = @version >= 2.0 endheading $endif float param xangle caption = "X Axis Rotation" default = 0.0 endparam float param yangle caption = "Y Axis Rotation" default = 0.0 endparam float param zangle caption = "Z Axis Rotation" default = 0.0 visible = @version < 2.0 endparam heading caption = "Raytrace parameters" endheading param view caption = "Object view" enum = "3D" "2D" default = 0 hint = "The 2D view is at the level of the viewing screen (Starting Distance)." endparam $ifdef VER40 heading text = "The 'Distance' display type will work only with the 3D Fractal Coloring \ Direct ucl. It's in reb.ucl." visible = @type == "Distance" endheading $endif param type caption = "Display type" enum = "Raytrace" "Distance" default = 0 visible = @view == "3D" hint = "The distance option provides coloring according to the distance \ from the camera." endparam float param epsilon caption = "Closeness" default = 1.0 hint = "Determines closeness of approach to the fractal \ surface in pixels." visible = @view == "3D" endparam float param dfactor caption = "Distance factor" default = 1.0 hint = "Decrease to more accurately approach the fractal surface. This will \ slow generation of the image." visible = @view == "3D" && @potmeth != "Brute Force" endparam float param maxstep caption = "Maxiumum step" default = 1.0 visible = @view == "3D" && @potmeth != "Brute Force" hint = "Largest allowed step for approach to the object surface." endparam int param filter caption = "Filter width" default = 0 min = 0 hint = "Gaussian filter on the surface normals." endparam $ifdef VER40 heading text = "For Juliabrots, QuatExpJulia and QuatSinJulia the 'Brute Force' potential \ method is recommended. It may also be useful for other objects if \ artifacts are observed. This method is usually much slower than the \ other methods." visible = @view == "3D" endheading $endif param potmeth caption = "Potential method" enum = "Exponential smoothing" "Vepstas" "Brute Force" default = 1 visible = @view == "3D" && @fractal != \ "JuliaBrot" && @fractal != "GopalsamyBrot" && @fractal != \ "PhoenixBrot" && @fractal != "IkenagaBrot" && @fractal != \ "LambdaBrot" && @fractal != "QuatExpJulia" && @fractal != \ "QuatSinJulia" endparam param potmeth2 caption = "Potential method" enum = "Exponential smoothing" "Vepstas" "Brute Force" default = 2 visible = @view == "3D" && (@fractal == \ "JuliaBrot" || @fractal == "GopalsamyBrot" || @fractal == \ "PhoenixBrot" || @fractal == "IkenagaBrot" || @fractal == \ "LambdaBrot" || @fractal == "QuatExpJulia" || @fractal == \ "QuatSinJulia") endparam float param velocity caption = "Velocity" default = 20 visible = @view == "3D" && ((@potmeth == "Brute Force"\ && @fractal != "JuliaBrot" && @fractal != \ "GopalsamyBrot" && @fractal != "PhoenixBrot" && @fractal != \ "IkenagaBrot" && @fractal != "LambdaBrot" && \ @fractal != "QuatExpJulia" && @fractal != "QuatSinJulia") || (@potmeth2 == \ "Brute Force" &&(@fractal == \ "JuliaBrot" || @fractal == "GopalsamyBrot" || @fractal == \ "PhoenixBrot" || @fractal == "IkenagaBrot" || @fractal == \ "LambdaBrot" || @fractal == "QuatExpJulia" || @fractal == \ "QuatSinJulia"))) hint = "The rate of the initial approach to the surface." endparam bool param limitgrad caption = "Limit gradient" default = false ; visible = @view == "3D" && !@constgrad && @potmeth != "Brute Force" visible = @view == "3D" && !@constgrad && !((@potmeth == "Brute Force"&& \ @fractal != "JuliaBrot" && @fractal != \ "GopalsamyBrot" && @fractal != "PhoenixBrot" && @fractal != \ "IkenagaBrot" && @fractal != "LambdaBrot" && \ @fractal != "QuatExpJulia" && @fractal != "QuatSinJulia") || (@potmeth2 == \ "Brute Force" &&(@fractal == \ "JuliaBrot" || @fractal == "GopalsamyBrot" || @fractal == \ "PhoenixBrot" || @fractal == "IkenagaBrot" || @fractal == \ "LambdaBrot"|| @fractal == "QuatExpJulia" || @fractal == \ "QuatSinJulia"))) endparam float param limvallow caption = "lower limit" default = 1.0 visible = @view == "3D" && @limitgrad && !@constgrad && !((@potmeth == "Brute Force" \ && @fractal != "JuliaBrot" && @fractal != \ "GopalsamyBrot" && @fractal != "PhoenixBrot" && @fractal != \ "IkenagaBrot" && @fractal != "LambdaBrot" && \ @fractal != "QuatExpJulia" && @fractal != "QuatSinJulia") || (@potmeth2 == \ "Brute Force" &&(@fractal == \ "JuliaBrot" || @fractal == "GopalsamyBrot" || @fractal == \ "PhoenixBrot" || @fractal == "IkenagaBrot" || @fractal == \ "LambdaBrot"|| @fractal == "QuatExpJulia" || @fractal == \ "QuatSinJulia"))) endparam float param limvalhigh caption = "upper limit" default = 10.0 visible = @view == "3D" && @limitgrad && !@constgrad && !((@potmeth == "Brute Force"\ && @fractal != "JuliaBrot" && @fractal != \ "GopalsamyBrot" && @fractal != "PhoenixBrot" && @fractal != \ "IkenagaBrot" && @fractal != "LambdaBrot" && \ @fractal != "QuatExpJulia" && @fractal != "QuatSinJulia") || (@potmeth2 == \ "Brute Force" &&(@fractal == \ "JuliaBrot" || @fractal == "GopalsamyBrot" || @fractal == \ "PhoenixBrot" || @fractal == "IkenagaBrot" || @fractal == \ "LambdaBrot"|| @fractal == "QuatExpJulia" || @fractal == \ "QuatSinJulia"))) endparam bool param constgrad caption = "Constant gradient" default = false visible = @view == "3D" && !@limitgrad && !((@potmeth == "Brute Force" \ && @fractal != "JuliaBrot" && @fractal != \ "GopalsamyBrot" && @fractal != "PhoenixBrot" && @fractal != \ "IkenagaBrot" && @fractal != "LambdaBrot" && \ @fractal != "QuatExpJulia" && @fractal != "QuatSinJulia") || (@potmeth2 == \ "Brute Force" &&(@fractal == \ "JuliaBrot" || @fractal == "GopalsamyBrot" || @fractal == \ "PhoenixBrot" || @fractal == "IkenagaBrot" || @fractal == \ "LambdaBrot"|| @fractal == "QuatExpJulia" || @fractal == \ "QuatSinJulia"))) endparam float param gradval caption = "Gradient value" default = 1.0 visible = @view == "3D" && @constgrad && !@limitgrad && !((@potmeth == "Brute Force"\ && @fractal != "JuliaBrot" && @fractal != \ "GopalsamyBrot" && @fractal != "PhoenixBrot" && @fractal != \ "IkenagaBrot" && @fractal != "LambdaBrot" && \ @fractal != "QuatExpJulia" && @fractal != "QuatSinJulia") || (@potmeth2 == \ "Brute Force" &&(@fractal == \ "JuliaBrot" || @fractal == "GopalsamyBrot" || @fractal == \ "PhoenixBrot" || @fractal == "IkenagaBrot" || @fractal == \ "LambdaBrot"|| @fractal == "QuatExpJulia" || @fractal == \ "QuatSinJulia"))) endparam heading caption = "Cutting Plane" endheading $ifdef VER40 heading text = "The starting and ending planes are defined by the X, Y and Z \ values referenced to the camera position and the plane of the \ screen. The cutting planes are applied after any rotations." endheading $endif $ifdef VER40 heading text = " Starting Plane" endheading $else heading caption = "Starting Plane" endheading $endif float param mindistr caption = "X value" default = 0.0 hint = "This defines the cutting plane." visible = @version < 1.8 endparam float param mindisti caption = "Y value" default = 0.0 hint = "This defines the cutting plane." visible = @version < 1.8 endparam float param mindist caption = "Z value" default = 2.0 hint = "This defines the cutting plane." visible = @version < 1.8 endparam float param mindistrqj caption = "X value" default = 0.0 hint = "This defines the cutting plane." visible = @version >= 1.8 && (@fractal == "HyperJulia" || @fractal == \ "QuatJulia" || @fractal == "QuatPowerJulia" || @fractal == \ "QuatMandel" || @fractal == "HyperMandel" || @fractal == \ "QuatLambda" || @fractal == \ "QuatIkenagaJulia" || @fractal == "JuliaBrot" || @fractal == \ "GopalsamyBrot" || @fractal == "PhoenixBrot" || @fractal == \ "IkenagaBrot"|| @fractal == "QuatManowarJulia" || @fractal == \ "QuatSpiderJulia") endparam float param mindistiqj caption = "Y value" default = 0.0 hint = "This defines the cutting plane." visible = @version >= 1.8 && (@fractal == "HyperJulia" || @fractal == \ "QuatJulia" || @fractal == "QuatPowerJulia" || @fractal == \ "QuatMandel" || @fractal == "HyperMandel" || @fractal == \ "QuatLambda" || @fractal == \ "QuatIkenagaJulia" || @fractal == "JuliaBrot"|| @fractal == \ "GopalsamyBrot" || @fractal == "PhoenixBrot" || @fractal == \ "IkenagaBrot"|| @fractal == "QuatManowarJulia" || @fractal == \ "QuatSpiderJulia") endparam float param mindistqj caption = "Z value" default = 2.0 hint = "This defines the cutting plane." visible = @version >= 1.8 && (@fractal == "HyperJulia" || @fractal == \ "QuatJulia" || @fractal == "QuatPowerJulia" || @fractal == \ "QuatMandel" || @fractal == "HyperMandel" || @fractal == \ "QuatLambda" || @fractal == \ "QuatIkenagaJulia" || @fractal == "JuliaBrot"|| @fractal == \ "GopalsamyBrot" || @fractal == "PhoenixBrot" || @fractal == \ "IkenagaBrot"|| @fractal == "QuatManowarJulia" || @fractal == \ "QuatSpiderJulia") endparam float param mindistrqej caption = "X value" default = 0.0 hint = "This defines the cutting plane." visible = @version >= 1.8 && @fractal == "QuatExpJulia" endparam float param mindistiqej caption = "Y value" default = 0.0 hint = "This defines the cutting plane." visible = @version >= 1.8 && @fractal == "QuatExpJulia" endparam float param mindistqej caption = "Z value" default = 0.0 hint = "This defines the cutting plane." visible = @version >= 1.8 && @fractal == "QuatExpJulia" endparam float param mindistrqsj caption = "X value" default = 0.0 hint = "This defines the cutting plane." visible = @version >= 1.8 && @fractal == "QuatSinJulia" endparam float param mindistiqsj caption = "Y value" default = 0.0 hint = "This defines the cutting plane." visible = @version >= 1.8 && @fractal == "QuatSinJulia" endparam float param mindistqsj caption = "Z value" default = 4.0 hint = "This defines the cutting plane." visible = @version >= 1.8 && @fractal == "QuatSinJulia" endparam float param mindistrl caption = "X value" default = 0.0 hint = "This defines the cutting plane." visible = @version >= 1.8 && @fractal == "LambdaBrot" endparam float param mindistil caption = "Y value" default = 0.0 hint = "This defines the cutting plane." visible = @version >= 1.8 && @fractal == "LambdaBrot" endparam float param mindistl caption = "Z value" default = 4.0 hint = "This defines the cutting plane." visible = @version >= 1.8 && @fractal == "LambdaBrot" endparam $ifdef VER40 heading text = " Ending Plane" visible = @view == "3D" endheading $else heading caption = "Ending Plane" visible = @view == "3D" endheading $endif float param maxdistr caption = "X value" default = 0.0 hint = "This is the maximum distance from the cutting plane." visible = @view == "3D" && @version < 1.8 endparam float param maxdisti caption = "Y value" default = 0.0 hint = "This is the maximum distance from the cutting plane." visible = @view == "3D" && @version < 1.8 endparam float param maxdist caption = "Z value" default = 4.0 hint = "This is the maximum distance from the cutting plane." visible = @view == "3D" && @version < 1.8 endparam float param maxdistrqj caption = "X value" default = 0.0 hint = "This is the maximum distance from the cutting plane." visible = @view == "3D" && @version >= 1.8 && (@fractal == "HyperJulia" \ || @fractal == "QuatJulia" || @fractal == "QuatPowerJulia" || \ @fractal == "QuatMandel" || @fractal == "HyperMandel" || \ @fractal == "QuatExpJulia"|| @fractal == "QuatLambda" || @fractal == \ "QuatIkenagaJulia" || @fractal == "JuliaBrot"|| @fractal == \ "GopalsamyBrot" || @fractal == "PhoenixBrot" || @fractal == \ "IkenagaBrot"|| @fractal == "QuatManowarJulia" || @fractal == \ "QuatSpiderJulia") endparam float param maxdistiqj caption = "Y value" default = 0.0 hint = "This is the maximum distance from the cutting plane." visible = @view == "3D" && @version >= 1.8 && (@fractal == "HyperJulia" \ || @fractal == "QuatJulia" || @fractal == "QuatPowerJulia" || \ @fractal == "QuatMandel" || @fractal == "HyperMandel" || \ @fractal == "QuatExpJulia"|| @fractal == "QuatLambda" || @fractal == \ "QuatIkenagaJulia" || @fractal == "JuliaBrot"|| @fractal == \ "GopalsamyBrot" || @fractal == "PhoenixBrot" || @fractal == \ "IkenagaBrot"|| @fractal == "QuatManowarJulia" || @fractal == \ "QuatSpiderJulia") endparam float param maxdistqj caption = "Z value" default = 4.0 hint = "This is the maximum distance from the cutting plane." visible = @view == "3D" && @version >= 1.8 && (@fractal == "HyperJulia" \ || @fractal == "QuatJulia" || @fractal == "QuatPowerJulia" || \ @fractal == "QuatMandel" || @fractal == "HyperMandel" || \ @fractal == "QuatExpJulia"|| @fractal == "QuatLambda" || @fractal == \ "QuatIkenagaJulia" || @fractal == "JuliaBrot"|| @fractal == \ "GopalsamyBrot" || @fractal == "PhoenixBrot" || @fractal == \ "IkenagaBrot"|| @fractal == "QuatManowarJulia" || @fractal == \ "QuatSpiderJulia") endparam float param maxdistrqsj caption = "X value" default = 0.0 hint = "This is the maximum distance from the cutting plane." visible = @view == "3D" && @version >= 1.8 && @fractal == "QuatSinJulia" endparam float param maxdistiqsj caption = "Y value" default = 0.0 hint = "This is the maximum distance from the cutting plane." visible = @view == "3D" && @version >= 1.8 && @fractal == "QuatSinJulia" endparam float param maxdistqsj caption = "Z value" default = 8.0 hint = "This is the maximum distance from the cutting plane." visible = @view == "3D" && @version >= 1.8 && @fractal == "QuatSinJulia" endparam float param maxdistrl caption = "X value" default = 0.0 hint = "This is the maximum distance from the cutting plane." visible = @view == "3D" && @version >= 1.8 && @fractal == "LambdaBrot" endparam float param maxdistil caption = "Y value" default = 0.0 hint = "This is the maximum distance from the cutting plane." visible = @view == "3D" && @version >= 1.8 && @fractal == "LambdaBrot" endparam float param maxdistl caption = "Z value" default = 8.0 hint = "This is the maximum distance from the cutting plane." visible = @view == "3D" && @version >= 1.8 && @fractal == "LambdaBrot" endparam $ifdef VER40 heading caption = "Camera Settings" expanded = false endheading heading text = "Camera Origin" visible = @view == "3D" endheading $else heading caption = "Camera Settings" visible = @view == "3D" endheading heading caption = " Camera Origin" endheading $endif float param camr caption = " X" default = -1.0 endparam float param cami caption = " Y" default = 1.0 endparam float param camj caption = " Z" default = 10.0 endparam $ifdef VER40 heading text = "Camera Point At" endheading $else heading caption = " Camera Point At" endheading $endif float param cpointx caption = " X" default = 0.0 endparam float param cpointy caption = " Y" default = 0.0 endparam float param vpj caption = " Z" default = 0.0 endparam $ifdef VER40 heading caption = "Illumination" expanded = false visible = @view == "3D" && @type == "raytrace" endheading $else heading caption = "Illumination" visible = @view == "3D" && @type == "raytrace" endheading $endif param ltype caption = "Light type" enum = "Point source" "Infinite light" default = 0 visible = @view == "3D" && @type == "raytrace" endparam param angle caption = "Light Rotation" default = 60.0 hint = "Gives the rotation of the light source, in degrees." visible = @ltype == "Infinite light" && @view == "3D" && @type == "raytrace" endparam param elevation caption = "Light Elevation" default = 60.0 hint = "Gives the elevation of the light source, in degrees." visible = @ltype == "Infinite light" && @view == "3D" && @type == "raytrace" endparam $ifdef VER40 heading text = "Light Origin" visible=@ltype != "infinite light" && @view == "3D" && @type == "raytrace" endheading $else heading caption = " Light Origin" visible=@ltype != "infinite light" && @view == "3D" && @type == "raytrace" endheading $endif float param lpointx caption = " X" default = 1.5 visible=@ltype != "infinite light" && @view == "3D" && @type == "raytrace" endparam float param lpointy caption = " Y" default = 2 visible=@ltype != "infinite light" && @view == "3D" && @type == "raytrace" endparam float param lplane caption = " Z" default = 5 visible=@ltype != "infinite light" && @view == "3D" && @type == "raytrace" endparam $ifdef VER40 heading text = "Light Point At" visible=@ltype != "infinite light" && @view == "3D" && @type == "raytrace" endheading $else heading caption = " Light Point At" visible=@ltype != "infinite light" && @view == "3D" && @type == "raytrace" endheading $endif float param lightx caption = " X" default = 0.0 visible=@ltype != "infinite light" && @view == "3D" && @type == "raytrace" endparam float param lighty caption = " Y" default = 0.0 visible=@ltype != "infinite light" && @view == "3D" && @type == "raytrace" endparam float param lightz caption = " Z" default = 0.0 visible=@ltype != "infinite light" && @view == "3D" && @type == "raytrace" endparam heading caption = "Shadows" visible = @view == "3D" && @type == "raytrace" endheading bool param shadows caption = "Add Shadows" default = false visible = @view == "3D" endparam $ifdef VER40 heading text = "Increasing 'shadow sensivity' will give shadows that show less fractal \ detail, but can also increase the number of false shadows from roughness \ on the fractal surface. Decreasing object roughness slightly may reduce \ the false shadows." visible = @view == "3D" && @shadows endheading $endif float param objshadsens caption = "Object shadow sens" default = 0.1 visible = @view == "3D" && @shadows hint = "Determines shadow detail and sensitivity to surface roughness. Larger \ show less detail and more response to surface roughness" endparam float param srough caption = "Object roughness" default = 0.99 visible = @view == "3D" && @shadows hint = "Determines shadow sensitivity to surface roughness. Larger \ have more response to surface roughness" endparam float param floorshadsens caption = "Floor shadow sens" default = 1.0 visible = @view == "3D" && @shadows endparam heading caption = "Environment" visible = @view == "3D" endheading bool param floor caption = "Add floor" default = false visible = @view == "3D" endparam float param fa caption = "X direction" default = 0.0 visible=@floor==true && @view == "3D" endparam float param fb caption = "Y direction" default = 1.0 visible=@floor==true && @view == "3D" endparam float param fc caption = "Z direction" default = 0.2 visible=@floor==true && @view == "3D" endparam float param fd caption = "Position" default = -4.0 visible=@floor==true && @view == "3D" endparam float param dis caption = "Floor brightness" default = 1.0 visible=@floor==true && @view == "3D" endparam float param fade caption = "Fade factor" default = 3.0 min = 3.0 visible=@floor==true && @view == "3D" endparam heading caption = "Floor Patterns" visible=@floor==true && @view == "3D" endheading param flrtype caption = "Floor Type" default = 0 enum = "Checkerboard" "Plain" visible=@floor==true && @view == "3D" endparam float param checkscale caption = "Pattern scale" default = 1 visible=@floor==true && @flrtype != "Plain" && @view == "3D" endparam complex param poffset caption = "Pattern offset" default = (0,0) visible=@floor==true && @flrtype != "Plain" && @view == "3D" endparam } IndrasPromise {; Ron Barnett, May 2006 ; Based upon code in the Book Indra's Pearls by ; by Mumford, Series and Wright, and the public C code of Curtis McMullen. ; The sorting routine is a modification of HEAPSORT from Numerical Recipies by ; Press, Flannery, Teukolsky and Vettering. global: complex tab = 0 complex gz = 0 complex gz0 = 0 complex gQ = 0 complex gR = 0 int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) float count[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float fx = 0.0 float ffx = 0.0 float xx = 0.0 float fy = 0.0 float ffy = 0.0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float xmin = cx - txmax/2 float ymin = cy - tymax/2 int MaxLevel = @level int level = MaxLevel int lev = 0 int iii = 0 complex cs[5000000] float rad[5000000] complex csf[2500000] float radf[2500000] float clr[5000000] float clrf[2500000] complex gens[13,4] complex temp1 = 0 complex temp2 = 0 complex temp3 = 0 complex temp4 = 0 float thresh = @scircle/1000 complex rra = 0 float rrb = 0 float rrc = 0 bool continue = true int si = 0 int sj = 0 int ii = 0 int i = 0 int j = 0 int k = 0 int c = 0 int l = 0 int ir = 0 int ifinal = 0 int istack = 0 int nold = 0 int nfinal = 1 float ddx = 0 float ddy = 0 float ddr = 0 complex det = 0 float PARAFUZZ = 1e-3 ; Nearly parallel slopes float LINEFUZZ = 1e-5 ; Line vs. Circle bool done = false complex unit = 0 complex im = (0,1) float ku = @su float kv = 0 float kx = @sx float ky = 0 float kk = 0 float gsum[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] complex gr = (1,1) complex gr2 = (0,1) ^ 0.411111111111 float gfreq = 1.0 int gi = 0 complex gp = 0 float gbx0 = 0 float gby0 = 0 float gbx1 = 0 float gby1 = 0 float grx0 = 0 float gry0 = 0 float grx1 = 0 float gry1 = 0 float gb00 = 0 float gb10 = 0 float gb01 = 0 float gb11 = 0 float gg_b00_0 = 0 float gg_b10_0 = 0 float gg_b01_0 = 0 float gg_b11_0 = 0 float gg_b00_1 = 0 float gg_b10_1 = 0 float gg_b01_1 = 0 float gg_b11_1 = 0 float gd = 0.0 float gu1 = 0 float gv1 = 0 float gu2 = 0 float gv2 = 0 float gsx = 0 float gsy = 0 float ga = 0 float gb = 0 complex gpixel=0 complex gp = 0 float fsum = 0 if @slope while (h < #height+ht) while (w < #width+wd) gpixel = w/(#width+wd) + flip(h/(#height+ht)) gp = gpixel * @gnscale * gr + @gnoffset gi = @giter gfreq = @gfreq gsum[w,h] = 0 WHILE (gi > 0) gbx0 = floor(real(gp)) % 256 gby0 = floor(imag(gp)) % 256 IF (gbx0 < 0) gbx0 = gbx0 + 256 ENDIF IF (gby0 < 0) gby0 = gby0 + 256 ENDIF gbx1 = (gbx0 + 1) % 256 gby1 = (gby0 + 1) % 256 grx0 = real(gp) - floor(real(gp)) gry0 = imag(gp) - floor(imag(gp)) grx1 = grx0 - 1 gry1 = gry0 - 1 gb00 = (gbx0^2 % 65536 + gby0)^2 % 65536 gb10 = (gbx1^2 % 65536 + gby0)^2 % 65536 gb01 = (gbx0^2 % 65536 + gby1)^2 % 65536 gb11 = (gbx1^2 % 65536 + gby1)^2 % 65536 gg_b00_0 = (gb00)^2*0.25 % 512 - 256 gg_b10_0 = (gb10)^2*0.25 % 512 - 256 gg_b01_0 = (gb01)^2*0.25 % 512 - 256 gg_b11_0 = (gb11)^2*0.25 % 512 - 256 gg_b00_1 = (gb00+1)^2*0.25 % 512 - 256 gg_b10_1 = (gb10+1)^2*0.25 % 512 - 256 gg_b01_1 = (gb01+1)^2*0.25 % 512 - 256 gg_b11_1 = (gb11+1)^2*0.25 % 512 - 256 gd = 1 / sqrt(sqr(gg_b00_0) + sqr(gg_b00_1)) gg_b00_0 = gg_b00_0 * gd gg_b00_1 = gg_b00_1 * gd gd = 1 / sqrt(sqr(gg_b10_0) + sqr(gg_b10_1)) gg_b10_0 = gg_b10_0 * gd gg_b10_1 = gg_b10_1 * gd gd = 1 / sqrt(sqr(gg_b01_0) + sqr(gg_b01_1)) gg_b01_0 = gg_b01_0 * gd gg_b01_1 = gg_b01_1 * gd gd = 1 / sqrt(sqr(gg_b11_0) + sqr(gg_b11_1)) gg_b11_0 = gg_b11_0 * gd gg_b11_1 = gg_b11_1 * gd gu1 = grx0 * gg_b00_0 + gry0 * gg_b00_1 gv1 = grx1 * gg_b10_0 + gry0 * gg_b10_1 gu2 = grx0 * gg_b01_0 + gry1 * gg_b01_1 gv2 = grx1 * gg_b11_0 + gry1 * gg_b11_1 gsx = sqr(grx0) * (3 - grx0*2) gsy = sqr(gry0) * (3 - gry0*2) ga = gu1 + gsx*(gv1-gu1) gb = gu2 + gsx*(gv2-gu2) gsum[w,h] = gsum[w,h] + (ga + gsy*(gb-ga))*gfreq gfreq = gfreq / 2 gp = gp * gr2 * 2 gi = gi - 1 ENDWHILE w = w + 1 endwhile w = 0 h = h + 1 endwhile w = 0 h = 0 ; initialize count array ; while(h < #height+wd) while(w < #width+ht) count[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile endif ; initial circle cs[0] = (0,0) rad[0] = 1.0 csf[0] = (0,0) radf[0] = rad[0] clr[0] = 0 ; the following are matrix representations of Mobius tranforms ; matrix one gens[0,0] = (1.0,1.0) gens[0,1] = (0.0,1.0) gens[0,2] = (0.0,-1.0) gens[0,3] = (1.0,-1.0) ; matrix two gens[1,0] = (1,-1) gens[1,1] = (0,-1) gens[1,2] = (0,1) gens[1,3] = (1,1) if @cusptype == "Nearby group" if @showcusp == "Both" cs[0] = (0,0.703) rad[0] = 0.297 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.703) rad[1] = 0.297 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (0,0.703) rad[0] = 0.297 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.703) rad[1] = 0.297 csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif ; matrix three gens[2,0] = (0.955,-0.025) gens[2,1] = (0.045,0.025) gens[2,2] = (-1.955,0.025) gens[2,3] = (0.955,-0.025) ; matrix four gens[3,0] = (0.955,-0.025) gens[3,1] = (-0.045,-0.025) gens[3,2] = (1.955,-0.025) gens[3,3] = (0.955,-0.025) elseif @cusptype == "Double Cusp" if @cusp == "0/1" if @showcusp == "Both" cs[0] = (0,0.5) rad[0] = 0.5 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.5) rad[1] = 0.5 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (0,0.5) rad[0] = 0.5 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.5) rad[1] = 0.5 csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif ; matrix three gens[2,0] = (1,0) gens[2,1] = (0,0) gens[2,2] = (-2,0) gens[2,3] = (1,0) ; matrix four gens[3,0] = (1,0) gens[3,1] = (0,0) gens[3,2] = (2,0) gens[3,3] = (1,0) elseif @cusp == "1/15" if @showcusp == "Both" cs[0] = (0,0.67129232) rad[0] = 0.32870768 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.67129232) rad[1] = 0.32870768 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (0,0.67129232) rad[0] = 0.32870768 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.67129232) rad[1] = 0.32870768 csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif ; matrix three gens[2,0] = (0.979295515055895, -0.0056392803058829) gens[2,1] = (0.020704484944105, 0.0056392803058829 ) gens[2,2] = (-1.9792955150559, 0.0056392803058829) gens[2,3] = (0.979295515055895, -0.0056392803058829) ; matrix four gens[3,0] = (0.979295515055895, -0.0056392803058829) gens[3,1] = (-0.020704484944105, -0.0056392803058829) gens[3,2] = (1.9792955150559, -0.0056392803058829) gens[3,3] = (0.979295515055895, -0.0056392803058829) elseif @cusp == "1/10" if @showcusp == "Both" cs[0] = (0,0.67634831) rad[0] = 0.32365169 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.67634831) rad[1] = 0.32365169 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (0,0.67634831) rad[0] = 0.32365169 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.67634831) rad[1] = 0.32365169 csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif ; matrix three gens[2,0] = (0.95671164793341,-0.0181440387612714) gens[2,1] = (0.04328835206659, 0.0181440387612714) gens[2,2] = (-1.95671164793341, 0.0181440387612714) gens[2,3] = (0.95671164793341,-0.0181440387612714) ; matrix four gens[3,0] = (0.95671164793341,-0.0181440387612714) gens[3,1] = (-0.04328835206659, -0.0181440387612714) gens[3,2] = (1.95671164793341, -0.0181440387612714) gens[3,3] = (0.95671164793341,-0.0181440387612714) elseif @cusp == "2/19" if @showcusp == "Both" cs[0] = (0,0.7395679) rad[0] = 0.2604321 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.7395679) rad[1] = 0.2604321 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (0,0.7395679) rad[0] = 0.2604321 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.7395679) rad[1] = 0.2604321 csf[1] = cs[1] radf[1] = rad[1] csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif ; matrix three gens[2,0] = (0.95188999889859,-0.0197899756344403) gens[2,1] = (0.04811000110141,0.0197899756344403) gens[2,2] = (-1.95188999889859,0.0197899756344403) gens[2,3] = (0.95188999889859,-0.0197899756344403) ; matrix four gens[3,0] = (0.95188999889859,-0.0197899756344403) gens[3,1] = (-0.04811000110141,-0.0197899756344403) gens[3,2] = (1.95188999889859,-0.0197899756344403) gens[3,3] = (0.95188999889859,-0.0197899756344403) elseif @cusp == "1/9" if @showcusp == "Both" cs[0] = (0,0.678234935) rad[0] = 0.32176507 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.678234935) rad[1] = 0.32176507 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (0,0.678234935) rad[0] = 0.32176507 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.678234935) rad[1] = 0.32176507 csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif ; matrix three gens[2,0] = (0.948203625474605,-0.0243765064493254) gens[2,1] = (0.051796374525395,0.0243765064493254) gens[2,2] = (-1.94820362547461, 0.0243765064493254) gens[2,3] = (0.948203625474605,-0.0243765064493254) ; matrix four gens[3,0] = (0.948203625474605,-0.0243765064493254) gens[3,1] = (-0.051796374525395,-0.0243765064493254) gens[3,2] = (1.94820362547461, -0.0243765064493254) gens[3,3] = (0.948203625474605,-0.0243765064493254) elseif @cusp == "7/43" if @showcusp == "Both" cs[0] = (0,0.770204) rad[0] = 0.229796 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.770204) rad[1] = 0.229796 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (0,0.770204) rad[0] = 0.229796 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.770204) rad[1] = 0.229796 csf[1] = cs[1] radf[1] = rad[1] csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif ; matrix three gens[2,0] = (0.903927619995215,-0.0684993439535685) gens[2,1] = (0.096072380004785, 0.0684993439535685) gens[2,2] = (-1.90392761999521, 0.0684993439535685) gens[2,3] = (0.903927619995215,-0.0684993439535685) ; matrix four gens[3,0] = (0.903927619995215,-0.0684993439535685) gens[3,1] = (-0.096072380004785, -0.0684993439535685) gens[3,2] = (1.90392761999521, -0.0684993439535685) gens[3,3] = (0.903927619995215,-0.0684993439535685) elseif @cusp == "3/10" if @showcusp == "Both" cs[0] = (0,0.7683375) rad[0] = 0.2316625 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.7683375) rad[1] = 0.2316625 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (0,0.7683375) rad[0] = 0.2316625 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.7683375) rad[1] = 0.2316625 csf[1] = cs[1] radf[1] = rad[1] csf[1] = cs[1] radf[1] = rad[1] csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif ; matrix three gens[2,0] = (0.829156197588855,-0.25) gens[2,1] = (0.17084380241115, 0.25) gens[2,2] = (-1.82915619758885, 0.25) gens[2,3] = (0.829156197588855,-0.25) ; matrix four gens[3,0] = (0.829156197588855,-0.25) gens[3,1] = (-0.17084380241115, -0.25) gens[3,2] = (1.82915619758885, -0.25) gens[3,3] = (0.829156197588855,-0.25) elseif @cusp == "2/5" if @showcusp == "Both" cs[0] = (0,0.7334116) rad[0] = 0.2665884 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.7334116) rad[1] = 0.2665884 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (0,0.7334116) rad[0] = 0.2665884 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.7334116) rad[1] = 0.2665884 csf[1] = cs[1] radf[1] = rad[1] csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif ; matrix three gens[2,0] = (0.821069384326745,-0.38329420873273) gens[2,1] = (0.17893061567326, 0.38329420873273) gens[2,2] = (-1.82106938432674, 0.38329420873273) gens[2,3] = (0.821069384326745,-0.38329420873273) ; matrix four gens[3,0] = (0.821069384326745,-0.38329420873273) gens[3,1] = (-0.17893061567326, -0.38329420873273) gens[3,2] = (1.82106938432674, -0.38329420873273) gens[3,3] = (0.821069384326745,-0.38329420873273) elseif @cusp == "1/2" if @showcusp == "Both" cs[0] = (0,0.63397461) rad[0] = 0.36602539 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.63397461) rad[1] = 0.36602539 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (0,0.63397461) rad[0] = 0.36602539 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.63397461) rad[1] = 0.36602539 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 endif ; matrix three gens[2,0] = (0.86602540378444,-0.5) gens[2,1] = (0.1339745921556,0.5) gens[2,2] = (-1.86602540378444,0.5) gens[2,3] = (0.86602540378444,-0.5) ; matrix four gens[3,0] = (0.86602540378444,-0.5) gens[3,1] = (-0.1339745921556,-0.5) gens[3,2] = (1.86602540378444,-0.5) gens[3,3] = (0.86602540378444,-0.5) elseif @cusp == "21/34" if @showcusp == "Both" cs[0] = (0,0.833539) rad[0] = 0.166461 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.833539) rad[1] = 0.166461 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (0,0.833539) rad[0] = 0.166461 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.833539) rad[1] = 0.166461 csf[1] = cs[1] radf[1] = rad[1] csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif ; matrix three gens[2,0] = (0.80899539837605,-0.64585014332109) gens[2,1] = (0.19100460162395,0.64585014332109) gens[2,2] = (-1.80899539837605,0.64585014332109) gens[2,3] = (0.80899539837605,-0.64585014332109) ; matrix four gens[3,0] = (0.80899539837605,-0.64585014332109) gens[3,1] = (-0.19100460162395,-0.64585014332109) gens[3,2] = (1.80899539837605,-0.64585014332109) gens[3,3] = (0.80899539837605,-0.64585014332109) elseif @cusp == "1/1" if @showcusp == "Both" cs[0] = (0,0.5) rad[0] = 0.5 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.5) rad[1] = 0.5 csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (0,0.5) rad[0] = 0.5 csf[0] = cs[0] radf[0] = rad[0] cs[1] = (0,-0.5) rad[1] = 0.5 csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif ; matrix three gens[2,0] = (1,-1) gens[2,1] = (0,1) gens[2,2] = (-2,1) gens[2,3] = (1,-1) ; matrix four gens[3,0] = (1,-1) gens[3,1] = (0,-1) gens[3,2] = (2,-1) gens[3,3] = (1,-1) endif elseif @cusptype == "Slice" if @scusp == "Nearby group" ; matrix three gens[2,0] = (0.955,-0.025) gens[2,2] = (0.045,0.025) gens[2,1] = (-1.955,0.025) gens[2,3] = (0.955,-0.025) ; matrix four gens[3,0] = (0.955,-0.025) gens[3,2] = (-0.045,-0.025) gens[3,1] = (1.955,-0.025) gens[3,3] = (0.955,-0.025) elseif @scusp == "0/1" ; matrix one gens[0,0] = (1,-1) gens[0,1] = (1,0) gens[0,2] = (1,0) gens[0,3] = (1,1) ; matrix two gens[1,0] = (1,1) gens[1,1] = (-1,0) gens[1,2] = (-1,0) gens[1,3] = (1,-1) ; matrix three gens[2,0] = (-0.5,0.5) gens[2,1] = (0.5,1.5) gens[2,2] = (-0.5,0.5) gens[2,3] = (-0.5,0.5) ; matrix four gens[3,0] = (-0.5,0.5) gens[3,1] = (-0.5,-1.5) gens[3,2] = (0.5,-0.5) gens[3,3] = (-0.5,0.5) elseif @scusp == "1/15" ; matrix three gens[2,0] = (0.979295515055895, -0.0056392803058829) gens[2,2] = (0.020704484944105, 0.0056392803058829 ) gens[2,1] = (-1.9792955150559, 0.0056392803058829) gens[2,3] = (0.979295515055895, -0.0056392803058829) ; matrix four gens[3,0] = (0.979295515055895, -0.0056392803058829) gens[3,2] = (-0.020704484944105, -0.0056392803058829) gens[3,1] = (1.9792955150559, -0.0056392803058829) gens[3,3] = (0.979295515055895, -0.0056392803058829) elseif @scusp == "2/19" ; matrix three gens[2,0] = (0.95188999889859,-0.0197899756344403) gens[2,2] = (0.04811000110141,0.0197899756344403) gens[2,1] = (-1.95188999889859,0.0197899756344403) gens[2,3] = (0.95188999889859,-0.0197899756344403) ; matrix four gens[3,0] = (0.95188999889859,-0.0197899756344403) gens[3,2] = (-0.04811000110141,-0.0197899756344403) gens[3,1] = (1.95188999889859,-0.0197899756344403) gens[3,3] = (0.95188999889859,-0.0197899756344403) elseif @scusp == "1/9" ; matrix three gens[2,0] = (0.948203625474605,-0.0243765064493254) gens[2,2] = (0.051796374525395,0.0243765064493254) gens[2,1] = (-1.94820362547461, 0.0243765064493254) gens[2,3] = (0.948203625474605,-0.0243765064493254) ; matrix four gens[3,0] = (0.948203625474605,-0.0243765064493254) gens[3,2] = (-0.051796374525395,-0.0243765064493254) gens[3,1] = (1.94820362547461, -0.0243765064493254) gens[3,3] = (0.948203625474605,-0.0243765064493254) elseif @scusp == "7/43" ; matrix three gens[2,0] = (0.903927619995215,-0.0684993439535685) gens[2,2] = (0.096072380004785, 0.0684993439535685) gens[2,1] = (-1.90392761999521, 0.0684993439535685) gens[2,3] = (0.903927619995215,-0.0684993439535685) ; matrix four gens[3,0] = (0.903927619995215,-0.0684993439535685) gens[3,2] = (-0.096072380004785, -0.0684993439535685) gens[3,1] = (1.90392761999521, -0.0684993439535685) gens[3,3] = (0.903927619995215,-0.0684993439535685) elseif @scusp == "2/5" ; matrix three gens[2,0] = (0.821069384326745,-0.38329420873273) gens[2,2] = (0.17893061567326, 0.38329420873273) gens[2,1] = (-1.82106938432674, 0.38329420873273) gens[2,3] = (0.821069384326745,-0.38329420873273) ; matrix four gens[3,0] = (0.821069384326745,-0.38329420873273) gens[3,2] = (-0.17893061567326, -0.38329420873273) gens[3,1] = (1.82106938432674, -0.38329420873273) gens[3,3] = (0.821069384326745,-0.38329420873273) endif elseif @cusptype == "Schottky" clr[0] = 0 clr[1] = 0 clr[2] = 0 clr[3] = 0 if @subtype == "Kissing" ; uses formula on page 170 of "Indra's Pearls" ky = sqrt(kx^2-1) kv = sqrt(ku^2-1) if @plus == "Larger root" kk = (1+sqrt(1-ky^2*kv^2))/(ky*kv) else kk = (1-sqrt(1-ky^2*kv^2))/(ky*kv) endif cs[0] = flip(kk*ku/kv) ;a cs[1] = kx/ky ;b cs[2] = -flip(kk*ku/kv) ;A cs[3] = -kx/ky ;B rad[0] = kk/kv ;ra rad[1] = 1/ky ;rb rad[2] = kk/kv ;rA rad[3] = 1/ky ;rB csf[0] = cs[0] csf[1] = cs[1] csf[2] = cs[2] csf[3] = cs[3] radf[0] = rad[0] radf[1] = rad[1] radf[2] = rad[2] radf[3] = rad[3] elseif @subtype == "Disjoint" cs[0] = (1.112,1.202) ;a cs[1] = (0.877,-0.948) ;b cs[2] = (-1.178,-1.112) ;A cs[3] = (-0.812,0.872) ;B rad[0] = 0.8 ;ra rad[1] = 1.045 ;rA rad[2] = 0.775 ;rb rad[3] = 1.125 ;rB csf[0] = cs[0] csf[1] = cs[1] csf[2] = cs[2] csf[3] = cs[3] radf[0] = rad[0] radf[1] = rad[1] radf[2] = rad[2] radf[3] = rad[3] elseif @subtype == "Apollonian 1" ; uses info on page 201 of Indra's Pearls cs[0] = (0,0) ;a - this is a line, the real axis cs[1] = (1,-1) ;b cs[2] = (0,-0.25) ;A cs[3] = (-1,-1) ;B rad[0] = -1 ;ra rad[1] = 1 ;rb rad[2] = 0.25 ;rA rad[3] = 1 ;rB csf[0] = cs[0] csf[1] = cs[1] csf[2] = cs[2] csf[3] = cs[3] radf[0] = rad[0] radf[1] = rad[1] radf[2] = rad[2] radf[3] = rad[3] elseif @subtype == "Apollonian 2" ; use info on page 202 of Indra's Pearls cs[0] = (0,1) ;a cs[1] = (1,0) ;b - this is a line, x = 1 cs[2] = (0,-1) ;A cs[3] = (-1,0) ;B - this is a line, x = -1 rad[0] = 1 ;ra rad[1] = -0.5 ;rb rad[2] = 1 ;rA rad[3] = -0.5 ;rB csf[0] = cs[0] csf[1] = cs[1] csf[2] = cs[2] csf[3] = cs[3] radf[0] = rad[0] radf[1] = rad[1] radf[2] = rad[2] radf[3] = rad[3] elseif @subtype == "Apollonian 3" cs[0] = (-sqrt(3)-2)/2 cs[1] = (sqrt(3)/2+1 + flip(sqrt(3) + 1.5))/2 cs[2] = (sqrt(3)/2+1 - flip(sqrt(3) + 1.5))/2 cs[3] = (0,0) rad[0] = (sqrt(3) + 1.5)/2 rad[1] = rad[0] rad[2] = rad[0] rad[3] = 0.25 csf[0] = cs[0] csf[1] = cs[1] csf[2] = cs[2] csf[3] = cs[3] radf[0] = rad[0] radf[1] = rad[1] radf[2] = rad[2] radf[3] = rad[3] elseif @subtype == "Indra's net" float corr = 1.0101 cs[0] = (-sqrt(3)-2)/2 cs[1] = (sqrt(3)/2+1 + flip(sqrt(3) + 1.5))/2 cs[2] = (sqrt(3)/2+1 - flip(sqrt(3) + 1.5))/2 cs[3] = (sqrt(3)+2)/20*corr cs[4] = -cs[3]/2+flip(sqrt(3)+1.5)/20*corr cs[5] = -cs[3]/2-flip(sqrt(3)+1.5)/20*corr rad[0] = (sqrt(3) + 1.5)/2 rad[1] = rad[0] rad[2] = rad[0] rad[3] = (sqrt(3) + 1.5)/20*corr rad[4] = rad[3] rad[5] = rad[3] csf[0] = cs[0] csf[1] = cs[1] csf[2] = cs[2] csf[3] = cs[3] csf[4] = cs[4] csf[5] = cs[5] radf[0] = rad[0] radf[1] = rad[1] radf[2] = rad[2] radf[3] = rad[3] radf[4] = rad[4] radf[5] = rad[5] gens[4,0] = cs[4]/rad[4] gens[4,1] = rad[4]-|cs[4]|/rad[4] gens[4,2] = 1/rad[4] gens[4,3] = -conj(cs[4])/rad[4] gens[5,0] = cs[5]/rad[5] gens[5,1] = rad[5]-|cs[5]|/rad[5] gens[5,2] = 1/rad[5] gens[5,3] = -conj(cs[5])/rad[5] endif if rad[0] > 0 gens[0,0] = cs[0]/rad[0] gens[0,1] = rad[0]-|cs[0]|/rad[0] gens[0,2] = 1/rad[0] gens[0,3] = -conj(cs[0])/rad[0] else unit = cos(-#pi*rad[0]) + flip(sin(-#pi*rad[0])) gens[0,0] = im*unit gens[0,1] = im*(conj(unit)*cs[0]-unit*conj(cs[0])) gens[0,2] = 0 gens[0,3] = im*conj(unit) endif if rad[1] > 0 gens[1,0] = cs[1]/rad[1] gens[1,1] = rad[1]-|cs[1]|/rad[1] gens[1,2] = 1/rad[1] gens[1,3] = -conj(cs[1])/rad[1] else unit = cos(-#pi*rad[1]) + flip(sin(-#pi*rad[1])) gens[1,0] = im*unit gens[1,1] = im*(conj(unit)*cs[1]-unit*conj(cs[1])) gens[1,2] = 0 gens[1,3] = im*conj(unit) endif if rad[2] > 0 gens[2,0] = cs[2]/rad[2] gens[2,1] = rad[2]-|cs[2]|/rad[2] gens[2,2] = 1/rad[2] gens[2,3] = -conj(cs[2])/rad[2] else unit = cos(-#pi*rad[2]) + flip(sin(-#pi*rad[2])) gens[2,0] = im*unit gens[2,1] = im*(conj(unit)*cs[2]-unit*conj(cs[2])) gens[2,2] = 0 gens[2,3] = im*conj(unit) endif if rad[3] > 0 gens[3,0] = cs[3]/rad[3] gens[3,1] = rad[3]-|cs[3]|/rad[3] gens[3,2] = 1/rad[3] gens[3,3] = -conj(cs[3])/rad[3] else unit = cos(-#pi*rad[3]) + flip(sin(-#pi*rad[3])) gens[3,0] = im*unit gens[3,1] = im*(conj(unit)*cs[3]-unit*conj(cs[3])) gens[3,2] = 0 gens[3,3] = im*conj(unit) endif elseif @cusptype == "Grandma's Special" if @showcusp == "Both" cs[0] = 1-@cir rad[0] = @cir csf[0] = cs[0] radf[0] = rad[0] cs[1] = -(1-@cir) rad[1] = @cir csf[1] = cs[1] radf[1] = rad[1] cs[2] = (0,0) rad[2] = 1 csf[2] = (0,0) radf[2] = 1 clr[0] = 0 clr[1] = 0 clr[2] = 0 elseif @showcusp == "Alternate" cs[0] = (1-@cir) rad[0] = @cir csf[0] = cs[0] radf[0] = rad[0] cs[1] = -(1-@cir) rad[1] = @cir csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif tab = (@ta*@tb+sqrt(@ta*@ta*@tb*@tb-4*(@ta*@ta+@tb*@tb)))/2 if @alttab tab = (@ta*@tb-sqrt(@ta*@ta*@tb*@tb-4*(@ta*@ta+@tb*@tb)))/2 endif gz0 = (tab-2)*@tb/(@tb*tab-2*@ta+2*(0,1)*tab) gens[0,0] = (@tb-(0,2))/2 gens[0,1] = @tb/2 gens[0,2] = @tb/2 gens[0,3] = conj(gens[0,0]) gens[1,0] = gens[0,3] gens[1,1] = -gens[0,1] gens[1,2] = -gens[0,2] gens[1,3] = gens[0,0] gens[2,0] = @ta/2 gens[2,2] = (@ta*tab-2*@tb+(0,4))/((2*tab+4)*gz0) gens[2,1] = (@ta*tab-2*@tb-(0,4))*gz0/(2*tab-4) gens[2,3] = @ta/2 if @trans temp1 = gens[2,1] gens[2,1] = gens[2,2] gens[2,2] = temp1 endif gens[3,0] = gens[2,3] gens[3,1] = -gens[2,1] gens[3,2] = -gens[2,2] gens[3,3] = gens[2,0] $ifdef PM print(gens[0,0]) print(gens[0,1]) print(gens[0,2]) print(gens[0,3]) print(gens[1,0]) print(gens[1,1]) print(gens[1,2]) print(gens[1,3]) print(gens[2,0]) print(gens[2,1]) print(gens[2,2]) print(gens[2,3]) print(gens[3,0]) print(gens[3,1]) print(gens[3,2]) print(gens[3,3]) $endif elseif @cusptype == "Grandma's Special #2" if @showcusp == "Both" cs[0] = @cirs rad[0] = @rads-cabs(@cirs) if @lines rad[0] = -rad[0] endif csf[0] = cs[0] radf[0] = rad[0] cs[1] = -@cirs rad[1] = rad[0] csf[1] = cs[1] radf[1] = rad[1] cs[2] = @cira rad[2] = @rada-cabs(@cira) if @linea rad[2] = -rad[2] endif csf[2] = cs[2] radf[2] = rad[2] cs[3] = -@cira rad[3] = rad[2] csf[3] = cs[2] radf[3] = rad[2] clr[0] = 0 clr[1] = 0 clr[2] = 0 clr[3] = 0 elseif @showcusp == "Alternate" cs[0] = @cira rad[0] = @rada-cabs(@cira) if @linea rad[0] = -rad[0] endif csf[0] = cs[0] radf[0] = rad[0] cs[1] = -@cira rad[1] = rad[0] csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 else cs[0] = @cirs rad[0] = @rads-cabs(@cirs) if @lines rad[0] = -rad[0] endif csf[0] = cs[0] radf[0] = rad[0] cs[1] = -@cirs rad[1] = rad[0] csf[1] = cs[1] radf[1] = rad[1] clr[0] = 0 clr[1] = 0 endif gz = 0.5*sqrt(@ta^2*@tb^2-4*@ta^2-4*@tb^2+4*@tabAB+8) tab = 0.5*@ta*@tb-gz if @alttab tab = 0.5*@ta*@tb+gz endif gQ = sqrt(2-@tabAB) gR = sqrt(2+@tabAB) if cabs(@tabAB+im*gQ*gR)<2 gR = -gR endif gz0 = (tab-2)*(@tb+gR)/(@tb*tab-2*@ta+im*gQ*tab) gens[0,0] = (@tb-im*gQ)/2 gens[0,1] = (@tb*tab-2*@ta-im*gQ*tab)/((2*tab+4)*gz0) gens[0,2] = (@tb*tab-2*@ta+im*gQ*tab)*gz0/(2*tab-4) gens[0,3] = (@tb+im*gQ)/2 gens[1,0] = gens[0,3] gens[1,1] = -gens[0,1] gens[1,2] = -gens[0,2] gens[1,3] = gens[0,0] gens[2,0] = @ta/2 gens[2,1] = (@ta*tab-2*@tb+2*im*gQ)/((2*tab+4)*gz0) gens[2,2] = (@ta*tab-2*@tb-2*im*gQ)*gz0/(2*tab-4) gens[2,3] = @ta/2 if @trans temp1 = gens[2,1] gens[2,1] = gens[2,2] gens[2,2] = temp1 endif gens[3,0] = gens[2,3] gens[3,1] = -gens[2,1] gens[3,2] = -gens[2,2] gens[3,3] = gens[2,0] elseif @cusptype == "Maskit" if @showcuspm == "Both" cs[0] = 1 + flip(@radam) rad[0] = @radam csf[0] = cs[0] radf[0] = rad[0] clr[0] = 0 cs[1] = (1,0) rad[1] = 0 csf[1] = cs[1] radf[1] = rad[1] clr[1] = 0 elseif @showcuspm == "Alternate" cs[0] = 1 + flip(@radam) rad[0] = @radam csf[0] = cs[0] radf[0] = rad[0] clr[0] = 0 else cs[0] = (1,0) rad[0] = 0 csf[0] = cs[0] radf[0] = rad[0] clr[0] = 0 endif gens[0,0] = @m gens[0,1] = 1 gens[0,2] = 1 gens[0,3] = 0 gens[1,0] = gens[0,3] gens[1,1] = -gens[0,1] gens[1,2] = -gens[0,2] gens[1,3] = gens[0,0] gens[2,0] = 1 gens[2,1] = 0 gens[2,2] = 2 gens[2,3] = 1 gens[3,0] = gens[2,3] gens[3,1] = -gens[2,1] gens[3,2] = -gens[2,2] gens[3,3] = gens[2,0] endif ; normalize the matrices if @subtype != "Disjoint" && @subtype != "Apollonian 1" \ && @subtype != "Apollonian 2" && @subtype != "Apollonian 3" && \ @subtype != "Indra's Net" i = 0 while i < 4 det = gens[i,0]*gens[i,3]-gens[i,1]*gens[i,2] det = 1/sqrt(det) gens[i,0] = gens[i,0]*det gens[i,1] = gens[i,1]*det gens[i,2] = gens[i,2]*det gens[i,3] = gens[i,3]*det i = i + 1 endwhile endif ; inverse gens matrices int iend = 0 if @subtype == "Indra's Net" iend = 6 else iend = 4 endif i = 0 while i < iend det = gens[i,0]*gens[i,3]-gens[i,1]*gens[i,2] gens[i+iend,0] = gens[i,3] gens[i+iend,1] = -gens[i,1] gens[i+iend,2] = -gens[i,2] gens[i+iend,3] = gens[i,0] if real(det) <= 0 gens[i+iend,0] = -conj(gens[i+iend,0]) gens[i+iend,1] = -conj(gens[i+iend,1]) gens[i+iend,2] = -conj(gens[i+iend,2]) gens[i+iend,3] = -conj(gens[i+iend,3]) endif i = i + 1 endwhile if @version >= 150 if @cusptype == "Schottky" j = 4 iii = 3 if @subtype == "Indra's Net" j = 6 iii = 5 endif elseif @cusptype != "Slice" && @cusptype != "Maskit" if @showcusp == "Both" j = 3 iii = 2 elseif @showcusp == "Standard" j = 1 iii = 0 else j = 2 iii = 1 endif elseif @cusptype == "Grandma's Special #2" if @showcusp == "Both" j = 4 iii = 3 else j = 2 iii = 1 endif elseif @cusptype == "Maskit" if @showcuspm == "Both" j = 2 iii = 1 else j = 1 iii = 0 endif else j = 1 iii = 0 endif else j = 1 iii = 0 endif lev = 1 while lev <= level && j < 9999999 i = 0 while i < iend && j < 9999999 k = 0 while k <= iii && j < 9999999 if rad[k] <= 0 ; matrix of line unit = cos(-#pi*rad[k]) + flip(sin(-#pi*rad[k])) gens[12,0] = im*unit gens[12,1] = im*(conj(unit)*cs[k]-unit*conj(cs[k])) gens[12,2] = 0 gens[12,3] = im*conj(unit) else ; matrix of circle gens[12,0] = cs[k]/rad[k] gens[12,1] = rad[k]-|cs[k]|/rad[k] gens[12,2] = 1/rad[k] gens[12,3] = -conj(cs[k])/rad[k] endif ; product of circle matrix and gens inverse det = gens[12,0]*gens[12,3]-gens[12,1]*gens[12,2] temp1 = gens[12,0] temp2 = gens[12,1] temp3 = gens[12,2] temp4 = gens[12,3] if real(det) < 0 gens[12,0] = temp1*conj(gens[i+iend,0])+temp2*conj(gens[i+iend,2]) gens[12,1] = temp1*conj(gens[i+iend,1])+temp2*conj(gens[i+iend,3]) gens[12,2] = temp3*conj(gens[i+iend,0])+temp4*conj(gens[i+iend,2]) gens[12,3] = temp3*conj(gens[i+iend,1])+temp4*conj(gens[i+iend,3]) else gens[12,0] = temp1*gens[i+iend,0]+temp2*gens[i+iend,2] gens[12,1] = temp1*gens[i+iend,1]+temp2*gens[i+iend,3] gens[12,2] = temp3*gens[i+iend,0]+temp4*gens[i+iend,2] gens[12,3] = temp3*gens[i+iend,1]+temp4*gens[i+iend,3] endif ; previous product and product with gens det = gens[i,0]*gens[i,3]-gens[i,1]*gens[i,2] temp1 = gens[12,0] temp2 = gens[12,1] temp3 = gens[12,2] temp4 = gens[12,3] if real(det) < 0 gens[12,0] = gens[i,0]*conj(temp1)+gens[i,1]*conj(temp3) gens[12,1] = gens[i,0]*conj(temp2)+gens[i,1]*conj(temp4) gens[12,2] = gens[i,2]*conj(temp1)+gens[i,3]*conj(temp3) gens[12,3] = gens[i,2]*conj(temp2)+gens[i,3]*conj(temp4) else gens[12,0] = gens[i,0]*temp1+gens[i,1]*temp3 gens[12,1] = gens[i,0]*temp2+gens[i,1]*temp4 gens[12,2] = gens[i,2]*temp1+gens[i,3]*temp3 gens[12,3] = gens[i,2]*temp2+gens[i,3]*temp4 endif if real(gens[12,2]) < LINEFUZZ && real(gens[12,2]) > - LINEFUZZ ; matrix to line rad[j] = -atan2(gens[12,0])/#pi-1.5 cs[j] = -gens[12,1]*gens[12,0]/2 else ; matrix to circle cs[j] = gens[12,0]/gens[12,2] rad[j] = cabs(1/real(gens[12,2])) endif if abs(rad[j]) < @scircle j = j - 1 endif clr[j] = lev if j < 9999999 j = j+1 else lev = level + 1 endif k = k + 1 endwhile i = i + 1 endwhile ; sort array by circle identity l = round(j/2) + 1 ir = j continue = true repeat if l > 1 l = l-1 rra = cs[l-1] rrb = rad[l-1] rrc = clr[l-1] else rra = cs[ir-1] rrb = rad[ir-1] rrc = clr[ir-1] cs[ir-1] = cs[0] rad[ir-1] = rad[0] clr[ir-1] = clr[0] ir = ir-1 if ir == 0 cs[0] = rra rad[0] = rrb clr[0] = rrc continue = false endif endif if continue == true si = l sj = 2*l endif while (sj <= ir) && (continue == true) if sj < ir ddx = real(cs[sj-1])-real(cs[sj]) ddy = imag(cs[sj-1])-imag(cs[sj]) ddr = rad[sj-1]-rad[sj] c = 0 done = false ; Lines precede circles if rad[sj-1] <= 0 && rad[sj] > 0 c = -1 done = true elseif rad[sj] <= 0 && rad[sj-1] > 0 c = 1 done = true elseif ddx < -thresh c = -1 done = true elseif ddx > thresh && !done c = 1 done = true elseif ddy < -thresh && !done c = -1 done = true elseif ddy > thresh && !done c = 1 done = true elseif rad[sj-1] <= 0 && !done ; Lines if ddr < -PARAFUZZ && !done c = -1 done = true elseif ddr > PARAFUZZ && !done c = 1 done = true endif elseif !done ; Circles if ddr < -thresh && !done c = -1 done = true elseif ddr > thresh && !done c = 1 done = true endif endif if c < 0 sj = sj + 1 endif endif ddx = real(rra)-real(cs[sj-1]) ddy = imag(rra)-imag(cs[sj-1]) ddr = rrb-rad[sj-1] c = 0 done = false ; Lines precede circles if rrb <= 0 && rad[sj-1] > 0 c = -1 done = true elseif rad[sj-1] <= 0 && rrb > 0 c = 1 done = true elseif ddx < -thresh c = -1 done = true elseif ddx > thresh && !done c = 1 done = true elseif ddy < -thresh && !done c = -1 done = true elseif ddy > thresh && !done c = 1 done = true elseif rrb <= 0 && !done ; Lines if ddr < -PARAFUZZ && !done c = -1 done = true elseif ddr > PARAFUZZ && !done c = 1 done = true endif elseif !done ; Circles if ddr < -thresh && !done c = -1 done = true elseif ddr > thresh && !done c = 1 done = true endif endif if c < 0 cs[si-1] = cs[sj-1] rad[si-1] = rad[sj-1] clr[si-1] = clr[sj-1] si = sj sj = sj + sj else sj = ir + 1 endif endwhile if (continue == true) cs[si-1] = rra rad[si-1] = rrb clr[si-1] = rrc endif until continue == false ; eliminate duplicates in place ir = 1 l = 1 while ir < j ddx = real(cs[ir])-real(cs[ir-1]) ddy = imag(cs[ir])-imag(cs[ir-1]) ddr = rad[ir]-rad[ir-1] c = 0 done = false ; Lines precede circles if rad[ir] <= 0 && rad[ir-1] > 0 c = -1 done = true elseif rad[ir-1] <= 0 && rad[ir] > 0 c = 1 done = true elseif ddx < -thresh c = -1 done = true elseif ddx > thresh && !done c = 1 done = true elseif ddy < -thresh && !done c = -1 done = true elseif ddy > thresh && !done c = 1 done = true elseif rad[ir] <= 0 && !done ; Lines if ddr < -PARAFUZZ && !done c = -1 done = true elseif ddr > PARAFUZZ && !done c = 1 done = true endif elseif !done ; Circles if ddr < -thresh && !done c = -1 done = true elseif ddr > thresh && !done c = 1 done = true endif endif if c == 0 ir = ir + 1 else cs[l] = cs[ir] rad[l] = rad[ir] clr[l] = clr[ir] ir = ir +1 l = l + 1 endif endwhile j = l ; move to final array, skipping dups ifinal = 0 istack = 0 nold = nfinal while ifinal < nold && istack < j && nfinal < 9999999 ddx = real(csf[ifinal])-real(cs[istack]) ddy = imag(csf[ifinal])-imag(cs[istack]) ddr = radf[ifinal]-rad[istack] c = 0 done = false ; Lines precede circles if radf[ifinal] <= 0 && rad[istack] > 0 c = -1 done = true elseif rad[istack] <= 0 && radf[ifinal] > 0 c = 1 done = true elseif ddx < -thresh c = -1 done = true elseif ddx > thresh && !done c = 1 done = true elseif ddy < -thresh && !done c = -1 done = true elseif ddy > thresh && !done c = 1 done = true elseif radf[ifinal] <= 0 && !done ; Lines if ddr < -PARAFUZZ && !done c = -1 done = true elseif ddr > PARAFUZZ && !done c = 1 done = true endif elseif !done ; Circles if ddr < -thresh && !done c = -1 done = true elseif ddr > thresh && !done c = 1 done = true endif endif if c < 0 ifinal = ifinal + 1 endif if c == 0 istack = istack + 1 endif if c > 0 csf[nfinal] = cs[istack] radf[nfinal] = rad[istack] clrf[nfinal] = clr[istack] nfinal = nfinal + 1 istack = istack + 1 endif endwhile while istack < j && nfinal < 9999999 csf[nfinal] = cs[istack] radf[nfinal] = rad[istack] clrf[nfinal] = clr[istack] nfinal = nfinal + 1 istack = istack + 1 endwhile ir = nold while ir 1 l = l-1 rra = csf[l-1] rrb = radf[l-1] rrc = clrf[l-1] else rra = csf[ir-1] rrb = radf[ir-1] rrc = clrf[ir-1] csf[ir-1] = csf[0] radf[ir-1] = radf[0] clrf[ir-1] = clrf[0] ir = ir-1 if ir == 0 csf[0] = rra radf[0] = rrb clrf[0] = rrc continue = false endif endif if continue == true si = l sj = 2*l endif while (sj <= ir) && (continue == true) if sj < ir ddx = real(csf[sj-1])-real(csf[sj]) ddy = imag(csf[sj-1])-imag(csf[sj]) ddr = radf[sj-1]-radf[sj] c = 0 done = false ; Lines precede circles if radf[sj-1] <= 0 && radf[sj] > 0 c = -1 done = true elseif radf[sj] <= 0 && radf[sj-1] > 0 c = 1 done = true elseif ddx < -thresh c = -1 done = true elseif ddx > thresh && !done c = 1 done = true elseif ddy < -thresh && !done c = -1 done = true elseif ddy > thresh && !done c = 1 done = true elseif radf[sj-1] <= 0 && !done ; Lines if ddr < -PARAFUZZ && !done c = -1 done = true elseif ddr > PARAFUZZ && !done c = 1 done = true endif elseif !done ; Circles if ddr < -thresh && !done c = -1 done = true elseif ddr > thresh && !done c = 1 done = true endif endif if c < 0 sj = sj + 1 endif endif ddx = real(rra)-real(csf[sj-1]) ddy = imag(rra)-imag(csf[sj-1]) ddr = rrb-radf[sj-1] c = 0 done = false ; Lines precede circles if rrb <= 0 && radf[sj-1] > 0 c = -1 done = true elseif radf[sj-1] <= 0 && rrb > 0 c = 1 done = true elseif ddx < -thresh c = -1 done = true elseif ddx > thresh && !done c = 1 done = true elseif ddy < -thresh && !done c = -1 done = true elseif ddy > thresh && !done c = 1 done = true elseif rrb <= 0 && !done ; Lines if ddr < -PARAFUZZ && !done c = -1 done = true elseif ddr > PARAFUZZ && !done c = 1 done = true endif elseif !done ; Circles if ddr < -thresh && !done c = -1 done = true elseif ddr > thresh && !done c = 1 done = true endif endif if c < 0 csf[si-1] = csf[sj-1] radf[si-1] = radf[sj-1] clrf[si-1] = clrf[sj-1] si = sj sj = sj + sj else sj = ir + 1 endif endwhile if (continue == true) csf[si-1] = rra radf[si-1] = rrb clrf[si-1] = rrc endif until continue == false iii = j-1 if j == 0 lev = level+1 else lev = lev+1 endif endwhile int maxi = nfinal-1 ; sort arrays by level continue = true l = round((nfinal)/2) + 1 ir = nfinal repeat if l > 1 l = l-1 rra = csf[l-1] rrb = radf[l-1] rrc = clrf[l-1] else rra = csf[ir-1] rrb = radf[ir-1] rrc = clrf[ir-1] csf[ir-1] = csf[0] radf[ir-1] = radf[0] clrf[ir-1] = clrf[0] ir = ir-1 if ir == 0 csf[0] = rra radf[0] = rrb clrf[0] = rrc continue = false endif endif if continue == true si = l sj = 2*l endif while (sj <= ir) && (continue == true) if sj < ir if clrf[sj-1] < clrf[sj] sj = sj + 1 endif endif if rrc < clrf[sj-1] csf[si-1] = csf[sj-1] radf[si-1] = radf[sj-1] clrf[si-1] = clrf[sj-1] si = sj sj = sj + sj else sj = ir + 1 endif endwhile if (continue == true) csf[si-1] = rra radf[si-1] = rrb clrf[si-1] = rrc endif until continue == false float sscale = 0 if @cusptype == "Slice" ii = 0 if @scusp == "Nearby group" sscale = 0.05 elseif @scusp == "1/15" sscale = 0.015 elseif @scusp == "0/1" sscale = 0.5 elseif @scusp == "2/19" sscale = 0.025 elseif @scusp == "1/9" sscale = 0.04 elseif @scusp == "7/43" sscale = 0.035 elseif @scusp == "2/5" sscale = 0.2 endif while ii <= maxi radf[ii] = radf[ii]*sscale csf[ii] = csf[ii]*sscale ii = ii + 1 endwhile endif if @cusptype == "Maskit" ii = 0 while ii <= maxi csf[ii] = csf[ii] - im ii = ii + 1 endwhile endif if @slope ; translate circles to pixels ; ii = 0 int pxx = 0 int pyy = 0 int rds = 0 while ii <= maxi if clrf[ii] >= @levshow radf[ii] = radf[ii]*@radmul if radf[ii] < @maxrad && radf[ii] > 0 fx = real(csf[ii]) fy = imag(csf[ii]) ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax xx = ffx ffx = (0.5*#width + (ffx - 0.5)*cos(#angle)*#width - (ffy - 0.5)*sin(#angle)*#height) ffy = (0.5*#height + (ffy - 0.5)*cos(#angle)*#height + (xx - 0.5)*sin(#angle)*#width) px = round(ffx)+wd2 py = round(ffy)+ht2 rds = round(radf[ii]*#width/txmax) pxx = px-rds while pxx < px+rds pyy = py-rds while pyy < py+rds if pxx > 0 && pyy > 0 && pxx < #width+wd && pyy < #height+ht if @fill == 0 fsum = gsum[pxx,pyy]/rds*100 if ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^2-((pxx-px))^2-((pyy-py))^2) >=0 count[pxx,pyy] = ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^@pwr-(@alpha*(pxx-px))^@pwr-(@beta*(pyy-py))^@pwr)^ \ (1/@pwr)/@gamma endif elseif @fill == 1 fsum = gsum[pxx,pyy]/rds*100 if ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^2-((pxx-px))^2-((pyy-py))^2) >=0 count[pxx,pyy] = ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^@pwr+(@alpha*(pxx-px))^@pwr-(@beta*(pyy-py))^@pwr)^ \ (1/@pwr)/@gamma endif elseif @fill == 2 fsum = gsum[pxx,pyy]/rds*100 if ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^2-((pxx-px))^2-((pyy-py))^2) >=0 count[pxx,pyy] = ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^@pwr+(@alpha*(pxx-px))^@pwr+(@beta*(pyy-py))^@pwr)^ \ (1/@pwr)/@gamma endif elseif @fill == 3 fsum = gsum[pxx,pyy]/rds*100 if ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^2-((pxx-px))^2-((pyy-py))^2) >=0 count[pxx,pyy] = ((rds*(1+@gfbmf*(1+fsum))/(1+@gfbmf))^@pwr-(@alpha*(pxx-px))^@pwr+(@beta*(pyy-py))^@pwr)^ \ (1/@pwr)/@gamma endif endif endif pyy = pyy + 1 endwhile pxx = pxx + 1 endwhile endif endif ii = ii + 1 endwhile endif ; init: bool bailout = false float nhit=0 float nhitx=0 float nhity=0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 float bail = @bailout if @version >= 130 if @selbail == "none" bail = 0 elseif @selbail == "Use bailout" bail = @bailout2 endif endif if @lmethod == "Multiply" && @version < 130 bail = bail/10000000 endif int li = @levshow int jj = 1 float newrad = 0 complex in = 0 if @linit == "0" #z = 0 elseif @linit == "-1" #z = -1 elseif @linit == "1" #z = 1 elseif @linit == "pixel" #z = #pixel endif complex oldz = #z ; loop: if @slope int delta = 1 int xcrd = #x int ycrd = #y bool inside = true ; if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true && count[xcrd,ycrd] >= 0 if xcrd+delta < #width+wd && ycrd+delta < #height+ht nhit=count[xcrd,ycrd] nhitx=count[xcrd+delta,ycrd] nhity=count[xcrd,ycrd+delta] endif endif cen = nhit cenx = nhitx ceny = nhity e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -delta/100.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd #z = vx + flip(vy); fudge z from vector if bailout == false bailout = true endif else while clrf[li] <= jj && li < maxi newrad = @radmul*radf[li] if cabs(#pixel-csf[li]) < newrad && newrad < @maxrad \ && clrf[li] >= @levshow if @variant != "7" in = @fnin(csf[li]-#pixel) else in = csf[li]-#pixel endif if @variant == "1" if @version < 130 in = (in*(newrad-cabs(in))/(newrad-@radadj)^2)^2 else in = abs(in*(newrad-cabs(in))/(newrad-@radadj)^2) endif elseif @variant == "2" if @version < 130 in = abs(in*(newrad-cabs(in))/(newrad-@radadj)^2) else in = (in*(newrad-cabs(in))/(newrad-@radadj)^2)^2 endif elseif @variant == "3" in = (in*(newrad-|in|)/(newrad-@radadj)^2)^2 elseif @variant == "4" in = abs(in*(newrad-|in|)/(newrad-@radadj)^2) elseif @variant == "5" in = (in*sqrt(newrad^2-|in|)/(newrad-@radadj)^2)^2 elseif @variant == "6" in = abs(in*sqrt(newrad^2-|in|)/(newrad-@radadj)^2) elseif @variant == "7" in = @fnin(in*(newrad-cabs(in))/(newrad-@radadj)) elseif @variant == "8" in = (in*(newrad-cabs(in))/(newrad-@radadj))^@power elseif @variant == "9" in = (in*newrad/(newrad-cabs(in)))^@power elseif @variant == "10" in = (in*newrad^2/(newrad-cabs(in)))^2 elseif @variant == "11" if cabs(in) >= newrad in = newrad endif in = sqrt(newrad^2-|in|) elseif @variant == "12" if cabs(in) >= newrad in = newrad endif in = sqrt(newrad^2-|in|)/newrad elseif @variant == "level" in = csf[li] elseif @variant == "index" in = li+1 elseif @variant == "size" in = radf[li] elseif @variant == "position" in = cabs(csf[li]) elseif @variant == "count" in = jj+1 endif if @lmethod == "Multiply" #z = #z^@power*in + in elseif @lmethod == "Add" #z = #z^@power + in elseif @lmethod == "Divide" #z = #z^@power/in + in elseif @lmethod == "Alt Divide" #z = #z^@power/in + #pixel elseif @lmethod == "Subtract" #z = #z^@power - in elseif @lmethod == "Alt Multiply" #z = #z^@power*in + #pixel elseif @lmethod == "Simple" #z = in endif if |#z-oldz| < bail && bail != 0 && @version >= 130 bailout = true if cabs(#z) == -1 || cabs(#z) == 1 ||cabs(#z) == cabs(#pixel) #z = 0 endif li = maxi endif oldz = #z endif li = li + 1 endwhile jj = jj + 1 if bail == 0 if jj >= @level bailout = true if cabs(#z) == -1 || cabs(#z) == 1 ||cabs(#z) == cabs(#pixel) #z = 0 endif endif else if @version < 130 li = 0 endif if jj >= @level && |#z| > bail && @version < 130 bailout = true if cabs(#z) == -1 || cabs(#z) == 1 ||cabs(#z) == cabs(#pixel) #z = 0 endif endif endif endif ; bailout: !bailout default: method = multipass periodicity = 0 param version caption = "Formula Version" default = 310 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam heading caption="Indra's Promise" endheading $ifdef VER40 heading text = "Based upon code in the Book Indra's Pearls by \ by Mumford, Series and Wright, and the public C \ code of Curtis McMullen. This is an advanced formula and is \ best used with some knowledge of Kleinian groups" endheading heading text = "For the slope option, color with Damien's Lighting formula or with \ 3D Texturizer Enhanced III. Most other coloring methods will not work \ with this option. The global fBm code is based upon \ the code of Damien Jones. " visible = @slope endheading $endif title="Indra's Promise" bool param slope caption = "Calc as slope" default = false endparam param applyMapping caption = "Apply Mapping" default = true visible = @slope endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true && @slope hint = "Increase if application of mapping leaves unexpected gaps in the \ image." endparam heading caption = "Iteration methods" endheading $ifdef VER40 heading text = "Be sure to set 'Maximum Iterations' on the Formula tab to be greater \ or equal to 'Max Iters'." endheading $endif int param level caption = "Max Iters" default = 100 min = 1 endparam param scircle caption = "Smallest Circle" default = 0.001 endparam $ifdef VER40 heading text = "Select 'Bailout = none' to get smooth coloring with most coloring \ methods. 'Use Bailout' is required for some iteration coloring \ methods, such as the default 'None' method." visible = !@slope endheading $endif param selbail caption = "Select bailout" default = 1 enum = "none" "Use bailout" visible = @version >= 130 && !@slope endparam float param bailout2 caption = "Bailout" default = 4.0 visible = @version >= 130 && @selbail == "Use bailout" && !@slope endparam float param bailout caption = "Bailout" default = 0 visible = @version < 130 && !@slope endparam param lmethod caption = "Loop method" default = 0 enum = "Add" "Subtract" "Multiply" "Alt Multiply" "Divide" "Alt Divide" \ "Simple" visible = !@slope endparam param linit caption = "Loop initiator" default = 1 enum = "-1" "0" "1" "pixel" visible = !@slope endparam param power caption = "#z power" default = (1,0) visible = !@slope && @lmethod != "Simple" endparam func fnin caption = "Circle function" default = ident() visible = !@slope endfunc param radmul caption = "Rad multiplier" default = 1.0 endparam float param maxrad caption = "Max circle size" default = 0.6 endparam param levshow caption = "Min display level" default = 0 ; visible = !@slope endparam $ifdef VER40 heading text = "Determines how #z is created during the iterations." visible = !@slope endheading $endif param variant caption = "Combination method" default = 0 enum = "level" "index" "size" "position" "count" "1" "2" "3" "4" "5" "6" "7" \ "8" "9" "10" "11" "12" visible = !@slope endparam param radadj caption = "Circle adj" default = 0.0 visible = !@slope endparam heading caption = "Group types" endheading $ifdef VER40 heading text = "Use these methods with care, as only certain combinations of \ parameters will give satisfactory results. Use of the help file \ is essential. Use of the 'Expore' feature is not recommended." visible = @cusptype == "Grandma's Special" || @cusptype == "Grandma's Special #2" \ || @cusptype == "Maskit" endheading heading text = "The Grandma algorithms come from 'Indra's Pearls' by Mumford, \ Series and Wright. Consult the book for use of the trace parameters." visible = @cusptype == "Grandma's Special" || @cusptype == "Grandma's Special #2" endheading heading text = "The Maskit algorithm come from 'Indra's Pearls' by Mumford, \ Series and Wright. Consult the book for use of the Maskit parameters." visible = @cusptype == "Maskit" endheading $endif param cusptype caption = "Group" default = 4 enum = "Double Cusp" "Grandma's Special" "Grandma's Special #2" \ "Maskit" "Nearby Group" "Schottky" "Slice" endparam param cusp caption = "Cusp" default = 1 enum = "0/1" "1/15" "1/10" "2/19" "1/9" "7/43" "3/10" "2/5" "1/2" "21/34" "1/1" visible = @cusptype == "Double Cusp" endparam param scusp caption = "Slice Group" default = 0 enum = "Nearby group" "0/1" "1/15" "2/19" "1/9" "7/43" "2/5" visible = @cusptype == "Slice" endparam param showcusp caption = "Cusp view" default = 1 enum = "Both" "Standard" "Alternate" visible = @cusptype != "Slice" && @cusptype != "Maskit" && @cusptype != "Schottky" endparam param showcuspm caption = "Cusp view" default = 1 enum = "Both" "Standard" "Alternate" visible = @cusptype == "Maskit" endparam param subtype caption = "Schottky subtype" default = 0 enum = "Kissing" "Disjoint" "Apollonian 1" "Apollonian 2" "Apollonian 3" \ "Indra's Net" visible = @cusptype == "Schottky" endparam param plus caption = "k value" default = 0 enum = "Smaller root" "Larger root" visible = @subtype == "Kissing" && @cusptype == "Schottky" endparam float param su caption = "Param for a-A circles" default = 1.143 min = 1.0 visible = @subtype == "Kissing" && @cusptype == "Schottky" endparam float param sx caption = "Param for b-B circles" default = 1.958 min = 1.0 visible = @subtype == "Kissing" && @cusptype == "Schottky" endparam $ifdef VER40 heading text = "Slowly increase 'gen circle' until good circle packing is observed." visible = @cusptype == "Grandma's special"&& @showcusp != "Standard" endheading $endif param @cir caption ="Gen circle" default = 0.01 hint = "Slowly increase until good circle packing is observed." visible = @cusptype == "Grandma's special"&& @showcusp != "Standard" endparam $ifdef VER40 heading text = "These parameters set the size and position of the 'Standard' \ generator circles." visible = @cusptype == "Grandma's special #2"&& @showcusp != "Alternate" endheading $endif param @cirs caption ="Gen circle std" default = (0,0) visible = (@cusptype == "Grandma's special #2"&& @showcusp != "Alternate") endparam param @rads caption ="Rad ref std" default = 1.0 visible = (@cusptype == "Grandma's special #2"&& @showcusp != "Alternate") endparam bool param @lines caption ="Generate as line" default = false visible = (@cusptype == "Grandma's special #2"&& @showcusp != "Alternate") endparam $ifdef VER40 heading text = "These parameters set the size and position of the 'Alternate' \ generator circles." visible = @cusptype == "Grandma's special #2"&& @showcusp != "Standard" endheading $endif param @cira caption ="Gen circle alt" default = (0,0) visible = (@cusptype == "Grandma's special #2"&& @showcusp != "Standard") endparam param @rada caption ="Rad ref alt" default = 1.0 visible = (@cusptype == "Grandma's special #2"&& @showcusp != "Standard") endparam $ifdef VER40 heading text = "This parameter set the size and position of the 'Alternate' \ generator circle." visible = @cusptype == "Maskit"&& @showcusp != "Standard" endheading $endif param @radam caption ="Rad ref" default = 0.5 visible = @cusptype == "Maskit"&& @showcuspm != "Standard" endparam bool param @linea caption ="Generate as line" default = false visible = (@cusptype == "Grandma's special #2"&& @showcusp != "Standard") endparam complex param m caption = "Maskit param" default = (0.0112785606117653,1.95859103011179) visible = @cusptype == "Maskit" endparam complex param ta caption = "Trace a" default = (1.95,0.02) visible = @cusptype == "Grandma's Special" || @cusptype == "Grandma's Special #2" endparam complex param tb caption = "Trace b" default = 3 visible = @cusptype == "Grandma's Special" || @cusptype == "Grandma's Special #2" endparam bool param alttab caption ="Alternate trace ab" default = false visible = @cusptype == "Grandma's Special" || @cusptype == "Grandma's Special #2" endparam complex param tabAB caption = "Trace abAB" default = -2 visible = @cusptype == "Grandma's Special #2" endparam bool param trans caption = "Transpose transform" default = false visible = @cusptype == "Grandma's Special" || @cusptype == "Grandma's Special #2" endparam heading caption = "Coloring" visible = @slope endheading param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible = @slope endparam param zscale caption = "Height Pre-Scale" default = 0.4 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible = @slope endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible = @slope endparam param fill caption = "Fill Type" enum = "quartic 1" "quartic 2" "quartic 3" "quartic 4" default = 0 visible = @slope endparam float param pwr caption = "Power" default = 2.0 visible = @slope endparam float param alpha caption = "alpha" default = 1.0 visible = @slope endparam float param beta caption = "beta" default = 1.0 visible = @slope endparam float param gamma caption = "gamma" default = 1.0 visible = @slope endparam heading caption = "fBm Textures" visible = @slope endheading param gnoffset caption = "global fBm Offset" default = (0,0) hint = "This is the offset of the pattern. You can use this to shift \ the pattern around on the complex plane." visible = @slope endparam float param gfbmf caption = "global fBm weight" default = 0.1 visible = @slope endparam float param gnscale caption = "global fBm Scale" default = 0.0 hint = "This is the overall scale of the noise." visible = @slope endparam float param gfreq caption = "global fBm freq" default = 1.0 visible = @slope endparam int param giter caption = "global fBm iter" default = 7 min = 1 visible = @slope endparam } TentMap {; Ron Barnett, August 2006 ; based upon the tent map formula and the Barnsley ; fractal algorithm init: if @invert #z = 1/(#pixel+(0.000001,0.000001)) else #z = #pixel endif if @flavor == "Flavor 1" #z = @tentfn(#z) endif loop: if @flavor == "Flavor 2" #z = @tentfn(#z) endif if @invert if @type == "cabs" if cabs(@tentfn2(#z)) <= @tent3 #z = @tent1*#z/(#pixel+(0.000001,0.000001)) else #z = @tent1*(@tent2-#z)/(#pixel+(0.000001,0.000001)) endif elseif @type == "real" if real(@tentfn2(#z)) <= @tent3 #z = @tent1*#z/(#pixel+(0.000001,0.000001)) else #z = @tent1*(@tent2-#z)/(#pixel+(0.000001,0.000001)) endif elseif @type == "imag" if imag(@tentfn2(#z)) <= @tent3 #z = @tent1*#z/(#pixel+(0.000001,0.000001)) else #z = @tent1*(@tent2-#z)/(#pixel+(0.000001,0.000001)) endif else if imag(@tentfn2(#z)) > @tent3 #z = @tent1*(@tent2-#z)/(#pixel+(0.000001,0.000001)) elseif real(@tentfn2(#z)) > @tent3 #z = @tent1*(@tent2-#z)/(#pixel+(0.000001,0.000001)) else #z = @tent1*#z/(#pixel+(0.000001,0.000001)) endif endif else if @type == "cabs" if cabs(@tentfn2(#z)) <= @tent3 #z = @tent1*#z*#pixel else #z = @tent1*(@tent2-#z)*#pixel endif elseif @type == "real" if real(@tentfn2(#z)) <= @tent3 #z = @tent1*#z*#pixel else #z = @tent1*(@tent2-#z)*#pixel endif elseif @type == "imag" if imag(@tentfn2(#z)) <= @tent3 #z = @tent1*#z*#pixel else #z = @tent1*(@tent2-#z)*#pixel endif else if imag(@tentfn2(#z)) > @tent3 #z = @tent1*(@tent2-#z)*#pixel elseif real(@tentfn2(#z)) > @tent3 #z = @tent1*(@tent2-#z)*#pixel else #z = @tent1*#z*#pixel endif endif endif bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Tent Map" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass heading caption = "Tent Map" endheading $ifdef VER40 heading text = "Based upon the Tent Map:" endheading heading text = " T(x) = s*x for x <= 0.5" endheading heading text = " T(x) = s*(1-x) for x > 0.5" endheading heading text = "and the code for the Barnsley type fractals." endheading heading text = "This formula is best used as a switch template \ for Julia TentMap." endheading $else heading caption = "Based upon the Tent Map:" endheading heading caption = " T(x) = s*x for x <= 0.5" endheading heading caption = " T(x) = s*(1-x) for x > 0.5" endheading $endif float param version caption = "Version number" default = 1.0 hint = "This is for backwards compatibility with old versions \ of the formula." visible = false endparam param type caption = "Tent type" default = 1 enum = "cabs" "real" "imag" "Pinsky" endparam param flavor caption = "Flavor" default = 0 enum = "Flavor 1" "Flavor 2" endparam bool param invert caption = "Inversion" default = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam float param tent1 caption ="Tent param #1" default = 1 endparam float param tent2 caption ="Tent param #2" default = 1 endparam float param tent3 caption ="Tent param #3" default = 0.5 endparam func tentfn caption = "Tent function" default = abs() endfunc func tentfn2 caption = "Tent function #2" default = ident() endfunc switch: type = "JuliaTentMap" bailout = @bailout p1 = #pixel test = @test tent1 = @tent1 tent2 = @tent2 tent3 = @tent3 type = @type tentfn = @tentfn tentfn2 = @tentfn2 flavor = @flavor invert = @invert } JuliaTentMap {; Ron Barnett, August 2006 ; based upon the tent map formula and the Barnsley ; fractal algorithm init: if @invert #z = 1/(#pixel+(0.000001,0.000001)) else #z = #pixel endif if @flavor == "Flavor 1" #z = @tentfn(#z) endif loop: if @flavor == "Flavor 2" #z = @tentfn(#z) endif if @invert if @type == "cabs" if cabs(@tentfn2(#z)) <= @tent3 #z = @tent1*#z/(@p1+(0.000001,0.000001)) else #z = @tent1*(@tent2-#z)/(@p1+(0.000001,0.000001)) endif elseif @type == "real" if real(@tentfn2(#z)) <= @tent3 #z = @tent1*#z/(@p1+(0.000001,0.000001)) else #z = @tent1*(@tent2-#z)/(@p1+(0.000001,0.000001)) endif elseif @type == "imag" if imag(@tentfn2(#z)) <= @tent3 #z = @tent1*#z/(@p1+(0.000001,0.000001)) else #z = @tent1*(@tent2-#z)/(@p1+(0.000001,0.000001)) endif else if imag(@tentfn2(#z)) > @tent3 #z = @tent1*(@p1-#z)/(#pixel+(0.000001,0.000001)) elseif real(@tentfn2(#z)) > @tent3 #z = @tent1*(@p1-#z)/(#pixel+(0.000001,0.000001)) else #z = @tent1*#z/(@p1+(0.000001,0.000001)) endif endif else if @type == "cabs" if cabs(@tentfn2(#z)) <= @tent3 #z = @tent1*#z*@p1 else #z = @tent1*(@tent2-#z)*@p1 endif elseif @type == "real" if real(@tentfn2(#z)) <= @tent3 #z = @tent1*#z*@p1 else #z = @tent1*(@tent2-#z)*@p1 endif elseif @type == "imag" if imag(@tentfn2(#z)) <= @tent3 #z = @tent1*#z*@p1 else #z = @tent1*(@tent2-#z)*@p1 endif else if imag(@tentfn2(#z)) > @tent3 #z = @tent1*(@tent2-#z)*@p1 elseif real(@tentfn2(#z)) > @tent3 #z = @tent1*(@tent2-#z)*@p1 else #z = @tent1*#z*@p1 endif endif endif bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Julia TentMap" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass heading caption = "Julia TentMap" endheading $ifdef VER40 heading text = "Based upon the Tent Map:" endheading heading text = " T(x) = s*x for x <= 0.5" endheading heading text = " T(x) = s*(1-x) for x > 0.5" endheading heading text = "and the code for the Barnsley type fractals." endheading $else heading caption = "Based upon the Tent Map:" endheading heading caption = " T(x) = s*x for x <= 0.5" endheading heading caption = " T(x) = s*(1-x) for x > 0.5" endheading $endif float param version caption = "Version number" default = 1.0 hint = "This is for backwards compatibility with old versions \ of the formula." visible = false endparam param p1 caption = "Julia seed" default = (0.6, 1) endparam param type caption = "Tent type" default = 1 enum = "cabs" "real" "imag" "Pinsky" endparam param flavor caption = "Flavor" default = 0 enum = "Flavor 1" "Flavor 2" endparam bool param invert caption = "Inversion" default = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam float param tent1 caption ="Tent param #1" default = 1 endparam float param tent2 caption ="Tent param #2" default = 1 endparam float param tent3 caption ="Tent param #3" default = 0.5 endparam func tentfn caption = "Tent function" default = abs() endfunc func tentfn2 caption = "Tent function #2" default = ident() endfunc switch: type = "TentMap" bailout = @bailout test = @test tent1 = @tent1 tent2 = @tent2 tent3 = @tent3 type = @type tentfn = @tentfn tentfn2 = @tentfn2 flavor = @flavor invert = @invert } SlopeExpTentMap { ; based upon the tent map formula and the Barnsley ; fractal algorithm. The slope code is modified from the work of ; Damien Jones init: complex z1 = #pixel complex z2 = #pixel complex z3 = #pixel complex c1 = #pixel; primary iterated point complex c2 = #pixel + @offset; horizontally offset point complex c3 = #pixel + flip(@offset); vertically offset point if @flavor == "Flavor 1" z1 = @tentfn(z1) z2 = @tentfn(z2) z3 = @tentfn(z3) endif int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 float theta = 0.0 float r = 0.0 complex qa = 0 complex qb = 0 complex qc = 0 complex qy = 0 complex qx = 0 complex cx = 0 complex cy = 0 loop: if @flavor == "Flavor 2" z1 = @tentfn(z1) z2 = @tentfn(z2) z3 = @tentfn(z3) endif if @type == "cabs" if cabs(@tentfn2(z1)) <= @tent3 z1 = @tent1*z1*c1 z2 = @tent1*z2*c2 z3 = @tent1*z3*c3 else z1 = @tent1*(@tent2-z1)*c1 z2 = @tent1*(@tent2-z2)*c2 z3 = @tent1*(@tent2-z3)*c3 endif elseif @type == "real" if real(@tentfn2(z1)) <= @tent3 z1 = @tent1*z1*c1 z2 = @tent1*z2*c2 z3 = @tent1*z3*c3 else z1 = @tent1*(@tent2-z1)*c1 z2 = @tent1*(@tent2-z2)*c2 z3 = @tent1*(@tent2-z3)*c3 endif elseif @type == "imag" if imag(@tentfn2(z1)) <= @tent3 z1 = @tent1*z1*c1 z2 = @tent1*z2*c2 z3 = @tent1*z3*c3 else z1 = @tent1*(@tent2-z1)*c1 z2 = @tent1*(@tent2-z2)*c2 z3 = @tent1*(@tent2-z3)*c3 endif else if imag(@tentfn2(z1)) > @tent3 z1 = @tent1*(@tent2-z1)*c1 z2 = @tent1*(@tent2-z2)*c2 z3 = @tent1*(@tent2-z3)*c3 elseif real(@tentfn2(z1)) > @tent3 z1 = @tent1*(@tent2-z1)*c1 z2 = @tent1*(@tent2-z2)*c2 z3 = @tent1*(@tent2-z3)*c3 else z1 = @tent1*z1*c1 z2 = @tent1*z2*c2 z3 = @tent1*z3*c3 endif endif iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: method = multipass periodicity = 0 heading caption = "SlopeExp TentMap" endheading $ifdef VER40 heading text = "Based upon the Tent Map:" endheading heading text = " T(x) = s*x for x <= 0.5" endheading heading text = " T(x) = s*(1-x) for x > 0.5" endheading heading text = "and the code for the Barnsley type fractals." endheading heading text = "This formula is best used as a switch template \ for Julia TentMap." endheading $else heading caption = "Based upon the Tent Map:" endheading heading caption = " T(x) = s*x for x <= 0.5" endheading heading caption = " T(x) = s*(1-x) for x > 0.5" endheading $endif $ifdef VER40 heading text = "The formula provides 88 different Height Value variants for the slope calculations." endheading heading text = "Use Damien's Lighting Coloring or 3D Texturizer Enhanced III. \ Most other coloring formulas can be used." endheading $else heading caption = "Use Damien's Lighting Coloring" endheading heading caption = "Or 3D Texturizer Enhanced III." endheading heading caption = "Most other coloring formulas" endheading heading caption = "can also be used." endheading $endif title = "SlopeExp (TentMap)" center = (0, 0.0) maxiter = 1000 param version caption = "Version parameter" default = 1.0 visible = false endparam param type caption = "Tent type" default = 1 enum = "cabs" "real" "imag" "Pinsky" endparam param flavor caption = "Flavor" default = 0 enum = "Flavor 1" "Flavor 2" endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam float param tent1 caption ="Tent param #1" default = 1 endparam float param tent2 caption ="Tent param #2" default = 1 endparam float param tent3 caption ="Tent param #3" default = 0.5 endparam func tentfn caption = "Tent function" default = abs() endfunc func tentfn2 caption = "Tent function #2" default = ident() endfunc heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sectic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpJuliaTentMap" p1 = #pixel bailout = @bailout offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot tent1 = @tent1 tent2 = @tent2 tent3 = @tent3 type = @type tentfn = @tentfn tentfn2 = @tentfn2 flavor = @flavor } SlopeExpJuliaTentMap { ; based upon the tent map formula and the Barnsley ; fractal algorithm. The slope code is modified from the work of ; Damien Jones init: complex z1 = #pixel; primary iterated point complex z2 = #pixel + @offset; horizontally offset point complex z3 = #pixel + flip(@offset); vertically offset point complex c1 = @p1 complex c2 = @p1 complex c3 = @p1 if @flavor == "Flavor 1" z1 = @tentfn(z1) z2 = @tentfn(z2) z3 = @tentfn(z3) endif int done = 2 float modz = 0.0 float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float d1 = 0.0; distances float d2 = 0.0 float d3 = 0.0 float s1 = 1.0e20; smallest distances float s2 = 1.0e20 float s3 = 1.0e20 float iterexp1 = 0.0 float iterexp2 = 0.0 float iterexp3 = 0.0 complex polar = 0.0 complex af1 = 0.0 complex af2 = 0.0 loop: if @flavor == "Flavor 2" z1 = @tentfn(z1) z2 = @tentfn(z2) z3 = @tentfn(z3) endif if @type == "cabs" if cabs(@tentfn2(z1)) <= @tent3 z1 = @tent1*z1*c1 z2 = @tent1*z2*c2 z3 = @tent1*z3*c3 else z1 = @tent1*(@tent2-z1)*c1 z2 = @tent1*(@tent2-z2)*c2 z3 = @tent1*(@tent2-z3)*c3 endif elseif @type == "real" if real(@tentfn2(z1)) <= @tent3 z1 = @tent1*z1*c1 z2 = @tent1*z2*c2 z3 = @tent1*z3*c3 else z1 = @tent1*(@tent2-z1)*c1 z2 = @tent1*(@tent2-z2)*c2 z3 = @tent1*(@tent2-z3)*c3 endif elseif @type == "imag" if imag(@tentfn2(z1)) <= @tent3 z1 = @tent1*z1*c1 z2 = @tent1*z2*c2 z3 = @tent1*z3*c3 else z1 = @tent1*(@tent2-z1)*c1 z2 = @tent1*(@tent2-z2)*c2 z3 = @tent1*(@tent2-z3)*c3 endif else if imag(@tentfn2(z1)) > @tent3 z1 = @tent1*(@tent2-z1)*c1 z2 = @tent1*(@tent2-z2)*c2 z3 = @tent1*(@tent2-z3)*c3 elseif real(@tentfn2(z1)) > @tent3 z1 = @tent1*(@tent2-z1)*c1 z2 = @tent1*(@tent2-z2)*c2 z3 = @tent1*(@tent2-z3)*c3 else z1 = @tent1*z1*c1 z2 = @tent1*z2*c2 z3 = @tent1*z3*c3 endif endif iterexp1 = iterexp1 + exp(-cabs(z1)) iterexp2 = iterexp2 + exp(-cabs(z2)) iterexp3 = iterexp3 + exp(-cabs(z3)) done = done + 1; increment iteration counter IF (@zmode == 0) ; smallest |z| d1 = |z1| ; get current distances from origin d2 = |z2| d3 = |z3| IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 1) ; smallest |real(z)| d1 = abs(real(z1)) ; get current distances from i axis d2 = abs(real(z2)) d3 = abs(real(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 2) ; smallest |imag(z)| d1 = abs(imag(z1)) ; get current distances from r axis d2 = abs(imag(z2)) d3 = abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 3) ; smallest |real(z)|+|imag(z)| d1 = abs(real(z1))+abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))+abs(imag(z2)) d3 = abs(real(z3))+abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 4) ; smallest |real(z)|*|imag(z)| d1 = abs(real(z1))*abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))*abs(imag(z2)) d3 = abs(real(z3))*abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 5) ; smallest |real(z)|/|imag(z)| d1 = abs(real(z1))/abs(imag(z1)) ; get current distances from i axis d2 = abs(real(z2))/abs(imag(z2)) d3 = abs(real(z3))/abs(imag(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 6) ; smallest |atan(z)| d1 = abs(atan2(z1)) ; get current angles d2 = abs(atan2(z2)) d3 = abs(atan2(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 7) ; smallest |function1(z)| d1 = abs(real(fn1(z1))) + abs(imag(fn1(z1))) ; get current distances d2 = abs(real(fn1(z2))) + abs(imag(fn1(z2))) d3 = abs(real(fn1(z3))) + abs(imag(fn1(z3))) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 8) ; smallest |function2(z)| d1 = cabs(fn1(z1)) ; get current distances d2 = cabs(fn1(z2)) d3 = cabs(fn1(z3)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 9) ; smallest Lemniscate Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(2*theta))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 10) ; smallest Cardiod Distance theta = atan(imag(#z)/real(#z)) r = 5*@a*(1-cos(theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 11) ; smallest Conchoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*(@a + @b*cos(theta))/cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 12) ; smallest Cycloid Distance theta = atan(imag(#z)/real(#z)) r = 2*cabs(#z) polar = r*(theta-sin(theta)) + flip(r*(1-cos(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 13) ; smallest Archimedes Distance theta = atan(imag(#z)/real(#z)) r = 3.5*@a*theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 14) ; smallest Log Spiral Distance theta = atan(imag(#z)/real(#z)) r = exp(@a*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 15) ; smallest Rose Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 16) ; smallest Bifolium Distance theta = atan(imag(#z)/real(#z)) r = 16*@a*sin(theta)^2*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 17) ; smallest Astroid Distance theta = atan(imag(#z)/real(#z)) af1 = @afn1(theta)^imag(@apwr) af2 = @afn2(theta)^imag(@apwr) polar = 1.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 18) ; smallest Cissoid of Diocles Distance theta = atan(imag(#z)/real(#z)) r = 2*@a*sin(theta)*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 19) ; smallest Cochleoid Distance theta = atan(imag(#z)/real(#z)) ; theta = atan2(#z) r = 1.25*@a*sin(theta)/theta polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 20) ; smallest Folium of Descartes Distance theta = atan(imag(#z)/real(#z)) r = @a*tan(theta)/(cos(theta)*(1+tan(theta)^3)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 21) ; smallest Limacon of Pascal Distance theta = atan(imag(#z)/real(#z)) r = 0.03*@b + 1.5*@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 22) ; smallest Lituus Distance theta = atan(imag(#z)/real(#z)) r = 0.6*@a/theta^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 23) ; smallest Nephroid Distance theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) - @afn1(theta/3) af2 = 3*@afn2(theta) - @afn2(theta/3) polar = 0.75*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 24) ; smallest Strophoid Distance theta = atan(imag(#z)/real(#z)) r = 0.2*@b*sin(@a-2*theta)/sin(@a-theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 25) ; smallest Witch of Agnesi theta = atan(imag(#z)/real(#z)) af1 = 2*cotan(theta) af2 = 1-cos(2*theta) polar = 0.1*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 26) ; smallest Curtate Cycloid theta = atan(imag(#z)/real(#z)) af1 = 2*@a*theta - 0.1*@b*@afn2(theta) af2 = 2*@a - 0.1*@b*@afn1(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 27) ; smallest Epicycloid theta = atan(imag(#z)/real(#z)) af1 = (5*@a+@b)*@afn1(theta) - @b*@afn1((5*@a+@b)*theta/@b) af2 = (5*@a+@b)*@afn2(theta) - @b*@afn2((5*@a+@b)*theta/@b) polar = 0.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 28) ; smallest Ellipse Evolute theta = atan(imag(#z)/real(#z)) af1 = (@a^2-(0.7*@b)^2)/@a*@afn1(theta)^(real(@apwr)) af2 = ((0.7*@b)^2-@a^2)/(0.7*@b)*@afn2(theta)^(imag(@apwr)) polar = 0.2*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 29) ; smallest Tractrix theta = atan(imag(#z)/real(#z)) af1 = @a*(log(tan(theta/2))-@afn1(theta)) af2 = @a*@afn2(theta) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 30) ; smallest Kampyle of Eudoxus Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta)^2 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 31) ; smallest Circle Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*(1-3*2*@b*cos(theta)+2*2*@b*cos(theta)^3)/(-(1+2*(2*@b)^2)+3*2*@b*cos(theta)) af2 = 2*(2*@b)^2*sin(theta)^3/(1+2*(2*@b)^2-3*@b*cos(theta)) polar = 1.5*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 32) ; smallest Deltoid Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 3*@afn1(theta) + @afn1(3*theta+#pi/2*@b) - @afn1(#pi/2*@b) af2 = 3*@afn2(theta) + @afn2(3*theta+#pi/2*@b) - @afn2(#pi/2*@b) polar = 0.35*@a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 33) ; smallest Ellipse Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 4*@a*(@a-@b)*(@a*@b)*sin(theta)^3/(@a^2+@b^2+(@b^2-@a^2)*cos(2*theta)) af2 = 4*@b*(@b^2-@a^2)*cos(theta)^3/(@a^2+@b^2+3*(@b^2-@a^2)*cos(2*theta)) polar = 0.25*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 34) ; smallest Log Spiral Catacaustic theta = atan(imag(#z)/real(#z)) af1 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)-sin(theta))/(1+(2*@b^2)) af2 = 2*@b*exp(2*@b*theta)*(2*@b*cos(theta)+sin(theta))/(1+(2*@b^2)) polar = @a*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 35) ; smallest Butterfly Distance theta = atan(imag(#z)/real(#z)) r = 1.25*@a*(exp(sin(theta))-2*cos(4*theta)+sin(1/24*(2*theta-#pi))) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 36) ; smallest Gear Curve theta = atan(imag(#z)/real(#z)) af1 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*cos(theta) af2 = (0.25*@a+1/@b*tanh(@b*sin(@pn*theta)))*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 37) ; smallest Arachnida 1 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn-1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 38) ; smallest Arachnida 2 Distance theta = atan(imag(#z)/real(#z)) r = @a*sin(@pn*theta)/sin((@pn+1)*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 39) ; smallest Cayley's Sextic Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*cos(theta)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 40) ; smallest Cycloid of Seva Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a*(1+2*cos(2*theta)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 41) ; smallest Devil's Curve Distance theta = atan(imag(#z)/real(#z)) r = (((0.5*@a*sin(theta))^2-(0.2*@b*cos(theta))^2)/(sin(theta)^2-cos(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 42) ; smallest Eight Curve Distance theta = atan(imag(#z)/real(#z)) r = @a*cos(theta)^(-2)*cos(2*theta)^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 43) ; smallest Epispiral Distance theta = atan(imag(#z)/real(#z)) r = 0.25*@a/cos(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 44) ; smallest Hipopede Distance theta = atan(imag(#z)/real(#z)) r = (0.5*@b*(0.5*@a-(0.5*@b)^2*cos(theta)))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 45) ; smallest Maltese Cross Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@a/(cos(theta)*sin(theta)*(cos(theta)^2-sin(theta)^2))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 46) ; smallest Ophiuride Distance theta = atan(imag(#z)/real(#z)) r = (0.01*@b*sin(theta)-4.5*@a*cos(theta))*tan(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 47) ; smallest Quadratrix of Hippias Distance theta = atan(imag(#z)/real(#z)) r = @a*theta/sin(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 48) ; smallest Poinsot Spiral 1 Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a/cosh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 49) ; smallest Poinsot Spiral 2 Distance theta = atan(imag(#z)/real(#z)) r = @a/sinh(@pn*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 50) ; smallest Quadrifolium Distance theta = atan(imag(#z)/real(#z)) r = 2.5*@a*sin(2*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 51) ; smallest Scarabaeus Distance theta = atan(imag(#z)/real(#z)) r = 0.5*@b*cos(2*theta)-@a*cos(theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 52) ; smallest Semicubical Parabola Distance theta = atan(imag(#z)/real(#z)) r = 1.5*@a*(cos(3*@b*theta))^(1/(3*@b)) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 53) ; smallest Swastika Curve Distance theta = atan(imag(#z)/real(#z)) r = 2.25*@a*(sin(theta)*cos(theta)/(sin(theta)^4-cos(theta)^4))^0.5 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 54) ; smallest Trifolium Distance theta = atan(imag(#z)/real(#z)) r = -2*@a*cos(3*theta) polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 55) ; smallest Tschirnhausen Cubic Distance theta = atan(imag(#z)/real(#z)) r = @a/cos(theta/3)^3 polar = r*cos(theta) + flip(r*sin(theta)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 56) ; smallest Bicorn theta = atan(imag(#z)/real(#z)) af1 = @a*sin(theta) af2 = @a*cos(theta)^2*(2+cos(theta))/(3+sin(theta)^2) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 57) ; smallest Cruciform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a/cos(theta) af2 = 0.02*@b/sin(theta) polar = 1.5*(af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 58) ; smallest Knot curve cy = imag(#z) qa = 1 qb = -2 qc = 1 - 3*cy^2 - 2*cy^3 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 59) ; smallest Ampersand qa = 4 qb = 6*real(#z)^2 - 3*real(#z) - 3 qc = 6*real(#z)^4 - 13*real(#z)^3 + 19*real(#z)^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(real(#z) + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 60) ; smallest Bean theta = atan(imag(#z)/real(#z)) af1 = @a*(@afn1(theta)^real(@apwr) + @afn2(theta)^imag(@apwr)) polar = ((af1*cos(theta))+flip((af1*sin(theta)))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 61) ; smallest Bicuspid cy = imag(#z) qa = 1 qb = -2*(0.05*@b)^2 qc = (0.05*@b)^4 - (cy^2 - (0.05*@b)^2)^2 if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = 2.25*@a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 62) ; smallest Bow theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1-tan(theta)^2)*cos(theta) af2 = 0.1*@b*(1-tan(theta)^2)*sin(theta) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 63) ; smallest Cassini Ovals theta = atan(imag(#z)/real(#z)) if @negroot == true rr = 0.5*@a*(cos(2*theta)-((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 else rr = 0.5*@a*(cos(2*theta)+((@b*0.1/(@a*0.5))^4-sin(2*theta)^2)^0.5)^0.5 endif polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 64) ; smallest Circle theta = atan(imag(#z)/real(#z)) rr = @a*sin(theta)^2 + 0.2*@b*cos(theta)^2 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 65) ; smallest Trident cx = real(#z) cy = cx^2 + 0.1*@b/cx polar = 0.1*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 66) ; smallest Stirrup Curve cy = imag(#z) qa = 1 qb = -2 qc = 1-cy^2*(cy-1)*(cy-2)*(cy+5) if @negroot == true qx = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qx = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(qx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 67) ; smallest Diamond polar = @a*@safn(abs((real(#z)*@sa1))+abs((flip(imag(#z))^@sa2))-1) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 68) ; smallest Dumbbell Curve cx = real(#z) cy = (cx^4 - cx^6)^0.5 polar = 4*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 69) ; smallest Teardrop Curve theta = atan(imag(#z)/real(#z)) af1 = @a*cos(theta) af2 = 0.5*@b*sin(theta)*sin(theta/2)^(@pn-1) polar = (af1 + flip(af2)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 70) ; smallest Happy Accident polar = 15*@a*@safn((((real(#z)*@sa4)^(1+@sa2))+ \ (flip(imag(#z))^2*@sa3))*atan2((flip(imag(#z))^@sa7)* \ (real(#z)^@sa5))-@sa1* \ (flip(imag(#z))^@sa6)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 71) ; smallest Hyperbola theta = atan(imag(#z)/real(#z)) rr = 0.35*@a*(1/cos(2*theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 72) ; smallest Kappa Curve theta = atan(imag(#z)/real(#z)) rr = 0.1*@a*tan(theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 73) ; smallest Piriform theta = atan(imag(#z)/real(#z)) af1 = 0.1*@a*(1+sin(theta)) af2 = 0.1*@b*cos(theta)*(1+sin(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 74) ; smallest Keratoid Cusp cx = real(#z) qa = 1 qb = -cx^2 qc = -cx^5 if @negroot == true qy = (-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa) else qy = (-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa) endif polar = 2.5*@a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 75) ; smallest Serpentine Curve theta = atan(imag(#z)/real(#z)) af1 = 0.2*@a*cotan(theta) af2 = 0.2*@b*sin(theta)*cos(theta) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 76) ; smallest Line cx = real(#z) cy = cx polar = 3*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 77) ; smallest Links Curve cx = real(#z) qa = 1 qb = 2*cx^2-6*cx qc = cx^4-2*cx^3+cx^2 if @negroot == true qy = ((-qb - (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 else qy = ((-qb + (qb^2 - 4*qa*qc)^0.5)/(2*qa))^0.5 endif polar = @a*(cx + flip(qy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 78) ; smallest Parabola cy = imag(#z) cx = 10*@b*cy^2 polar = 0.65*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 79) ; smallest Trefoil theta = atan(imag(#z)/real(#z)) rr = 0.1*@a/cos(3*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 80) ; smallest Trident of Descartes cx = real(#z) cy = (cx-0.2*@b)*(cx+0.2*@b)*(cx-0.4*@b)/cx polar = @a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 81) ; smallest Trisectrix of Maclaurin theta = atan(imag(#z)/real(#z)) rr = 0.5*@a*sin(3*theta)/sin(2*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 82) ; smallest Atzema Spiral theta = atan(imag(#z)/real(#z)) af1 = 0.5*@a*(sin(theta)/theta-2*cos(theta)-theta*sin(theta)) af2 = 0.05*@b*(cos(theta)/theta-2*sin(theta)+theta*cos(theta)) polar = af1 + flip(af2) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 83) ; smallest Rose of Troy theta = atan(imag(#z)/real(#z)) rr = @cp*(1+10*@a*sin(4*@b*theta)) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 84) ; smallest Cotes' Spiral theta = atan(imag(#z)/real(#z)) rr = @a/cosh(@b*theta) polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 85) ; smallest Dipole Curve theta = atan(imag(#z)/real(#z)) rr = @a*(cos(theta))^0.5 polar = (rr*cos(theta))+flip((rr*sin(theta))) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ELSEIF (@zmode == 86) ; smallest Polytrope cx = real(#z) cy = 1/cx^@pn polar = 0.00005*@a*(cx + flip(cy)) d1 = abs(cabs(z1)-cabs(polar)) ; get current distances d2 = abs(cabs(z2)-cabs(polar)) d3 = abs(cabs(z3)-cabs(polar)) IF (d1 < s1) ; update smallest distances s1 = d1 ENDIF IF (d2 < s2) s2 = d2 ENDIF IF (d3 < s3) s3 = d3 ENDIF ENDIF modz = |z1| IF (modz > @bailout ||\ @everyiter ||\ done == #maxit + 2); done, or every iteration, or last ; determine continuous iteration (height) for each point IF (@zmode >= 0 && @zmode <= 86) ; height based on smallest |z| e1 = s1 * @zscale e2 = s2 * @zscale e3 = s3 * @zscale ELSEIF (@zmode == 87) e1 = iterexp1 * @zscale e2 = iterexp2 * @zscale e3 = iterexp3 * @zscale ENDIF ; apply transfer function ; a function is not used because these are floats ; and not all functions apply to floats IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * @zscale2 e2 = e2 * @zscale2 e3 = e3 * @zscale2 vx = e2-e1 vy = e3-e1 vz = -@offset ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd z = vx + flip(vy); fudge z from vector ELSE; didn't compute z this time z = z1; use primary iteration value to keep periodicity working ENDIF IF (modz > @bailout); we're done done = 0 ENDIF bailout: (done > 0) default: method = multipass periodicity = 0 heading caption = "SlopeExp JuliaTentMap" endheading $ifdef VER40 heading text = "Based upon the Tent Map:" endheading heading text = " T(x) = s*x for x <= 0.5" endheading heading text = " T(x) = s*(1-x) for x > 0.5" endheading heading text = "and the code for the Barnsley type fractals." endheading $else heading caption = "Based upon the Tent Map:" endheading heading caption = " T(x) = s*x for x <= 0.5" endheading heading caption = " T(x) = s*(1-x) for x > 0.5" endheading $endif $ifdef VER40 heading text = "The formula provides 88 different Height Value variants for the slope calculations." endheading heading text = "Use Damien's Lighting Coloring or 3D Texturizer Enhanced III. \ Most other coloring formulas can be used." endheading $else heading caption = "Use Damien's Lighting Coloring" endheading heading caption = "Or 3D Texturizer Enhanced III." endheading heading caption = "Most other coloring formulas" endheading heading caption = "can also be used." endheading $endif title = "SlopeExp (JuliaTentMap)" center = (0.0, 0.0) maxiter = 1000 param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param p1 caption = "Julia Seed" default = (-0.6,1) hint = "This is the Julia seed, a constant parameter which \ defines the shape of the fractal." endparam param type caption = "Tent type" default = 1 enum = "cabs" "real" "imag" "Pinsky" endparam param flavor caption = "Flavor" default = 0 enum = "Flavor 1" "Flavor 2" endparam param bailout caption = "Bailout Value" default = 10000.0 min = 0.0 hint = "Defines how soon an orbit bails out, i.e. doesn't belong \ to the Mandelbrot set anymore." endparam float param tent1 caption ="Tent param #1" default = 1 endparam float param tent2 caption ="Tent param #2" default = 1 endparam float param tent3 caption ="Tent param #3" default = 0.5 endparam func tentfn caption = "Tent function" default = abs() endfunc func tentfn2 caption = "Tent function #2" default = ident() endfunc heading caption = "Slope Parameters" endheading param offset caption = "Orbit Separation" default = 0.00000001 hint = "Defines how far apart the simultaneous orbits are. Smaller \ distances will produce more accurate results." endparam param zmode caption = "Height Value" default = 87 enum = "smallest |z|" "smallest |real(z)|" "smallest |imag(z)|" \ "smallest |sum(z)|" "smallest |product(z)|" \ "|smallest quotient(z)|" "smallest |atan(z)|" \ "smallest |function1(z)|" "smallest |function2(z)|" \ "Lemniscate" "Cardiod" "Conchoid" "Cycloid" "Archimedes" \ "Log Spiral" "Rose" "Bifolium" "Astroid" "Cissoid of Diocles" \ "Cochleoid" "Folium of Descartes" "Limacon of Pascal" \ "Lituus" "Nephroid" "Strophoid" "Witch of Agnesi" \ "Curtate Cycloid" "Epicycloid" "Ellipse Evolute" "Tractrix" \ "Kampyle of Eudoxus" "Circle Catacaustic" "Deltoid Catacaustic" \ "Ellipse Catacaustic" "Log Spiral Catacaustic" "Butterfly" \ "Gear Curve" "Arachnida 1" "Arachnida 2" "Cayley's Sextic" \ "Cycloid of Seva" "Devil's Curve" "Eight Curve" "Epispiral" \ "Hipopede" "Maltese Cross" "Ophiuride" "Quadratrix of Hippias" \ "Poinsot Spiral 1" "Poinsot Spiral 2" "Quadrifolium" "Scarabaeus" \ "Semicubical Parabola" "Swastika Curve" "Trifolium" \ "Tschirnhausen Cubic" "Bicorn" "Cruciform" "Knot Curve" \ "Ampersand" "Bean" "Bicuspid" "Bow" "Cassini Ovals" "Circle" \ "Trident" "Stirrup Curve" "Diamond" "Dumbbell Curve" \ "Teardrop Curve" "Happy Accident" "Hyperbola" "Kappa Curve" \ "Piriform" "Keratoid Cusp" "Serpentine Curve" "Line" \ "Links Curve" "Parabola" "Trefoil" "Trident of Descartes" \ "Trisectrix of Maclaurin" "Atzema Spiral" "Rose of Troy" \ "Cotes' Spiral" "Dipole Curve" "Polytrope" \ "smoothed iteration" hint = "Specifies what will be used to construct a height value." endparam func fn1 caption = "Transmute Function" default = sin() visible = @zmode==7 || @zmode ==8 endfunc param a caption = "Polar Parameter" default = 0.2 visible=@zmode==9 || @zmode==10 || @zmode==11 || @zmode==13 || @zmode==14 \ || @zmode==15 || @zmode==16 || @zmode==17 || @zmode==18 || @zmode==19 \ || @zmode==20 || @zmode==21 || @zmode==22 || @zmode==23 || @zmode==24 \ || @zmode==25 || @zmode==26 || @zmode==27 || @zmode==28 || @zmode==29 \ || @zmode==30 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==35 || @zmode==36 || @zmode==37 || @zmode==38 || @zmode==39 \ || @zmode==40 || @zmode==41 || @zmode==42 || @zmode==43 || @zmode==44 \ || @zmode==45 || @zmode==46 || @zmode==47 || @zmode==48 || @zmode==49 \ || @zmode==50 || @zmode==51 || @zmode==52 || @zmode==53 || @zmode==54 \ || @zmode==55 || @zmode==56 || @zmode==57 || @zmode==58 || @zmode==59 \ || @zmode==60 || @zmode==61 || @zmode==62 || @zmode==63 || @zmode==64 \ || @zmode==65 || @zmode==66 || @zmode==67 || @zmode==68 || @zmode==69 \ || @zmode==70 || @zmode==71 || @zmode==72 || @zmode==73 || @zmode==74 \ || @zmode==75 || @zmode==76 || @zmode==77 || @zmode==78 || @zmode==79 \ || @zmode==80 || @zmode==81 || @zmode==82 || @zmode==83 || @zmode==84 \ || @zmode==85 || @zmode==86 endparam param b caption = "2nd Polar Parameter" default = 1.0 visible=@zmode==11 || @zmode==21 || @zmode==24 || @zmode==26 || @zmode==27 \ || @zmode==28 || @zmode==31 || @zmode==32 || @zmode==33 || @zmode==34 \ || @zmode==36 || @zmode==41 || @zmode==44 || @zmode==46 || @zmode==51 \ || @zmode==52 || @zmode==57 || @zmode==61 || @zmode==62 || @zmode==63 \ || @zmode==64 || @zmode==65 || @zmode==69 || @zmode==73 || @zmode==75 \ || @zmode==78 || @zmode==80 || @zmode==82 || @zmode==83 || @zmode==84 endparam param cp caption = "3rd Polar parameter" default = 0.05 visible=@zmode==83 endparam param pn caption = "Polar Integer" default = 3 visible=@zmode==36 || @zmode==37 || @zmode==38 || @zmode==43 || @zmode==48 \ || @zmode==49 || @zmode==69 || @zmode==86 endparam param apwr caption = "Polar Power" default = (3.0,3.0) visible = @zmode==17 || @zmode==28 || @zmode==60 endparam func afn1 caption = "Polar Fn 1" default = cos() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc func afn2 caption = "Polar Fn 2" default = sin() visible = @zmode==17 || @zmode==23 || @zmode==26 || @zmode==27 || @zmode==28 \ || @zmode==29 || @zmode==32 || @zmode==60 endfunc param sa1 caption = "Adjuster 1" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa2 caption = "Adjuster 2" default = 1.0 visible = @zmode == 67 || @zmode==70 endparam param sa3 caption = "Adjuster 3" default = 1.0 visible = @zmode == 70 endparam param sa4 caption = "Adjuster 4" default = 1.0 visible = @zmode == 70 endparam param sa5 caption = "Adjuster 5" default = 1.0 visible = @zmode == 70 endparam param sa6 caption = "Adjuster 6" default = 1.0 visible = @zmode == 70 endparam param sa7 caption = "Adjuster 7" default = 1.0 visible = @zmode == 70 endparam func safn caption = "Adjuster Fn" default = ident() visible = @zmode == 67 || @zmode==70 endfunc param negroot caption = "Quad Neg Root" default = false visible=@zmode==58 || @zmode==61 || @zmode==66 || @zmode==74 || @zmode==77 endparam param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." endparam param zscale2 caption = "Height Post-Scale" default = 0.025 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." endparam param everyiter caption = "Every Iteration" default = false hint = "If set, the surface normal will be computed at every \ iteration. If you are using a coloring algorithm which \ processes every iteration, you will need this." endparam switch: type = "SlopeExpTentMap" bailout = @bailout offset = @offset xfer = @xfer zscale = @zscale zscale2 = @zscale2 zmode = @zmode everyiter = @everyiter a = @a b = @b cp = @cp pn = @pn afn1 = @afn1 afn2 = @afn2 safn = @safn apwr = @apwr fn1 = @fn1 sa1 = @sa1 sa2 = @sa2 sa3 = @sa3 sa4 = @sa4 sa5 = @sa5 sa6 = @sa6 sa7 = @sa7 negroot = @negroot tent1 = @tent1 tent2 = @tent2 tent3 = @tent3 type = @type tentfn = @tentfn tentfn2 = @tentfn2 flavor = @flavor } Manowar {; Ron Barnett, September 2006 ; From Fractint with extended bailout options init: #z = #pixel + @start complex z1 = #z loop: complex oldz = #z #z = oldz*oldz + z1 + #pixel z1 = oldz bailout: ; |#z| <= t (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Manowar" maxiter = 1000 center = (-0.5, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam switch: type = "Manowarj" bailout = @bailout seed = #pixel test = @test } Manowarj {; Ron Barnett, September 2006 ; From Fractint with extended bailout options init: #z = #pixel complex z1 = #z loop: complex oldz = #z #z = oldz*oldz + z1 + @seed z1 = oldz bailout: ; |#z| <= t (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Manowar Julia" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam complex param seed caption = "Seed" default = (0,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam switch: type = "Manowar" bailout = @bailout test = @test } Spider {; Ron Barnett, September 2006 ; from an old Fractint formula init: #z = #pixel complex c = #pixel loop: #z=#z*#z+c c=c/2+#z bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Spider" maxiter = 1000 center = (-0.5, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam switch: type = "SpiderJulia" bailout = @bailout p1 = #pixel test = @test } SpiderJulia {; Ron Barnett, September 2006 ; from an old Fractint formula init: #z = #pixel complex c = @p1 loop: #z=#z*#z+c c=c/2+#z bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Spider Julia" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam complex param p1 caption = "Julia Seed" default = (0.05625,0.1) endparam switch: type = "Spider" bailout = @bailout test = @test } JonHornerSpider {; Ron Barnett, October 2008 ; from an old Fractint formula init: #z = #pixel complex c = #pixel loop: #z=#z*#z+c c=c*@sparam+#z bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Jon Horner's Spider" maxiter = 1000 center = (-0.5, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam complex param sparam caption = "Spider Parameter" default = (0.5,0) endparam switch: type = "JonHornerSpiderJulia" bailout = @bailout sparam = @sparam p1 = #pixel test = @test } JonHornerSpiderJulia {; Ron Barnett, October 2008 ; from an old Fractint formula init: #z = #pixel complex c = @p1 loop: #z=#z*#z+c c=c*@sparam+#z bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Jon Horner's Spider Julia" maxiter = 1000 center = (0.0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam complex param p1 caption = "Seed" default = (0.15, 0.25) endparam complex param sparam caption = "Spider Parameter" default = (0.5,0) endparam switch: type = "JonHornerSpider" bailout = @bailout sparam = @sparam test = @test } RolfFreericksSpider {; Ron Barnett, October 2008 ; from an old Fractint formula init: #z = #pixel complex c = #pixel complex h = c loop: #z=#z*#z+c-h c=c*@sparam+#z bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Rolf Freericks' Spider" maxiter = 1000 center = (-0.5, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam complex param sparam caption = "Spider Parameter" default = (0.5,0) endparam switch: type = "RolfFreericksSpiderJulia" bailout = @bailout sparam = @sparam p1 = #pixel test = @test } RolfFreericksSpiderJulia {; Ron Barnett, October 2008 ; from an old Fractint formula init: #z = #pixel complex c = @p1 complex h = c loop: #z=#z*#z+c-h c=c*@sparam+#z bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Rolf Freericks' Spider Julia" maxiter = 1000 center = (0.0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam complex param p1 caption = "Seed" default = (-0.03, -0.06) endparam complex param sparam caption = "Spider Parameter" default = (0.5,0) endparam switch: type = "RolfFreericksSpider" bailout = @bailout sparam = @sparam test = @test } MandelGopalsamy2 { ; Ron Barnett, October 2006 init: #z = @start loop: x = real(#z) y = imag(#z)*@a #z = x + flip(y) #z = -(0,1)*conj(#z)^@power + #pixel bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mandel Gopalsamy2" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 100 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam float param a caption = "Parameter a" default = 2.0 endparam complex param power caption = "Power" default = (2,0) endparam switch: type = "Gopalsamy2" bailout = @bailout p1 = #pixel power = power a = a } MandelGopalsamy3 { ; Ron Barnett, October 2006 init: #z = @start loop: x = real(#z) y = imag(#z) x1 = 3*x*y*y - x*x*x + #pixel y = y*y*y - 3*x*x*y #z = x1 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mandel Gopalsamy3" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam switch: type = "Gopalsamy3" bailout = @bailout p1 = #pixel } MandelGopalsamy4 { ; Ron Barnett, October 006 init: #z = @start loop: x = real(#z) y = imag(#z) x1 = -x*y + #pixel y = 2*y*y - 3*x*x #z = x1 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mandel Gopalsamy4" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam switch: type = "Gopalsamy4" bailout = @bailout p1 = #pixel } MandelGopalsamy5 { ; Ron Barnett, October 2006 init: #z = @start loop: x = real(#z) y = imag(#z) x1 = 2*x*y y1 = x*x - y*y x2 = -2*x1*y1 + #pixel y = y1*y1 - x1*x1 #z = x2 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mandel Gopalsamy5" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam switch: type = "Gopalsamy5" bailout = @bailout p1 = #pixel } MandelGopalsamyExp { ; Ron Barnett, October 2006 init: #z = @start loop: x = real(#z) y = imag(#z) x1 = -exp(x)*cos(y) + #pixel y = -exp(x)*sin(y) #z = x1 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mandel GopalsamyExp" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam switch: type = "GopalsamyExp" bailout = @bailout p1 = #pixel } MandelGopalsamyExp2 { ; Ron Barnett, October 2006 init: #z = @start loop: x = real(#z) y = imag(#z) x1 = exp(x)*cos(y) y1 = exp(x)*sin(y) x2 = -2*x1*y1 + #pixel y = y1*y1 - x1*x1 #z = x2 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mandel GopalsamyExp2" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam switch: type = "GopalsamyExp2" bailout = @bailout p1 = #pixel } MandelGopalsamyFn { ; Ron Barnett, October 2006 init: #z = @start loop: x = real(#z) y = imag(#z) x1 = @fn1(x)*@fn2(y) y1 = @fn3(x)*@fn4(y) x2 = -2*x1*y1 + #pixel y = y1*y1 - x1*x1 #z = x2 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mandel GopalsamyFn" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam func fn1 caption = "First Function" default = cosh() endfunc func fn2 caption = "Second Function" default = sin() endfunc func fn3 caption = "Third Function" default = ident() endfunc func fn4 caption = "Fourth Function" default = cos() endfunc switch: type = "GopalsamyFn" bailout = @bailout p1 = #pixel fn1 = @fn1 fn2 = @fn2 fn3 = @fn3 fn4 = @fn4 } MandelGopalsamySin { ; Ron Barnett, October 2006 init: #z = @start loop: x = real(#z) y = imag(#z) x1 = -sin(x)*cosh(y) + #pixel y = -cos(x)*sinh(y) #z = x1 + flip(y) bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Mandel GopalsamySin" maxiter = 1000 center = (0, 0) periodicity = 0 method = multipass param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param start caption = "Perturbation" default = (0,0) endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam float param bailout caption = "Bailout value" default = 10000 min = 1 endparam switch: type = "GopalsamySin" bailout = @bailout p1 = #pixel } Slope_3D_Quadratic_ODE_G_Attractor { ; Ron Barnett April 29, 2004 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III ; Strange attractors from simultaneous ; ordinary differential equations using ; Euler's finite difference method to ; calculate ; ; global: float zscale2 = 0 float cprojx = 0 float cprojy = 0 float cprojz = 0 float scrsize = sqrt(#width*#width+#height*#height) if !@oldver zscale2 = @zscale2*scrsize cprojx = @cprojx*#width cprojy = @cprojy*#height cprojz = @cprojz*scrsize else zscale2 = @zscale2 cprojx = @cprojx cprojy = @cprojy cprojz = @cprojz endif int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits2[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits3[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float s[52,31] float fx = 0.0 float ffx = 0.0 float xx = 0.0 float fy = 0.0 float ffy = 0.0 float yy = 0.0 float zz = 0.0 float ffz = 0.0 float b1 = 0 float b2 = 0 float b3 = 0 float b4 = 0 float b5 = 0 float b6 = 0 float b7 = 0 float b8 = 0 float b9 = 0 float b10 = 0 float b11 = 0 float b12 = 0 float b13 = 0 float b14 = 0 float b15 = 0 float b16 = 0 float b17 = 0 float b18 = 0 float b19 = 0 float b20 = 0 float b21 = 0 float b22 = 0 float b23 = 0 float b24 = 0 float b25 = 0 float b26 = 0 float b27 = 0 float b28 = 0 float b29 = 0 float b30 = 0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float tzmax = sqrt(txmax^2+tymax^2) float xmin = cx - txmax/2 float ymin = cy - tymax/2 float zmin = sqrt(xmin^2 + ymin^2) float iterate = @density*10000000 float maxnhit = 0 ; ; initialize hit array ; while(h < #height) while(w < #width) hits[w,h] = 0 hits2[w,h] = 0 hits3[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; initialize presets ; s[1,1]=1.0,s[1,2]=-1.1,s[1,3]=-0.6,s[1,4]=-1.0,s[1,5]=0.2,s[1,6]=0.4,s[1,7]=1.0,s[1,8]=0.8,s[1,9]=0.5,s[1,10]=-0.8,s[1,11]=0.1,s[1,12]=-0.1,s[1,13]=-1.2,s[1,14]=-0.9,s[1,15]=0.3,s[1,16]=1.0,s[1,17]=-0.9,s[1,18]=-0.5,s[1,19]=1.1,s[1,20]=1.0,s[1,21]=0.1,s[1,22]=-1.0,s[1,23]=1.0,s[1,24]=-0.9,s[1,25]=-0.4,s[1,26]=-0.6,s[1,27]=0.3,s[1,28]=-0.6,s[1,29]=0.1,s[1,30]=0.7 s[2,1]=-1.0,s[2,2]=-0.3,s[2,3]=0.2,s[2,4]=-0.9,s[2,5]=0.7,s[2,6]=-0.1,s[2,7]=0.3,s[2,8]=1.1,s[2,9]=-0.8,s[2,10]=-0.5,s[2,11]=-1.1,s[2,12]=1.2,s[2,13]=-1.0,s[2,14]=-0.6,s[2,15]=0.6,s[2,16]=1.2,s[2,17]=-0.1,s[2,18]=0.5,s[2,19]=0.5,s[2,20]=0.8,s[2,21]=-1.2,s[2,22]=-0.8,s[2,23]=-1.1,s[2,24]=1.1,s[2,25]=0.7,s[2,26]=0.5,s[2,27]=0.0,s[2,28]=-1.1,s[2,29]=-0.5,s[2,30]=0.6 s[3,1]=-0.8,s[3,2]=-0.5,s[3,3]=0.5,s[3,4]=0.2,s[3,5]=0.2,s[3,6]=-1.1,s[3,7]=-0.8,s[3,8]=-1.0,s[3,9]=-1.1,s[3,10]=0.4,s[3,11]=-1.0,s[3,12]=-0.3,s[3,13]=0.6,s[3,14]=1.1,s[3,15]=0.7,s[3,16]=0.4,s[3,17]=0.1,s[3,18]=1.0,s[3,19]=1.0,s[3,20]=-0.7,s[3,21]=1.1,s[3,22]=-1.0,s[3,23]=-0.9,s[3,24]=-0.9,s[3,25]=-0.7,s[3,26]=-0.3,s[3,27]=-0.2,s[3,28]=-0.3,s[3,29]=-1.0,s[3,30]=0.1 s[4,1]=-0.3,s[4,2]=-0.9,s[4,3]=1.2,s[4,4]=0.1,s[4,5]=1.1,s[4,6]=-1.1,s[4,7]=-0.1,s[4,8]=0.4,s[4,9]=0.4,s[4,10]=-0.6,s[4,11]=0.8,s[4,12]=-0.2,s[4,13]=-0.1,s[4,14]=1.0,s[4,15]=-1.1,s[4,16]=0.3,s[4,17]=-0.5,s[4,18]=-1.0,s[4,19]=1.2,s[4,20]=0.1,s[4,21]=-0.7,s[4,22]=0.1,s[4,23]=-0.3,s[4,24]=0.1,s[4,25]=0.6,s[4,26]=0.6,s[4,27]=0.7,s[4,28]=1.1,s[4,29]=-0.8,s[4,30]=-0.4 s[5,1]=-1.1,s[5,2]=0.1,s[5,3]=0.9,s[5,4]=0.1,s[5,5]=0.2,s[5,6]=0.6,s[5,7]=0.2,s[5,8]=0.0,s[5,9]=-0.2,s[5,10]=-0.2,s[5,11]=-0.3,s[5,12]=-1.1,s[5,13]=0.6,s[5,14]=0.8,s[5,15]=-0.1,s[5,16]=-0.1,s[5,17]=0.3,s[5,18]=0.2,s[5,19]=0.8,s[5,20]=-0.7,s[5,21]=0.6,s[5,22]=-1.1,s[5,23]=0.8,s[5,24]=-0.9,s[5,25]=0.1,s[5,26]=0.1,s[5,27]=-0.4,s[5,28]=0.8,s[5,29]=-0.7,s[5,30]=0.6 s[6,1]=0.7,s[6,2]=-0.2,s[6,3]=-1.2,s[6,4]=0.4,s[6,5]=0.3,s[6,6]=-1.0,s[6,7]=0.2,s[6,8]=-1.0,s[6,9]=-1.2,s[6,10]=1.2,s[6,11]=0.5,s[6,12]=0.8,s[6,13]=-1.1,s[6,14]=-0.6,s[6,15]=-0.3,s[6,16]=0.4,s[6,17]=-0.2,s[6,18]=-0.1,s[6,19]=-1.2,s[6,20]=0.1,s[6,21]=0.1,s[6,22]=0.8,s[6,23]=1.1,s[6,24]=0.5,s[6,25]=1.0,s[6,26]=0.0,s[6,27]=-0.8,s[6,28]=-0.3,s[6,29]=-0.6,s[6,30]=0.4 s[7,1]=0.3,s[7,2]=0.1,s[7,3]=0.6,s[7,4]=-0.5,s[7,5]=0.2,s[7,6]=0.5,s[7,7]=1.2,s[7,8]=0.0,s[7,9]=-0.1,s[7,10]=-1.1,s[7,11]=0.9,s[7,12]=-0.9,s[7,13]=-1.0,s[7,14]=0.0,s[7,15]=0.3,s[7,16]=-1.2,s[7,17]=0.7,s[7,18]=1.0,s[7,19]=0.9,s[7,20]=0.2,s[7,21]=-0.5,s[7,22]=-0.1,s[7,23]=0.6,s[7,24]=0.0,s[7,25]=1.1,s[7,26]=-1.2,s[7,27]=-0.8,s[7,28]=0.9,s[7,29]=1.2,s[7,30]=-0.4 s[8,1]=-0.3,s[8,2]=0.4,s[8,3]=0.3,s[8,4]=-1.1,s[8,5]=1.0,s[8,6]=0.7,s[8,7]=0.8,s[8,8]=0.2,s[8,9]=0.4,s[8,10]=-0.9,s[8,11]=0.1,s[8,12]=-0.6,s[8,13]=1.1,s[8,14]=-0.3,s[8,15]=0.2,s[8,16]=0.2,s[8,17]=-0.4,s[8,18]=0.5,s[8,19]=0.9,s[8,20]=-0.3,s[8,21]=1.0,s[8,22]=-0.7,s[8,23]=1.0,s[8,24]=-0.5,s[8,25]=0.0,s[8,26]=-1.2,s[8,27]=-0.6,s[8,28]=0.5,s[8,29]=-0.8,s[8,30]=0.5 s[9,1]=0.7,s[9,2]=0.2,s[9,3]=0.5,s[9,4]=-0.6,s[9,5]=0.4,s[9,6]=0.8,s[9,7]=1.1,s[9,8]=-0.8,s[9,9]=-1.2,s[9,10]=-1.0,s[9,11]=-0.5,s[9,12]=0.4,s[9,13]=0.8,s[9,14]=-0.1,s[9,15]=-0.2,s[9,16]=-0.5,s[9,17]=-0.6,s[9,18]=-0.4,s[9,19]=-0.3,s[9,20]=0.7,s[9,21]=0.6,s[9,22]=1.1,s[9,23]=0.3,s[9,24]=0.6,s[9,25]=0.0,s[9,26]=-1.2,s[9,27]=-0.5,s[9,28]=-0.9,s[9,29]=-1.1,s[9,30]=0.8 s[10,1]=-0.1,s[10,2]=-1.0,s[10,3]=-0.4,s[10,4]=-0.5,s[10,5]=1.0,s[10,6]=-0.6,s[10,7]=1.1,s[10,8]=1.2,s[10,9]=-0.9,s[10,10]=-0.4,s[10,11]=-1.2,s[10,12]=0.7,s[10,13]=-0.1,s[10,14]=0.8,s[10,15]=-0.5,s[10,16]=-0.8,s[10,17]=-0.9,s[10,18]=-0.9,s[10,19]=0.6,s[10,20]=1.1,s[10,21]=0.0,s[10,22]=1.0,s[10,23]=0.3,s[10,24]=-0.9,s[10,25]=0.5,s[10,26]=-1.1,s[10,27]=-0.3,s[10,28]=-0.8,s[10,29]=-0.9,s[10,30]=-0.6 s[11,1]=0.4,s[11,2]=-1.0,s[11,3]=0.8,s[11,4]=1.0,s[11,5]=1.1,s[11,6]=-0.5,s[11,7]=-0.1,s[11,8]=-0.8,s[11,9]=-1.1,s[11,10]=-0.4,s[11,11]=0.5,s[11,12]=-0.6,s[11,13]=-0.2,s[11,14]=-0.5,s[11,15]=-0.3,s[11,16]=-0.7,s[11,17]=0.3,s[11,18]=1.2,s[11,19]=1.2,s[11,20]=0.1,s[11,21]=1.2,s[11,22]=0.1,s[11,23]=-0.5,s[11,24]=0.3,s[11,25]=-0.9,s[11,26]=0.2,s[11,27]=-1.2,s[11,28]=-0.8,s[11,29]=0.3,s[11,30]=1.0 s[12,1]=-0.3,s[12,2]=-0.4,s[12,3]=-0.2,s[12,4]=-0.8,s[12,5]=-0.2,s[12,6]=-0.1,s[12,7]=-0.4,s[12,8]=0.2,s[12,9]=0.3,s[12,10]=0.4,s[12,11]=0.8,s[12,12]=1.0,s[12,13]=-0.5,s[12,14]=-0.5,s[12,15]=-0.7,s[12,16]=-1.1,s[12,17]=-0.1,s[12,18]=-0.1,s[12,19]=-1.1,s[12,20]=0.5,s[12,21]=-0.2,s[12,22]=0.0,s[12,23]=-0.5,s[12,24]=-1.0,s[12,25]=-0.6,s[12,26]=1.1,s[12,27]=0.2,s[12,28]=-0.1,s[12,29]=-0.6,s[12,30]=0.3 s[13,1]=-0.5,s[13,2]=0.2,s[13,3]=0.3,s[13,4]=0.2,s[13,5]=-0.5,s[13,6]=-1.0,s[13,7]=1.1,s[13,8]=0.6,s[13,9]=-0.1,s[13,10]=-1.2,s[13,11]=0.3,s[13,12]=-0.9,s[13,13]=-1.2,s[13,14]=-1.2,s[13,15]=0.7,s[13,16]=0.1,s[13,17]=1.1,s[13,18]=0.3,s[13,19]=1.1,s[13,20]=-0.9,s[13,21]=-0.3,s[13,22]=1.0,s[13,23]=0.4,s[13,24]=1.0,s[13,25]=0.8,s[13,26]=-0.4,s[13,27]=0.7,s[13,28]=0.1,s[13,29]=-0.2,s[13,30]=-0.5 s[14,1]=0.4,s[14,2]=0.7,s[14,3]=0.9,s[14,4]=0.3,s[14,5]=-1.1,s[14,6]=0.9,s[14,7]=0.5,s[14,8]=0.7,s[14,9]=0.9,s[14,10]=-1.2,s[14,11]=-0.2,s[14,12]=-0.8,s[14,13]=-0.9,s[14,14]=0.7,s[14,15]=0.6,s[14,16]=0.1,s[14,17]=-1.1,s[14,18]=-0.5,s[14,19]=-0.3,s[14,20]=0.6,s[14,21]=0.5,s[14,22]=1.2,s[14,23]=-1.0,s[14,24]=0.0,s[14,25]=0.9,s[14,26]=-1.1,s[14,27]=-0.2,s[14,28]=0.2,s[14,29]=-0.7,s[14,30]=0.9 s[15,1]=0.4,s[15,2]=0.5,s[15,3]=-0.6,s[15,4]=0.3,s[15,5]=-0.1,s[15,6]=-0.6,s[15,7]=1.0,s[15,8]=0.2,s[15,9]=0.7,s[15,10]=-0.3,s[15,11]=-0.9,s[15,12]=1.1,s[15,13]=1.2,s[15,14]=0.5,s[15,15]=0.1,s[15,16]=-0.7,s[15,17]=0.6,s[15,18]=0.4,s[15,19]=-1.1,s[15,20]=-1.1,s[15,21]=1.0,s[15,22]=-0.8,s[15,23]=-0.8,s[15,24]=0.6,s[15,25]=-0.5,s[15,26]=-0.7,s[15,27]=-0.6,s[15,28]=0.9,s[15,29]=0.9,s[15,30]=0.4 s[16,1]=0.3,s[16,2]=-1.1,s[16,3]=0.4,s[16,4]=0.2,s[16,5]=-0.5,s[16,6]=0.9,s[16,7]=-0.2,s[16,8]=-1.1,s[16,9]=0.9,s[16,10]=-0.7,s[16,11]=-1.0,s[16,12]=-1.0,s[16,13]=1.2,s[16,14]=0.6,s[16,15]=0.9,s[16,16]=0.0,s[16,17]=-0.9,s[16,18]=-0.9,s[16,19]=0.0,s[16,20]=-0.3,s[16,21]=-1.1,s[16,22]=1.1,s[16,23]=0.2,s[16,24]=0.1,s[16,25]=0.2,s[16,26]=-0.7,s[16,27]=-0.1,s[16,28]=-1.0,s[16,29]=0.3,s[16,30]=-0.7 s[17,1]=-1.1,s[17,2]=-0.2,s[17,3]=-0.5,s[17,4]=1.0,s[17,5]=0.6,s[17,6]=0.0,s[17,7]=0.4,s[17,8]=-1.2,s[17,9]=-1.1,s[17,10]=0.1,s[17,11]=0.4,s[17,12]=1.2,s[17,13]=-1.0,s[17,14]=-0.1,s[17,15]=0.8,s[17,16]=0.1,s[17,17]=0.4,s[17,18]=-0.2,s[17,19]=0.7,s[17,20]=-0.8,s[17,21]=-0.9,s[17,22]=0.9,s[17,23]=-0.6,s[17,24]=0.8,s[17,25]=-0.5,s[17,26]=0.4,s[17,27]=0.9,s[17,28]=-0.5,s[17,29]=0.3,s[17,30]=-0.1 s[18,1]=-0.4,s[18,2]=-0.2,s[18,3]=0.7,s[18,4]=1.2,s[18,5]=0.8,s[18,6]=-1.2,s[18,7]=1.0,s[18,8]=-0.9,s[18,9]=-0.9,s[18,10]=-1.1,s[18,11]=-0.7,s[18,12]=0.0,s[18,13]=0.2,s[18,14]=-0.5,s[18,15]=0.8,s[18,16]=-1.0,s[18,17]=-0.9,s[18,18]=0.3,s[18,19]=-0.4,s[18,20]=1.2,s[18,21]=1.2,s[18,22]=1.2,s[18,23]=-0.3,s[18,24]=0.3,s[18,25]=0.5,s[18,26]=-0.5,s[18,27]=1.0,s[18,28]=0.5,s[18,29]=-0.9,s[18,30]=0.1 s[19,1]=-0.8,s[19,2]=0.9,s[19,3]=0.2,s[19,4]=-0.8,s[19,5]=0.4,s[19,6]=-0.8,s[19,7]=0.6,s[19,8]=0.1,s[19,9]=1.1,s[19,10]=0.6,s[19,11]=0.4,s[19,12]=0.8,s[19,13]=-0.2,s[19,14]=-0.6,s[19,15]=0.3,s[19,16]=-1.0,s[19,17]=-0.9,s[19,18]=-1.1,s[19,19]=-0.5,s[19,20]=0.9,s[19,21]=-0.8,s[19,22]=-1.2,s[19,23]=-1.2,s[19,24]=-0.9,s[19,25]=-1.2,s[19,26]=-0.2,s[19,27]=1.2,s[19,28]=0.8,s[19,29]=0.5,s[19,30]=0.7 s[20,1]=0.7,s[20,2]=-1.0,s[20,3]=-0.3,s[20,4]=0.5,s[20,5]=0.1,s[20,6]=0.3,s[20,7]=-0.7,s[20,8]=1.1,s[20,9]=-1.2,s[20,10]=-0.3,s[20,11]=1.2,s[20,12]=1.2,s[20,13]=-0.7,s[20,14]=1.0,s[20,15]=0.8,s[20,16]=-0.5,s[20,17]=1.0,s[20,18]=-0.6,s[20,19]=0.4,s[20,20]=-1.1,s[20,21]=-0.4,s[20,22]=1.1,s[20,23]=-1.2,s[20,24]=0.7,s[20,25]=0.9,s[20,26]=1.2,s[20,27]=1.0,s[20,28]=0.1,s[20,29]=0.3,s[20,30]=-0.6 s[21,1]=-0.7,s[21,2]=0.7,s[21,3]=0.8,s[21,4]=0.2,s[21,5]=1.0,s[21,6]=-0.8,s[21,7]=0.6,s[21,8]=-1.1,s[21,9]=-0.8,s[21,10]=1.1,s[21,11]=0.0,s[21,12]=1.1,s[21,13]=0.9,s[21,14]=0.9,s[21,15]=0.9,s[21,16]=0.1,s[21,17]=-0.6,s[21,18]=0.9,s[21,19]=0.1,s[21,20]=1.2,s[21,21]=0.5,s[21,22]=1.0,s[21,23]=1.2,s[21,24]=0.4,s[21,25]=-0.5,s[21,26]=0.9,s[21,27]=-0.5,s[21,28]=-1.0,s[21,29]=-0.3,s[21,30]=0.0 s[22,1]=0.2,s[22,2]=-0.3,s[22,3]=-0.8,s[22,4]=-0.4,s[22,5]=-0.1,s[22,6]=1.1,s[22,7]=0.1,s[22,8]=1.0,s[22,9]=0.1,s[22,10]=-1.1,s[22,11]=-1.1,s[22,12]=0.0,s[22,13]=0.8,s[22,14]=-0.3,s[22,15]=-0.8,s[22,16]=-0.9,s[22,17]=-0.1,s[22,18]=-0.5,s[22,19]=-1.1,s[22,20]=1.0,s[22,21]=-0.7,s[22,22]=0.0,s[22,23]=0.3,s[22,24]=-0.6,s[22,25]=0.0,s[22,26]=0.6,s[22,27]=-0.1,s[22,28]=-1.1,s[22,29]=-0.8,s[22,30]=-0.4 s[23,1]=-1.2,s[23,2]=0.5,s[23,3]=-0.5,s[23,4]=0.0,s[23,5]=0.4,s[23,6]=0.7,s[23,7]=0.3,s[23,8]=-0.3,s[23,9]=0.5,s[23,10]=1.0,s[23,11]=-0.7,s[23,12]=0.5,s[23,13]=0.1,s[23,14]=-1.2,s[23,15]=0.2,s[23,16]=-0.3,s[23,17]=0.8,s[23,18]=0.4,s[23,19]=-0.3,s[23,20]=-0.6,s[23,21]=1.1,s[23,22]=-1.0,s[23,23]=0.2,s[23,24]=0.9,s[23,25]=-0.4,s[23,26]=1.2,s[23,27]=-0.6,s[23,28]=1.2,s[23,29]=0.5,s[23,30]=0.8 s[24,1]=-1.1,s[24,2]=0.3,s[24,3]=0.4,s[24,4]=0.5,s[24,5]=0.7,s[24,6]=0.4,s[24,7]=0.8,s[24,8]=0.4,s[24,9]=0.4,s[24,10]=-0.7,s[24,11]=-0.7,s[24,12]=0.5,s[24,13]=-1.1,s[24,14]=0.3,s[24,15]=0.6,s[24,16]=-0.6,s[24,17]=-0.2,s[24,18]=0.9,s[24,19]=-1.2,s[24,20]=-0.6,s[24,21]=0.5,s[24,22]=-0.8,s[24,23]=1.1,s[24,24]=0.3,s[24,25]=0.9,s[24,26]=1.2,s[24,27]=-0.1,s[24,28]=0.9,s[24,29]=-0.6,s[24,30]=-0.9 s[25,1]=-0.3,s[25,2]=-0.1,s[25,3]=0.2,s[25,4]=0.9,s[25,5]=1.1,s[25,6]=1.1,s[25,7]=0.0,s[25,8]=0.2,s[25,9]=0.3,s[25,10]=0.3,s[25,11]=0.6,s[25,12]=-0.9,s[25,13]=0.1,s[25,14]=-1.0,s[25,15]=0.2,s[25,16]=0.6,s[25,17]=-0.3,s[25,18]=1.2,s[25,19]=0.8,s[25,20]=0.7,s[25,21]=0.3,s[25,22]=1.2,s[25,23]=-0.6,s[25,24]=-1.2,s[25,25]=-0.1,s[25,26]=0.6,s[25,27]=0.9,s[25,28]=-1.0,s[25,29]=-1.1,s[25,30]=0.0 s[26,1]=1.1,s[26,2]=-0.1,s[26,3]=-0.4,s[26,4]=-1.2,s[26,5]=0.6,s[26,6]=0.9,s[26,7]=-1.1,s[26,8]=-1.0,s[26,9]=-0.9,s[26,10]=0.6,s[26,11]=1.1,s[26,12]=0.9,s[26,13]=0.0,s[26,14]=1.2,s[26,15]=1.2,s[26,16]=0.2,s[26,17]=-0.1,s[26,18]=0.9,s[26,19]=0.3,s[26,20]=-1.0,s[26,21]=0.0,s[26,22]=1.1,s[26,23]=-0.2,s[26,24]=0.9,s[26,25]=-1.2,s[26,26]=0.2,s[26,27]=0.8,s[26,28]=-1.2,s[26,29]=-0.9,s[26,30]=0.7 s[27,1]=-0.6,s[27,2]=-1.2,s[27,3]=0.5,s[27,4]=-0.9,s[27,5]=-1.0,s[27,6]=-0.8,s[27,7]=-0.4,s[27,8]=-0.9,s[27,9]=0.0,s[27,10]=-1.0,s[27,11]=-0.8,s[27,12]=-0.6,s[27,13]=0.3,s[27,14]=1.0,s[27,15]=-1.2,s[27,16]=-0.4,s[27,17]=-1.1,s[27,18]=-0.1,s[27,19]=1.1,s[27,20]=0.7,s[27,21]=-0.2,s[27,22]=1.0,s[27,23]=0.2,s[27,24]=0.8,s[27,25]=0.7,s[27,26]=-1.1,s[27,27]=1.2,s[27,28]=-1.0,s[27,29]=0.9,s[27,30]=-0.4 s[28,1]=-0.2,s[28,2]=-1.0,s[28,3]=0.8,s[28,4]=0.5,s[28,5]=-1.0,s[28,6]=0.6,s[28,7]=0.9,s[28,8]=-0.2,s[28,9]=0.1,s[28,10]=-1.1,s[28,11]=-1.2,s[28,12]=-0.5,s[28,13]=0.7,s[28,14]=-0.1,s[28,15]=-0.4,s[28,16]=-0.4,s[28,17]=-0.4,s[28,18]=-0.7,s[28,19]=0.9,s[28,20]=0.3,s[28,21]=-1.2,s[28,22]=-0.4,s[28,23]=-0.1,s[28,24]=1.2,s[28,25]=1.0,s[28,26]=-1.2,s[28,27]=1.2,s[28,28]=-0.8,s[28,29]=-0.5,s[28,30]=0.4 s[29,1]=-1.0,s[29,2]=-1.1,s[29,3]=0.5,s[29,4]=-0.2,s[29,5]=1.0,s[29,6]=0.0,s[29,7]=0.1,s[29,8]=1.0,s[29,9]=-0.9,s[29,10]=0.4,s[29,11]=-0.6,s[29,12]=-1.2,s[29,13]=-0.9,s[29,14]=-1.2,s[29,15]=0.9,s[29,16]=1.1,s[29,17]=0.9,s[29,18]=-0.5,s[29,19]=-0.3,s[29,20]=-1.0,s[29,21]=-0.3,s[29,22]=0.9,s[29,23]=-0.5,s[29,24]=-1.1,s[29,25]=-1.2,s[29,26]=-0.7,s[29,27]=0.7,s[29,28]=1.2,s[29,29]=1.0,s[29,30]=-0.7 s[30,1]=-1.0,s[30,2]=0.9,s[30,3]=0.4,s[30,4]=1.1,s[30,5]=-1.1,s[30,6]=-0.9,s[30,7]=0.8,s[30,8]=0.4,s[30,9]=1.1,s[30,10]=0.0,s[30,11]=-0.5,s[30,12]=-0.5,s[30,13]=-0.3,s[30,14]=-1.2,s[30,15]=0.9,s[30,16]=-1.2,s[30,17]=-0.8,s[30,18]=1.1,s[30,19]=-1.0,s[30,20]=0.7,s[30,21]=-1.0,s[30,22]=1.0,s[30,23]=0.5,s[30,24]=-0.8,s[30,25]=1.1,s[30,26]=1.2,s[30,27]=-0.1,s[30,28]=0.8,s[30,29]=-1.2,s[30,30]=-0.8 s[31,1]=0.1,s[31,2]=0.7,s[31,3]=-0.8,s[31,4]=-1.2,s[31,5]=1.2,s[31,6]=0.8,s[31,7]=-0.3,s[31,8]=0.6,s[31,9]=0.8,s[31,10]=-0.2,s[31,11]=0.9,s[31,12]=-1.1,s[31,13]=-1.0,s[31,14]=0.4,s[31,15]=1.0,s[31,16]=-0.3,s[31,17]=-0.1,s[31,18]=-1.0,s[31,19]=0.0,s[31,20]=0.8,s[31,21]=-0.9,s[31,22]=-0.4,s[31,23]=-0.5,s[31,24]=-0.1,s[31,25]=0.7,s[31,26]=0.1,s[31,27]=0.7,s[31,28]=-0.5,s[31,29]=-0.3,s[31,30]=-1.0 s[32,1]=1.1,s[32,2]=-0.6,s[32,3]=-1.1,s[32,4]=-0.2,s[32,5]=-0.7,s[32,6]=0.7,s[32,7]=0.3,s[32,8]=0.9,s[32,9]=-0.4,s[32,10]=-0.4,s[32,11]=-0.3,s[32,12]=-0.7,s[32,13]=0.7,s[32,14]=0.0,s[32,15]=-0.8,s[32,16]=0.7,s[32,17]=0.1,s[32,18]=-1.0,s[32,19]=-0.5,s[32,20]=0.2,s[32,21]=-0.6,s[32,22]=0.3,s[32,23]=0.8,s[32,24]=-0.3,s[32,25]=0.7,s[32,26]=-0.1,s[32,27]=1.1,s[32,28]=0.8,s[32,29]=0.7,s[32,30]=-0.2 s[33,1]=0.9,s[33,2]=1.1,s[33,3]=0.8,s[33,4]=-0.7,s[33,5]=-0.5,s[33,6]=0.6,s[33,7]=-0.8,s[33,8]=0.3,s[33,9]=1.0,s[33,10]=-0.7,s[33,11]=0.5,s[33,12]=0.7,s[33,13]=0.6,s[33,14]=0.5,s[33,15]=0.5,s[33,16]=-1.0,s[33,17]=0.5,s[33,18]=-0.5,s[33,19]=-1.1,s[33,20]=-0.5,s[33,21]=0.7,s[33,22]=0.9,s[33,23]=-0.2,s[33,24]=-1.0,s[33,25]=1.2,s[33,26]=1.2,s[33,27]=1.2,s[33,28]=0.7,s[33,29]=-0.4,s[33,30]=-1.0 s[34,1]=-0.9,s[34,2]=-0.6,s[34,3]=-0.9,s[34,4]=1.0,s[34,5]=-0.9,s[34,6]=0.8,s[34,7]=1.1,s[34,8]=-1.2,s[34,9]=0.4,s[34,10]=-0.8,s[34,11]=1.0,s[34,12]=-0.4,s[34,13]=-1.1,s[34,14]=-1.1,s[34,15]=0.4,s[34,16]=-0.3,s[34,17]=0.3,s[34,18]=-0.7,s[34,19]=0.1,s[34,20]=0.0,s[34,21]=0.0,s[34,22]=-0.2,s[34,23]=0.6,s[34,24]=0.3,s[34,25]=0.9,s[34,26]=1.0,s[34,27]=0.8,s[34,28]=1.1,s[34,29]=-1.1,s[34,30]=0.2 s[35,1]=-0.3,s[35,2]=-1.1,s[35,3]=0.1,s[35,4]=0.9,s[35,5]=0.0,s[35,6]=-0.2,s[35,7]=-1.1,s[35,8]=-0.4,s[35,9]=0.9,s[35,10]=0.8,s[35,11]=0.3,s[35,12]=1.2,s[35,13]=0.5,s[35,14]=0.4,s[35,15]=0.1,s[35,16]=0.1,s[35,17]=-0.1,s[35,18]=-0.9,s[35,19]=1.1,s[35,20]=0.3,s[35,21]=0.1,s[35,22]=0.1,s[35,23]=0.4,s[35,24]=0.8,s[35,25]=-0.4,s[35,26]=-1.0,s[35,27]=0.0,s[35,28]=1.0,s[35,29]=0.0,s[35,30]=-0.4 s[36,1]=0.3,s[36,2]=0.6,s[36,3]=0.5,s[36,4]=-0.9,s[36,5]=-0.6,s[36,6]=-1.0,s[36,7]=0.6,s[36,8]=1.1,s[36,9]=-1.2,s[36,10]=-1.1,s[36,11]=-0.1,s[36,12]=0.9,s[36,13]=0.8,s[36,14]=1.1,s[36,15]=0.3,s[36,16]=0.0,s[36,17]=-0.2,s[36,18]=0.8,s[36,19]=0.0,s[36,20]=1.0,s[36,21]=0.1,s[36,22]=0.0,s[36,23]=0.1,s[36,24]=-0.9,s[36,25]=1.0,s[36,26]=-0.1,s[36,27]=-0.6,s[36,28]=-0.7,s[36,29]=-0.2,s[36,30]=1.2 s[37,1]=0.1,s[37,2]=-0.4,s[37,3]=-0.3,s[37,4]=0.7,s[37,5]=-0.7,s[37,6]=-0.2,s[37,7]=0.3,s[37,8]=-1.2,s[37,9]=1.0,s[37,10]=-0.3,s[37,11]=0.4,s[37,12]=-0.3,s[37,13]=-0.7,s[37,14]=0.0,s[37,15]=0.4,s[37,16]=0.5,s[37,17]=0.9,s[37,18]=-0.7,s[37,19]=0.8,s[37,20]=-0.8,s[37,21]=-0.4,s[37,22]=-0.4,s[37,23]=-0.4,s[37,24]=0.8,s[37,25]=1.2,s[37,26]=-1.1,s[37,27]=-0.4,s[37,28]=0.6,s[37,29]=-0.4,s[37,30]=-0.7 s[38,1]=-0.3,s[38,2]=0.7,s[38,3]=0.0,s[38,4]=-0.1,s[38,5]=0.3,s[38,6]=0.3,s[38,7]=0.8,s[38,8]=-0.9,s[38,9]=0.4,s[38,10]=-0.8,s[38,11]=0.4,s[38,12]=-0.3,s[38,13]=-0.2,s[38,14]=-0.7,s[38,15]=0.5,s[38,16]=0.8,s[38,17]=-1.2,s[38,18]=-0.9,s[38,19]=1.0,s[38,20]=0.9,s[38,21]=-0.3,s[38,22]=0.4,s[38,23]=1.1,s[38,24]=-1.2,s[38,25]=-1.0,s[38,26]=0.2,s[38,27]=-1.0,s[38,28]=0.2,s[38,29]=-0.5,s[38,30]=1.1 s[39,1]=-1.1,s[39,2]=0.8,s[39,3]=0.8,s[39,4]=-0.4,s[39,5]=-0.6,s[39,6]=0.6,s[39,7]=-1.2,s[39,8]=-1.2,s[39,9]=0.6,s[39,10]=0.8,s[39,11]=-0.8,s[39,12]=-0.9,s[39,13]=0.0,s[39,14]=1.0,s[39,15]=0.3,s[39,16]=-0.1,s[39,17]=0.2,s[39,18]=1.2,s[39,19]=0.5,s[39,20]=0.9,s[39,21]=0.3,s[39,22]=0.6,s[39,23]=-0.2,s[39,24]=0.8,s[39,25]=-1.2,s[39,26]=-0.9,s[39,27]=-0.1,s[39,28]=-0.9,s[39,29]=-0.2,s[39,30]=0.6 s[40,1]=0.0,s[40,2]=0.3,s[40,3]=-1.0,s[40,4]=1.1,s[40,5]=-0.7,s[40,6]=-1.0,s[40,7]=-0.3,s[40,8]=0.3,s[40,9]=0.2,s[40,10]=-1.2,s[40,11]=-0.1,s[40,12]=0.0,s[40,13]=0.9,s[40,14]=0.7,s[40,15]=0.9,s[40,16]=-0.4,s[40,17]=0.1,s[40,18]=-0.5,s[40,19]=-1.0,s[40,20]=-0.7,s[40,21]=0.1,s[40,22]=-1.1,s[40,23]=-0.8,s[40,24]=-1.0,s[40,25]=-0.8,s[40,26]=1.2,s[40,27]=0.2,s[40,28]=1.0,s[40,29]=-0.6,s[40,30]=-1.0 s[41,1]=0.8,s[41,2]=-0.5,s[41,3]=0.9,s[41,4]=-1.1,s[41,5]=1.1,s[41,6]=-1.2,s[41,7]=-1.1,s[41,8]=-0.8,s[41,9]=0.1,s[41,10]=-0.4,s[41,11]=0.0,s[41,12]=0.5,s[41,13]=0.2,s[41,14]=-0.5,s[41,15]=-0.5,s[41,16]=1.0,s[41,17]=-0.7,s[41,18]=0.4,s[41,19]=1.2,s[41,20]=0.1,s[41,21]=0.8,s[41,22]=-0.8,s[41,23]=-0.4,s[41,24]=1.0,s[41,25]=-0.9,s[41,26]=-0.4,s[41,27]=-0.6,s[41,28]=0.3,s[41,29]=-0.8,s[41,30]=-0.3 s[42,1]=1.2,s[42,2]=-0.9,s[42,3]=0.0,s[42,4]=-0.4,s[42,5]=-1.1,s[42,6]=0.3,s[42,7]=-0.5,s[42,8]=0.4,s[42,9]=0.5,s[42,10]=0.3,s[42,11]=-1.0,s[42,12]=1.0,s[42,13]=0.4,s[42,14]=1.0,s[42,15]=0.7,s[42,16]=-0.7,s[42,17]=0.5,s[42,18]=0.6,s[42,19]=0.4,s[42,20]=0.6,s[42,21]=-0.2,s[42,22]=-0.9,s[42,23]=1.1,s[42,24]=-0.4,s[42,25]=-0.9,s[42,26]=0.5,s[42,27]=-0.4,s[42,28]=-0.5,s[42,29]=0.3,s[42,30]=-0.1 s[43,1]=1.0,s[43,2]=0.5,s[43,3]=-0.4,s[43,4]=-0.9,s[43,5]=0.8,s[43,6]=1.1,s[43,7]=-1.1,s[43,8]=-0.2,s[43,9]=0.6,s[43,10]=0.9,s[43,11]=-0.3,s[43,12]=0.4,s[43,13]=1.1,s[43,14]=1.0,s[43,15]=0.2,s[43,16]=-0.7,s[43,17]=-0.2,s[43,18]=0.8,s[43,19]=-1.0,s[43,20]=0.5,s[43,21]=1.1,s[43,22]=0.6,s[43,23]=0.1,s[43,24]=0.6,s[43,25]=-0.3,s[43,26]=1.0,s[43,27]=-0.2,s[43,28]=-1.0,s[43,29]=0.7,s[43,30]=-0.8 s[44,1]=-0.5,s[44,2]=-1.2,s[44,3]=0.3,s[44,4]=-1.2,s[44,5]=0.3,s[44,6]=-0.5,s[44,7]=1.2,s[44,8]=-1.0,s[44,9]=-0.4,s[44,10]=-0.5,s[44,11]=-1.2,s[44,12]=0.8,s[44,13]=1.2,s[44,14]=-0.5,s[44,15]=1.1,s[44,16]=0.4,s[44,17]=0.7,s[44,18]=0.9,s[44,19]=-0.9,s[44,20]=-0.9,s[44,21]=0.5,s[44,22]=-1.1,s[44,23]=0.4,s[44,24]=0.4,s[44,25]=0.5,s[44,26]=-0.1,s[44,27]=-1.2,s[44,28]=0.2,s[44,29]=-0.8,s[44,30]=-0.6 s[45,1]=0.0,s[45,2]=0.1,s[45,3]=1.2,s[45,4]=-0.4,s[45,5]=0.5,s[45,6]=0.4,s[45,7]=-1.1,s[45,8]=0.1,s[45,9]=-0.2,s[45,10]=0.0,s[45,11]=-1.1,s[45,12]=0.4,s[45,13]=0.7,s[45,14]=0.3,s[45,15]=-1.1,s[45,16]=0.5,s[45,17]=-1.2,s[45,18]=-1.0,s[45,19]=-1.1,s[45,20]=-1.2,s[45,21]=0.2,s[45,22]=0.8,s[45,23]=0.1,s[45,24]=0.0,s[45,25]=0.3,s[45,26]=0.5,s[45,27]=0.6,s[45,28]=0.2,s[45,29]=-0.7,s[45,30]=0.4 s[46,1]=1.2,s[46,2]=0.0,s[46,3]=0.7,s[46,4]=-0.7,s[46,5]=-0.9,s[46,6]=0.3,s[46,7]=-1.1,s[46,8]=1.1,s[46,9]=-0.2,s[46,10]=-0.4,s[46,11]=0.0,s[46,12]=-0.5,s[46,13]=0.8,s[46,14]=-1.2,s[46,15]=-1.1,s[46,16]=-0.2,s[46,17]=-0.5,s[46,18]=-0.1,s[46,19]=0.6,s[46,20]=-0.6,s[46,21]=-0.5,s[46,22]=0.7,s[46,23]=1.2,s[46,24]=0.8,s[46,25]=0.5,s[46,26]=0.0,s[46,27]=1.1,s[46,28]=0.8,s[46,29]=0.4,s[46,30]=-0.9 s[47,1]=-0.1,s[47,2]=-0.8,s[47,3]=0.4,s[47,4]=0.6,s[47,5]=-0.4,s[47,6]=1.1,s[47,7]=0.2,s[47,8]=-0.1,s[47,9]=-0.1,s[47,10]=1.2,s[47,11]=0.2,s[47,12]=-1.2,s[47,13]=1.1,s[47,14]=-1.2,s[47,15]=1.2,s[47,16]=-0.2,s[47,17]=0.7,s[47,18]=-0.3,s[47,19]=0.4,s[47,20]=-0.8,s[47,21]=-0.5,s[47,22]=0.4,s[47,23]=0.7,s[47,24]=0.4,s[47,25]=1.2,s[47,26]=-0.2,s[47,27]=1.0,s[47,28]=0.6,s[47,29]=0.4,s[47,30]=-0.3 s[48,1]=1.1,s[48,2]=-0.4,s[48,3]=0.4,s[48,4]=0.8,s[48,5]=0.0,s[48,6]=-0.4,s[48,7]=-1.1,s[48,8]=-1.1,s[48,9]=-0.2,s[48,10]=-1.2,s[48,11]=-0.3,s[48,12]=-0.7,s[48,13]=1.2,s[48,14]=0.4,s[48,15]=0.2,s[48,16]=0.0,s[48,17]=0.5,s[48,18]=-0.5,s[48,19]=0.9,s[48,20]=-0.9,s[48,21]=-0.5,s[48,22]=0.7,s[48,23]=0.7,s[48,24]=-1.0,s[48,25]=0.3,s[48,26]=-0.2,s[48,27]=0.2,s[48,28]=-1.0,s[48,29]=0.3,s[48,30]=-0.3 s[49,1]=1.2,s[49,2]=0.5,s[49,3]=-0.2,s[49,4]=-1.0,s[49,5]=-0.1,s[49,6]=-0.6,s[49,7]=0.3,s[49,8]=-0.1,s[49,9]=0.6,s[49,10]=-0.9,s[49,11]=-0.5,s[49,12]=-0.7,s[49,13]=0.7,s[49,14]=0.7,s[49,15]=1.1,s[49,16]=-1.2,s[49,17]=0.4,s[49,18]=-0.2,s[49,19]=-0.9,s[49,20]=0.4,s[49,21]=-0.4,s[49,22]=-0.7,s[49,23]=-0.5,s[49,24]=-1.1,s[49,25]=0.8,s[49,26]=-0.3,s[49,27]=0.9,s[49,28]=-1.1,s[49,29]=-0.4,s[49,30]=0.4 s[50,1]=-0.1,s[50,2]=0.3,s[50,3]=-0.1,s[50,4]=-0.5,s[50,5]=0.0,s[50,6]=0.9,s[50,7]=-0.7,s[50,8]=-0.5,s[50,9]=-1.2,s[50,10]=-0.2,s[50,11]=-1.0,s[50,12]=1.2,s[50,13]=0.9,s[50,14]=0.4,s[50,15]=0.2,s[50,16]=-0.9,s[50,17]=0.3,s[50,18]=0.7,s[50,19]=-0.4,s[50,20]=0.7,s[50,21]=-0.4,s[50,22]=1.2,s[50,23]=-0.2,s[50,24]=-1.2,s[50,25]=0.4,s[50,26]=-0.4,s[50,27]=0.4,s[50,28]=-1.0,s[50,29]=-0.3,s[50,30]=0.6 s[51,1]=0.0,s[51,2]=0.2,s[51,3]=-0.3,s[51,4]=1.2,s[51,5]=-0.6,s[51,6]=-0.4,s[51,7]=1.2,s[51,8]=0.0,s[51,9]=-0.2,s[51,10]=0.2,s[51,11]=-0.4,s[51,12]=-0.9,s[51,13]=0.8,s[51,14]=0.5,s[51,15]=-0.6,s[51,16]=0.6,s[51,17]=0.2,s[51,18]=0.7,s[51,19]=-1.0,s[51,20]=1.1,s[51,21]=-0.3,s[51,22]=0.6,s[51,23]=0.8,s[51,24]=0.0,s[51,25]=0.8,s[51,26]=-0.9,s[51,27]=0.7,s[51,28]=0.3,s[51,29]=-1.0,s[51,30]=-1.2 ; ; initialize coefficients ; if @sel > 0 b1 = s[@sel,1] b2 = s[@sel,2] b3 = s[@sel,3] b4 = s[@sel,4] b5 = s[@sel,5] b6 = s[@sel,6] b7 = s[@sel,7] b8 = s[@sel,8] b9 = s[@sel,9] b10 = s[@sel,10] b11 = s[@sel,11] b12 = s[@sel,12] b13 = s[@sel,13] b14 = s[@sel,14] b15 = s[@sel,15] b16 = s[@sel,16] b17 = s[@sel,17] b18 = s[@sel,18] b19 = s[@sel,19] b20 = s[@sel,20] b21 = s[@sel,21] b22 = s[@sel,22] b23 = s[@sel,23] b24 = s[@sel,24] b25 = s[@sel,25] b26 = s[@sel,26] b27 = s[@sel,27] b28 = s[@sel,28] b29 = s[@sel,29] b30 = s[@sel,30] endif ; ; fill the hit array ; while (iter < (iterate*sqr(#width*#magn/400))) xx = fx yy = fy if @sel == 0 fx = fx + @ed*(@a1 + @a2*fx + @a3*fx*fx + @a4*fx*fy + @a5*fx*zz + @a6*fy + @a7*fy*fy + \ @a8*fy*zz + @a9*zz + @a10*zz*zz) fy = fy + @ed*(@a11 + @a12*xx + @a13*xx*xx + @a14*xx*fy + @a15*xx*zz + @a16*fy + @a17*fy*fy + \ @a18*fy*zz + @a19*zz + @a20*zz*zz) zz = zz + @ed*(@a21 + @a22*xx + @a23*xx*xx + @a24*xx*yy + @a25*xx*zz + @a26*yy + @a27*yy*yy + \ @a28*yy*zz + @a29*zz + @a30*zz*zz) else fx = fx +@ed*(b1 + b2*fx + b3*fx*fx + b4*fx*fy + b5*fx*zz + b6*fy + b7*fy*fy + \ b8*fy*zz + b9*zz + b10*zz*zz) fy = fy + @ed*(b11 + b12*xx + b13*xx*xx + b14*xx*fy + b15*xx*zz + b16*fy + b17*fy*fy + \ b18*fy*zz + b19*zz + b20*zz*zz) zz = zz + @ed*(b21 + b22*xx + b23*xx*xx + b24*xx*yy + b25*xx*zz + b26*yy + b27*yy*yy + \ b28*yy*zz + b29*zz + b30*zz*zz) endif ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax ffz = (zmin-zz)/sqrt(txmax^2+tymax^2) xx = ffx ; ; rotation around the z axis ; xx = ffx ffx = 0.5 + (ffx - 0.5 - @rotoffx/txmax)*cos(#angle) - \ (ffy - 0.5 - @rotoffy/tymax)*sin(#angle) ffy = 0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(#angle) + \ (xx - 0.5 - @rotoffx/txmax)*sin(#angle) ; ; rotation around the y axis ; xx = ffx ffx = (0.5 + (ffz - 0.5 - @rotoffz/txmax)*sin(@zangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@zangle*pi/180))*#width ffz = (0.5 + (ffz - 0.5 - @rotoffz/tzmax)*cos(@zangle*pi/180) - \ (xx - 0.5 - @rotoffx/txmax)*sin(@zangle*pi/180)) ; ; rotation around the x axis ; yy = ffy ffy = (0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(@xangle*pi/180) - \ (ffz - 0.5 - @rotoffz/tzmax)*sin(@xangle*pi/180))*#height if @oldver ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*#height/2 else ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*scrsize endif ; ; final translation ; ffx = ffx - @transx*#width ffy = ffy - @transy*#height if @oldver ffz = ffz - @transz*#height/2 else ffz = ffz - @transz*scrsize endif ; ; perspective application ; if @oldver if @useproj ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif else if @useprojn ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif endif px = trunc(ffx)+wd2 py = trunc(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+1+flip(ffz) if real(hits[px,py])>maxnhit maxnhit = real(hits[px,py]) endif if ffz > hits3[px,py] || hits3[px,py] == 0 hits3[px,py] = ffz endif hits2[px,py] = ffz endif iter = iter + 1 endwhile h = 0 w = 0 ; init: float nhit=0 float zave=0 float zlast=0 float zbiggest=0 float nhitx=0 float zavex=0 float zlastx=0 float zbiggestx=0 float nhity=0 float zavey=0 float zlasty=0 float zbiggesty=0 bool done = false float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 int i = 0 ;loop: int delta = ceil(@closeness) int xcrd = #x int ycrd = #y bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true if xcrd+@closeness < #width+wd && ycrd+@closeness < #height+ht && real(hits[xcrd,ycrd]) > @thresh if @filter == 0 if @value == 3 zbiggest = hits3[xcrd,ycrd] zbiggestx = hits3[xcrd+delta,ycrd] zbiggesty = hits3[xcrd,ycrd+delta] elseif @value == 0 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) elseif @value == 1 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) zave = imag(hits[xcrd,ycrd])/(nhit + 1) zavex = imag(hits[xcrd+delta,ycrd])/(nhitx + 1) zavey = imag(hits[xcrd,ycrd+delta])/(nhity + 1) elseif @value == 2 zlast = hits2[xcrd,ycrd] zlastx = hits2[xcrd+delta,ycrd] zlasty = hits2[xcrd,ycrd+delta] endif else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 zbiggest = 0 zbiggestx = 0 zbiggesty = 0 zave = 0 zavex = 0 zavey = 0 zlast = 0 zlastx = 0 zlasty = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter if @value == 0 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) elseif @value == 1 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) zave = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy])/(nhit+1) zavex = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx+delta,ycrd+gy])/(nhitx+1) zavey = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta])/(nhity+1) elseif @value == 2 zlast = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy] zlastx = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx+delta,ycrd+gy] zlasty = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy+delta] elseif @value == 3 zbiggest = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy] zbiggestx = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx+delta,ycrd+gy] zbiggesty = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy+delta] endif gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile if @value == 0 nhit = nhit/gweight nhitx = nhitx/gweight nhity = nhity/gweight elseif @value == 1 zave = zave/gweight zavex = zavex/gweight zavey = zavey/gweight elseif @value == 2 zlast = zlast/gweight zlastx = zlastx/gweight zlasty = zlasty/gweight elseif @value == 3 zbiggest = zbiggest/gweight zbiggestx = zbiggestx/gweight zbiggesty = zbiggesty/gweight endif endif endif endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = zave cenx = zavex ceny = zavey elseif @value == 2 cen = zlast cenx = zlastx ceny = zlasty else cen = zbiggest cenx = zbiggestx ceny = zbiggesty endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * zscale2 e2 = e2 * zscale2 e3 = e3 * zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxnhit elseif @value == 1 #z = (zave/(log(maxnhit)+1))^3 elseif @value == 2 #z = (zlast/(log(maxnhit)+1))^10 elseif @value == 3 #z = (zbiggest/(log(maxnhit)+1))^10 endif endif if @oldver if done == false done = true endif endif loop: i = i + 1 if !@oldver if cen < i if done == false done = true endif endif endif bailout: done == false default: heading caption="Sprott 3D Quadratic ODE G Attractors" endheading $ifdef VER40 heading text="Strange attractors from simultaneous ordinary differential \ equations using Euler's finite difference method to calculate." endheading heading text="Color with Damien's Lighting, 3D Texturizer Enhanced III or \ Direct Color Slope." endheading $else heading caption="Strange attractors from simultaneous" endheading heading caption="ordinary differential equations using" endheading heading caption="Euler's finite difference method to" endheading heading caption="calculate." endheading heading caption="Color with Damien's Lighting" endheading heading caption="or one of the 3D Texturizer formulas" endheading heading caption="3D Texturizer III is needed for" endheading heading caption="the non-slope color options." endheading $endif title="Slope 3D Quadratic ODE G Attractor" maxiter=1000 method=multipass periodicity=0 float param version caption = "Version number" default = 1.1 hint = "This is for backwards compatibility with old versions \ of the formula." visible = false endparam bool param oldver caption = "Use original version" default = false endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 0.1 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 0 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param value caption = "Hit Value" enum = "Count" "Ave Z" "Last Z" "Largest Z" default = 3 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param pass caption = "Pass slope values" default = true endparam heading caption = "Slope Parameters" visible=@pass==true endheading param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 1.0 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible=@pass==true endparam heading caption = "Rotations and Translations" endheading $ifdef VER40 heading text = "Use the location tab for rotation around the Z Axis." endheading $endif param xangle caption = "X Axis Rotation" default = 0.0 hint = "This is the fixed (horizontal) Y Axis. It is performed \ after the normal fractal rotation(s) and zooms." endparam param zangle caption = "Y Axis Rotation" default = 0.0 ; min = 0.0 ; max = 180.0 hint = "This is the fixed (vertical) Y Axis. It is performed \ after the normal fractal rotation(s) and zooms." endparam param rotoffx caption = "Rot Center X Offset" default = 0.0 endparam param rotoffy caption = "Rot Center Y Offset" default = 0.0 endparam param rotoffz caption = "Rot Center Z Offset" default = 0.0 endparam param transx caption = "X Final Translation" default = 0.0 endparam param transy caption = "Y Final Translation" default = 0.0 endparam param transz caption = "Z Final Translation" default = 0.0 endparam heading caption = "Perspective" endheading param useproj caption = "Use Perspective" default = false visible = @oldver endparam param useprojn caption = "Use Perspective" default = true visible = !@oldver endparam param cprojx caption = "X Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam param cprojy caption = "Y Center of Projection" default = 0.5 visible = @useproj || @useprojn endparam float param cprojz caption = "Z Center of Projection" default = -1 visible = @useproj || @useprojn endparam heading caption = "Attractor Parameters" endheading param hideparam caption = "Hide Parameters" default = true endparam param ed caption = "Euler Difference" default = 0.1 endparam param sel caption = "select preset coeffs" enum = "no preset" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" \ "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" \ "29" "30" "31" "32" "33" "34" "35" "36" "27" "38" "39" "40" "41" "42" \ "43" "44" "45" "46" "47" "48" "49" "50" "51" default = 0 endparam param a1 caption = "coefficient a1" default = -1.2 visible = @hideparam==false endparam param a2 caption = "coefficient a2" default = -0.7 visible = @hideparam==false endparam param a3 caption = "coefficient a3" default = 0.9 visible = @hideparam==false endparam param a4 caption = "coefficient a4" default = 0.5 visible = @hideparam==false endparam param a5 caption = "coefficient a5" default = 0.9 visible = @hideparam==false endparam param a6 caption = "coefficient a6" default = -0.1 visible = @hideparam==false endparam param a7 caption = "coefficient a7" default = -0.2 visible = @hideparam==false endparam param a8 caption = "coefficient a8" default = -0.5 visible = @hideparam==false endparam param a9 caption = "coefficient a9" default = -1.1 visible = @hideparam==false endparam param a10 caption = "coefficient a10" default = 0.5 visible = @hideparam==false endparam param a11 caption = "coefficient a11" default = -1.0 visible = @hideparam==false endparam param a12 caption = "coefficient a12" default = 1.0 visible = @hideparam==false endparam param a13 caption = "coefficient a13" default = -0.8 visible = @hideparam==false endparam param a14 caption = "coefficient a14" default = 0.6 visible = @hideparam==false endparam param a15 caption = "coefficient a15" default = 0.6 visible = @hideparam==false endparam param a16 caption = "coefficient a16" default = 1.2 visible = @hideparam==false endparam param a17 caption = "coefficient a17" default = -0.1 visible = @hideparam==false endparam param a18 caption = "coefficient a18" default = 1.1 visible = @hideparam==false endparam param a19 caption = "coefficient a19" default = 1.1 visible = @hideparam==false endparam param a20 caption = "coefficient a20" default = 0.6 visible = @hideparam==false endparam param a21 caption = "coefficient a21" default = 0.3 visible = @hideparam==false endparam param a22 caption = "coefficient a22" default = 0.6 visible = @hideparam==false endparam param a23 caption = "coefficient a23" default = -1.1 visible = @hideparam==false endparam param a24 caption = "coefficient a24" default = -0.7 visible = @hideparam==false endparam param a25 caption = "coefficient a25" default = -0.1 visible = @hideparam==false endparam param a26 caption = "coefficient a26" default = -1.0 visible = @hideparam==false endparam param a27 caption = "coefficient a27" default = -0.2 visible = @hideparam==false endparam param a28 caption = "coefficient a28" default = -0.2 visible = @hideparam==false endparam param a29 caption = "coefficient a29" default = -0.1 visible = @hideparam==false endparam param a30 caption = "coefficient a30" default = 0.1 visible = @hideparam==false endparam } Slope_3D_Cubic_G_Attractor { ; Ron Barnett January 2006 ; Has options for Susan Chambless' mapping algorithm, ; Gaussian filtering and non-slope coloring ; The non-slope coloring requires 3D Texturizer III ; Strange attractors from simultaneous ; global: float zscale2 = 0 float cprojx = 0 float cprojy = 0 float cprojz = 0 float scrsize = sqrt(#width*#width+#height*#height) zscale2 = @zscale2*scrsize cprojx = @cprojx*#width cprojy = @cprojy*#height cprojz = @cprojz*scrsize int w = 0 int h = 0 float Inc = @percentInc*0.01 float wd = Inc*#width float ht = Inc*#height int wd2 = round(wd*0.5) int ht2 = round(ht*0.5) complex hits[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits2[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float hits3[round(#width*(1+@percentInc*0.01)),round(#height*(1+@percentInc*0.01))] float s[21,61] float fx = 0.0 float ffx = 0.0 float xx = 0.0 float fy = 0.0 float ffy = 0.0 float yy = 0.0 float zz = 0.0 float ffz = 0.0 float b1=0,float b2=0,float b3=0,float b4=0,float b5=0,float b6=0,float b7=0,float b8=0,float b9=0,float b10=0,float b11=0,float b12=0,float b13=0,float b14=0,float b15=0 float b16=0,float b17=0,float b18=0,float b19=0,float b20=0,float b21=0,float b22=0,float b23=0,float b24=0,float b25=0,float b26=0,float b27=0,float b28=0,float b29=0,float b30=0 float b31=0,float b32=0,float b33=0,float b34=0,float b35=0,float b36=0,float b37=0,float b38=0,float b39=0,float b40=0,float b41=0,float b42=0,float b43=0,float b44=0,float b45=0 float b46=0,float b47=0,float b48=0,float b49=0,float b50=0,float b51=0,float b52=0,float b53=0,float b54=0,float b55=0,float b56=0,float b57=0,float b58=0,float b59=0,float b60=0 int iter = 0 int px = 0 int py = 0 float cy = imag(#center) float cx = real(#center) float txmax = 4.0/#magn float tymax = txmax*#height/#width float tzmax = sqrt(txmax^2+tymax^2) float xmin = cx - txmax/2 float ymin = cy - tymax/2 float zmin = sqrt(xmin^2 + ymin^2) float iterate = @density*10000000 float maxnhit = 0 ; ; initialize hit array ; while(h < #height+wd) while(w < #width+ht) hits[w,h] = 0 hits2[w,h] = 0 hits3[w,h] = 0 w = w + 1 endwhile w = 0 h = h + 1 endwhile ; ; initialize presets s[1,1]=-0.1,s[1,2]=-0.6,s[1,3]=0.4,s[1,4]=-0.6,s[1,5]=-0.7,s[1,6]=0.3,s[1,7]=-0.7,s[1,8]=0.6,s[1,9]=-0.6,s[1,10]=-0.6,s[1,11]=0.8,s[1,12]=-0.6,s[1,13]=-0.8,s[1,14]=1.2,s[1,15]=0.4,s[1,16]=0.7,s[1,17]=0.1,s[1,18]=-0.7,s[1,19]=-0.5,s[1,20]=0.4,s[1,21]=-0.2,s[1,22]=1.0,s[1,23]=0.9,s[1,24]=0.8,s[1,25]=-1.1,s[1,26]=-0.3,s[1,27]=0.4,s[1,28]=-0.1,s[1,29]=1.1,s[1,30]=-0.2 s[1,31]=0.8,s[1,32]=0.6,s[1,33]=-0.3,s[1,34]=-0.3,s[1,35]=-1.0,s[1,36]=-0.2,s[1,37]=0.0,s[1,38]=0.3,s[1,39]=0.3,s[1,40]=0.1,s[1,41]=0.3,s[1,42]=0.9,s[1,43]=0.2,s[1,44]=0.0,s[1,45]=1.1,s[1,46]=1.0,s[1,47]=0.6,s[1,48]=-0.5,s[1,49]=-0.2,s[1,50]=0.8,s[1,51]=0.9,s[1,52]=-1.0,s[1,53]=-0.7,s[1,54]=1.1,s[1,55]=0.9,s[1,56]=-0.2,s[1,57]=-0.3,s[1,58]=0.5,s[1,59]=-0.9,s[1,60]=0.4 s[2,1]=0.7,s[2,2]=-0.3,s[2,3]=-0.3,s[2,4]=0.4,s[2,5]=0.1,s[2,6]=-0.8,s[2,7]=0.9,s[2,8]=-1.0,s[2,9]=1.1,s[2,10]=-0.1,s[2,11]=-0.4,s[2,12]=0.3,s[2,13]=-1.0,s[2,14]=-0.2,s[2,15]=0.9,s[2,16]=-1.0,s[2,17]=0.4,s[2,18]=0.4,s[2,19]=1.0,s[2,20]=0.3,s[2,21]=0.8,s[2,22]=0.2,s[2,23]=0.9,s[2,24]=-0.2,s[2,25]=0.6,s[2,26]=-0.2,s[2,27]=0.2,s[2,28]=-0.9,s[2,29]=-0.4,s[2,30]=-0.3 s[2,31]=-0.1,s[2,32]=-0.4,s[2,33]=0.3,s[2,34]=-0.2,s[2,35]=0.7,s[2,36]=0.1,s[2,37]=1.0,s[2,38]=-0.9,s[2,39]=-0.1,s[2,40]=-0.5,s[2,41]=0.0,s[2,42]=-0.8,s[2,43]=0.9,s[2,44]=1.1,s[2,45]=-1.2,s[2,46]=-0.6,s[2,47]=0.0,s[2,48]=0.5,s[2,49]=0.3,s[2,50]=-0.4,s[2,51]=-0.5,s[2,52]=0.0,s[2,53]=-0.3,s[2,54]=0.5,s[2,55]=0.5,s[2,56]=-1.2,s[2,57]=-0.2,s[2,58]=0.3,s[2,59]=-0.8,s[2,60]=1.2 s[3,1]=0.0,s[3,2]=0.6,s[3,3]=0.4,s[3,4]=-0.1,s[3,5]=-1.0,s[3,6]=0.3,s[3,7]=-0.7,s[3,8]=-0.5,s[3,9]=0.7,s[3,10]=0.7,s[3,11]=0.1,s[3,12]=-0.2,s[3,13]=-1.2,s[3,14]=-0.6,s[3,15]=0.4,s[3,16]=-0.1,s[3,17]=1.1,s[3,18]=-0.3,s[3,19]=-0.1,s[3,20]=-0.4,s[3,21]=0.4,s[3,22]=0.7,s[3,23]=-1.0,s[3,24]=0.8,s[3,25]=0.1,s[3,26]=-0.3,s[3,27]=0.9,s[3,28]=-1.2,s[3,29]=-0.4,s[3,30]=-0.7 s[3,31]=0.4,s[3,32]=0.8,s[3,33]=-0.9,s[3,34]=-0.4,s[3,35]=0.9,s[3,36]=0.4,s[3,37]=-0.5,s[3,38]=0.7,s[3,39]=0.7,s[3,40]=0.3,s[3,41]=-0.7,s[3,42]=0.5,s[3,43]=0.4,s[3,44]=0.3,s[3,45]=0.9,s[3,46]=0.8,s[3,47]=0.2,s[3,48]=-0.3,s[3,49]=0.1,s[3,50]=0.8,s[3,51]=0.5,s[3,52]=-0.6,s[3,53]=0.2,s[3,54]=1.0,s[3,55]=-0.3,s[3,56]=0.4,s[3,57]=0.7,s[3,58]=-0.4,s[3,59]=0.4,s[3,60]=0.9 s[4,1]=-0.6,s[4,2]=-0.8,s[4,3]=0.6,s[4,4]=-0.1,s[4,5]=-0.1,s[4,6]=0.2,s[4,7]=0.1,s[4,8]=0.1,s[4,9]=0.1,s[4,10]=-0.3,s[4,11]=0.2,s[4,12]=-0.7,s[4,13]=-0.1,s[4,14]=0.1,s[4,15]=-0.3,s[4,16]=-0.1,s[4,17]=-0.1,s[4,18]=-0.4,s[4,19]=-1.0,s[4,20]=-1.0,s[4,21]=0.2,s[4,22]=0.5,s[4,23]=0.8,s[4,24]=0.9,s[4,25]=-0.4,s[4,26]=0.2,s[4,27]=1.1,s[4,28]=0.5,s[4,29]=0.4,s[4,30]=0.8 s[4,31]=1.0,s[4,32]=0.1,s[4,33]=-0.6,s[4,34]=-0.3,s[4,35]=-1.2,s[4,36]=-1.0,s[4,37]=-0.3,s[4,38]=0.3,s[4,39]=1.2,s[4,40]=0.3,s[4,41]=-0.1,s[4,42]=-0.3,s[4,43]=0.0,s[4,44]=1.1,s[4,45]=-0.9,s[4,46]=-0.6,s[4,47]=-1.2,s[4,48]=0.8,s[4,49]=0.1,s[4,50]=0.1,s[4,51]=-0.6,s[4,52]=1.2,s[4,53]=-0.1,s[4,54]=-0.1,s[4,55]=1.2,s[4,56]=-0.8,s[4,57]=0.9,s[4,58]=1.0,s[4,59]=0.1,s[4,60]=-0.8 s[5,1]=-0.4,s[5,2]=0.7,s[5,3]=0.6,s[5,4]=1.2,s[5,5]=-0.6,s[5,6]=-0.5,s[5,7]=-0.1,s[5,8]=-0.8,s[5,9]=1.2,s[5,10]=-1.0,s[5,11]=1.0,s[5,12]=0.4,s[5,13]=0.2,s[5,14]=0.5,s[5,15]=0.8,s[5,16]=-0.7,s[5,17]=0.9,s[5,18]=0.7,s[5,19]=-0.3,s[5,20]=-0.7,s[5,21]=0.5,s[5,22]=-0.6,s[5,23]=-1.0,s[5,24]=-1.0,s[5,25]=-0.6,s[5,26]=1.1,s[5,27]=-0.6,s[5,28]=-0.3,s[5,29]=0.8,s[5,30]=0.6 s[5,31]=-0.2,s[5,32]=0.6,s[5,33]=-0.4,s[5,34]=0.2,s[5,35]=-1.1,s[5,36]=0.8,s[5,37]=-0.5,s[5,38]=-0.7,s[5,39]=-0.7,s[5,40]=0.8,s[5,41]=0.6,s[5,42]=-1.1,s[5,43]=0.8,s[5,44]=0.5,s[5,45]=0.1,s[5,46]=0.8,s[5,47]=-0.3,s[5,48]=1.1,s[5,49]=-1.1,s[5,50]=-0.9,s[5,51]=-0.8,s[5,52]=-1.0,s[5,53]=0.1,s[5,54]=0.9,s[5,55]=-0.2,s[5,56]=-0.1,s[5,57]=-0.3,s[5,58]=-0.7,s[5,59]=0.8,s[5,60]=-0.6 s[6,1]=-0.3,s[6,2]=-0.4,s[6,3]=0.0,s[6,4]=-0.8,s[6,5]=0.5,s[6,6]=1.1,s[6,7]=0.1,s[6,8]=0.3,s[6,9]=-0.5,s[6,10]=0.9,s[6,11]=0.7,s[6,12]=0.5,s[6,13]=-0.8,s[6,14]=0.6,s[6,15]=0.3,s[6,16]=0.5,s[6,17]=1.1,s[6,18]=-0.3,s[6,19]=1.1,s[6,20]=-0.4,s[6,21]=0.5,s[6,22]=-0.4,s[6,23]=-0.5,s[6,24]=1.0,s[6,25]=-0.4,s[6,26]=0.0,s[6,27]=-1.2,s[6,28]=-0.6,s[6,29]=0.9,s[6,30]=-0.2 s[6,31]=0.5,s[6,32]=-1.0,s[6,33]=0.2,s[6,34]=0.0,s[6,35]=1.0,s[6,36]=0.1,s[6,37]=0.6,s[6,38]=-0.2,s[6,39]=-1.2,s[6,40]=-0.3,s[6,41]=0.2,s[6,42]=0.2,s[6,43]=-1.0,s[6,44]=-0.4,s[6,45]=-0.1,s[6,46]=-0.1,s[6,47]=-0.2,s[6,48]=-0.1,s[6,49]=0.9,s[6,50]=-0.5,s[6,51]=0.1,s[6,52]=0.9,s[6,53]=0.9,s[6,54]=0.3,s[6,55]=1.1,s[6,56]=-0.6,s[6,57]=0.4,s[6,58]=-0.5,s[6,59]=0.9,s[6,60]=0.9 s[7,1]=0.6,s[7,2]=-0.5,s[7,3]=-0.6,s[7,4]=-0.5,s[7,5]=-0.9,s[7,6]=1.1,s[7,7]=0.1,s[7,8]=0.4,s[7,9]=0.0,s[7,10]=-1.1,s[7,11]=0.3,s[7,12]=1.1,s[7,13]=0.5,s[7,14]=0.0,s[7,15]=-0.9,s[7,16]=0.8,s[7,17]=0.0,s[7,18]=0.3,s[7,19]=-0.8,s[7,20]=-0.9,s[7,21]=-0.1,s[7,22]=0.3,s[7,23]=0.9,s[7,24]=-0.9,s[7,25]=0.5,s[7,26]=0.1,s[7,27]=-0.4,s[7,28]=-0.8,s[7,29]=-0.1,s[7,30]=-0.4 s[7,31]=0.0,s[7,32]=-0.4,s[7,33]=1.0,s[7,34]=-0.6,s[7,35]=0.5,s[7,36]=1.0,s[7,37]=0.0,s[7,38]=1.1,s[7,39]=0.1,s[7,40]=-0.4,s[7,41]=-0.5,s[7,42]=1.0,s[7,43]=1.0,s[7,44]=-0.9,s[7,45]=-0.5,s[7,46]=1.2,s[7,47]=0.1,s[7,48]=0.3,s[7,49]=-0.2,s[7,50]=-0.8,s[7,51]=-0.8,s[7,52]=-1.1,s[7,53]=0.0,s[7,54]=0.9,s[7,55]=-0.9,s[7,56]=0.3,s[7,57]=-0.7,s[7,58]=-0.3,s[7,59]=-0.7,s[7,60]=0.9 s[8,1]=-0.1,s[8,2]=-1.0,s[8,3]=-0.6,s[8,4]=0.8,s[8,5]=-0.3,s[8,6]=0.0,s[8,7]=0.5,s[8,8]=0.3,s[8,9]=1.1,s[8,10]=-0.7,s[8,11]=-0.3,s[8,12]=-1.0,s[8,13]=1.1,s[8,14]=0.6,s[8,15]=-1.1,s[8,16]=0.9,s[8,17]=0.3,s[8,18]=-1.1,s[8,19]=0.0,s[8,20]=-0.8,s[8,21]=0.0,s[8,22]=-0.4,s[8,23]=-0.9,s[8,24]=0.2,s[8,25]=-1.1,s[8,26]=-1.0,s[8,27]=-1.2,s[8,28]=0.9,s[8,29]=1.0,s[8,30]=0.8 s[8,31]=-0.2,s[8,32]=0.5,s[8,33]=0.6,s[8,34]=0.3,s[8,35]=1.1,s[8,36]=0.4,s[8,37]=0.5,s[8,38]=-1.0,s[8,39]=1.2,s[8,40]=-1.1,s[8,41]=0.0,s[8,42]=-0.1,s[8,43]=0.8,s[8,44]=1.2,s[8,45]=-0.6,s[8,46]=-0.8,s[8,47]=-0.6,s[8,48]=-0.6,s[8,49]=0.8,s[8,50]=1.2,s[8,51]=0.2,s[8,52]=0.5,s[8,53]=0.3,s[8,54]=0.8,s[8,55]=-0.6,s[8,56]=1.0,s[8,57]=0.5,s[8,58]=-0.5,s[8,59]=0.0,s[8,60]=0.1 s[9,1]=-0.1,s[9,2]=0.1,s[9,3]=-0.5,s[9,4]=-0.1,s[9,5]=0.6,s[9,6]=0.6,s[9,7]=0.6,s[9,8]=-0.7,s[9,9]=1.1,s[9,10]=-1.1,s[9,11]=0.0,s[9,12]=0.7,s[9,13]=-0.4,s[9,14]=-0.3,s[9,15]=-0.4,s[9,16]=-0.8,s[9,17]=0.1,s[9,18]=0.5,s[9,19]=-0.1,s[9,20]=-0.6,s[9,21]=0.0,s[9,22]=-0.1,s[9,23]=-0.4,s[9,24]=0.9,s[9,25]=0.7,s[9,26]=-1.0,s[9,27]=1.2,s[9,28]=-0.9,s[9,29]=0.1,s[9,30]=0.0 s[9,31]=0.5,s[9,32]=1.0,s[9,33]=-1.1,s[9,34]=0.4,s[9,35]=1.0,s[9,36]=0.3,s[9,37]=-1.1,s[9,38]=0.5,s[9,39]=-0.7,s[9,40]=-0.8,s[9,41]=-0.1,s[9,42]=-1.2,s[9,43]=0.5,s[9,44]=0.8,s[9,45]=-0.5,s[9,46]=0.2,s[9,47]=0.6,s[9,48]=-0.4,s[9,49]=1.2,s[9,50]=0.6,s[9,51]=0.0,s[9,52]=-1.2,s[9,53]=0.3,s[9,54]=-0.1,s[9,55]=-0.3,s[9,56]=-0.3,s[9,57]=-0.4,s[9,58]=0.3,s[9,59]=1.0,s[9,60]=-1.2 s[10,1]=-0.4,s[10,2]=-1.1,s[10,3]=-1.0,s[10,4]=-0.1,s[10,5]=0.8,s[10,6]=0.3,s[10,7]=0.7,s[10,8]=-0.6,s[10,9]=1.1,s[10,10]=0.6,s[10,11]=-0.4,s[10,12]=0.3,s[10,13]=-1.2,s[10,14]=0.7,s[10,15]=-1.1,s[10,16]=0.0,s[10,17]=-0.6,s[10,18]=0.3,s[10,19]=0.0,s[10,20]=-0.6,s[10,21]=-0.3,s[10,22]=-0.5,s[10,23]=0.5,s[10,24]=-0.7,s[10,25]=-1.2,s[10,26]=0.6,s[10,27]=-0.8,s[10,28]=0.2,s[10,29]=0.4,s[10,30]=0.9 s[10,31]=-0.6,s[10,32]=1.1,s[10,33]=0.8,s[10,34]=0.7,s[10,35]=-0.6,s[10,36]=1.2,s[10,37]=0.7,s[10,38]=0.9,s[10,39]=-0.5,s[10,40]=-1.1,s[10,41]=-0.2,s[10,42]=0.1,s[10,43]=0.7,s[10,44]=1.1,s[10,45]=-0.8,s[10,46]=-0.3,s[10,47]=0.4,s[10,48]=0.9,s[10,49]=-0.6,s[10,50]=1.2,s[10,51]=-0.8,s[10,52]=0.3,s[10,53]=0.3,s[10,54]=-0.3,s[10,55]=-0.9,s[10,56]=0.1,s[10,57]=-1.0,s[10,58]=0.6,s[10,59]=-0.4,s[10,60]=1.2 s[11,1]=1.0,s[11,2]=-0.3,s[11,3]=-0.5,s[11,4]=1.0,s[11,5]=1.1,s[11,6]=1.0,s[11,7]=-0.5,s[11,8]=-1.0,s[11,9]=-1.2,s[11,10]=-1.2,s[11,11]=-0.6,s[11,12]=-0.2,s[11,13]=-1.1,s[11,14]=-0.3,s[11,15]=0.0,s[11,16]=0.1,s[11,17]=0.3,s[11,18]=-0.5,s[11,19]=0.4,s[11,20]=-0.3,s[11,21]=-0.2,s[11,22]=-0.6,s[11,23]=0.8,s[11,24]=0.1,s[11,25]=1.2,s[11,26]=-0.7,s[11,27]=0.7,s[11,28]=-0.5,s[11,29]=-0.7,s[11,30]=-0.2 s[11,31]=1.2,s[11,32]=-0.1,s[11,33]=0.0,s[11,34]=-0.1,s[11,35]=-0.9,s[11,36]=0.8,s[11,37]=-0.5,s[11,38]=0.5,s[11,39]=0.4,s[11,40]=-0.5,s[11,41]=0.6,s[11,42]=0.3,s[11,43]=-0.3,s[11,44]=0.7,s[11,45]=0.3,s[11,46]=0.2,s[11,47]=0.7,s[11,48]=0.4,s[11,49]=0.0,s[11,50]=-0.5,s[11,51]=1.1,s[11,52]=-0.4,s[11,53]=0.5,s[11,54]=-1.0,s[11,55]=-0.7,s[11,56]=0.6,s[11,57]=1.1,s[11,58]=-1.2,s[11,59]=0.1,s[11,60]=0.3 s[12,1]=-0.2,s[12,2]=-0.9,s[12,3]=-0.8,s[12,4]=-0.2,s[12,5]=0.6,s[12,6]=-0.9,s[12,7]=0.0,s[12,8]=0.6,s[12,9]=1.1,s[12,10]=1.2,s[12,11]=-0.5,s[12,12]=0.0,s[12,13]=0.6,s[12,14]=1.0,s[12,15]=1.1,s[12,16]=-0.1,s[12,17]=-0.7,s[12,18]=-1.1,s[12,19]=-0.5,s[12,20]=0.8,s[12,21]=-0.2,s[12,22]=0.9,s[12,23]=1.1,s[12,24]=-0.1,s[12,25]=-0.4,s[12,26]=-0.3,s[12,27]=0.3,s[12,28]=1.1,s[12,29]=-0.9,s[12,30]=-0.5 s[12,31]=0.5,s[12,32]=0.3,s[12,33]=0.6,s[12,34]=0.9,s[12,35]=-0.4,s[12,36]=0.7,s[12,37]=1.1,s[12,38]=0.6,s[12,39]=-1.2,s[12,40]=0.2,s[12,41]=-0.1,s[12,42]=0.2,s[12,43]=-0.7,s[12,44]=0.8,s[12,45]=0.9,s[12,46]=0.4,s[12,47]=-0.6,s[12,48]=-0.2,s[12,49]=-1.1,s[12,50]=0.4,s[12,51]=-0.7,s[12,52]=-0.7,s[12,53]=0.5,s[12,54]=0.5,s[12,55]=0.7,s[12,56]=0.1,s[12,57]=0.4,s[12,58]=0.5,s[12,59]=-1.2,s[12,60]=0.8 s[13,1]=0.6,s[13,2]=-1.1,s[13,3]=-0.1,s[13,4]=-0.9,s[13,5]=0.0,s[13,6]=0.6,s[13,7]=-0.9,s[13,8]=0.4,s[13,9]=0.4,s[13,10]=-1.1,s[13,11]=-0.1,s[13,12]=-0.8,s[13,13]=0.5,s[13,14]=0.7,s[13,15]=-0.3,s[13,16]=-0.3,s[13,17]=-0.2,s[13,18]=1.1,s[13,19]=0.3,s[13,20]=-0.1,s[13,21]=0.0,s[13,22]=0.9,s[13,23]=-0.1,s[13,24]=-0.7,s[13,25]=-0.1,s[13,26]=0.3,s[13,27]=0.1,s[13,28]=-0.4,s[13,29]=1.0,s[13,30]=0.4 s[13,31]=-0.6,s[13,32]=-0.8,s[13,33]=0.4,s[13,34]=0.6,s[13,35]=0.5,s[13,36]=1.2,s[13,37]=0.3,s[13,38]=-0.7,s[13,39]=0.8,s[13,40]=0.9,s[13,41]=0.1,s[13,42]=0.3,s[13,43]=0.0,s[13,44]=-1.2,s[13,45]=0.0,s[13,46]=1.0,s[13,47]=1.1,s[13,48]=-1.2,s[13,49]=0.4,s[13,50]=0.0,s[13,51]=-0.8,s[13,52]=-0.9,s[13,53]=0.5,s[13,54]=1.1,s[13,55]=1.2,s[13,56]=-1.0,s[13,57]=0.2,s[13,58]=0.3,s[13,59]=0.0,s[13,60]=0.2 s[14,1]=-0.2,s[14,2]=-0.5,s[14,3]=-0.9,s[14,4]=-1.1,s[14,5]=-1.2,s[14,6]=-0.2,s[14,7]=0.5,s[14,8]=-1.1,s[14,9]=-0.7,s[14,10]=-0.4,s[14,11]=0.5,s[14,12]=0.1,s[14,13]=0.4,s[14,14]=0.1,s[14,15]=0.3,s[14,16]=0.1,s[14,17]=-1.2,s[14,18]=0.2,s[14,19]=0.2,s[14,20]=-0.3,s[14,21]=-0.2,s[14,22]=-0.2,s[14,23]=0.0,s[14,24]=-1.0,s[14,25]=0.4,s[14,26]=0.5,s[14,27]=0.7,s[14,28]=0.2,s[14,29]=-0.3,s[14,30]=0.5 s[14,31]=-0.2,s[14,32]=0.9,s[14,33]=0.8,s[14,34]=1.1,s[14,35]=-0.6,s[14,36]=-0.7,s[14,37]=-0.9,s[14,38]=-0.9,s[14,39]=1.2,s[14,40]=0.9,s[14,41]=0.1,s[14,42]=-0.9,s[14,43]=-0.6,s[14,44]=-1.0,s[14,45]=0.5,s[14,46]=1.0,s[14,47]=-0.2,s[14,48]=0.0,s[14,49]=-1.2,s[14,50]=0.1,s[14,51]=0.1,s[14,52]=-0.2,s[14,53]=0.7,s[14,54]=-0.7,s[14,55]=0.8,s[14,56]=-0.8,s[14,57]=0.8,s[14,58]=0.4,s[14,59]=-0.4,s[14,60]=-1.1 s[15,1]=-0.2,s[15,2]=0.2,s[15,3]=1.1,s[15,4]=-0.2,s[15,5]=-0.9,s[15,6]=-0.7,s[15,7]=-1.1,s[15,8]=0.7,s[15,9]=0.4,s[15,10]=-0.4,s[15,11]=-0.3,s[15,12]=-0.1,s[15,13]=-0.6,s[15,14]=0.9,s[15,15]=-0.8,s[15,16]=0.1,s[15,17]=-0.5,s[15,18]=0.9,s[15,19]=-1.0,s[15,20]=0.4,s[15,21]=0.1,s[15,22]=-0.1,s[15,23]=1.0,s[15,24]=0.9,s[15,25]=-1.1,s[15,26]=-0.1,s[15,27]=-0.3,s[15,28]=0.6,s[15,29]=-0.5,s[15,30]=1.0 s[15,31]=0.8,s[15,32]=-0.3,s[15,33]=0.3,s[15,34]=0.2,s[15,35]=-0.8,s[15,36]=0.5,s[15,37]=0.3,s[15,38]=-0.4,s[15,39]=1.1,s[15,40]=0.9,s[15,41]=0.6,s[15,42]=1.2,s[15,43]=0.8,s[15,44]=1.1,s[15,45]=1.1,s[15,46]=-0.7,s[15,47]=-0.2,s[15,48]=1.2,s[15,49]=1.0,s[15,50]=1.2,s[15,51]=-0.4,s[15,52]=-0.4,s[15,53]=-1.2,s[15,54]=-0.7,s[15,55]=-0.3,s[15,56]=-0.4,s[15,57]=0.9,s[15,58]=0.0,s[15,59]=0.7,s[15,60]=-1.0 s[16,1]=0.3,s[16,2]=-0.7,s[16,3]=-1.0,s[16,4]=0.1,s[16,5]=0.4,s[16,6]=-0.3,s[16,7]=-0.5,s[16,8]=1.0,s[16,9]=1.2,s[16,10]=-0.9,s[16,11]=-1.0,s[16,12]=-0.9,s[16,13]=-0.8,s[16,14]=0.7,s[16,15]=0.3,s[16,16]=-0.3,s[16,17]=1.2,s[16,18]=-0.2,s[16,19]=-1.0,s[16,20]=0.1,s[16,21]=0.3,s[16,22]=-0.3,s[16,23]=-0.9,s[16,24]=0.2,s[16,25]=0.7,s[16,26]=0.5,s[16,27]=-0.6,s[16,28]=-0.1,s[16,29]=-0.5,s[16,30]=-1.2 s[16,31]=0.5,s[16,32]=0.8,s[16,33]=-0.5,s[16,34]=-0.8,s[16,35]=0.5,s[16,36]=0.5,s[16,37]=-0.5,s[16,38]=-0.9,s[16,39]=0.2,s[16,40]=0.7,s[16,41]=-0.5,s[16,42]=-0.7,s[16,43]=0.3,s[16,44]=0.8,s[16,45]=-0.3,s[16,46]=-1.0,s[16,47]=-0.6,s[16,48]=-0.5,s[16,49]=-0.8,s[16,50]=0.7,s[16,51]=0.4,s[16,52]=-0.1,s[16,53]=-0.1,s[16,54]=0.2,s[16,55]=-0.1,s[16,56]=0.2,s[16,57]=0.6,s[16,58]=0.4,s[16,59]=-0.2,s[16,60]=-1.2 s[17,1]=0.9,s[17,2]=-0.9,s[17,3]=0.4,s[17,4]=-0.1,s[17,5]=0.9,s[17,6]=-0.6,s[17,7]=-0.7,s[17,8]=1.2,s[17,9]=-0.2,s[17,10]=1.2,s[17,11]=-1.2,s[17,12]=0.3,s[17,13]=-0.4,s[17,14]=0.8,s[17,15]=0.9,s[17,16]=-0.3,s[17,17]=-0.3,s[17,18]=-0.8,s[17,19]=-0.5,s[17,20]=0.1,s[17,21]=-0.2,s[17,22]=0.5,s[17,23]=0.0,s[17,24]=0.6,s[17,25]=1.1,s[17,26]=-0.1,s[17,27]=0.6,s[17,28]=-1.0,s[17,29]=0.1,s[17,30]=-0.8 s[17,31]=0.8,s[17,32]=-1.2,s[17,33]=-1.2,s[17,34]=-0.2,s[17,35]=0.5,s[17,36]=-0.6,s[17,37]=0.9,s[17,38]=-0.6,s[17,39]=1.2,s[17,40]=-0.9,s[17,41]=0.4,s[17,42]=0.6,s[17,43]=-0.3,s[17,44]=-1.2,s[17,45]=-1.0,s[17,46]=-0.5,s[17,47]=-0.7,s[17,48]=0.9,s[17,49]=0.5,s[17,50]=0.5,s[17,51]=-0.7,s[17,52]=-0.5,s[17,53]=-1.2,s[17,54]=-1.2,s[17,55]=-0.7,s[17,56]=0.0,s[17,57]=1.2,s[17,58]=0.4,s[17,59]=1.2,s[17,60]=-0.9 s[18,1]=0.1,s[18,2]=-0.5,s[18,3]=0.9,s[18,4]=1.0,s[18,5]=1.0,s[18,6]=0.8,s[18,7]=-0.9,s[18,8]=0.9,s[18,9]=-0.6,s[18,10]=1.0,s[18,11]=-0.1,s[18,12]=-0.2,s[18,13]=0.9,s[18,14]=0.9,s[18,15]=-0.3,s[18,16]=0.0,s[18,17]=0.4,s[18,18]=-0.2,s[18,19]=-0.4,s[18,20]=-0.7,s[18,21]=-0.3,s[18,22]=1.1,s[18,23]=0.9,s[18,24]=-0.7,s[18,25]=-0.1,s[18,26]=-1.2,s[18,27]=-0.1,s[18,28]=-0.1,s[18,29]=1.0,s[18,30]=-1.1 s[18,31]=1.0,s[18,32]=1.1,s[18,33]=0.2,s[18,34]=-1.1,s[18,35]=0.5,s[18,36]=-0.5,s[18,37]=0.5,s[18,38]=0.3,s[18,39]=-0.8,s[18,40]=0.8,s[18,41]=0.4,s[18,42]=0.4,s[18,43]=-0.1,s[18,44]=0.3,s[18,45]=-0.6,s[18,46]=-0.7,s[18,47]=0.6,s[18,48]=-0.6,s[18,49]=-1.2,s[18,50]=0.0,s[18,51]=0.4,s[18,52]=1.1,s[18,53]=0.2,s[18,54]=0.4,s[18,55]=1.0,s[18,56]=-0.6,s[18,57]=-0.8,s[18,58]=0.3,s[18,59]=-0.8,s[18,60]=0.8 s[19,1]=0.4,s[19,2]=-1.1,s[19,3]=-1.2,s[19,4]=0.8,s[19,5]=0.2,s[19,6]=0.6,s[19,7]=0.0,s[19,8]=-0.1,s[19,9]=-0.5,s[19,10]=0.9,s[19,11]=0.7,s[19,12]=1.1,s[19,13]=-0.8,s[19,14]=0.3,s[19,15]=0.3,s[19,16]=0.7,s[19,17]=0.1,s[19,18]=0.4,s[19,19]=-0.2,s[19,20]=-1.1,s[19,21]=0.0,s[19,22]=-0.6,s[19,23]=-0.8,s[19,24]=1.1,s[19,25]=0.3,s[19,26]=0.2,s[19,27]=0.6,s[19,28]=0.3,s[19,29]=-1.0,s[19,30]=0.7 s[19,31]=0.8,s[19,32]=-0.8,s[19,33]=-1.2,s[19,34]=-0.1,s[19,35]=-0.5,s[19,36]=0.3,s[19,37]=-1.1,s[19,38]=0.6,s[19,39]=-0.1,s[19,40]=-1.1,s[19,41]=0.1,s[19,42]=-0.5,s[19,43]=0.5,s[19,44]=1.2,s[19,45]=0.0,s[19,46]=-0.6,s[19,47]=-0.7,s[19,48]=-0.8,s[19,49]=0.5,s[19,50]=-0.2,s[19,51]=0.8,s[19,52]=0.1,s[19,53]=1.0,s[19,54]=-0.6,s[19,55]=0.5,s[19,56]=-0.9,s[19,57]=-0.1,s[19,58]=1.0,s[19,59]=-1.2,s[19,60]=-0.5 s[20,1]=0.2,s[20,2]=-1.0,s[20,3]=0.1,s[20,4]=0.7,s[20,5]=0.0,s[20,6]=0.7,s[20,7]=-0.3,s[20,8]=0.5,s[20,9]=-0.6,s[20,10]=-0.6,s[20,11]=-0.7,s[20,12]=0.7,s[20,13]=-0.7,s[20,14]=0.9,s[20,15]=1.1,s[20,16]=-0.9,s[20,17]=-0.1,s[20,18]=-0.4,s[20,19]=-0.6,s[20,20]=-0.6,s[20,21]=-0.1,s[20,22]=0.0,s[20,23]=1.0,s[20,24]=-0.7,s[20,25]=-0.6,s[20,26]=0.5,s[20,27]=0.3,s[20,28]=0.9,s[20,29]=0.9,s[20,30]=0.9 s[20,31]=-1.0,s[20,32]=0.0,s[20,33]=0.9,s[20,34]=-0.1,s[20,35]=-0.2,s[20,36]=0.9,s[20,37]=1.1,s[20,38]=-0.8,s[20,39]=0.1,s[20,40]=1.0,s[20,41]=0.0,s[20,42]=0.1,s[20,43]=0.6,s[20,44]=0.9,s[20,45]=-1.1,s[20,46]=0.4,s[20,47]=-0.9,s[20,48]=0.2,s[20,49]=-1.1,s[20,50]=1.0,s[20,51]=1.0,s[20,52]=0.9,s[20,53]=-1.0,s[20,54]=0.6,s[20,55]=-1.0,s[20,56]=-0.6,s[20,57]=-1.1,s[20,58]=0.2,s[20,59]=-0.7,s[20,60]=0.5 ; ; ; initialize coefficients ; if @sel > 0 b1=s[@sel,1],b2=s[@sel,2],b3=s[@sel,3],b4=s[@sel,4],b5=s[@sel,5],b6=s[@sel,6],b7=s[@sel,7],b8=s[@sel,8],b9=s[@sel,9],b10=s[@sel,10] b11=s[@sel,11],b12=s[@sel,12],b13=s[@sel,13],b14=s[@sel,14],b15=s[@sel,15],b16=s[@sel,16],b17=s[@sel,17],b18=s[@sel,18],b19=s[@sel,19],b20=s[@sel,20] b21=s[@sel,21],b22=s[@sel,22],b23=s[@sel,23],b24=s[@sel,24],b25=s[@sel,25],b26=s[@sel,26],b27=s[@sel,27],b28=s[@sel,28],b29=s[@sel,29],b30=s[@sel,30] b31=s[@sel,31],b32=s[@sel,32],b33=s[@sel,33],b34=s[@sel,34],b35=s[@sel,35],b36=s[@sel,36],b37=s[@sel,37],b38=s[@sel,38],b39=s[@sel,39],b40=s[@sel,40] b41=s[@sel,41],b42=s[@sel,42],b43=s[@sel,43],b44=s[@sel,44],b45=s[@sel,45],b46=s[@sel,46],b47=s[@sel,47],b48=s[@sel,48],b49=s[@sel,49],b50=s[@sel,50] b51=s[@sel,51],b52=s[@sel,52],b53=s[@sel,53],b54=s[@sel,54],b55=s[@sel,55],b56=s[@sel,56],b57=s[@sel,57],b58=s[@sel,58],b59=s[@sel,59],b60=s[@sel,60] endif ; ; fill the hit array ; while (iter < (iterate*sqr(#width*#magn/400))) xx = fx yy = fy if @sel == 0 fx = @a1 + @a2*fx + @a3*fx*fx + @a4*fx*fx*fx + @a5*fx*fx*fy + @a6*fx*fx*zz + @a7*fx*fy + \ @a8*fx*fy*fy + @a9*fx*fy*zz + @a10*fx*zz + @a11*fx*zz*zz + @a12*fy + @a13*fy*fy + @a14*fy*fy*fy + \ @a15*fy*fy*zz + @a16*fy*zz + @a17*fy*zz*zz + @a18*zz + @a19*zz*zz + @a20*zz*zz*zz fy = @a21 + @a22*xx + @a23*xx*xx + @a24*xx*xx*xx + @a25*xx*xx*fy + @a26*xx*xx*zz + @a27*xx*fy +\ @a28*xx*fy*fy + @a29*xx*fy*zz + @a30*xx*zz + @a31*xx*zz*zz + @a32*fy + @a33*fy*fy + @a34*fy*fy*fy + \ @a35*fy*fy*zz + @a36*fy*zz + @a37*fy*zz*zz + @a38*zz + @a39*zz*zz + @a40*zz*zz*zz zz = @a41 + @a42*xx + @a43*xx*xx + @a44*xx*xx*xx + @a45*xx*xx*yy + @a46*xx*xx*zz + @a47*xx*yy + \ @a48*xx*yy*yy + @a49*xx*yy*zz + @a50*xx*zz + @a51*xx*zz*zz + @a52*yy + @a53*yy*yy + @a54*yy*yy*yy + \ @a55*yy*yy*zz + @a56*yy*zz + @a57*yy*zz*zz + @a58*zz + @a59*zz*zz + @a60*zz*zz*zz else fx = b1 + b2*fx + b3*fx*fx + b4*fx*fx*fx + b5*fx*fx*fy + b6*fx*fx*zz + b7*fx*fy + \ b8*fx*fy*fy + b9*fx*fy*zz + b10*fx*zz + b11*fx*zz*zz + b12*fy + b13*fy*fy + b14*fy*fy*fy + \ b15*fy*fy*zz + b16*fy*zz + b17*fy*zz*zz + b18*zz + b19*zz*zz + b20*zz*zz*zz fy = b21 + b22*xx + b23*xx*xx + b24*xx*xx*xx + b25*xx*xx*fy + b26*xx*xx*zz + b27*xx*fy +\ b28*xx*fy*fy + b29*xx*fy*zz + b30*xx*zz + b31*xx*zz*zz + b32*fy + b33*fy*fy + b34*fy*fy*fy + \ b35*fy*fy*zz + b36*fy*zz + b37*fy*zz*zz + b38*zz + b39*zz*zz + b40*zz*zz*zz zz = b41 + b42*xx + b43*xx*xx + b44*xx*xx*xx + b45*xx*xx*yy + b46*xx*xx*zz + b47*xx*yy + \ b48*xx*yy*yy + b49*xx*yy*zz + b50*xx*zz + b51*xx*zz*zz + b52*yy + b53*yy*yy + b54*yy*yy*yy + \ b55*yy*yy*zz + b56*yy*zz + b57*yy*zz*zz + b58*zz + b59*zz*zz + b60*zz*zz*zz endif ; ; translate values to pixels ; ffx = fx - xmin ffy = fy - ymin ffy = tymax - ffy ffx = ffx/txmax ffy = ffy/tymax ffz = (zmin-zz)/sqrt(txmax^2+tymax^2) xx = ffx ; ; rotation around the z axis ; xx = ffx ffx = 0.5 + (ffx - 0.5 - @rotoffx/txmax)*cos(#angle) - \ (ffy - 0.5 - @rotoffy/tymax)*sin(#angle)*#height/#width ffy = 0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(#angle) + \ (xx - 0.5 - @rotoffx/txmax)*sin(#angle)*#width/#height; ; rotation around the y axis ; xx = ffx ffx = (0.5 + (ffz - 0.5 - @rotoffz/txmax)*sin(@zangle*pi/180) + \ (ffx - 0.5 - @rotoffx/txmax)*cos(@zangle*pi/180))*#width ffz = (0.5 + (ffz - 0.5 - @rotoffz/tzmax)*cos(@zangle*pi/180) - \ (xx - 0.5 - @rotoffx/txmax)*sin(@zangle*pi/180)) ; ; rotation around the x axis ; yy = ffy ffy = (0.5 + (ffy - 0.5 - @rotoffy/tymax)*cos(@xangle*pi/180) - \ (ffz - 0.5 - @rotoffz/tzmax)*sin(@xangle*pi/180))*#height ffz = (0.5 + (yy - 0.5 - @rotoffy/tymax)*sin(@xangle*pi/180) + \ (ffz - 0.5 - @rotoffz/tzmax)*cos(@xangle*pi/180))*scrsize ; ; final translation ; ffx = ffx - @transx*#width ffy = ffy - @transy*#height ffz = ffz - @transz*scrsize ; ; perspective application ; if @useprojn ffx = (cprojx*ffz-ffx*cprojz)/(ffz-cprojz) ffy = (cprojy*ffz-ffy*cprojz)/(ffz-cprojz) endif px = trunc(ffx)+wd2 py = trunc(ffy)+ht2 if px > 0 && py > 0 && px < #width+wd && py < #height+ht hits[px,py] = hits[px,py]+1+flip(ffz) if real(hits[px,py])>maxnhit maxnhit = real(hits[px,py]) endif if ffz > hits3[px,py] hits3[px,py] = ffz elseif hits3[px,py] ==0 hits3[px,py] = ffz endif hits2[px,py] = ffz endif iter = iter + 1 endwhile h = 0 w = 0 ; init: float nhit=0 float zave=0 float zlast=0 float zbiggest=0 float nhitx=0 float zavex=0 float zlastx=0 float zbiggestx=0 float nhity=0 float zavey=0 float zlasty=0 float zbiggesty=0 bool done = false float r = 2/log(20)*@filter^2 float gauss[2*@filter+1,2*@filter+1] float gweight = 0 int gx = 0 int gy = 0 float a = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter a = (gx^2 + gy^2)/r gauss[gx+@filter,gy+@filter] = exp(-a) gweight = gweight + gauss[gx+@filter,gy+@filter] gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile float e1 = 0.0; potentials float e2 = 0.0 float e3 = 0.0 float vx = 0.0; normal vector float vy = 0.0 float vz = 0.0 float vd = 0.0 float cen = 0 float cenx = 0 float ceny = 0 int i = 0 ;loop: int delta = ceil(@closeness) int xcrd = #x int ycrd = #y bool inside = true if @applymapping==true ; generate the x and y location in the image float dxx = (real(#pixel)-real(#center))*(#width)/4*#magn float dyy = (imag(#pixel)-imag(#center))*(#width)/4*#magn float transx = (#width+wd)*0.5; float transy = (#height+ht)*0.5; float cosan = cos(#angle); float sinan = sin(#angle); xcrd = round((transx + (dxx*cosan + dyy*sinan))) ycrd = round((transy + (dxx*sinan - dyy*cosan))) ; is this in our image? if (xcrd+wd2<0 || xcrd>=#width+wd2 || ycrd+ht2<0 || ycrd>=#height+ht2) inside = false endif endif if inside == true if xcrd+@closeness < #width+wd && ycrd+@closeness < #height+ht && real(hits[xcrd,ycrd]) > @thresh if @filter == 0 if @value == 3 zbiggest = hits3[xcrd,ycrd] zbiggestx = hits3[xcrd+delta,ycrd] zbiggesty = hits3[xcrd,ycrd+delta] elseif @value == 0 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) elseif @value == 1 nhit = real(hits[xcrd,ycrd]) nhitx = real(hits[xcrd+delta,ycrd]) nhity = real(hits[xcrd,ycrd+delta]) zave = imag(hits[xcrd,ycrd])/(nhit + 1) zavex = imag(hits[xcrd+delta,ycrd])/(nhitx + 1) zavey = imag(hits[xcrd,ycrd+delta])/(nhity + 1) elseif @value == 2 zlast = hits2[xcrd,ycrd] zlastx = hits2[xcrd+delta,ycrd] zlasty = hits2[xcrd,ycrd+delta] endif else ; apply the Gaussian filter nhit=0 nhitx=0 nhity=0 zbiggest = 0 zbiggestx = 0 zbiggesty = 0 zave = 0 zavex = 0 zavey = 0 zlast = 0 zlastx = 0 zlasty = 0 gx = -@filter gy = -@filter while gy <= @filter while gx <= @filter if @value == 0 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) elseif @value == 1 nhit = nhit + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy]) nhitx = nhitx + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx+delta,ycrd+gy]) nhity = nhity + gauss[gx+@filter,gy+@filter]*real(hits[xcrd+gx,ycrd+gy+delta]) zave = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy])/(nhit+1) zavex = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx+delta,ycrd+gy])/(nhitx+1) zavey = gauss[gx+@filter,gy+@filter]*imag(hits[xcrd+gx,ycrd+gy+delta])/(nhity+1) elseif @value == 2 zlast = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy] zlastx = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx+delta,ycrd+gy] zlasty = gauss[gx+@filter,gy+@filter]*hits2[xcrd+gx,ycrd+gy+delta] elseif @value == 3 zbiggest = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy] zbiggestx = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx+delta,ycrd+gy] zbiggesty = gauss[gx+@filter,gy+@filter]*hits3[xcrd+gx,ycrd+gy+delta] endif gx = gx + 1 endwhile gx = -@filter gy = gy + 1 endwhile if @value == 0 nhit = nhit/gweight nhitx = nhitx/gweight nhity = nhity/gweight elseif @value == 1 zave = zave/gweight zavex = zavex/gweight zavey = zavey/gweight elseif @value == 2 zlast = zlast/gweight zlastx = zlastx/gweight zlasty = zlasty/gweight elseif @value == 3 zbiggest = zbiggest/gweight zbiggestx = zbiggestx/gweight zbiggesty = zbiggesty/gweight endif endif endif endif if @value == 0 cen = nhit cenx = nhitx ceny = nhity elseif @value == 1 cen = zave cenx = zavex ceny = zavey elseif @value == 2 cen = zlast cenx = zlastx ceny = zlasty else cen = zbiggest cenx = zbiggestx ceny = zbiggesty endif e1 = cen*@zscale e2 = cenx*@zscale e3 = ceny*@zscale IF (@xfer == 1); log e1 = log(e1) e2 = log(e2) e3 = log(e3) ELSEIF (@xfer == 2); sqrt e1 = sqrt(e1) e2 = sqrt(e2) e3 = sqrt(e3) ELSEIF (@xfer == 3); cuberoot e1 = (e1)^(1/3) e2 = (e2)^(1/3) e3 = (e3)^(1/3) ELSEIF (@xfer == 4); exp e1 = exp(e1) e2 = exp(e2) e3 = exp(e3) ELSEIF (@xfer == 5); sqr e1 = sqr(e1) e2 = sqr(e2) e3 = sqr(e3) ELSEIF (@xfer == 6); cube e1 = (e1)^3 e2 = (e2)^3 e3 = (e3)^3 ELSEIF (@xfer == 7); sin e1 = sin(e1) e2 = sin(e2) e3 = sin(e3) ELSEIF (@xfer == 8); cos e1 = cos(e1) e2 = cos(e2) e3 = cos(e3) ELSEIF (@xfer == 9); tan e1 = tan(e1) e2 = tan(e2) e3 = tan(e3) ENDIF ; apply post-scale e1 = e1 * zscale2 e2 = e2 * zscale2 e3 = e3 * zscale2 vx = e2-e1 vy = e3-e1 vz = -@closeness/20.0 ; normalize vector vd = 1/sqrt(sqr(vx)+sqr(vy)+sqr(vz)) vx = vx*vd vy = vy*vd vz = vz*vd if @pass == true #z = vx + flip(vy); fudge z from vector else if @value == 0 #z = nhit/maxnhit elseif @value == 1 #z = (zave/(log(maxnhit)+1))^3 elseif @value == 2 #z = (zlast/(log(maxnhit)+1))^10 elseif @value == 3 #z = (zbiggest/(log(maxnhit)+1))^10 endif endif if @oldver if done == false done = true endif endif loop: i = i + 1 if !@oldver if cen < i if done == false done = true endif endif endif bailout: done == false default: heading caption="Sprott 3D Cubic G Attractor" endheading $ifdef VER40 heading text=" x -> Cubic in x, y and z" endheading heading text=" y -> Cubic in x, y and z" endheading heading text=" z -> Cubic in x, y and z" endheading heading text="Color with Damien's Lighting or 3D Texturizer Enhanced III \ formulas. 3D Texturizer III is needed for the non-slope color options." endheading $else heading caption="x -> Cubic in x, y and z" endheading heading caption="y -> Cubic in x, y and z" endheading heading caption="z -> Cubic in x, y and z" endheading heading caption="Color with Damien's Lighting" endheading heading caption="or one of the 3D Texturizer formulas" endheading heading caption="3D Texturizer III is needed for" endheading heading caption="the non-slope color options." endheading $endif title="Slope 3D Cubic G Attractor" periodicity=0 magn=3 method = multipass maxiter=1000 param oldver caption = "Use old version" default = false endparam float param version caption = "Version number" default = 1.0 hint = "This is for backwards compatibility with old versions \ of the formula." visible = false endparam param applyMapping caption = "Apply Mapping" default = false endparam param percentInc caption = "Oversize by (%)" default = 0.0 visible = @applyMapping == true endparam param density caption = "Hit Density" default = 0.03 hint = "Coloring density for the strange attractor." endparam param filter caption = "Filter Width" default = 0 min = 0 endparam param closeness caption = "Orbit Closeness" default = 1.0 min = 0.001 visible=@pass==true endparam param value caption = "Hit Value" enum = "Count" "Ave Z" "Last Z" "Largest Z" default = 3 endparam param thresh caption = "Hit Threshold" default = 0.0 endparam param pass caption = "Pass slope values" default = true endparam heading caption = "Slope Parameters" visible=@pass==true endheading param xfer caption = "Height Transfer" default = 0 enum = "linear" "log" "sqrt" "cuberoot" "exp" "sqr" "cube" "sin" "cos" "tan" hint = "This function will be applied to the height value \ before a slope is calculated." visible=@pass==true endparam param zscale caption = "Height Pre-Scale" default = 1.0 hint = "Specifies the ratio between height and distance. Higher \ values will exaggerate differences between high and low. \ In general, you will want to use smaller numbers here." visible=@pass==true endparam param zscale2 caption = "Height Post-Scale" default = 1.0 hint = "Specifies the ratio between height and distance; like \ Height Pre-Scale, except that this value is applied after \ the transfer function." visible=@pass==true endparam heading caption = "Rotations and Translations" endheading $ifdef VER40 heading text = "Use the location tab for rotation around the Z Axis." endheading $endif param xangle caption = "X Axis Rotation" default = 0.0 hint = "This is the fixed (horizontal) Y Axis. It is performed \ after the normal fractal rotation(s) and zooms." endparam param zangle caption = "Y Axis Rotation" default = 0.0 ; min = 0.0 ; max = 180.0 hint = "This is the fixed (vertical) Y Axis. It is performed \ after the normal fractal rotation(s) and zooms." endparam param rotoffx caption = "Rot Center X Offset" default = 0.0 endparam param rotoffy caption = "Rot Center Y Offset" default = 0.0 endparam param rotoffz caption = "Rot Center Z Offset" default = 0.0 endparam param transx caption = "X Final Translation" default = 0.0 endparam param transy caption = "Y Final Translation" default = 0.0 endparam param transz caption = "Z Final Translation" default = 0.0 endparam heading caption = "Perspective" endheading param useprojn caption = "Use Perspective" default = true endparam param cprojx caption = "X Center of Projection" default = 0.5 visible = @useprojn endparam param cprojy caption = "Y Center of Projection" default = 0.5 visible = @useprojn endparam float param cprojz caption = "Z Center of Projection" default = -1 visible = @useprojn endparam heading caption = "Attractor Parameters" endheading param hideparam caption = "Hide Parameters" default = true endparam param sel caption = "select preset coeffs" enum = "no preset" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" \ "15" "16" "17" "18" "19" "20" default = 0 endparam param a1 caption = "coefficient a1" default = 0.3 visible = @hideparam==false endparam param a2 caption = "coefficient a2" default = -.4 visible = @hideparam==false endparam param a3 caption = "coefficient a3" default = 1.0 visible = @hideparam==false endparam param a4 caption = "coefficient a4" default = 0.3 visible = @hideparam==false endparam param a5 caption = "coefficient a5" default = 0.5 visible = @hideparam==false endparam param a6 caption = "coefficient a6" default = 0.4 visible = @hideparam==false endparam param a7 caption = "coefficient a7" default = 0.7 visible = @hideparam==false endparam param a8 caption = "coefficient a8" default = 0.5 visible = @hideparam==false endparam param a9 caption = "coefficient a9" default = 0.9 visible = @hideparam==false endparam param a10 caption = "coefficient a10" default = 1.0 visible = @hideparam==false endparam param a11 caption = "coefficient a11" default = 1.2 visible = @hideparam==false endparam param a12 caption = "coefficient a12" default = -0.4 visible = @hideparam==false endparam param a13 caption = "coefficient a13" default = 0.4 visible = @hideparam==false endparam param a14 caption = "coefficient a14" default = -0.3 visible = @hideparam==false endparam param a15 caption = "coefficient a15" default = -0.1 visible = @hideparam==false endparam param a16 caption = "coefficient a16" default = -0.6 visible = @hideparam==false endparam param a17 caption = "coefficient a17" default = -0.1 visible = @hideparam==false endparam param a18 caption = "coefficient a18" default = 1.1 visible = @hideparam==false endparam param a19 caption = "coefficient a19" default = 1.0 visible = @hideparam==false endparam param a20 caption = "coefficient a20" default = 0.6 visible = @hideparam==false endparam param a21 caption = "coefficient a21" default = 0.2 visible = @hideparam==false endparam param a22 caption = "coefficient a22" default = 0.6 visible = @hideparam==false endparam param a23 caption = "coefficient a23" default = -1.1 visible = @hideparam==false endparam param a24 caption = "coefficient a24" default = -1.0 visible = @hideparam==false endparam param a25 caption = "coefficient a25" default = 0.2 visible = @hideparam==false endparam param a26 caption = "coefficient a26" default = 0.4 visible = @hideparam==false endparam param a27 caption = "coefficient a27" default = 0.4 visible = @hideparam==false endparam param a28 caption = "coefficient a28" default = 0.2 visible = @hideparam==false endparam param a29 caption = "coefficient a29" default = 0.6 visible = @hideparam==false endparam param a30 caption = "coefficient a30" default = -1.1 visible = @hideparam==false endparam param a31 caption = "coefficient a31" default = 0.6 visible = @hideparam==false endparam param a32 caption = "coefficient a32" default = -0.4 visible = @hideparam==false endparam param a33 caption = "coefficient a33" default = -1.1 visible = @hideparam==false endparam param a34 caption = "coefficient a34" default = -0.1 visible = @hideparam==false endparam param a35 caption = "coefficient a35" default = 0.6 visible = @hideparam==false endparam param a36 caption = "coefficient a36" default = -0.2 visible = @hideparam==false endparam param a37 caption = "coefficient a37" default = -0.8 visible = @hideparam==false endparam param a38 caption = "coefficient a38" default = -0.6 visible = @hideparam==false endparam param a39 caption = "coefficient a39" default = 0.6 visible = @hideparam==false endparam param a40 caption = "coefficient a40" default = 1.2 visible = @hideparam==false endparam param a41 caption = "coefficient a41" default = -0.5 visible = @hideparam==false endparam param a42 caption = "coefficient a42" default = 0.3 visible = @hideparam==false endparam param a43 caption = "coefficient a43" default = 1.1 visible = @hideparam==false endparam param a44 caption = "coefficient a44" default = -0.1 visible = @hideparam==false endparam param a45 caption = "coefficient a45" default = 0.9 visible = @hideparam==false endparam param a46 caption = "coefficient a46" default = -1.0 visible = @hideparam==false endparam param a47 caption = "coefficient a47" default = -0.6 visible = @hideparam==false endparam param a48 caption = "coefficient a48" default = -0.3 visible = @hideparam==false endparam param a49 caption = "coefficient a49" default = 0.5 visible = @hideparam==false endparam param a50 caption = "coefficient a50" default = 0.4 visible = @hideparam==false endparam param a51 caption = "coefficient a51" default = -0.8 visible = @hideparam==false endparam param a52 caption = "coefficient a52" default = 0.5 visible = @hideparam==false endparam param a53 caption = "coefficient a53" default = -0.8 visible = @hideparam==false endparam param a54 caption = "coefficient a54" default = -1.0 visible = @hideparam==false endparam param a55 caption = "coefficient a55" default = 0.1 visible = @hideparam==false endparam param a56 caption = "coefficient a56" default = -0.9 visible = @hideparam==false endparam param a57 caption = "coefficient a57" default = -1.1 visible = @hideparam==false endparam param a58 caption = "coefficient a58" default = -0.7 visible = @hideparam==false endparam param a59 caption = "coefficient a59" default = -0.1 visible = @hideparam==false endparam param a60 caption = "coefficient a60" default = -0.6 visible = @hideparam==false endparam } JuliaLyaponov {; Ron Barnett, March 2008 ; Negative exponent Julia with Lyaponov bailout init: complex c = @seed #z = #pixel int i = 0 int k = @stabilize float lambda = 0 float lambdaf = 0 complex el = 0 bool done = false while i < k #z = 1/#z^@mpower + c el = -@mpower/#z^(@mpower+1) lambda = lambda + log(cabs(el)) i = i + 1 endwhile loop: int j = 1 bool bailc = false #z = 1/#z^@mpower + c el = -@mpower/#z^(@mpower+1) lambda = lambda + log(cabs(el)) lambdaf = lambda/(k+j) j = j + 1 if @flavor == "1" bailc = lambdaf > @lbailout && |1/#z^@mpower-@seed| < @rbailout else bailc = lambdaf < @lbailout && |1/#z^@mpower-@seed| < @rbailout endif if bailc done = true #z = #z/cabs(#z) #z = #z*lambdaf endif bailout: !done default: title = "Julia Lyaponov" maxiter = 1000 periodicity = 0 method = multipass $ifdef VER40 heading text = "This is an experimental formula that uses a variant of Ken \ Shirriff's ideas for using the Lyaponov exponent for bailout \ of a Julia formula with negative powers. The Julia seeds are \ best found using 'Mandel Lyaponov' and the 'switch' parameter." endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam int param stabilize caption = "Pre-iterations" default = 250 endparam complex param mpower caption = "Power" default = (2,0) endparam float param rbailout caption = "Radius Bailout" default = 0.4 endparam float param lbailout caption = "Lyap Bailout" default = 0 endparam complex param seed caption = "Julia Seed" default = (0.6,0.465) endparam param flavor caption = "Flavor" default = 0 enum = "1" "2" endparam switch: type = "MandelLyaponov" lbailout = @lbailout rbailout = @rbailout flavor = @flavor mpower = @mpower stabilize = @stabilize } MandelLyaponov {; Ron Barnett, March 2008 ; Negative exponent Mandel with Lyaponov bailout init: complex c = #pixel #z = 1 int i = 0 int k = @stabilize float lambda = 0 float lambdaf = 0 complex el = 0 bool done = false while i < k #z = 1/#z^@mpower + c el = -@mpower/#z^(@mpower+1) lambda = lambda + log(cabs(el)) i = i + 1 endwhile loop: int j = 1 bool bailc = false #z = 1/#z^@mpower + c el = -@mpower/#z^(@mpower+1) lambda = lambda + log(cabs(el)) lambdaf = lambda/(j+k) j = j + 1 if @flavor == "1" bailc = lambdaf > @lbailout && |1/#z^@mpower-c| < @rbailout else bailc = lambdaf < @lbailout && |1/#z^@mpower-c| < @rbailout endif if bailc done = true #z = #z/cabs(#z) #z = #z*lambdaf endif bailout: !done default: title = "Mandel Lyaponov" maxiter = 1000 periodicity = 0 method = multipass $ifdef VER40 heading text = "This is an experimental formula that uses a variant of Ken \ Shirriff's ideas for using the Lyaponov exponent for bailout \ of a Mandelbrot formula with negative powers." endheading $endif param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam int param stabilize caption = "Pre-iterations" default = 250 endparam complex param mpower caption = "Power" default = (2,0) endparam float param rbailout caption = "Radius Bailout" default = 0.4 endparam float param lbailout caption = "Lyap Bailout" default = 0 endparam param flavor caption = "Flavor" default = 0 enum = "1" "2" endparam switch: type = "JuliaLyaponov" lbailout = @lbailout rbailout = @rbailout flavor = @flavor seed = #pixel mpower = @mpower stabilize = @stabilize } TransJulia { ; Based upon ideas of Robert Devaney from his book "Chaos, Fractals and Dynamics" ; init: #z = #pixel loop: if @flavor == "Default" #z = @p1*@fn1(#z) elseif @flavor == "Squared" #z = @p1*@fn1(#z^2) elseif @flavor == "Squared2" #z = @p1*@fn1(#z)^2 else #z = @p1*@fn1(#z) - @p2*@fn1(#z) endif bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Trans Julia" maxiter = 1000 method = multipass precision = 0 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p1 caption = "seed" default = (-0.1, 0.4) endparam param p2 caption = "seed 2" default = (1,0) visible = @flavor == "Difference" endparam func fn1 caption = "Function" default = sin() endfunc param flavor caption = "Flavor" default = 0 enum = "Default" "Squared" "Squared2" "Difference" endparam switch: type = "TransMand" bailout = @bailout test = @test fn1 = @fn1 flavor = @flavor p2 = @p2 } TransMand { ; Based upon ideas of Robert Devaney from his book "Chaos, Fractals and Dynamics" ; init: #z = #pixel loop: if @flavor == "Default" #z = #pixel*@fn1(#z) elseif @flavor == "Squared" #z = #pixel*@fn1(#z^2) elseif @flavor == "Squared2" #z = #pixel*@fn1(#z)^2 else #z = #pixel*@fn1(#z) - @p2*@fn1(#z) endif bailout: (@test == 0 && |#z| <= @bailout) || \ (@test == 1 && sqr(real(#z)) <= @bailout) || \ (@test == 2 && sqr(imag(#z)) <= @bailout) || \ (@test == 3 && (sqr(real(#z)) <= @bailout && sqr(imag(#z)) < @bailout)) || \ (@test == 4 && (sqr(real(#z)) <= @bailout || sqr(imag(#z)) < @bailout)) || \ (@test == 5 && (sqr(abs(real(#z)) + abs(imag(#z))) <= @bailout)) || \ (@test == 6 && (sqr(real(#z) + imag(#z)) <= @bailout)) default: title = "Trans Mand" maxiter = 1000 method = multipass precision = 0 center = (0, 0) param version caption = "Formula Version" default = 1.0 hint = "You should never see this parameter; it's used internally to track \ which version of the formula was used to create your image, so that \ if a bug is found which breaks backwards-compatibility, the formula \ can adapt transparently." visible = false endparam param test caption = "Bailout Test" default = 0 enum = "mod" "real" "imag" "or" "and" "manh" "manr" endparam param bailout caption = "Bailout value" default = 100.0 min = 1 endparam param p2 caption = "seed 2" default = (1,0) visible = @flavor == "Difference" endparam func fn1 caption = "Function" default = sin() endfunc param flavor caption = "Flavor" default = 0 enum = "Default" "Squared" "Squared2" "Difference" endparam switch: type = "TransJulia" bailout = @bailout p1 = #pixel test = @test fn1 = @fn1 p2 = @p2 flavor = @flavor } IterMandelbrot { ; some of the code is based upon ideas presented by Kerry Mitchell on Fractal ; Forums. init: #z = 0 int iter = 1 complex rot = 0 complex c = #pixel complex i = (0,1) loop: rot=e^(-i*iter)*@rfactor #z=(#z*(1-@s2+@s2*rot))^(@power*(1-@s3)+@s3*iter)+(1-@s1+@s1*rot)*c if @rev1 #z=(#z*(1-@s2+@s2*rot))^(@power*(1-@s3)+@s3*iter)+(1-@s1+@s1*(-rot))*c endif if @rev2 #z=(#z*(1-@s2+@s2*(-rot)))^(@power*(1-@s3)+@s3*iter)+(1-@s1+@s1*rot)*c endif iter = iter + 1 bailout: |#z| <= @bailout default: maxiter = 100 method = multipass periodicity = 0 center = (-0.5, 0) param bailout caption = "Bailout value" default = 1e10 min = 1 endparam complex param power caption = "power" default = (2,0) endparam heading text = "For sliders #1 and #2, The iteration value is transitioned to a \ rotation. For slider #1 the rotation is applied to the \ Mandelbrot constant/Julia seed. For slider #2 the rotaion is \ applied to the z value. The reverse slider check boxes \ reverse the angle. The rotation factor is a modifier of the \ rotation value." endheading complex param rfactor caption = "rotation factor" default = (1,0) visible = @s1 != 0 || @s2 != 0 endparam float param s1 caption = "slider #1" default = 0 min = 0 max = 1 hint = "Slider for the Mandelbrot constant/Julia seed." endparam bool param rev1 caption = "reverse slider #1" default = false endparam float param s2 caption = "slider #2" default = 0 min = 0 max = 1 hint = "Slider for #z" endparam bool param rev2 caption = "reverse slider #2" default = false endparam heading text = "For slider #3 the Mandelbrot/Julia power is transitioned to \ the iteration value." endheading float param s3 caption = "slider #3" default = 0 min = 0 max = 1 hint = "Slider for Power" endparam switch: type = "IterJulia" bailout = @bailout power = @power s1 = @s1 s2 = @s2 s3 = @s3 rev1 = @rev1 rev2 = @rev2 rfactor = @rfactor seed = #pixel } IterJulia { ; some of the code is based upon ideas presented by Kerry Mitchell on Fractal ; Forums. init: #z = #pixel int iter = 1 complex rot = 0 complex i = (0,1) loop: rot=e^(-i*iter)*@rfactor #z=(#z*(1-@s2+@s2*rot))^(@power*(1-@s3)+@s3*iter)+(1-@s1+@s1*rot)*@seed if @rev1 #z=(#z*(1-@s2+@s2*rot))^(@power*(1-@s3)+@s3*iter)+(1-@s1+@s1*(-rot))*@seed endif if @rev2 #z=(#z*(1-@s2+@s2*(-rot)))^(@power*(1-@s3)+@s3*iter)+(1-@s1+@s1*rot)*@seed endif iter = iter + 1 bailout: |#z| <= @bailout default: maxiter = 100 method = multipass periodicity = 0 center = (0, 0) param bailout caption = "Bailout value" default = 1e10 min = 1 endparam complex param power caption = "power" default = (2,0) endparam heading text = "For sliders #1 and #2, The iteration value is transitioned to a \ rotation. For slider #1 the rotation is applied to the \ Mandelbrot constant/Julia seed. For slider #2 the rotaion is \ applied to the z value. The reverse slider check boxes \ reverse the angle. The rotation factor is a modifier of the \ rotation value." endheading complex param rfactor caption = "rotation factor" default = (1,0) visible = @s1 != 0 || @s2 != 0 endparam float param s1 caption = "slider #1" default = 0 min = 0 max = 1 endparam bool param rev1 caption = "reverse slider #1" default = false endparam float param s2 caption = "slider #2" default = 0 min = 0 max = 1 endparam bool param rev2 caption = "reverse slider #2" default = false endparam heading text = "For slider #3 the Mandelbrot/Julia power is transitioned to \ the iteration value." endheading float param s3 caption = "slider #3" default = 0 min = 0 max = 1 hint = "Slider for Power" endparam complex param seed caption = "Julia seed" default = (-0.75,0.25) endparam switch: type = "IterMandelbrot" bailout = @bailout power = @power s1 = @s1 s2 = @s2 s3 = @s3 rev1 = @rev1 rev2 = @rev2 rfactor = @rfactor }