1 /** 2 * Mandelbulber v2, a 3D fractal generator _%}}i*<. ______ 3 * Copyright (C) 2020 Mandelbulber Team _>]|=||i=i<, / ____/ __ __ 4 * \><||i|=>>%) / / __/ /___/ /_ 5 * This file is part of Mandelbulber. )<=i=]=|=i<> / /__ /_ __/_ __/ 6 * The project is licensed under GPLv3, -<>>=|><|||` \____/ /_/ /_/ 7 * see also COPYING file in this folder. ~+{i%+++ 8 * 9 * Hybrid of Mandelbox and Mandelbulb power 2 with scaling of z axis 10 */ 11 12 #include "all_fractal_definitions.h" 13 cFractalBoxFoldBulbPow2()14cFractalBoxFoldBulbPow2::cFractalBoxFoldBulbPow2() : cAbstractFractal() 15 { 16 nameInComboBox = "Box Fold Bulb Pow 2"; 17 internalName = "box_fold_bulb_pow2"; 18 internalID = fractal::boxFoldBulbPow2; 19 DEType = deltaDEType; 20 DEFunctionType = linearDEFunction; 21 cpixelAddition = cpixelEnabledByDefault; 22 defaultBailout = 10000.0; 23 DEAnalyticFunction = analyticFunctionNone; 24 coloringFunction = coloringFunctionDefault; 25 } 26 FormulaCode(CVector4 & z,const sFractal * fractal,sExtendedAux & aux)27void cFractalBoxFoldBulbPow2::FormulaCode(CVector4 &z, const sFractal *fractal, sExtendedAux &aux) 28 { 29 (void)aux; 30 if (fabs(z.x) > fractal->foldingIntPow.foldFactor) 31 z.x = sign(z.x) * fractal->foldingIntPow.foldFactor * 2.0 - z.x; 32 if (fabs(z.y) > fractal->foldingIntPow.foldFactor) 33 z.y = sign(z.y) * fractal->foldingIntPow.foldFactor * 2.0 - z.y; 34 if (fabs(z.z) > fractal->foldingIntPow.foldFactor) 35 z.z = sign(z.z) * fractal->foldingIntPow.foldFactor * 2.0 - z.z; 36 37 double fR2_2 = 1.0; 38 double mR2_2 = 0.25; 39 double r2_2 = z.Dot(z); 40 double tglad_factor1_2 = fR2_2 / mR2_2; 41 42 if (r2_2 < mR2_2) 43 { 44 z = z * tglad_factor1_2; 45 aux.DE *= tglad_factor1_2; 46 } 47 else if (r2_2 < fR2_2) 48 { 49 double tglad_factor2_2 = fR2_2 / r2_2; 50 z = z * tglad_factor2_2; 51 aux.DE *= tglad_factor2_2; 52 } 53 54 z = z * 2.0; 55 double x2 = z.x * z.x; 56 double y2 = z.y * z.y; 57 double z2 = z.z * z.z; 58 double temp = 1.0 - z2 / (x2 + y2); 59 CVector4 zTemp; 60 zTemp.x = (x2 - y2) * temp; 61 zTemp.y = 2.0 * z.x * z.y * temp; 62 zTemp.z = -2.0 * z.z * sqrt(x2 + y2); 63 zTemp.w = z.w; 64 z = zTemp; 65 z.z *= fractal->foldingIntPow.zFactor; 66 // analyticDE controls 67 if (fractal->analyticDE.enabledFalse) 68 { 69 aux.DE = (aux.DE + 1.0) * 5.0 * aux.r * fractal->analyticDE.scale1 70 * sqrt(fractal->foldingIntPow.zFactor * fractal->foldingIntPow.zFactor + 2.0 71 + fractal->analyticDE.offset2) 72 + fractal->analyticDE.offset1; 73 } 74 // INFO remark: changed sequence of operation. 75 // adding of C constant was before multiplying by z-factor 76 } 77