void Normal_Calc_HCompl(VECTOR Result, int N_Max, const Fractal *, DBL **IterStack) { DBL n1, n2, n3, n4; int i; DBL x, y, z, w; DBL xx, yy, zz, ww; DBL Pow; /* * Algebraic properties of hypercomplexes allows simplifications in * computations... */ x = IterStack[X][0]; y = IterStack[Y][0]; z = IterStack[Z][0]; w = IterStack[W][0]; Pow = 2.0; for (i = 1; i < N_Max; ++i) { /* * For a map z->f(z), f depending on c, one must perform here : * * (x,y,z,w) * df/dz(IterStack[X][i],IterStack[Y][i],IterStack[Z][i],IterStack[W][i]) -> (x,y,z,w) , * * up to a constant. */ /******************* Case z->z^2+c *****************/ /* the df/dz part needs no work */ HMult(xx, yy, zz, ww, IterStack[X][i], IterStack[Y][i], IterStack[Z][i], IterStack[W][i], x, y, z, w); w = ww; z = zz; y = yy; x = xx; Pow *= 2.0; } n1 = IterStack[X][N_Max] * Pow; n2 = IterStack[Y][N_Max] * Pow; n3 = IterStack[Z][N_Max] * Pow; n4 = IterStack[W][N_Max] * Pow; Result[X] = x * n1 + y * n2 + z * n3 + w * n4; Result[Y] = -y * n1 + x * n2 - w * n3 + z * n4; Result[Z] = -z * n1 - w * n2 + x * n3 + y * n4; }
void Normal_Calc_HCompl_Reciprocal(VECTOR Result, int N_Max, const Fractal *, DBL **IterStack) { DBL n1, n2, n3, n4; int i; DBL x, y, z, w; DBL xx, yy, zz, ww; DBL xxx, yyy, zzz, www; /* * Algebraic properties of hypercomplexes allows simplifications in * computations... */ x = IterStack[X][0]; y = IterStack[Y][0]; z = IterStack[Z][0]; w = IterStack[W][0]; for (i = 1; i < N_Max; ++i) { /******************* Case: z->1/z+c *****************/ HReciprocal(&xx, &yy, &zz, &ww, IterStack[X][i], IterStack[Y][i], IterStack[Z][i], IterStack[W][i]); HSqr(xxx, yyy, zzz, www, xx, yy, zz, ww); HMult(xx, yy, zz, ww, x, y, z, w, -xxx, -yyy, -zzz, -www); x = xx; y = yy; z = zz; w = ww; } n1 = IterStack[X][N_Max]; n2 = IterStack[Y][N_Max]; n3 = IterStack[Z][N_Max]; n4 = IterStack[W][N_Max]; Result[X] = x * n1 + y * n2 + z * n3 + w * n4; Result[Y] = -y * n1 + x * n2 - w * n3 + z * n4; Result[Z] = -z * n1 - w * n2 + x * n3 + y * n4; }
void HypercomplexFunctionFractalRules::CalcNormal(Vector3d& Result, int N_Max, const Fractal *fractal, DBL **IterStack) const { DBL n1, n2, n3, n4; int i; DBL x, y, z, w; DBL xx, yy, zz, ww; DBL xxx, yyy, zzz, www; /* * Algebraic properties of hypercomplexes allows simplifications in * computations... */ x = IterStack[X][0]; y = IterStack[Y][0]; z = IterStack[Z][0]; w = IterStack[W][0]; for (i = 1; i < N_Max; ++i) { /**************** Case: z-> f(z)+c ************************/ HFunc(&xx, &yy, &zz, &ww, IterStack[X][i], IterStack[Y][i], IterStack[Z][i], IterStack[W][i], fractal); HMult(xxx, yyy, zzz, www, xx, yy, zz, ww, x, y, z, w); x = xxx; y = yyy; z = zzz; w = www; } n1 = IterStack[X][N_Max]; n2 = IterStack[Y][N_Max]; n3 = IterStack[Z][N_Max]; n4 = IterStack[W][N_Max]; Result[X] = x * n1 + y * n2 + z * n3 + w * n4; Result[Y] = -y * n1 + x * n2 - w * n3 + z * n4; Result[Z] = -z * n1 - w * n2 + x * n3 + y * n4; }