|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
Object jlb:JLB_SlopeHelper
class
Helper class for JLB_SlopeWithShapes.
Makes possible the use of any object formula with JLB_SlopeWithShapes. Works for both
convergent and divergent formulas. Manages height values as trap shapes.
class JLB_SlopeHelper { ; Helper class for JLB_SlopeWithShapes. <br> ; <p> ; Makes possible the use of any object formula with JLB_SlopeWithShapes. Works for both ; convergent and divergent formulas. Manages height values as trap shapes. public: import "common.ulb" import "Standard.ulb" import "reb.ulb" import "mmf.ulb" ; constructor func JLB_SlopeHelper(JLB_SlopeWithShapes owner) fContraction = new @ContractionClass(owner) fContraction2 = new @ContractionClass2(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, complex pc) fContraction.Init(pz, pc) fZ = pz ; Contraction.Init has no return value if @dual fContraction2.Init(pz, pc) fZ2 = 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(complex fC) 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 = fContraction.iterate(fZ, fC) endif if @dual if @flavor == "Sequence" fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength) if iter2 fZ = fContraction2.iterate(fZ, fC) endif elseif @flavor == "Merge" fZ2 = (fZ2 + fTransform.Iterate(fZ2)*@strength)/(1+@strength) fZ2 = fContraction2.iterate(fZ2, fC) endif endif notx = false endif if (iter >= @poststart && iter < (@poststart+@postend))&& @transform2 != NullTransform if iter1 fZ = fContraction.iterate(fZ, fC) endif fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2) if @dual if @flavor == "Sequence" if iter2 fZ = fContraction2.iterate(fZ, fC) endif fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2) elseif @flavor == "Merge" fZ2 = fContraction2.Iterate(fZ2, fC) 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 = fContraction.iterate(fZ, fC) endif if @dual if @flavor == "Sequence" fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength) if iter2 fZ = fContraction2.iterate(fZ, fC) endif elseif @flavor == "Merge" fZ2 = (fZ2 + fTransform.Iterate(fZ2)*@strength)/(1+@strength) fZ2 = fContraction2.iterate(fZ2, fC) endif endif notx = false endif if (iter >= @poststart && iter < (@poststart+@postend))&& @transform2 != NullTransform fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2) if iter1 fZ = fContraction.iterate(fZ, fC) endif if @dual if @flavor == "Sequence" fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2) if iter2 fZ = fContraction2.iterate(fZ, fC) endif elseif @flavor == "Merge" fZ2 = (fZ2 + fTransform2.Iterate(fZ2)*@strength2)/(1+@strength2) fZ2 = fContraction2.Iterate(fZ2, fC) endif endif notx = false endif elseif @combine == "Fr1 Tx1 Tx2 Fr2" if (iter >= @prestart && iter < (@prestart+@postend))&& @transform != NullTransform if iter1 fZ = fContraction.iterate(fZ, fC) endif fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength) if @dual if @flavor == "Sequence" if iter2 fZ = fContraction2.iterate(fZ, fC) endif fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength) elseif @flavor == "Merge" fZ2 = fContraction2.iterate(fZ2, fC) 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 = fContraction.iterate(fZ, fC) endif if @dual if @flavor == "Sequence" fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2) if iter2 fZ = fContraction2.iterate(fZ, fC) endif elseif @flavor == "Merge" fZ2 = (fZ2 + fTransform2.Iterate(fZ2)*@strength2)/(1+@strength2) fZ2 = fContraction2.Iterate(fZ2, fC) endif endif notx = false endif elseif @combine == "Fr1 Tx1 Fr2 Tx2" if (iter >= @prestart && iter < (@prestart+@postend))&& @transform != NullTransform if iter1 fZ = fContraction.iterate(fZ, fC) endif fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength) if @dual if @flavor == "Sequence" if iter2 fZ = fContraction2.iterate(fZ, fC) endif fZ = (fZ + fTransform.Iterate(fZ)*@strength)/(1+@strength) elseif @flavor == "Merge" fZ2 = fContraction2.iterate(fZ2, fC) fZ2 = (fZ2 + fTransform.Iterate(fZ2)*@strength)/(1+@strength) endif endif notx = false endif if (iter >= @poststart && iter < (@poststart+@postend))&& @transform2 != NullTransform if iter1 fZ = fContraction.iterate(fZ, fC) endif fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2) if @dual if @flavor == "Sequence" if iter2 fZ = fContraction2.iterate(fZ, fC) endif fZ = (fZ + fTransform2.Iterate(fZ)*@strength2)/(1+@strength2) elseif @flavor == "Merge" fZ2 = fContraction2.Iterate(fZ2, fC) fZ2 = (fZ2 + fTransform2.Iterate(fZ2)*@strength2)/(1+@strength2) endif endif notx = false endif endif if notx if iter1 fZ = fContraction.iterate(fZ, fC) endif if @dual if @flavor == "Sequence" if iter2 fZ = fContraction2.iterate(fZ, fC) endif elseif @flavor == "Merge" fZ2 = fContraction2.iterate(fZ2, fC) 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 = fContraction.iterate(fZ, fC) 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 @ContractionClass == 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: Contraction fContraction Contraction fContraction2 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 (JLB 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 \ ; && @ContractionClass != JLB_SlopeWithShapes visible = @dual && @flavor == "Sequence" && @v_slopehelper >= 101 endparam int param seqgap1 caption = "Iteration cycle" default = 4 ; visible = @dual && @flavor == "Sequence" && @ContractionClass != JLB_SlopeWithShapes &&\ ; @seqmethod == "By Iter Value" && @v_slopehelper >= 101 visible = @dual && @flavor == "Sequence" && \ @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 && @ContractionClass != JLB_SlopeWithShapes && @flavor == "Sequence" \ ; && @seqmethod == "By Iter Value" visible = @dual && @flavor == "Sequence" \ && @seqmethod == "By Iter Value" endheading int param seqgap2 caption = "Formula 1 Iters" default = 2 ; visible = @dual && @ContractionClass != JLB_SlopeWithShapes && @flavor == "Sequence" \ ; && @seqmethod == "By Iter Value" visible = @dual && @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 Contraction param ContractionClass caption = "Fractal Formula" default = JLB_MandelbrotContraction endparam Contraction param ContractionClass2 caption = "Fractal Formula 2" default = JLB_IkenagaContraction 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 | |
---|---|
JLB_SlopeHelper()
|
|
JLB_SlopeHelper(JLB_SlopeWithShapes owner)
constructor |
Method Summary | |
---|---|
float |
CalcHeight(int iter)
return fFormula.IsBailedOut(fZ) endfunc determine continuous iteration (height) |
complex |
Init(complex pz,
complex pc)
initialize the object |
complex |
Iterate(complex fC)
call for each iterated point |
Methods inherited from class Object |
---|
|
Constructor Detail |
---|
public JLB_SlopeHelper(JLB_SlopeWithShapes owner)
public JLB_SlopeHelper()
Method Detail |
---|
public complex Init(complex pz, complex pc)
public complex Iterate(complex fC)
public float CalcHeight(int iter)
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |