Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}