Here these must be a result of colour interpolation function for gradient with lines being where index value is close to 0 or 1.

But there are many colouring algorithms which makes lines like this.

This could be not too complicated and looks neat:

https://fractalforums.org/fractal-mathematics-and-new-theories/28/entropy-mandelbrot-coloring/368 Alsou here, but different stripes:

https://commons.wikimedia.org/wiki/File:Stripe_Average_Coloring_-_Mandelbrot_set_zoom_(_wake_1over3_).png In kaliset_HEARTS_tweaked_singleformula2.jpg lines is made by direct colouring algorithm with no changable colours involved just 3 parameters I called Log Trichrome. It have just niche use as it's hard, colours can't be mutch adjusted, but they are mutch brighter and realistic than pallete using, kind of like eletrical lights.

before calculation starts:

float factlogR = 1/(log(@baseR));

float factlogG = 1/(log(@baseG));

float factlogB = 1/(log(@baseB));

;during iteration:

cnt=cnt+1

;Log normalisation for insides => zero.

IF (cnt<100)

normaliter = sqr(cnt)

ENDIF

cabsz=cabs(z)

dataR= abs( factlogR*log ( factlogR*log ( factlogR*log (cabsz ) ) ) )

dataG= abs( factlogG*log ( factlogG*log ( factlogG*log (cabsz) ) ) )

dataB= abs( factlogB*log ( factlogB*log ( factlogB*log (cabsz) ) ) )

sumR= recip(dataR*normaliter + @darkness) + sumR

sumG= recip(dataG*normaliter + @darkness) + sumG

sumB= recip(dataB*normaliter + @darkness) + sumB

after end of fractal calculation:

#color = rgb(resultR, resultG, resultB)

With the variables:

@baseR=1.36

@baseG=1.53

@baseB=1.48

@darkness = 5 (by default =1)

Full code:

`LogTrichrome {`

; Direct colour method based on Fractal Explorer and NASA

; colour techniques. Summs of inveversed multiple log,

; algorithm by Arthur Sirotinsky and Olga Federenko.

; Colour information is generated by each channel having

; different logarithm bases.

; http://www.fractalforums.com/index.php?topic=11520

; + post functions for greater variety.

; + switch to use gradient, index is green channel.

; 03.10.2012. + new colour mode by harmonic between gradient and direct.

; So to have advantages of using gradients and direct colours.

; 12.10.2012. + gradient mode with index calculated as harmonic mean between 3 chanells - smoother.

; 17.10.2012. better normalisation for deeper renders.

; 13.11.2012. + flag to remove unnatural blue tones in direct modes.

; 14.08.2013. + triangle transfer function & more colour switches.

; 28.08.2013 + Pre functions, works like orbit traps.

; 30.09.2013 + 8 pre functions.

;+ random noise taken from Mark Townsend's scripts.

; by Edgar Malinovsky 16.04.2012.

; You may redistribute this algorithm, modify, derivate or use comercialy as you wish as long as you give proper credits.

; http://edo555.deviantart.com/

$DEFINE DIRECT

global:

; Calculating differences to ln

float factlogR = recip(log(@baseR));

float factlogG = recip(log(@baseG));

float factlogB = recip(log(@baseB));

init:

float sumR= 0.0

float sumG= 0.0

float sumB= 0.0

float resultR= 0.0

float resultG= 0.0

float resultB= 0.0

float cabsz= 0.0

float dataR= 0.0

float dataG= 0.0

float dataB= 0.0

int cnt= 0

int normaliter = 0

color gradcolor=rgba(0, 0, 0, 0)

float resultAlpha =0.0

complex ztemp =(0,0)

loop:

;"trap center"

ztemp=#z +@posneg

;pre functions

; + 1.0E-15 to avoid null value dots and not working with magnet.

IF (@prefn == 0) ; original unmodified

cabsz= cabs( ztemp +1.0E-15)

ELSEIF (@prefn == 1)

cabsz= cabs( real(ztemp)- imag(ztemp) +1.0E-15)

ELSEIF (@prefn == 2)

cabsz= cabs( real(ztemp)* imag(ztemp) +1.0E-15)

ELSEIF (@prefn == 3)

cabsz= cabs( real(ztemp)% (imag(ztemp) +1E-20) +1.0E-15)

ELSEIF (@prefn == 4)

cabsz= |ztemp +1.0E-15|

; non linear

ELSEIF (@prefn == 5)

cabsz= cabs( abs(real(ztemp)*2+ imag(ztemp))+ recip(abs(ztemp)+1e-15) +1.0E-15)

ELSEIF (@prefn == 6)

cabsz= cabs( ( (real(ztemp))*2+ (imag(ztemp))/((real(ztemp))+ (imag(ztemp))+ (1.9,0.1) ) ) +1.0E-15)

ELSEIF (@prefn == 7)

cabsz= cabs( (round(ztemp) +ztemp)*0.5 +1.0E-15)

ELSEIF (@prefn == 8)

cabsz= cabs( sinh( ztemp) +1.0E-15)

ELSEIF (@prefn == 9)

cabsz= cabs( cos( ztemp) +1.0E-15)

; symmetric

ELSEIF (@prefn == 10)

cabsz=cabs( sqr(imag(ztemp)) - sqrt(abs(real(ztemp))) + flip (sqr(real(ztemp)) - sqrt(abs(imag(ztemp) ))) + 1.0E-15)

ELSEIF (@prefn == 11)

cabsz= cabs(( sqr(sqr( imag(ztemp) )) + sqr(sqr( real(ztemp) )) + 1.0E-15 ) ^0.25 )

;back to basic

ELSEIF (@prefn == 12) ; real

cabsz= abs(real( ztemp +1.0E-15))

ELSEIF (@prefn == 13) ; imag

cabsz= abs(imag( ztemp) +1.0E-15)

;from orbit trap

ELSEIF (@prefn == 14)

; "hyperbola"

cabsz = abs(imag(ztemp) * real(ztemp) - 1+1.0E-15)

; from thin orbit trap of Samuel Monnier

ELSEIF (@prefn == 15 )

;sincos waves

cabsz= abs( sin(real(ztemp)) + cos(real(ztemp)) + imag(ztemp) +1.0E-15 )

ELSEIF (@prefn == 16 )

;parabola

cabsz = abs( sqr(real(ztemp)) - imag(ztemp) +1.0E-15)

ELSEIF (@prefn == 17 )

;trifolium

cabsz = abs(8/( sqr(real (ztemp) ) +4) - imag(ztemp) +1.0E-15)

;arlecchino, modified Mark Townsend harlequin

ELSEIF (@prefn == 18 )

;arlecchino

cabsz=cabs( ztemp- 1- sqr(1.25*real(atan( real(ztemp) / (imag(ztemp)+1.0E-15 ) )) ) +1.0E-15)

;formulas

ELSEIF (@prefn == 19)

;Chebyshev4Axolotl

cabsz =cabs( (sqr(ztemp)*(35 * sqr(ztemp) - 30) + 3) / 8 +1.0E-15)

ENDIF

cnt=cnt+1

;Log normalisation for insides => zero.

IF (cnt<100)

normaliter = sqr(cnt)

ENDIF

;Here goes logarithms

IF (@lgtype ==0)

dataR= abs( factlogR*log ( factlogR*log ( factlogR*log (cabsz) ) ) )

dataG= abs( factlogG*log ( factlogG*log ( factlogG*log (cabsz) ) ) )

dataB= abs( factlogB*log ( factlogB*log ( factlogB*log (cabsz) ) ) )

ELSEIF (@lgtype ==1)

dataR= abs( factlogR*log ( log ( factlogR*log (cabsz) ) ) )

dataG= abs( factlogG*log ( log ( factlogG*log (cabsz) ) ) )

dataB= abs( factlogB*log ( log ( factlogB*log (cabsz) ) ) )

ELSEIF (@lgtype ==2)

dataR= abs( factlogR*log ( factlogR*log ( factlogR*log ( factlogR*log (cabsz) ) ) ) )

dataG= abs( factlogG*log ( factlogG*log ( factlogG*log ( factlogG*log (cabsz) ) ) ) )

dataB= abs( factlogB*log ( factlogB*log ( factlogB*log ( factlogB*log (cabsz) ) ) ) )

ELSEIF (@lgtype ==3)

dataR= abs( factlogR*log ( ( factlogR*log (cabsz ) ) ) )

dataG= abs( factlogG*log ( ( factlogG*log (cabsz ) ) ) )

dataB= abs( factlogB*log ( ( factlogB*log (cabsz ) ) ) )

ENDIF

;summ of inverted logs

sumR= recip(dataR*normaliter + @darkness) + sumR

sumG= recip(dataG*normaliter + @darkness) + sumG

sumB= recip(dataB*normaliter + @darkness) + sumB

final:

IF (@userandom==true)

sumR = abs( tanh(@hyperandom *real(#random)) +sumR)

sumG = abs( tanh(@hyperandom *real(#random)) +sumG)

sumB = abs( tanh(@hyperandom *real(#random)) +sumB)

ENDIF

;modifications of index grade values 0 to 1.

IF (@postfn==0)

resultR=sumR

resultG=sumG

resultB=sumB

ELSEIF (@postfn==1)

resultR=sqr(sumR)

resultG=sqr(sumG)

resultB=sqr(sumB)

ELSEIF (@postfn==2)

resultR=sqrt(sumR)

resultG=sqrt(sumG)

resultB=sqrt(sumB)

ELSEIF (@postfn==3)

resultR= ( 1- sumR )

resultG= ( 1- sumG )

resultB= ( 1- sumB )

ELSEIF (@postfn==4)

resultR= abs( cos(#pi*sumR)+sumR*0.5 )

resultG= abs( cos(#pi*sumG)+sumG*0.5 )

resultB= abs( cos(#pi*sumB)+sumB*0.5 )

ELSEIF (@postfn==5)

resultR=abs(sumR -sqrt(sumG*sumB)*0.5)

resultG=abs(sumG -sqrt(sumR*sumB)*0.5)

resultB=abs(sumB -sqrt(sumR*sumG)*0.5)

ELSEIF (@postfn==6)

resultR=sqr(sin(#pi*sumR))

resultG=sqr(sin(#pi*sumG))

resultB=sqr(sin(#pi*sumB))

ELSEIF (@postfn==7)

resultR= abs( sumR -round(sumR) )

resultG= abs( sumG -round(sumG) )

resultB= abs( sumB -round(sumB) )

ELSEIF (@postfn==8)

resultR= tanh(sumR)

resultG= tanh(sumG)

resultB= tanh(sumB)

ELSEIF (@postfn==9)

resultR=( sin((sumR) )*cos((sumG)) )

resultG=( sin((sumG) )*cos((sumR)) )

resultB=( sin((sumB) )*cos((sumR)) )

ELSEIF (@postfn==10)

resultR=((sumR)/(2+abs(sumR)))*3

resultG=((sumG)/(2+abs(sumG)))*3

resultB=((sumB)/(2+abs(sumB)))*3

ELSEIF (@postfn==11)

resultR=abs(abs(sumR*0.5-trunc(sumR*0.5))-0.5)*2

resultG=abs(abs(sumG*0.5-trunc(sumG*0.5))-0.5)*2

resultB=abs(abs(sumB*0.5-trunc(sumB*0.5))-0.5)*2

ELSEIF (@postfn==12)

resultR = abs(cos(sumR))

resultG = abs(cos(sumG))

resultB = abs(cos(sumB))

ELSEIF (@postfn==13)

resultR = asinh(sumR)

resultG = asinh(sumG)

resultB = asinh(sumB)

ELSEIF (@postfn==14)

resultR = abs(exp(sin(sumR))-1)

resultG = abs(exp(sin(sumG))-1)

resultB = abs(exp(sin(sumB))-1)

ENDIF

; switching red and blue.

IF (@switchRB==true)

sumB=resultB

resultB=resultR

resultR=sumB

ENDIF

; switching red and green.

IF (@switchRG==true)

sumB=resultG

resultG=resultR

resultR=sumB

ENDIF

;colour mode: direct, using palette, or mix.

IF (@palette==0)

IF (@naturalise==true)

resultB=resultB*0.8

ENDIF

#color = rgb(resultR, resultG, resultB)

ELSEIF (@palette==1)

#color = gradient(resultG)

ELSEIF (@palette==2)

;gradient is by arithmetic mean of RGB

gradcolor=gradient( (resultR+resultG+resultB)*0.333333333333333 )

;harmonic of gradient and RGB

resultR=2/( recip (red(gradcolor))+ recip(resultR) )

resultG=2/( recip (green(gradcolor))+ recip(resultG) )

resultB=2/( recip (blue(gradcolor))+ recip(resultB) )

IF (@naturalise==true)

resultB=resultB*0.8

ENDIF

resultAlpha=alpha(gradcolor)

#color = rgba(resultR, resultG, resultB,resultAlpha)

ELSEIF (@palette==3)

; colour mode like of Fractal Explorer.

; uses pallete, but each chanell is calculated seperately.

resultR=red(gradient(resultR))

resultG=green(gradient(resultG))

resultB=blue(gradient(resultB))

resultAlpha=alpha(gradient( resultG))

IF (@naturalise==true)

resultB=resultB*0.8

ENDIF

#color = rgba(resultR, resultG, resultB, resultAlpha)

ELSEIF (@palette==4)

;smoother.

#color=gradient(3/(recip(resultR) + recip(resultG) + recip(resultB) ) )

ENDIF

default:

title = "Log Trichrome"

rating = recommended

heading

caption = "Colour notice"

text = "For Gradient change the colour mode."

endheading

param palette

caption = "Colour Mode"

enum= "Direct Colouring" "Gradient Based" "Mixed Harmonic" "Fractal Explorer like" "Gradient by Harmonic"

default=0

hint= "Gradient Based is gradient calculated from green channel, gradient harmonic is gradient calc from mean of all channels. Mixed is harmonic mean between gradient colour (by mean of RGB) and RGB channels. Fractal Explorer like is RGB values calculated seperately from gradient. All exept direct colouring uses gradient and alpha channel."

endparam

param posneg

caption = "Add to pixel value"

default = (0, 0)

hint = "Adding number aka trap center curves stalks around points with the opposite value. (2 and -2) And diverses + and - areas."

endparam

param lgtype

caption = "Logarithms applied"

enum = "1- Triple logarithm" "2- Smoother Triple log" "3- Quadruple logarithm" "4- Double logarithm"

default = 0

endparam

param darkness

caption="Darkness amount"

default=2.5

hint="Value added before inverting logarithm. Larger value creates darker pictures."

endparam

param switchRB

caption = "Switch Red and Blue"

default=false

hint= "Switch Red and Blue channels, so don't need to change log Bases."

endparam

param switchRG

caption = "Switch Red and Green"

default=false

hint= "Switch Red and Green channels, so don't need to change exponent Bases."

endparam

param prefn

caption = "Pre Function"

enum = "1 None" "2 X-Y" "3 X*Y" "4 remainder of X/Y" "5 X*X+Y*Y" "6 Stalks A" "7 Stalks B" "8 Areas" "9 Sinh" "10 Cos" "11 SZA Butterfly" "12 Supermodulus 4" "13 Real" "14 Imag" "15 Hyperbola" "16 Sincos Waves" "17 Parabola" "18 Trifolium" "19 Arlecchino" "20 Chebyshev4Axolotl"

default = 0

hint= "Pre function applied before colour calculations. Changes colour pattern like orbit traps."

endparam

param postfn

caption = "Transfer Function"

enum = "1- None" "2- Square Power (darker)" "3- Square Root (lighter)" "4- Inverted" "5- Half Periodic cos" "6- Accentuate RGB" "7- Haversine" "8- Solarisation" "9- Hyperbolic Tangent" "10- SineCosineMix" "11- Sigmoid" "12- Triangle" "13- Cosine" "14- ArcSinH" "15- ExpOfSin"

default = 0

hint="Changes colours. The same as UF, but applied before colour mode and have extra functions."

endparam

param naturalise

caption = "Naturalise Colours"

visible = (@palette == 0||@palette == 2||@palette == 3)

default=false

hint="Removes unnatural blue tint of non-gradient methods."

endparam

bool param userandom

caption = "Add Random noise"

default = false

endparam

float param hyperandom

caption = "Hypertangent noise"

hint = "Adds a random noise to the colours. Use very small or very large values 0.1 or 50."

default = 0.04

visible = (@userandom==true)

endparam

heading

caption = "Info"

text = "Colour method based on Fractal Explorer and NASA techniques. Indexes are summs of normalised inveversed multiple logarithms of all iterated z values. 3 different log bases behaves differently, hence generate different colours. Use Switches and 'Add to pixel value', more logarithms creates more stalks, 'Add to pixel' curves stalks around oposite values (adding 1 to -1 is 0), and post function changing tone. log Bases are for good in math. Colour Mode allows to switch between direct, gradient based and mixed direct and gradient by harmonic mean, Fractal Explorer like and gradient by harmonic mean modes. www.fractalforums.com"

endheading

param baseR

caption = "Red log Base"

default = 1.35

hint="Logarithmic base for a red channel. Colours are generated by each channel having different logs."

endparam

param baseG

caption = "Green log Base"

default = 1.55

endparam

param baseB

caption = "Blue log Base"

default = 1.65

endparam

heading

caption = "Colours"

text = "Colour Mode is incompatible with flag 'use gradient' of earlyer versions. Old parameters could require setting colour mode to direct or gradient. All modes exept direct colouring uses gradient and alpha channel."

endheading

}