reb
Class REB_SlopeHelper

Object
  extended by reb:REB_SlopeHelper

class 
Object:REB_SlopeHelper

Helper class for REB_Slope.

Makes possible the use of any object formula with REB_Slope. Works for both convergent and divergent formulas. Manages height values as trap shapes.


Ultra Fractal Source

Toggle UF Source Code Display

 class REB_SlopeHelper {
 ; Helper class for REB_Slope. <br>
 ; <p>
 ; Makes possible the use of any object formula with REB_Slope. Works for both
 ; convergent and divergent formulas. Manages height values as trap shapes.
 public:
   import "common.ulb"
   import "Standard.ulb"
 
   ; constructor
   func REB_SlopeHelper(REB_Slope owner)
     fFormula = new @formulaclass(owner)
     fFormula2 = new @formulaclass2(owner)
     fTransfer = new @transferclass(owner)
     fheight = new @heightvalue(owner)
     fTransform = new @transform(owner)
     fTransform2 = new @transform2(owner)
   endfunc
 
   ; initialize the object
   complex func Init(const complex pz)
     fZ = fFormula.Init(pz)
     if @dual
       fZ2 = fFormula2.Init(pz)
     endif
     fTransform.init(fZ)
     fTransform2.init(fZ)
     fTransfer.Init(pz)
     fheight.Init(pz)
     fMinDist = 1e20
     m_sflag = false
     fIterz = 0
     fOldz = 0
     iter = 0
     return fZ
   endfunc
 
   ; call for each iterated point
   complex func Iterate()
     iter1 = false
     iter2 = false
     switch1 = false
     switch2 = false
     foldz = fZ
     if @dual
       if iter % (@seqgap1) >= 0 && @seqgap2 != 0
         switch1 = true
         switch2 = false
       endif
       if (iter % (@seqgap1) >= (iter % @seqgap2)+1) || @seqgap2 == 0
         switch1 = false
         switch2 = true
       endif
       if @seqgap2 > @seqgap1
         switch1 = true
         switch2 = false
       endif
     endif
     if !@dual || @flavor == "Merge" || (@flavor == "Sequence" && @seqmethod == \
         "Default")
       iter1 = true
       iter2 = true
     elseif @dual &&  @flavor == "Sequence" && @seqmethod == "By Iter Value" && \
        switch1
        iter1 = true
     elseif @dual &&  @flavor == "Sequence" && @seqmethod == "By Iter Value" && \
        switch2
        iter2 = true
     endif
     if  @v_slopehelper >= 101
       notx = true
       if @combine == "Tx1 Fr1 Fr2 Tx2"
         if (iter >= @prestart && iter < (@prestart+@preend))&& @transform != NullTransform
           fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength)
           if iter1
             fZ = fFormula.iterate(fZ)
           endif
           if @dual
             if @flavor == "Sequence"
               fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength)
               if iter2
                 fZ = fFormula2.iterate(fZ)
               endif
             elseif @flavor == "Merge"
               fZ2 = (fZ2 + fTransform.Iterate(fZ2)*@strength)/(1+@strength)
               fZ2 = fFormula2.iterate(fZ2)
             endif
           endif
           notx = false
         endif
         if (iter >= @poststart && iter < (@poststart+@postend))&& @transform2 != NullTransform
           if iter1
             fZ = fFormula.iterate(fZ)
           endif
           fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2)
           if @dual
             if @flavor == "Sequence"
               if iter2
                 fZ = fFormula2.iterate(fZ)
               endif
               fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2)
             elseif @flavor == "Merge"
               fZ2 = fFormula2.Iterate(fZ2)
               fZ2 = (fZ2 + fTransform2.Iterate(fZ2)*@strength2)/(1+@strength2)
             endif
           endif
           notx = false
         endif
       elseif @combine == "Tx1 Fr1 Tx2 Fr2"
         if (iter >= @prestart && iter < (@prestart+@postend))&& @transform != NullTransform
           fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength)
           if iter1
             fZ = fFormula.iterate(fZ)
           endif
           if @dual
             if @flavor == "Sequence"
               fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength)
               if iter2
                 fZ = fFormula2.iterate(fZ)
               endif
             elseif @flavor == "Merge"
               fZ2 = (fZ2 + fTransform.Iterate(fZ2)*@strength)/(1+@strength)
               fZ2 = fFormula2.iterate(fZ2)
             endif
           endif
           notx = false
         endif
         if (iter >= @poststart && iter < (@poststart+@postend))&& @transform2 != NullTransform
           fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2)
           if iter1
             fZ = fFormula.iterate(fZ)
           endif
           if @dual
             if @flavor == "Sequence"
               fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2)
               if iter2
                 fZ = fFormula2.iterate(fZ)
               endif
             elseif @flavor == "Merge"
               fZ2 = (fZ2 + fTransform2.Iterate(fZ2)*@strength2)/(1+@strength2)
               fZ2 = fFormula2.Iterate(fZ2)
             endif
           endif
           notx = false
         endif
       elseif @combine == "Fr1 Tx1 Tx2 Fr2"
         if (iter >= @prestart && iter < (@prestart+@postend))&& @transform != NullTransform
           if iter1
             fZ = fFormula.iterate(fZ)
           endif
           fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength)
           if @dual
             if @flavor == "Sequence"
               if iter2
                 fZ = fFormula2.iterate(fZ)
               endif
               fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength)
             elseif @flavor == "Merge"
               fZ2 = fFormula2.iterate(fZ2)
               fZ2 = (fZ2 + fTransform.Iterate(fZ2)*@strength)/(1+@strength)
             endif
           endif
           notx = false
         endif
         if (iter >= @poststart && iter < (@poststart+@postend))&& @transform2 != NullTransform
           fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2)
           if iter1
             fZ = fFormula.iterate(fZ)
           endif
           if @dual
             if @flavor == "Sequence"
               fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2)
               if iter2
                 fZ = fFormula2.iterate(fZ)
               endif
             elseif @flavor == "Merge"
               fZ2 = (fZ2 + fTransform2.Iterate(fZ2)*@strength2)/(1+@strength2)
               fZ2 = fFormula2.Iterate(fZ2)
             endif
           endif
           notx = false
         endif
       elseif @combine == "Fr1 Tx1 Fr2 Tx2"
         if (iter >= @prestart && iter < (@prestart+@postend))&& @transform != NullTransform
           if iter1
             fZ = fFormula.iterate(fZ)
           endif
           fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength)
           if @dual
             if @flavor == "Sequence"
               if iter2
                 fZ = fFormula2.iterate(fZ)
               endif
               fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength)
             elseif @flavor == "Merge"
               fZ2 = fFormula2.iterate(fZ2)
               fZ2 = (fZ2 + fTransform.Iterate(fZ2)*@strength)/(1+@strength)
             endif
           endif
           notx = false
         endif
         if (iter >= @poststart && iter < (@poststart+@postend))&& @transform2 != NullTransform
           if iter1
             fZ = fFormula.iterate(fZ)
           endif
           fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2)
           if @dual
             if @flavor == "Sequence"
               if iter2
                 fZ = fFormula2.iterate(fZ)
               endif
               fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2)
             elseif @flavor == "Merge"
               fZ2 = fFormula2.Iterate(fZ2)
               fZ2 = (fZ2 + fTransform2.Iterate(fZ2)*@strength2)/(1+@strength2)
             endif
           endif
           notx = false
         endif
       endif
       if notx
         if iter1
           fZ = fFormula.iterate(fZ)
         endif
         if @dual
           if @flavor == "Sequence"
             if iter2
               fZ = fFormula2.iterate(fZ)
             endif
           elseif @flavor == "Merge"
             fZ2 = fFormula2.iterate(fZ2)
           endif
         endif
       endif
       iter = iter + 1
       if @dual && @flavor == "Merge"
         if @merget == "A+B"
           fZ = (fZ + fZ2)*@scale
         elseif @merget == "A+1/B"
           fZ = (fZ + 1/fZ2)*@scale
         elseif @merget == "1/A+B"
           fZ = (1/fZ + fZ2)*@scale
         elseif @merget == "A*B"
           fZ = (fZ*fZ2)*@scale
         elseif @merget == "A/B"
           fZ = (fZ/fZ2)*@scale
         elseif @merget == "B/A"
           fZ = (fZ2/fZ)*@scale
         elseif @merget == "Largest(A,B)"
           if cabs(fZ) < cabs(fZ2)
             fZ = fZ2
           endif
         elseif @merget == "Largest(A,1/B)"
           if cabs(fZ) < cabs(1/fZ2)
             fZ = fZ2
           endif
         elseif @merget == "Largest(1/A,B)"
           if cabs(1/fZ) < cabs(fZ2)
             fZ = fZ2
           endif
         elseif @merget == "Smallest(A,B)"
           if cabs(fZ) > cabs(fZ2)
             fZ = fZ2
           endif
         elseif @merget == "Smallest(A,1/B)"
           if cabs(fZ) > cabs(1/fZ2)
             fZ = fZ2
           endif
         elseif @merget == "Smallest(1/A,B)"
           if cabs(1/fZ) > cabs(fZ2)
             fZ = fZ2
           endif
         endif
       endif
     else
       fZ = fFormula.iterate(fZ)
     endif
 
 
     float d = fheight.Iterate(fZ)
     if d == -10000
       m_sflag = true
     endif
     if @tx
       d = cabs(fheight.GetTransformedPoint())
     endif
     if d < fMinDist && !m_sflag
       fMinDist = d
     endif
     if m_sflag
       if @formulaclass == DivergentFormula
          fIterz = fIterz + exp(-cabs(fZ))
       else
          fIterz = fIterz + exp(-1/(cabs(fOldz - fZ)))
       endif
     endif
     return fZ
   endfunc
 
   bool func IsBailedOut()
     return fFormula.IsBailedOut(fZ)
   endfunc
 
     ; determine continuous iteration (height)
   float func CalcHeight(int iter)
     float height = fMinDist
     if m_sflag
       height = fIterz
     endif
     return fTransfer.Iterate(height)
   endfunc
 
 private:
   Formula fFormula
   Formula fFormula2
   UserTransform fTransform
   UserTransform fTransform2
   float fMinDist
   Transfer fTransfer
   complex fZ
   complex fZ2
   TrapShape fheight
   bool m_sflag
   complex fOldz
   float fIterz
   int iter
   bool notx
   bool iter1
   bool iter2
   bool switch1
   bool switch2
 
 default:
   int param v_slopehelper
     caption = "Version (REB Slope Helper)"
     default = 101
     hint = "This version parameter is used to detect when a change has been made to the formula that is incompatible with the previous version. When that happens, this field will reflect the old version number to alert you to the fact that an alternate rendering is being used."
     visible = @v_slopehelper < 101
   endparam
   UserTransform param transform
     caption = "Pre transform"
     default = NullTransform
     expanded = false
     visible = @v_slopehelper >= 101
   endparam
   int param prestart
     caption = "Start Iter (Pre)"
     default = 0
     visible = @transform != NullTransform && @v_slopehelper >= 101
   endparam
   int param preend
     caption = "Iterations (Pre)"
     default = 1
     visible = @transform != NullTransform && @v_slopehelper >= 101
   endparam
   float param strength
     caption = "Strength (Pre)"
     default = 1
     visible = @transform != NullTransform && @v_slopehelper >= 101
   endparam
   bool param dual
     caption = "Use dual formulas"
     default = false
     visible =  @v_slopehelper >= 101
   endparam
   param combine
     caption = "Combine Order"
     default = 0
     enum ="Tx1 Fr1 Fr2 Tx2" "Tx1 Fr1 Tx2 Fr2" "Fr1 Tx1 Tx2 Fr2" "Fr1 Tx1 Fr2 Tx2"
     visible = @dual && @v_slopehelper >= 101
   endparam
   param flavor
     caption = "Combine Type"
     default = 0
     enum = "Sequence" "Merge"
     visible = @dual && @v_slopehelper >= 101
   endparam
   param seqmethod
     caption = "Sequence method"
     default = 0
     enum = "Default" "By Iter Value"
     visible = @dual  && @flavor == "Sequence"  && @v_slopehelper >= 101 \
                 && @formulaclass != REB_Slope
   endparam
   int param seqgap1
     caption = "Iteration cycle"
     default = 4
     visible = @dual && @flavor == "Sequence"   && @formulaclass != REB_Slope &&\
               @seqmethod == "By Iter Value"  && @v_slopehelper >= 101
   endparam
   heading
     text = "'Formula 1 iters' must be less than or equal to the 'Iteration cycle' \
             Out of range values will be truncated to the size of the 'Iteration \
             cycle'."
     visible = @dual  && @formulaclass != REB_Slope && @flavor == "Sequence" \
               && @seqmethod == "By Iter Value"
   endheading
   int param seqgap2
     caption = "Formula 1 Iters"
     default = 2
     visible = @dual  && @formulaclass != REB_Slope && @flavor == "Sequence" \
               && @seqmethod == "By Iter Value"
   endparam
   param merget
     caption = "Merge Type"
     default = 0
     enum = "A+B" "A+1/B" "1/A+B" "A*B" "A/B" "B/A" "Largest(A,B)" "Largest(A,1/B)"\
             "Largest(1/A,B)" "Smallest(A,B)" "Smallest(A,1/B)" "Smallest(1/A,B)"
     visible = @dual && @flavor == "Merge"  && @v_slopehelper >= 101
   endparam
   float param scale
     caption = "Merge Scale"
     default = 1.0
     visible = @dual && @flavor == "Merge" && (@merget == "A+B" || @merget == "A+1/B" \
               || @merget == "1/A+B" || @merget == "A*B" || @merget == "A/B" || \
               @merget == "B/A" ) && @v_slopehelper >= 101
   endparam
   Formula param formulaClass
     caption = "Fractal Formula"
     default = REB_Julia
   endparam
   Formula param formulaClass2
     caption = "Fractal Formula"
     default = REB_IkenagaJulia
     visible = @dual && @v_slopehelper >= 101
   endparam
   UserTransform param transform2
     caption = "Post transform"
     default = NullTransform
     expanded = false
     visible = @v_slopehelper >= 101
   endparam
   int param poststart
     caption = "Start Iter (Post)"
     default = 0
     visible = @transform2 != NullTransform  && @v_slopehelper >= 101
   endparam
   int param postend
     caption = "Iterations (Post)"
     default = 1
     visible = @transform2 != NullTransform  && @v_slopehelper >= 101
   endparam
   float param strength2
     caption = "Strength (Post)"
     default = 1
     visible = @transform2 != NullTransform && @v_slopehelper >= 101
   endparam
   TrapShape param heightvalue
     caption = "Height value"
     default = REB_TrapShapeSlopeBasic
   endparam
   Transfer param transferclass
     caption = "Height Transfer"
     default = Standard_HeightTransfer
     hint = "Selects a class that can transform the calculated height value."
     expanded = false
   endparam
   bool param tx
     caption = "Use transformed value"
     default = false
     visible = @heightvalue !=  REB_TrapShapeSlopeBasic
   endparam
 }
 


Constructor Summary
REB_SlopeHelper()
           
REB_SlopeHelper(REB_Slope owner)
          constructor
 
Method Summary
 float CalcHeight(int iter)
          determine continuous iteration (height)
 complex Init(complex pz)
          initialize the object
 boolean IsBailedOut()
           
 complex Iterate()
          call for each iterated point
 
Methods inherited from class Object
 

Constructor Detail

REB_SlopeHelper

public REB_SlopeHelper(REB_Slope owner)
constructor


REB_SlopeHelper

public REB_SlopeHelper()
Method Detail

Init

public complex Init(complex pz)
initialize the object


Iterate

public complex Iterate()
call for each iterated point


IsBailedOut

public boolean IsBailedOut()

CalcHeight

public float CalcHeight(int iter)
determine continuous iteration (height)