📄 fractals.c
字号:
/*
MarksMandelPwr (XAXIS) {
z = pixel, c = z ^ (z - 1):
z = c * sqr(z) + pixel,
|z| <= 4
}
*/
MarksMandelPwrfpFractal()
{
CMPLXtrig0(old,new);
CMPLXmult(tmp,new,new);
new.x += floatparm->x;
new.y += floatparm->y;
return(floatbailout());
}
MarksMandelPwrFractal()
{
#ifndef XFRACT
LCMPLXtrig0(lold,lnew);
LCMPLXmult(ltmp,lnew,lnew);
lnew.x += longparm->x;
lnew.y += longparm->y;
return(longbailout());
#endif
}
/* I was coding Marksmandelpower and failed to use some temporary
variables. The result was nice, and since my name is not on any fractal,
I thought I would immortalize myself with this error!
Tim Wegner */
TimsErrorfpFractal()
{
CMPLXtrig0(old,new);
new.x = new.x * tmp.x - new.y * tmp.y;
new.y = new.x * tmp.y - new.y * tmp.x;
new.x += floatparm->x;
new.y += floatparm->y;
return(floatbailout());
}
TimsErrorFractal()
{
#ifndef XFRACT
LCMPLXtrig0(lold,lnew);
lnew.x = multiply(lnew.x,ltmp.x,bitshift)-multiply(lnew.y,ltmp.y,bitshift);
lnew.y = multiply(lnew.x,ltmp.y,bitshift)-multiply(lnew.y,ltmp.x,bitshift);
lnew.x += longparm->x;
lnew.y += longparm->y;
return(longbailout());
#endif
}
CirclefpFractal()
{
extern int colors;
extern int color;
int i;
i = param[0]*(tempsqrx+tempsqry);
color = i&(colors-1);
return(1);
}
/*
CirclelongFractal()
{
extern int colors;
extern int color;
long i;
i = multiply(lparm.x,(ltempsqrx+ltempsqry),bitshift);
i = i >> bitshift;
color = i&(colors-1);
return(1);
}
*/
/* -------------------------------------------------------------------- */
/* Initialization (once per pixel) routines */
/* -------------------------------------------------------------------- */
#ifdef XFRACT
/* this code translated to asm - lives in newton.asm */
/* transform points with reciprocal function */
void invertz2(_CMPLX *z)
{
z->x = dx0[col]+dx1[row];
z->y = dy0[row]+dy1[col];
z->x -= f_xcenter; z->y -= f_ycenter; /* Normalize values to center of circle */
tempsqrx = sqr(z->x) + sqr(z->y); /* Get old radius */
if(fabs(tempsqrx) > FLT_MIN)
tempsqrx = f_radius / tempsqrx;
else
tempsqrx = FLT_MAX; /* a big number, but not TOO big */
z->x *= tempsqrx; z->y *= tempsqrx; /* Perform inversion */
z->x += f_xcenter; z->y += f_ycenter; /* Renormalize */
}
#endif
int long_julia_per_pixel()
{
#ifndef XFRACT
/* integer julia types */
/* lambda */
/* barnsleyj1 */
/* barnsleyj2 */
/* sierpinski */
if(invert)
{
/* invert */
invertz2(&old);
/* watch out for overflow */
if(sqr(old.x)+sqr(old.y) >= 127)
{
old.x = 8; /* value to bail out in one iteration */
old.y = 8;
}
/* convert to fudged longs */
lold.x = old.x*fudge;
lold.y = old.y*fudge;
}
else
{
lold.x = lx0[col]+lx1[row];
lold.y = ly0[row]+ly1[col];
}
return(0);
#else
printf("Called long_julia_per_pixel\n");
exit(0);
#endif
}
int long_richard8_per_pixel()
{
#ifndef XFRACT
long_mandel_per_pixel();
LCMPLXtrig1(*longparm,ltmp);
LCMPLXmult(ltmp,lparm2,ltmp);
return(1);
#endif
}
int long_mandel_per_pixel()
{
#ifndef XFRACT
/* integer mandel types */
/* barnsleym1 */
/* barnsleym2 */
linit.x = lx0[col]+lx1[row];
if(invert)
{
/* invert */
invertz2(&init);
/* watch out for overflow */
if(sqr(init.x)+sqr(init.y) >= 127)
{
init.x = 8; /* value to bail out in one iteration */
init.y = 8;
}
/* convert to fudged longs */
linit.x = init.x*fudge;
linit.y = init.y*fudge;
}
if(useinitorbit == 1)
lold = linitorbit;
else
lold = linit;
lold.x += lparm.x; /* initial pertubation of parameters set */
lold.y += lparm.y;
return(1); /* 1st iteration has been done */
#else
printf("Called long_mandel_per_pixel\n");
exit(0);
#endif
}
int julia_per_pixel()
{
/* julia */
if(invert)
{
/* invert */
invertz2(&old);
/* watch out for overflow */
if(bitshift <= 24)
if (sqr(old.x)+sqr(old.y) >= 127)
{
old.x = 8; /* value to bail out in one iteration */
old.y = 8;
}
if(bitshift > 24)
if (sqr(old.x)+sqr(old.y) >= 4.0)
{
old.x = 2; /* value to bail out in one iteration */
old.y = 2;
}
/* convert to fudged longs */
lold.x = old.x*fudge;
lold.y = old.y*fudge;
}
else
{
lold.x = lx0[col]+lx1[row];
lold.y = ly0[row]+ly1[col];
}
ltempsqrx = multiply(lold.x, lold.x, bitshift);
ltempsqry = multiply(lold.y, lold.y, bitshift);
ltmp = lold;
return(0);
}
marks_mandelpwr_per_pixel()
{
#ifndef XFRACT
mandel_per_pixel();
ltmp = lold;
ltmp.x -= fudge;
LCMPLXpwr(lold,ltmp,ltmp);
return(1);
#endif
}
int mandel_per_pixel()
{
/* mandel */
if(invert)
{
invertz2(&init);
/* watch out for overflow */
if(bitshift <= 24)
if (sqr(init.x)+sqr(init.y) >= 127)
{
init.x = 8; /* value to bail out in one iteration */
init.y = 8;
}
if(bitshift > 24)
if (sqr(init.x)+sqr(init.y) >= 4)
{
init.x = 2; /* value to bail out in one iteration */
init.y = 2;
}
/* convert to fudged longs */
linit.x = init.x*fudge;
linit.y = init.y*fudge;
}
else
linit.x = lx0[col]+lx1[row];
switch (fractype)
{
case MANDELLAMBDA: /* Critical Value 0.5 + 0.0i */
lold.x = FgHalf;
lold.y = 0;
break;
default:
lold = linit;
break;
}
/* alter init value */
if(useinitorbit == 1)
lold = linitorbit;
else if(useinitorbit == 2)
lold = linit;
if(inside == -60 || inside == -61)
{
/* kludge to match "Beauty of Fractals" picture since we start
Mandelbrot iteration with init rather than 0 */
lold.x = lparm.x; /* initial pertubation of parameters set */
lold.y = lparm.y;
color = -1;
}
else
{
lold.x += lparm.x; /* initial pertubation of parameters set */
lold.y += lparm.y;
}
ltmp = linit; /* for spider */
ltempsqrx = multiply(lold.x, lold.x, bitshift);
ltempsqry = multiply(lold.y, lold.y, bitshift);
return(1); /* 1st iteration has been done */
}
int marksmandel_per_pixel()
{
/* marksmandel */
if(invert)
{
invertz2(&init);
/* watch out for overflow */
if(sqr(init.x)+sqr(init.y) >= 127)
{
init.x = 8; /* value to bail out in one iteration */
init.y = 8;
}
/* convert to fudged longs */
linit.x = init.x*fudge;
linit.y = init.y*fudge;
}
else
linit.x = lx0[col]+lx1[row];
if(useinitorbit == 1)
lold = linitorbit;
else
lold = linit;
lold.x += lparm.x; /* initial pertubation of parameters set */
lold.y += lparm.y;
if(c_exp > 3)
lcpower(&lold,c_exp-1,&lcoefficient,bitshift);
else if(c_exp == 3) {
lcoefficient.x = multiply(lold.x, lold.x, bitshift)
- multiply(lold.y, lold.y, bitshift);
lcoefficient.y = multiply(lold.x, lold.y, bitshiftless1);
}
else if(c_exp == 2)
lcoefficient = lold;
else if(c_exp < 2) {
lcoefficient.x = 1L << bitshift;
lcoefficient.y = 0L;
}
ltempsqrx = multiply(lold.x, lold.x, bitshift);
ltempsqry = multiply(lold.y, lold.y, bitshift);
return(1); /* 1st iteration has been done */
}
int marksmandelfp_per_pixel()
{
/* marksmandel */
if(invert)
invertz2(&init);
else
init.x = dx0[col]+dx1[row];
if(useinitorbit == 1)
old = initorbit;
else
old = init;
old.x += parm.x; /* initial pertubation of parameters set */
old.y += parm.y;
tempsqrx = sqr(old.x);
tempsqry = sqr(old.y);
if(c_exp > 3)
cpower(&old,c_exp-1,&coefficient);
else if(c_exp == 3) {
coefficient.x = tempsqrx - tempsqry;
coefficient.y = old.x * old.y * 2;
}
else if(c_exp == 2)
coefficient = old;
else if(c_exp < 2) {
coefficient.x = 1.0;
coefficient.y = 0.0;
}
return(1); /* 1st iteration has been done */
}
marks_mandelpwrfp_per_pixel()
{
mandelfp_per_pixel();
tmp = old;
tmp.x -= 1;
CMPLXpwr(old,tmp,tmp);
return(1);
}
int mandelfp_per_pixel()
{
/* floating point mandelbrot */
/* mandelfp */
if(invert)
invertz2(&init);
else
init.x = dx0[col]+dx1[row];
switch (fractype)
{
case MAGNET2M:
FloatPreCalcMagnet2();
case MAGNET1M: /* Crit Val Zero both, but neither */
old.x = old.y = 0.0; /* is of the form f(Z,C) = Z*g(Z)+C */
break;
case MANDELLAMBDAFP: /* Critical Value 0.5 + 0.0i */
old.x = 0.5;
old.y = 0.0;
break;
default:
old = init;
break;
}
/* alter init value */
if(useinitorbit == 1)
old = initorbit;
else if(useinitorbit == 2)
old = init;
if(inside == -60 || inside == -61)
{
/* kludge to match "Beauty of Fractals" picture since we start
Mandelbrot iteration with init rather than 0 */
old.x = parm.x; /* initial pertubation of parameters set */
old.y = parm.y;
color = -1;
}
else
{
old.x += parm.x;
old.y += parm.y;
}
tmp = init; /* for spider */
tempsqrx = sqr(old.x); /* precalculated value for regular Mandelbrot */
tempsqry = sqr(old.y);
return(1); /* 1st iteration has been done */
}
int juliafp_per_pixel()
{
/* floating point julia */
/* juliafp */
if(invert)
invertz2(&old);
else
{
old.x = dx0[col]+dx1[row];
old.y = dy0[row]+dy1[col];
}
tempsqrx = sqr(old.x); /* precalculated value for regular Julia */
tempsqry = sqr(old.y);
tmp = old;
return(0);
}
int MPCjulia_per_pixel()
{
#ifndef XFRACT
/* floating point julia */
/* juliafp */
if(invert)
invertz2(&old);
else
{
old.x = dx0[col]+dx1[row];
old.y = dy0[row]+dy1[col];
}
mpcold.x = *pd2MP(old.x);
mpcold.y = *pd2MP(old.y);
return(0);
#endif
}
otherrichard8fp_per_pixel()
{
othermandelfp_per_pixel(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -