diff options
author | Lars-Dominik Braun <lars@6xq.net> | 2015-05-02 21:36:31 +0200 |
---|---|---|
committer | Lars-Dominik Braun <lars@6xq.net> | 2015-05-02 21:36:31 +0200 |
commit | b2dfbdf4d9644c684c938cb2730deab66aa06d9b (patch) | |
tree | 2710c26a94f8c85887389619682892363303f9db /src/variations.c | |
parent | fb1c90e18b0d77a8b4035461722b89c7db46db51 (diff) | |
download | pucket-b2dfbdf4d9644c684c938cb2730deab66aa06d9b.tar.gz pucket-b2dfbdf4d9644c684c938cb2730deab66aa06d9b.tar.bz2 pucket-b2dfbdf4d9644c684c938cb2730deab66aa06d9b.zip |
Move out of subdir
Diffstat (limited to 'src/variations.c')
-rw-r--r-- | src/variations.c | 2566 |
1 files changed, 0 insertions, 2566 deletions
diff --git a/src/variations.c b/src/variations.c deleted file mode 100644 index cc5c4c3..0000000 --- a/src/variations.c +++ /dev/null @@ -1,2566 +0,0 @@ -/* - FLAM3 - cosmic recursive fractal flames - Copyright (C) 1992-2009 Spotworks LLC - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include "variations.h" -#include "interpolation.h" - -#define badvalue(x) (((x)!=(x))||((x)>1e10)||((x)<-1e10)) - -/* Wrap the sincos function for Macs */ -#if defined(__APPLE__) || defined(_MSC_VER) -#define sincos(x,s,c) *(s)=sin(x); *(c)=cos(x); -#else -extern void sincos(double x, double *s, double *c); -#endif - -#ifdef _MSC_VER -#define trunc (int) -#endif - -char *flam3_variation_names[1+flam3_nvariations] = { - "linear", - "sinusoidal", - "spherical", - "swirl", - "horseshoe", - "polar", - "handkerchief", - "heart", - "disc", - "spiral", - "hyperbolic", - "diamond", - "ex", - "julia", - "bent", - "waves", - "fisheye", - "popcorn", - "exponential", - "power", - "cosine", - "rings", - "fan", - "blob", - "pdj", - "fan2", - "rings2", - "eyefish", - "bubble", - "cylinder", - "perspective", - "noise", - "julian", - "juliascope", - "blur", - "gaussian_blur", - "radial_blur", - "pie", - "ngon", - "curl", - "rectangles", - "arch", - "tangent", - "square", - "rays", - "blade", - "secant2", - "twintrian", - "cross", - "disc2", - "super_shape", - "flower", - "conic", - "parabola", - "bent2", - "bipolar", - "boarders", - "butterfly", - "cell", - "cpow", - "curve", - "edisc", - "elliptic", - "escher", - "foci", - "lazysusan", - "loonie", - "pre_blur", - "modulus", - "oscilloscope", - "polar2", - "popcorn2", - "scry", - "separation", - "split", - "splits", - "stripes", - "wedge", - "wedge_julia", - "wedge_sph", - "whorl", - "waves2", - "exp", - "log", - "sin", - "cos", - "tan", - "sec", - "csc", - "cot", - "sinh", - "cosh", - "tanh", - "sech", - "csch", - "coth", - "auger", - "flux", - "mobius", - 0 -}; - -/* - * VARIATION FUNCTIONS - * must be of the form void (void *, double) - */ -void var0_linear (flam3_iter_helper *f, double weight) { - /* linear */ - /* nx = tx; - ny = ty; - p[0] += v * nx; - p[1] += v * ny; */ - - f->p0 += weight * f->tx; - f->p1 += weight * f->ty; -} - -void var1_sinusoidal (flam3_iter_helper *f, double weight) { - /* sinusoidal */ - /* nx = sin(tx); - ny = sin(ty); - p[0] += v * nx; - p[1] += v * ny; */ - - f->p0 += weight * sin(f->tx); - f->p1 += weight * sin(f->ty); -} - -void var2_spherical (flam3_iter_helper *f, double weight) { - /* spherical */ - /* double r2 = tx * tx + ty * ty + 1e-6; - nx = tx / r2; - ny = ty / r2; - p[0] += v * nx; - p[1] += v * ny; */ - - double r2 = weight / ( f->precalc_sumsq + EPS); - - f->p0 += r2 * f->tx; - f->p1 += r2 * f->ty; -} - -void var3_swirl (flam3_iter_helper *f, double weight) { - /* swirl */ - /* double r2 = tx * tx + ty * ty; /k here is fun - double c1 = sin(r2); - double c2 = cos(r2); - nx = c1 * tx - c2 * ty; - ny = c2 * tx + c1 * ty; - p[0] += v * nx; - p[1] += v * ny; */ - - double r2 = f->precalc_sumsq; - double c1,c2; - double nx,ny; - - sincos(r2,&c1,&c2); -// double c1 = sin(r2); -// double c2 = cos(r2); - nx = c1 * f->tx - c2 * f->ty; - ny = c2 * f->tx + c1 * f->ty; - - f->p0 += weight * nx; - f->p1 += weight * ny; -} - -void var4_horseshoe (flam3_iter_helper *f, double weight) { - /* horseshoe */ - /* a = atan2(tx, ty); - c1 = sin(a); - c2 = cos(a); - nx = c1 * tx - c2 * ty; - ny = c2 * tx + c1 * ty; - p[0] += v * nx; - p[1] += v * ny; */ - - double r = weight / (f->precalc_sqrt + EPS); - - f->p0 += (f->tx - f->ty) * (f->tx + f->ty) * r; - f->p1 += 2.0 * f->tx * f->ty * r; -} - -void var5_polar (flam3_iter_helper *f, double weight) { - /* polar */ - /* nx = atan2(tx, ty) / M_PI; - ny = sqrt(tx * tx + ty * ty) - 1.0; - p[0] += v * nx; - p[1] += v * ny; */ - - double nx = f->precalc_atan * M_1_PI; - double ny = f->precalc_sqrt - 1.0; - - f->p0 += weight * nx; - f->p1 += weight * ny; -} - -void var6_handkerchief (flam3_iter_helper *f, double weight) { - /* folded handkerchief */ - /* a = atan2(tx, ty); - r = sqrt(tx*tx + ty*ty); - p[0] += v * sin(a+r) * r; - p[1] += v * cos(a-r) * r; */ - - double a = f->precalc_atan; - double r = f->precalc_sqrt; - - f->p0 += weight * r * sin(a+r); - f->p1 += weight * r * cos(a-r); -} - -void var7_heart (flam3_iter_helper *f, double weight) { - /* heart */ - /* a = atan2(tx, ty); - r = sqrt(tx*tx + ty*ty); - a *= r; - p[0] += v * sin(a) * r; - p[1] += v * cos(a) * -r; */ - - double a = f->precalc_sqrt * f->precalc_atan; - double ca,sa; - double r = weight * f->precalc_sqrt; - - sincos(a,&sa,&ca); - - f->p0 += r * sa; - f->p1 += (-r) * ca; -} - -void var8_disc (flam3_iter_helper *f, double weight) { - /* disc */ - /* nx = tx * M_PI; - ny = ty * M_PI; - a = atan2(nx, ny); - r = sqrt(nx*nx + ny*ny); - p[0] += v * sin(r) * a / M_PI; - p[1] += v * cos(r) * a / M_PI; */ - - double a = f->precalc_atan * M_1_PI; - double r = M_PI * f->precalc_sqrt; - double sr,cr; - sincos(r,&sr,&cr); - - f->p0 += weight * sr * a; - f->p1 += weight * cr * a; -} - -void var9_spiral (flam3_iter_helper *f, double weight) { - /* spiral */ - /* a = atan2(tx, ty); - r = sqrt(tx*tx + ty*ty) + 1e-6; - p[0] += v * (cos(a) + sin(r)) / r; - p[1] += v * (sin(a) - cos(r)) / r; */ - - double r = f->precalc_sqrt + EPS; - double r1 = weight/r; - double sr,cr; - sincos(r,&sr,&cr); - - f->p0 += r1 * (f->precalc_cosa + sr); - f->p1 += r1 * (f->precalc_sina - cr); -} - -void var10_hyperbolic (flam3_iter_helper *f, double weight) { - /* hyperbolic */ - /* a = atan2(tx, ty); - r = sqrt(tx*tx + ty*ty) + 1e-6; - p[0] += v * sin(a) / r; - p[1] += v * cos(a) * r; */ - - double r = f->precalc_sqrt + EPS; - - f->p0 += weight * f->precalc_sina / r; - f->p1 += weight * f->precalc_cosa * r; -} - -void var11_diamond (flam3_iter_helper *f, double weight) { - /* diamond */ - /* a = atan2(tx, ty); - r = sqrt(tx*tx + ty*ty); - p[0] += v * sin(a) * cos(r); - p[1] += v * cos(a) * sin(r); */ - - double r = f->precalc_sqrt; - double sr,cr; - sincos(r,&sr,&cr); - - f->p0 += weight * f->precalc_sina * cr; - f->p1 += weight * f->precalc_cosa * sr; -} - -void var12_ex (flam3_iter_helper *f, double weight) { - /* ex */ - /* a = atan2(tx, ty); - r = sqrt(tx*tx + ty*ty); - n0 = sin(a+r); - n1 = cos(a-r); - m0 = n0 * n0 * n0 * r; - m1 = n1 * n1 * n1 * r; - p[0] += v * (m0 + m1); - p[1] += v * (m0 - m1); */ - - double a = f->precalc_atan; - double r = f->precalc_sqrt; - - double n0 = sin(a+r); - double n1 = cos(a-r); - - double m0 = n0 * n0 * n0 * r; - double m1 = n1 * n1 * n1 * r; - - f->p0 += weight * (m0 + m1); - f->p1 += weight * (m0 - m1); -} - -void var13_julia (flam3_iter_helper *f, double weight) { - /* julia */ - /* a = atan2(tx, ty)/2.0; - if (flam3_random_bit()) a += M_PI; - r = pow(tx*tx + ty*ty, 0.25); - nx = r * cos(a); - ny = r * sin(a); - p[0] += v * nx; - p[1] += v * ny; */ - - double r; - double a = 0.5 * f->precalc_atan; - double sa,ca; - - if (flam3_random_isaac_bit(f->rc)) //(flam3_random_bit()) - a += M_PI; - - r = weight * sqrt(f->precalc_sqrt); - - sincos(a,&sa,&ca); - - f->p0 += r * ca; - f->p1 += r * sa; -} - -void var14_bent (flam3_iter_helper *f, double weight) { - /* bent */ - /* nx = tx; - ny = ty; - if (nx < 0.0) nx = nx * 2.0; - if (ny < 0.0) ny = ny / 2.0; - p[0] += v * nx; - p[1] += v * ny; */ - - double nx = f->tx; - double ny = f->ty; - - if (nx < 0.0) - nx = nx * 2.0; - if (ny < 0.0) - ny = ny / 2.0; - - f->p0 += weight * nx; - f->p1 += weight * ny; -} - -void var15_waves (flam3_iter_helper *f, double weight) { - /* waves */ - /* dx = coef[2][0]; - dy = coef[2][1]; - nx = tx + coef[1][0]*sin(ty/((dx*dx)+EPS)); - ny = ty + coef[1][1]*sin(tx/((dy*dy)+EPS)); - p[0] += v * nx; - p[1] += v * ny; */ - - double c10 = f->xform->c[1][0]; - double c11 = f->xform->c[1][1]; - - double nx = f->tx + c10 * sin( f->ty * f->xform->waves_dx2 ); - double ny = f->ty + c11 * sin( f->tx * f->xform->waves_dy2 ); - - f->p0 += weight * nx; - f->p1 += weight * ny; -} - -void var16_fisheye (flam3_iter_helper *f, double weight) { - /* fisheye */ - /* a = atan2(tx, ty); - r = sqrt(tx*tx + ty*ty); - r = 2 * r / (r + 1); - nx = r * cos(a); - ny = r * sin(a); - p[0] += v * nx; - p[1] += v * ny; */ - - double r = f->precalc_sqrt; - - r = 2 * weight / (r+1); - - f->p0 += r * f->ty; - f->p1 += r * f->tx; -} - -void var17_popcorn (flam3_iter_helper *f, double weight) { - /* popcorn */ - /* dx = tan(3*ty); - dy = tan(3*tx); - nx = tx + coef[2][0] * sin(dx); - ny = ty + coef[2][1] * sin(dy); - p[0] += v * nx; - p[1] += v * ny; */ - - double dx = tan(3*f->ty); - double dy = tan(3*f->tx); - - double nx = f->tx + f->xform->c[2][0] * sin(dx); - double ny = f->ty + f->xform->c[2][1] * sin(dy); - - f->p0 += weight * nx; - f->p1 += weight * ny; -} - -void var18_exponential (flam3_iter_helper *f, double weight) { - /* exponential */ - /* dx = exp(tx-1.0); - dy = M_PI * ty; - nx = cos(dy) * dx; - ny = sin(dy) * dx; - p[0] += v * nx; - p[1] += v * ny; */ - - double dx = weight * exp(f->tx - 1.0); - double dy = M_PI * f->ty; - double sdy,cdy; - - sincos(dy,&sdy,&cdy); - - - f->p0 += dx * cdy; - f->p1 += dx * sdy; -} - -void var19_power (flam3_iter_helper *f, double weight) { - /* power */ - /* a = atan2(tx, ty); - sa = sin(a); - r = sqrt(tx*tx + ty*ty); - r = pow(r, sa); - nx = r * precalc_cosa; - ny = r * sa; - p[0] += v * nx; - p[1] += v * ny; */ - - double r = weight * pow(f->precalc_sqrt, f->precalc_sina); - - f->p0 += r * f->precalc_cosa; - f->p1 += r * f->precalc_sina; -} - -void var20_cosine (flam3_iter_helper *f, double weight) { - /* cosine */ - /* nx = cos(tx * M_PI) * cosh(ty); - ny = -sin(tx * M_PI) * sinh(ty); - p[0] += v * nx; - p[1] += v * ny; */ - - double a = f->tx * M_PI; - double sa,ca; - double nx,ny; - - sincos(a,&sa,&ca); - nx = ca * cosh(f->ty); - ny = -sa * sinh(f->ty); - - f->p0 += weight * nx; - f->p1 += weight * ny; -} - -void var21_rings (flam3_iter_helper *f, double weight) { - /* rings */ - /* dx = coef[2][0]; - dx = dx * dx + EPS; - r = sqrt(tx*tx + ty*ty); - r = fmod(r + dx, 2*dx) - dx + r*(1-dx); - a = atan2(tx, ty); - nx = cos(a) * r; - ny = sin(a) * r; - p[0] += v * nx; - p[1] += v * ny; */ - - double dx = f->xform->c[2][0] * f->xform->c[2][0] + EPS; - double r = f->precalc_sqrt; - r = weight * (fmod(r+dx, 2*dx) - dx + r * (1 - dx)); - - f->p0 += r * f->precalc_cosa; - f->p1 += r * f->precalc_sina; -} - -void var22_fan (flam3_iter_helper *f, double weight) { - /* fan */ - /* dx = coef[2][0]; - dy = coef[2][1]; - dx = M_PI * (dx * dx + EPS); - dx2 = dx/2; - a = atan(tx,ty); - r = sqrt(tx*tx + ty*ty); - a += (fmod(a+dy, dx) > dx2) ? -dx2 : dx2; - nx = cos(a) * r; - ny = sin(a) * r; - p[0] += v * nx; - p[1] += v * ny; */ - - double dx = M_PI * (f->xform->c[2][0] * f->xform->c[2][0] + EPS); - double dy = f->xform->c[2][1]; - double dx2 = 0.5 * dx; - - double a = f->precalc_atan; - double r = weight * f->precalc_sqrt; - double sa,ca; - - a += (fmod(a+dy,dx) > dx2) ? -dx2 : dx2; - sincos(a,&sa,&ca); - - f->p0 += r * ca; - f->p1 += r * sa; -} - -void var23_blob (flam3_iter_helper *f, double weight) { - /* blob */ - /* a = atan2(tx, ty); - r = sqrt(tx*tx + ty*ty); - r = r * (bloblow + (blobhigh-bloblow) * (0.5 + 0.5 * sin(blobwaves * a))); - nx = sin(a) * r; - ny = cos(a) * r; - - p[0] += v * nx; - p[1] += v * ny; */ - - double r = f->precalc_sqrt; - double a = f->precalc_atan; - double bdiff = f->xform->blob_high - f->xform->blob_low; - - r = r * (f->xform->blob_low + - bdiff * (0.5 + 0.5 * sin(f->xform->blob_waves * a))); - - f->p0 += weight * f->precalc_sina * r; - f->p1 += weight * f->precalc_cosa * r; -} - -void var24_pdj (flam3_iter_helper *f, double weight) { - /* pdj */ - /* nx1 = cos(pdjb * tx); - nx2 = sin(pdjc * tx); - ny1 = sin(pdja * ty); - ny2 = cos(pdjd * ty); - - p[0] += v * (ny1 - nx1); - p[1] += v * (nx2 - ny2); */ - - double nx1 = cos(f->xform->pdj_b * f->tx); - double nx2 = sin(f->xform->pdj_c * f->tx); - double ny1 = sin(f->xform->pdj_a * f->ty); - double ny2 = cos(f->xform->pdj_d * f->ty); - - f->p0 += weight * (ny1 - nx1); - f->p1 += weight * (nx2 - ny2); -} - -void var25_fan2 (flam3_iter_helper *f, double weight) { - /* fan2 */ - /* a = precalc_atan; - r = precalc_sqrt; - - dy = fan2y; - dx = M_PI * (fan2x * fan2x + EPS); - dx2 = dx / 2.0; - - t = a + dy - dx * (int)((a + dy)/dx); - - if (t > dx2) - a = a - dx2; - else - a = a + dx2; - - nx = sin(a) * r; - ny = cos(a) * r; - - p[0] += v * nx; - p[1] += v * ny; */ - - double dy = f->xform->fan2_y; - double dx = M_PI * (f->xform->fan2_x * f->xform->fan2_x + EPS); - double dx2 = 0.5 * dx; - double a = f->precalc_atan; - double sa,ca; - double r = weight * f->precalc_sqrt; - - double t = a + dy - dx * (int)((a + dy)/dx); - - if (t>dx2) - a = a-dx2; - else - a = a+dx2; - - sincos(a,&sa,&ca); - - f->p0 += r * sa; - f->p1 += r * ca; -} - -void var26_rings2 (flam3_iter_helper *f, double weight) { - /* rings2 */ - /* r = precalc_sqrt; - dx = rings2val * rings2val + EPS; - r += dx - 2.0*dx*(int)((r + dx)/(2.0 * dx)) - dx + r * (1.0-dx); - nx = precalc_sina * r; - ny = precalc_cosa * r; - p[0] += v * nx; - p[1] += v * ny; */ - - double r = f->precalc_sqrt; - double dx = f->xform->rings2_val * f->xform->rings2_val + EPS; - - r += -2.0*dx*(int)((r+dx)/(2.0*dx)) + r * (1.0-dx); - - f->p0 += weight * f->precalc_sina * r; - f->p1 += weight * f->precalc_cosa * r; -} - -void var27_eyefish (flam3_iter_helper *f, double weight) { - /* eyefish */ - /* r = 2.0 * v / (precalc_sqrt + 1.0); - p[0] += r*tx; - p[1] += r*ty; */ - - double r = (weight * 2.0) / (f->precalc_sqrt + 1.0); - - f->p0 += r * f->tx; - f->p1 += r * f->ty; -} - -void var28_bubble (flam3_iter_helper *f, double weight) { - /* bubble */ - - double r = weight / (0.25 * (f->precalc_sumsq) + 1); - - f->p0 += r * f->tx; - f->p1 += r * f->ty; -} - -void var29_cylinder (flam3_iter_helper *f, double weight) { - /* cylinder (01/06) */ - - f->p0 += weight * sin(f->tx); - f->p1 += weight * f->ty; -} - -void var30_perspective (flam3_iter_helper *f, double weight) { - /* perspective (01/06) */ - - double t = 1.0 / (f->xform->perspective_dist - f->ty * f->xform->persp_vsin); - - f->p0 += weight * f->xform->perspective_dist * f->tx * t; - f->p1 += weight * f->xform->persp_vfcos * f->ty * t; -} - -void var31_noise (flam3_iter_helper *f, double weight) { - /* noise (03/06) */ - - double tmpr, sinr, cosr, r; - - tmpr = flam3_random_isaac_01(f->rc) * 2 * M_PI; - sincos(tmpr,&sinr,&cosr); - - r = weight * flam3_random_isaac_01(f->rc); - - f->p0 += f->tx * r * cosr; - f->p1 += f->ty * r * sinr; -} - -void var32_juliaN_generic (flam3_iter_helper *f, double weight) { - /* juliaN (03/06) */ - - int t_rnd = trunc((f->xform->julian_rN)*flam3_random_isaac_01(f->rc)); - - double tmpr = (f->precalc_atanyx + 2 * M_PI * t_rnd) / f->xform->julian_power; - - double r = weight * pow(f->precalc_sumsq, f->xform->julian_cn); - double sina, cosa; - sincos(tmpr,&sina,&cosa); - - f->p0 += r * cosa; - f->p1 += r * sina; -} - -void var33_juliaScope_generic (flam3_iter_helper *f, double weight) { - /* juliaScope (03/06) */ - - int t_rnd = trunc((f->xform->juliascope_rN) * flam3_random_isaac_01(f->rc)); - - double tmpr, r; - double sina, cosa; - - if ((t_rnd & 1) == 0) - tmpr = (2 * M_PI * t_rnd + f->precalc_atanyx) / f->xform->juliascope_power; - else - tmpr = (2 * M_PI * t_rnd - f->precalc_atanyx) / f->xform->juliascope_power; - - sincos(tmpr,&sina,&cosa); - - r = weight * pow(f->precalc_sumsq, f->xform->juliascope_cn); - - f->p0 += r * cosa; - f->p1 += r * sina; -} - -void var34_blur (flam3_iter_helper *f, double weight) { - /* blur (03/06) */ - - double tmpr, sinr, cosr, r; - - tmpr = flam3_random_isaac_01(f->rc) * 2 * M_PI; - sincos(tmpr,&sinr,&cosr); - - r = weight * flam3_random_isaac_01(f->rc); - - f->p0 += r * cosr; - f->p1 += r * sinr; -} - -void var35_gaussian (flam3_iter_helper *f, double weight) { - /* gaussian (09/06) */ - - double ang, r, sina, cosa; - - ang = flam3_random_isaac_01(f->rc) * 2 * M_PI; - sincos(ang,&sina,&cosa); - - r = weight * ( flam3_random_isaac_01(f->rc) + flam3_random_isaac_01(f->rc) - + flam3_random_isaac_01(f->rc) + flam3_random_isaac_01(f->rc) - 2.0 ); - - f->p0 += r * cosa; - f->p1 += r * sina; -} - -void var36_radial_blur (flam3_iter_helper *f, double weight) { - /* radial blur (09/06) */ - /* removed random storage 6/07 */ - - double rndG, ra, rz, tmpa, sa, ca; - - /* Get pseudo-gaussian */ - rndG = weight * (flam3_random_isaac_01(f->rc) + flam3_random_isaac_01(f->rc) - + flam3_random_isaac_01(f->rc) + flam3_random_isaac_01(f->rc) - 2.0); - - /* Calculate angle & zoom */ - ra = f->precalc_sqrt; - tmpa = f->precalc_atanyx + f->xform->radialBlur_spinvar*rndG; - sincos(tmpa,&sa,&ca); - rz = f->xform->radialBlur_zoomvar * rndG - 1; - - f->p0 += ra * ca + rz * f->tx; - f->p1 += ra * sa + rz * f->ty; -} - -void var37_pie(flam3_iter_helper *f, double weight) { - /* pie by Joel Faber (June 2006) */ - - double a, r, sa, ca; - int sl; - - sl = (int) (flam3_random_isaac_01(f->rc) * f->xform->pie_slices + 0.5); - a = f->xform->pie_rotation + - 2.0 * M_PI * (sl + flam3_random_isaac_01(f->rc) * f->xform->pie_thickness) / f->xform->pie_slices; - r = weight * flam3_random_isaac_01(f->rc); - sincos(a,&sa,&ca); - - f->p0 += r * ca; - f->p1 += r * sa; -} - -void var38_ngon(flam3_iter_helper *f, double weight) { - /* ngon by Joel Faber (09/06) */ - - double r_factor,theta,phi,b, amp; - - r_factor = pow(f->precalc_sumsq, f->xform->ngon_power/2.0); - - theta = f->precalc_atanyx; - b = 2*M_PI/f->xform->ngon_sides; - - phi = theta - (b*floor(theta/b)); - if (phi > b/2) - phi -= b; - - amp = f->xform->ngon_corners * (1.0 / (cos(phi) + EPS) - 1.0) + f->xform->ngon_circle; - amp /= (r_factor + EPS); - - f->p0 += weight * f->tx * amp; - f->p1 += weight * f->ty * amp; -} - -void var39_curl(flam3_iter_helper *f, double weight) -{ - double re = 1.0 + f->xform->curl_c1 * f->tx + f->xform->curl_c2 * (f->tx * f->tx - f->ty * f->ty); - double im = f->xform->curl_c1 * f->ty + 2.0 * f->xform->curl_c2 * f->tx * f->ty; - - double r = weight / (re*re + im*im); - - f->p0 += (f->tx * re + f->ty * im) * r; - f->p1 += (f->ty * re - f->tx * im) * r; -} - -void var40_rectangles(flam3_iter_helper *f, double weight) -{ - if (f->xform->rectangles_x==0) - f->p0 += weight * f->tx; - else - f->p0 += weight * ((2 * floor(f->tx / f->xform->rectangles_x) + 1) * f->xform->rectangles_x - f->tx); - - if (f->xform->rectangles_y==0) - f->p1 += weight * f->ty; - else - f->p1 += weight * ((2 * floor(f->ty / f->xform->rectangles_y) + 1) * f->xform->rectangles_y - f->ty); - -} - -void var41_arch(flam3_iter_helper *f, double weight) -{ - /* Z+ variation Jan 07 - procedure TXForm.Arch; - var - sinr, cosr: double; - begin - SinCos(random * vars[29]*pi, sinr, cosr); - FPx := FPx + sinr*vars[29]; - FPy := FPy + sqr(sinr)/cosr*vars[29]; - end; - */ - - /* - * !!! Note !!! - * This code uses the variation weight in a non-standard fashion, and - * it may change or even be removed in future versions of flam3. - */ - - double ang = flam3_random_isaac_01(f->rc) * weight * M_PI; - double sinr,cosr; - sincos(ang,&sinr,&cosr); - - f->p0 += weight * sinr; - f->p1 += weight * (sinr*sinr)/cosr; - -} - -void var42_tangent(flam3_iter_helper *f, double weight) -{ - /* Z+ variation Jan 07 - procedure TXForm.Tangent; - begin - FPx := FPx + vars[30] * (sin(FTx)/cos(FTy)); - FPy := FPy + vars[30] * (sin(FTy)/cos(FTy)); - end; - */ - - f->p0 += weight * sin(f->tx)/cos(f->ty); - f->p1 += weight * tan(f->ty); - -} - -void var43_square(flam3_iter_helper *f, double weight) -{ - /* Z+ variation Jan 07 - procedure TXForm.SquareBlur; - begin - FPx := FPx + vars[31] * (random - 0.5); - FPy := FPy + vars[31] * (random - 0.5); - end; - */ - - f->p0 += weight * (flam3_random_isaac_01(f->rc) - 0.5); - f->p1 += weight * (flam3_random_isaac_01(f->rc) - 0.5); - -} - -void var44_rays(flam3_iter_helper *f, double weight) -{ - /* Z+ variation Jan 07 - procedure TXForm.Rays; - var - r, sinr, cosr, tgr: double; - begin - SinCos(random * vars[32]*pi, sinr, cosr); - r := vars[32] / (sqr(FTx) + sqr(FTy) + EPS); - tgr := sinr/cosr; - FPx := FPx + tgr * (cos(FTx)*vars[32]) * r; - FPy := FPy + tgr * (sin(FTy)*vars[32]) * r; - end; - */ - - /* - * !!! Note !!! - * This code uses the variation weight in a non-standard fashion, and - * it may change or even be removed in future versions of flam3. - */ - - double ang = weight * flam3_random_isaac_01(f->rc) * M_PI; - double r = weight / (f->precalc_sumsq + EPS); - double tanr = weight * tan(ang) * r; - - - f->p0 += tanr * cos(f->tx); - f->p1 += tanr * sin(f->ty); - -} - -void var45_blade(flam3_iter_helper *f, double weight) -{ - /* Z+ variation Jan 07 - procedure TXForm.Blade; - var - r, sinr, cosr: double; - begin - r := sqrt(sqr(FTx) + sqr(FTy))*vars[33]; - SinCos(r*random, sinr, cosr); - FPx := FPx + vars[33] * FTx * (cosr + sinr); - FPy := FPy + vars[33] * FTx * (cosr - sinr); - end; - */ - - /* - * !!! Note !!! - * This code uses the variation weight in a non-standard fashion, and - * it may change or even be removed in future versions of flam3. - */ - - double r = flam3_random_isaac_01(f->rc) * weight * f->precalc_sqrt; - double sinr,cosr; - - sincos(r,&sinr,&cosr); - - f->p0 += weight * f->tx * (cosr + sinr); - f->p1 += weight * f->tx * (cosr - sinr); - -} - -void var46_secant2(flam3_iter_helper *f, double weight) -{ - /* Intended as a 'fixed' version of secant */ - - /* - * !!! Note !!! - * This code uses the variation weight in a non-standard fashion, and - * it may change or even be removed in future versions of flam3. - */ - - double r = weight * f->precalc_sqrt; - double cr = cos(r); - double icr = 1.0/cr; - - f->p0 += weight * f->tx; - - if (cr<0) - f->p1 += weight*(icr + 1); - else - f->p1 += weight*(icr - 1); -} - -void var47_twintrian(flam3_iter_helper *f, double weight) -{ - /* Z+ variation Jan 07 - procedure TXForm.TwinTrian; - var - r, diff, sinr, cosr: double; - begin - r := sqrt(sqr(FTx) + sqr(FTy))*vars[35]; - SinCos(r*random, sinr, cosr); - diff := Math.Log10(sinr*sinr)+cosr; - FPx := FPx + vars[35] * FTx * diff; - FPy := FPy + vars[35] * FTx * (diff - (sinr*pi)); - end; - */ - - /* - * !!! Note !!! - * This code uses the variation weight in a non-standard fashion, and - * it may change or even be removed in future versions of flam3. - */ - - double r = flam3_random_isaac_01(f->rc) * weight * f->precalc_sqrt; - double sinr,cosr,diff; - - sincos(r,&sinr,&cosr); - diff = log10(sinr*sinr)+cosr; - - if (badvalue(diff)) - diff = -30.0; - - f->p0 += weight * f->tx * diff; - f->p1 += weight * f->tx * (diff - sinr*M_PI); - -} - -void var48_cross(flam3_iter_helper *f, double weight) -{ - /* Z+ variation Jan 07 - procedure TXForm.Cross; - var - r: double; - begin - r := vars[36]*sqrt(1/(sqr(sqr(FTx)-sqr(FTy))+EPS)); - FPx := FPx + FTx * r; - FPy := FPy + FTy * r; - end; - */ - - double s = f->tx*f->tx - f->ty*f->ty; - double r = weight * sqrt(1.0 / (s*s+EPS)); - - f->p0 += f->tx * r; - f->p1 += f->ty * r; - -} - -void var49_disc2(flam3_iter_helper *f, double weight) -{ - /* Z+ variation Jan 07 - c := vvar/PI; - k := rot*PI; - sinadd := Sin(add); - cosadd := Cos(add); - cosadd := cosadd - 1; - if (add > 2*PI) then begin - cosadd := cosadd * (1 + add - 2*PI); - sinadd := sinadd * (1 + add - 2*PI) - end - else if (add < -2*PI) then begin - cosadd := cosadd * (1 + add + 2*PI); - sinadd := sinadd * (1 + add + 2*PI) - end - end; - procedure TVariationDisc2.CalcFunction; - var - r, sinr, cosr: extended; - begin - SinCos(k * (FTx^+FTy^), sinr, cosr); //rot*PI - r := c * arctan2(FTx^, FTy^); //vvar/PI - FPx^ := FPx^ + (sinr + cosadd) * r; - FPy^ := FPy^ + (cosr + sinadd) * r; - */ - - double r,t,sinr, cosr; - - t = f->xform->disc2_timespi * (f->tx + f->ty); - sincos(t,&sinr,&cosr); - r = weight * f->precalc_atan / M_PI; - - f->p0 += (sinr + f->xform->disc2_cosadd) * r; - f->p1 += (cosr + f->xform->disc2_sinadd) * r; - -} - -void var50_supershape(flam3_iter_helper *f, double weight) { - - double theta; - double t1,t2,r; - double st,ct; - double myrnd; - - theta = f->xform->super_shape_pm_4 * f->precalc_atanyx + M_PI_4; - - sincos(theta,&st,&ct); - - t1 = fabs(ct); - t1 = pow(t1,f->xform->super_shape_n2); - - t2 = fabs(st); - t2 = pow(t2,f->xform->super_shape_n3); - - myrnd = f->xform->super_shape_rnd; - - r = weight * ( (myrnd*flam3_random_isaac_01(f->rc) + (1.0-myrnd)*f->precalc_sqrt) - f->xform->super_shape_holes) - * pow(t1+t2,f->xform->super_shape_pneg1_n1) / f->precalc_sqrt; - - f->p0 += r * f->tx; - f->p1 += r * f->ty; -} - -void var51_flower(flam3_iter_helper *f, double weight) { - /* cyberxaos, 4/2007 */ - /* theta := arctan2(FTy^, FTx^); - r := (random-holes)*cos(petals*theta); - FPx^ := FPx^ + vvar*r*cos(theta); - FPy^ := FPy^ + vvar*r*sin(theta);*/ - - double theta = f->precalc_atanyx; - double r = weight * (flam3_random_isaac_01(f->rc) - f->xform->flower_holes) * - cos(f->xform->flower_petals*theta) / f->precalc_sqrt; - - f->p0 += r * f->tx; - f->p1 += r * f->ty; -} - -void var52_conic(flam3_iter_helper *f, double weight) { - /* cyberxaos, 4/2007 */ - /* theta := arctan2(FTy^, FTx^); - r := (random - holes)*((eccentricity)/(1+eccentricity*cos(theta))); - FPx^ := FPx^ + vvar*r*cos(theta); - FPy^ := FPy^ + vvar*r*sin(theta); */ - - double ct = f->tx / f->precalc_sqrt; - double r = weight * (flam3_random_isaac_01(f->rc) - f->xform->conic_holes) * - f->xform->conic_eccentricity / (1 + f->xform->conic_eccentricity*ct) / f->precalc_sqrt; - - f->p0 += r * f->tx; - f->p1 += r * f->ty; -} - -void var53_parabola(flam3_iter_helper *f, double weight) { - /* cyberxaos, 4/2007 */ - /* r := sqrt(sqr(FTx^) + sqr(FTy^)); - FPx^ := FPx^ + parabola_height*vvar*sin(r)*sin(r)*random; - FPy^ := FPy^ + parabola_width*vvar*cos(r)*random; */ - - double r = f->precalc_sqrt; - double sr,cr; - - sincos(r,&sr,&cr); - - f->p0 += f->xform->parabola_height * weight * sr*sr * flam3_random_isaac_01(f->rc); - f->p1 += f->xform->parabola_width * weight * cr * flam3_random_isaac_01(f->rc); - -} - -void var54_bent2 (flam3_iter_helper *f, double weight) { - - /* Bent2 in the Apophysis Plugin Pack */ - - double nx = f->tx; - double ny = f->ty; - - if (nx < 0.0) - nx = nx * f->xform->bent2_x; - if (ny < 0.0) - ny = ny * f->xform->bent2_y; - - f->p0 += weight * nx; - f->p1 += weight * ny; -} - -void var55_bipolar (flam3_iter_helper *f, double weight) { - - /* Bipolar in the Apophysis Plugin Pack */ - - double x2y2 = f->precalc_sumsq; - double t = x2y2+1; - double x2 = 2*f->tx; - double ps = -M_PI_2 * f->xform->bipolar_shift; - double y = 0.5 * atan2(2.0 * f->ty, x2y2 - 1.0) + ps; - - if (y > M_PI_2) - y = -M_PI_2 + fmod(y + M_PI_2, M_PI); - else if (y < -M_PI_2) - y = M_PI_2 - fmod(M_PI_2 - y, M_PI); - - f->p0 += weight * 0.25 * M_2_PI * log ( (t+x2) / (t-x2) ); - f->p1 += weight * M_2_PI * y; -} - -void var56_boarders (flam3_iter_helper *f, double weight) { - - /* Boarders in the Apophysis Plugin Pack */ - - double roundX, roundY, offsetX, offsetY; - - roundX = rint(f->tx); - roundY = rint(f->ty); - offsetX = f->tx - roundX; - offsetY = f->ty - roundY; - - if (flam3_random_isaac_01(f->rc) >= 0.75) { - f->p0 += weight*(offsetX*0.5 + roundX); - f->p1 += weight*(offsetY*0.5 + roundY); - } else { - - if (fabs(offsetX) >= fabs(offsetY)) { - - if (offsetX >= 0.0) { - f->p0 += weight*(offsetX*0.5 + roundX + 0.25); - f->p1 += weight*(offsetY*0.5 + roundY + 0.25 * offsetY / offsetX); - } else { - f->p0 += weight*(offsetX*0.5 + roundX - 0.25); - f->p1 += weight*(offsetY*0.5 + roundY - 0.25 * offsetY / offsetX); - } - - } else { - - if (offsetY >= 0.0) { - f->p1 += weight*(offsetY*0.5 + roundY + 0.25); - f->p0 += weight*(offsetX*0.5 + roundX + offsetX/offsetY*0.25); - } else { - f->p1 += weight*(offsetY*0.5 + roundY - 0.25); - f->p0 += weight*(offsetX*0.5 + roundX - offsetX/offsetY*0.25); - } - } - } -} - -void var57_butterfly (flam3_iter_helper *f, double weight) { - - /* Butterfly in the Apophysis Plugin Pack */ - - /* wx is weight*4/sqrt(3*pi) */ - double wx = weight*1.3029400317411197908970256609023; - - double y2 = f->ty*2.0; - double r = wx*sqrt(fabs(f->ty * f->tx)/(EPS + f->tx*f->tx + y2*y2)); - - f->p0 += r * f->tx; - f->p1 += r * y2; - -} - -void var58_cell (flam3_iter_helper *f, double weight) { - - /* Cell in the Apophysis Plugin Pack */ - - double inv_cell_size = 1.0/f->xform->cell_size; - - /* calculate input cell */ - int x = floor(f->tx*inv_cell_size); - int y = floor(f->ty*inv_cell_size); - - /* Offset from cell origin */ - double dx = f->tx - x*f->xform->cell_size; - double dy = f->ty - y*f->xform->cell_size; - - /* interleave cells */ - if (y >= 0) { - if (x >= 0) { - y *= 2; - x *= 2; - } else { - y *= 2; - x = -(2*x+1); - } - } else { - if (x >= 0) { - y = -(2*y+1); - x *= 2; - } else { - y = -(2*y+1); - x = -(2*x+1); - } - } - - f->p0 += weight * (dx + x*f->xform->cell_size); - f->p1 -= weight * (dy + y*f->xform->cell_size); - -} - -void var59_cpow (flam3_iter_helper *f, double weight) { - - /* Cpow in the Apophysis Plugin Pack */ - - double a = f->precalc_atanyx; - double lnr = 0.5 * log(f->precalc_sumsq); - double va = 2.0 * M_PI / f->xform->cpow_power; - double vc = f->xform->cpow_r / f->xform->cpow_power; - double vd = f->xform->cpow_i / f->xform->cpow_power; - double ang = vc*a + vd*lnr + va*floor(f->xform->cpow_power*flam3_random_isaac_01(f->rc)); - double sa,ca; - - double m = weight * exp(vc * lnr - vd * a); - - sincos(ang,&sa,&ca); - - f->p0 += m * ca; - f->p1 += m * sa; - -} - -void var60_curve (flam3_iter_helper *f, double weight) { - - /* Curve in the Apophysis Plugin Pack */ - - double pc_xlen = f->xform->curve_xlength*f->xform->curve_xlength; - double pc_ylen = f->xform->curve_ylength*f->xform->curve_ylength; - - if (pc_xlen<1E-20) pc_xlen = 1E-20; - - if (pc_ylen<1E-20) pc_ylen = 1E-20; - - f->p0 += weight * (f->tx + f->xform->curve_xamp * exp(-f->ty*f->ty/pc_xlen)); - f->p1 += weight * (f->ty + f->xform->curve_yamp * exp(-f->tx*f->tx/pc_ylen)); - -} - -void var61_edisc (flam3_iter_helper *f, double weight) { - - /* Edisc in the Apophysis Plugin Pack */ - - double tmp = f->precalc_sumsq + 1.0; - double tmp2 = 2.0 * f->tx; - double r1 = sqrt(tmp+tmp2); - double r2 = sqrt(tmp-tmp2); - double xmax = (r1+r2) * 0.5; - double a1 = log(xmax + sqrt(xmax - 1.0)); - double a2 = -acos(f->tx/xmax); - double w = weight / 11.57034632; - double snv,csv,snhu,cshu; - - sincos(a1,&snv,&csv); - - snhu = sinh(a2); - cshu = cosh(a2); - - if (f->ty > 0.0) snv = -snv; - - f->p0 += w * cshu * csv; - f->p1 += w * snhu * snv; - -} - -void var62_elliptic (flam3_iter_helper *f, double weight) { - - /* Elliptic in the Apophysis Plugin Pack */ - - double tmp = f->precalc_sumsq + 1.0; - double x2 = 2.0 * f->tx; - double xmax = 0.5 * (sqrt(tmp+x2) + sqrt(tmp-x2)); - double a = f->tx / xmax; - double b = 1.0 - a*a; - double ssx = xmax - 1.0; - double w = weight / M_PI_2; - - if (b<0) - b = 0; - else - b = sqrt(b); - - if (ssx<0) - ssx = 0; - else - ssx = sqrt(ssx); - - f->p0 += w * atan2(a,b); - - if (f->ty > 0) - f->p1 += w * log(xmax + ssx); - else - f->p1 -= w * log(xmax + ssx); - -} - -void var63_escher (flam3_iter_helper *f, double weight) { - - /* Escher in the Apophysis Plugin Pack */ - - double seb,ceb; - double vc,vd; - double m,n; - double sn,cn; - - double a = f->precalc_atanyx; - double lnr = 0.5 * log(f->precalc_sumsq); - - sincos(f->xform->escher_beta,&seb,&ceb); - - vc = 0.5 * (1.0 + ceb); - vd = 0.5 * seb; - - m = weight * exp(vc*lnr - vd*a); - n = vc*a + vd*lnr; - - sincos(n,&sn,&cn); - - f->p0 += m * cn; - f->p1 += m * sn; - -} - -void var64_foci (flam3_iter_helper *f, double weight) { - - /* Foci in the Apophysis Plugin Pack */ - - double expx = exp(f->tx) * 0.5; - double expnx = 0.25 / expx; - double sn,cn,tmp; - - sincos(f->ty,&sn,&cn); - tmp = weight/(expx + expnx - cn); - - f->p0 += tmp * (expx - expnx); - f->p1 += tmp * sn; - -} - -void var65_lazysusan (flam3_iter_helper *f, double weight) { - - /* Lazysusan in the Apophysis Plugin Pack */ - - double x = f->tx - f->xform->lazysusan_x; - double y = f->ty + f->xform->lazysusan_y; - double r = sqrt(x*x + y*y); - double sina, cosa; - - if (r<weight) { - double a = atan2(y,x) + f->xform->lazysusan_spin + - f->xform->lazysusan_twist*(weight-r); - sincos(a,&sina,&cosa); - r = weight * r; - - f->p0 += r*cosa + f->xform->lazysusan_x; - f->p1 += r*sina - f->xform->lazysusan_y; - } else { - - r = weight * (1.0 + f->xform->lazysusan_space / r); - - f->p0 += r*x + f->xform->lazysusan_x; - f->p1 += r*y - f->xform->lazysusan_y; - - } - -} - -void var66_loonie (flam3_iter_helper *f, double weight) { - - /* Loonie in the Apophysis Plugin Pack */ - - /* - * !!! Note !!! - * This code uses the variation weight in a non-standard fashion, and - * it may change or even be removed in future versions of flam3. - */ - - double r2 = f->precalc_sumsq; - double w2 = weight*weight; - - if (r2 < w2) { - double r = weight * sqrt(w2/r2 - 1.0); - f->p0 += r * f->tx; - f->p1 += r * f->ty; - } else { - f->p0 += weight * f->tx; - f->p1 += weight * f->ty; - } - -} - -void var67_pre_blur (flam3_iter_helper *f, double weight) { - - /* pre-xform: PreBlur (Apo 2.08) */ - - /* Get pseudo-gaussian */ - double rndG = weight * (flam3_random_isaac_01(f->rc) + flam3_random_isaac_01(f->rc) - + flam3_random_isaac_01(f->rc) + flam3_random_isaac_01(f->rc) - 2.0); - double rndA = flam3_random_isaac_01(f->rc) * 2.0 * M_PI; - double sinA,cosA; - - sincos(rndA,&sinA,&cosA); - - /* Note: original coordinate changed */ - f->tx += rndG * cosA; - f->ty += rndG * sinA; - -} - -void var68_modulus (flam3_iter_helper *f, double weight) { - - /* Modulus in the Apophysis Plugin Pack */ - - double xr = 2*f->xform->modulus_x; - double yr = 2*f->xform->modulus_y; - - if (f->tx > f->xform->modulus_x) - f->p0 += weight * (-f->xform->modulus_x + fmod(f->tx + f->xform->modulus_x, xr)); - else if (f->tx < -f->xform->modulus_x) - f->p0 += weight * ( f->xform->modulus_x - fmod(f->xform->modulus_x - f->tx, xr)); - else - f->p0 += weight * f->tx; - - if (f->ty > f->xform->modulus_y) - f->p1 += weight * (-f->xform->modulus_y + fmod(f->ty + f->xform->modulus_y, yr)); - else if (f->ty < -f->xform->modulus_y) - f->p1 += weight * ( f->xform->modulus_y - fmod(f->xform->modulus_y - f->ty, yr)); - else - f->p1 += weight * f->ty; - -} - -void var69_oscope (flam3_iter_helper *f, double weight) { - - /* oscilloscope from the apophysis plugin pack */ - - double tpf = 2 * M_PI * f->xform->oscope_frequency; - double t; - - if (f->xform->oscope_damping == 0.0) - t = f->xform->oscope_amplitude * cos(tpf*f->tx) + f->xform->oscope_separation; - else { - t = f->xform->oscope_amplitude * exp(-fabs(f->tx)*f->xform->oscope_damping) - * cos(tpf*f->tx) + f->xform->oscope_separation; - } - - if (fabs(f->ty) <= t) { - f->p0 += weight*f->tx; - f->p1 -= weight*f->ty; - } else { - f->p0 += weight*f->tx; - f->p1 += weight*f->ty; - } -} - -void var70_polar2 (flam3_iter_helper *f, double weight) { - - /* polar2 from the apophysis plugin pack */ - - double p2v = weight / M_PI; - - f->p0 += p2v * f->precalc_atan; - f->p1 += p2v/2.0 * log(f->precalc_sumsq); -} - -void var71_popcorn2 (flam3_iter_helper *f, double weight) { - - /* popcorn2 from the apophysis plugin pack */ - - f->p0 += weight * ( f->tx + f->xform->popcorn2_x * sin(tan(f->ty*f->xform->popcorn2_c))); - f->p1 += weight * ( f->ty + f->xform->popcorn2_y * sin(tan(f->tx*f->xform->popcorn2_c))); - -} - -void var72_scry (flam3_iter_helper *f, double weight) { - - /* scry from the apophysis plugin pack */ - /* note that scry does not multiply by weight, but as the */ - /* values still approach 0 as the weight approaches 0, it */ - /* should be ok */ - - /* - * !!! Note !!! - * This code uses the variation weight in a non-standard fashion, and - * it may change or even be removed in future versions of flam3. - */ - - double t = f->precalc_sumsq; - double r = 1.0 / (f->precalc_sqrt * (t + 1.0/(weight+EPS))); - - f->p0 += f->tx * r; - f->p1 += f->ty * r; - -} - -void var73_separation (flam3_iter_helper *f, double weight) { - - /* separation from the apophysis plugin pack */ - - double sx2 = f->xform->separation_x * f->xform->separation_x; - double sy2 = f->xform->separation_y * f->xform->separation_y; - - if (f->tx > 0.0) - f->p0 += weight * (sqrt(f->tx*f->tx + sx2)- f->tx*f->xform->separation_xinside); - else - f->p0 -= weight * (sqrt(f->tx*f->tx + sx2)+ f->tx*f->xform->separation_xinside); - - if (f->ty > 0.0) - f->p1 += weight * (sqrt(f->ty*f->ty + sy2)- f->ty*f->xform->separation_yinside); - else - f->p1 -= weight * (sqrt(f->ty*f->ty + sy2)+ f->ty*f->xform->separation_yinside); - -} - -void var74_split (flam3_iter_helper *f, double weight) { - - /* Split from apo plugins pack */ - - if (cos(f->tx*f->xform->split_xsize*M_PI) >= 0) - f->p1 += weight*f->ty; - else - f->p1 -= weight*f->ty; - - if (cos(f->ty*f->xform->split_ysize*M_PI) >= 0) - f->p0 += weight * f->tx; - else - f->p0 -= weight * f->tx; - -} - -void var75_splits (flam3_iter_helper *f, double weight) { - - /* Splits from apo plugins pack */ - - if (f->tx >= 0) - f->p0 += weight*(f->tx+f->xform->splits_x); - else - f->p0 += weight*(f->tx-f->xform->splits_x); - - if (f->ty >= 0) - f->p1 += weight*(f->ty+f->xform->splits_y); - else - f->p1 += weight*(f->ty-f->xform->splits_y); - -} - -void var76_stripes (flam3_iter_helper *f, double weight) { - - /* Stripes from apo plugins pack */ - - double roundx,offsetx; - - roundx = floor(f->tx + 0.5); - offsetx = f->tx - roundx; - - f->p0 += weight * (offsetx*(1.0-f->xform->stripes_space)+roundx); - f->p1 += weight * (f->ty + offsetx*offsetx*f->xform->stripes_warp); - -} - -void var77_wedge (flam3_iter_helper *f, double weight) { - - /* Wedge from apo plugins pack */ - - double r = f->precalc_sqrt; - double a = f->precalc_atanyx + f->xform->wedge_swirl * r; - double c = floor( (f->xform->wedge_count * a + M_PI)*M_1_PI*0.5); - - double comp_fac = 1 - f->xform->wedge_angle*f->xform->wedge_count*M_1_PI*0.5; - double sa, ca; - - a = a * comp_fac + c * f->xform->wedge_angle; - - sincos(a,&sa,&ca); - - r = weight * (r + f->xform->wedge_hole); - - f->p0 += r*ca; - f->p1 += r*sa; - -} - -void var78_wedge_julia (flam3_iter_helper *f, double weight) { - - /* wedge_julia from apo plugin pack */ - - double r = weight * pow(f->precalc_sumsq, f->xform->wedgeJulia_cn); - int t_rnd = (int)((f->xform->wedgeJulia_rN)*flam3_random_isaac_01(f->rc)); - double a = (f->precalc_atanyx + 2 * M_PI * t_rnd) / f->xform->wedge_julia_power; - double c = floor( (f->xform->wedge_julia_count * a + M_PI)*M_1_PI*0.5 ); - double sa,ca; - - a = a * f->xform->wedgeJulia_cf + c * f->xform->wedge_julia_angle; - - sincos(a,&sa,&ca); - - f->p0 += r * ca; - f->p1 += r * sa; -} - -void var79_wedge_sph (flam3_iter_helper *f, double weight) { - - /* Wedge_sph from apo plugins pack */ - - double r = 1.0/(f->precalc_sqrt+EPS); - double a = f->precalc_atanyx + f->xform->wedge_sph_swirl * r; - double c = floor( (f->xform->wedge_sph_count * a + M_PI)*M_1_PI*0.5); - - double comp_fac = 1 - f->xform->wedge_sph_angle*f->xform->wedge_sph_count*M_1_PI*0.5; - double sa, ca; - - a = a * comp_fac + c * f->xform->wedge_sph_angle; - - sincos(a,&sa,&ca); - r = weight * (r + f->xform->wedge_sph_hole); - - f->p0 += r*ca; - f->p1 += r*sa; - -} - -void var80_whorl (flam3_iter_helper *f, double weight) { - - /* whorl from apo plugins pack */ - - /* - * !!! Note !!! - * This code uses the variation weight in a non-standard fashion, and - * it may change or even be removed in future versions of flam3. - */ - - double r = f->precalc_sqrt; - double a,sa,ca; - - if (r<weight) - a = f->precalc_atanyx + f->xform->whorl_inside/(weight-r); - else - a = f->precalc_atanyx + f->xform->whorl_outside/(weight-r); - - sincos(a,&sa,&ca); - - f->p0 += weight*r*ca; - f->p1 += weight*r*sa; - -} - -void var81_waves2 (flam3_iter_helper *f, double weight) { - - /* waves2 from Joel F */ - - f->p0 += weight*(f->tx + f->xform->waves2_scalex*sin(f->ty * f->xform->waves2_freqx)); - f->p1 += weight*(f->ty + f->xform->waves2_scaley*sin(f->tx * f->xform->waves2_freqy)); - -} - -/* complex vars by cothe */ -/* exp log sin cos tan sec csc cot sinh cosh tanh sech csch coth */ - -void var82_exp (flam3_iter_helper *f, double weight) { - //Exponential EXP - double expe = exp(f->tx); - double expcos,expsin; - sincos(f->ty,&expsin,&expcos); - f->p0 += weight * expe * expcos; - f->p1 += weight * expe * expsin; -} - -void var83_log (flam3_iter_helper *f, double weight) { - //Natural Logarithm LOG - // needs precalc_atanyx and precalc_sumsq - f->p0 += weight * 0.5 * log(f->precalc_sumsq); - f->p1 += weight * f->precalc_atanyx; -} - -void var84_sin (flam3_iter_helper *f, double weight) { - //Sine SIN - double sinsin,sinacos,sinsinh,sincosh; - sincos(f->tx,&sinsin,&sinacos); - sinsinh = sinh(f->ty); - sincosh = cosh(f->ty); - f->p0 += weight * sinsin * sincosh; - f->p1 += weight * sinacos * sinsinh; -} - -void var85_cos (flam3_iter_helper *f, double weight) { - //Cosine COS - double cossin,coscos,cossinh,coscosh; - sincos(f->tx,&cossin,&coscos); - cossinh = sinh(f->ty); - coscosh = cosh(f->ty); - f->p0 += weight * coscos * coscosh; - f->p1 -= weight * cossin * cossinh; -} - -void var86_tan (flam3_iter_helper *f, double weight) { - //Tangent TAN - double tansin,tancos,tansinh,tancosh; - double tanden; - sincos(2*f->tx,&tansin,&tancos); - tansinh = sinh(2.0*f->ty); - tancosh = cosh(2.0*f->ty); - tanden = 1.0/(tancos + tancosh); - f->p0 += weight * tanden * tansin; - f->p1 += weight * tanden * tansinh; -} - -void var87_sec (flam3_iter_helper *f, double weight) { - //Secant SEC - double secsin,seccos,secsinh,seccosh; - double secden; - sincos(f->tx,&secsin,&seccos); - secsinh = sinh(f->ty); - seccosh = cosh(f->ty); - secden = 2.0/(cos(2*f->tx) + cosh(2*f->ty)); - f->p0 += weight * secden * seccos * seccosh; - f->p1 += weight * secden * secsin * secsinh; -} - -void var88_csc (flam3_iter_helper *f, double weight) { - //Cosecant CSC - double cscsin,csccos,cscsinh,csccosh; - double cscden; - sincos(f->tx,&cscsin,&csccos); - cscsinh = sinh(f->ty); - csccosh = cosh(f->ty); - cscden = 2.0/(cosh(2.0*f->ty) - cos(2.0*f->tx)); - f->p0 += weight * cscden * cscsin * csccosh; - f->p1 -= weight * cscden * csccos * cscsinh; -} - -void var89_cot (flam3_iter_helper *f, double weight) { - //Cotangent COT - double cotsin,cotcos,cotsinh,cotcosh; - double cotden; - sincos(2.0*f->tx,&cotsin,&cotcos); - cotsinh = sinh(2.0*f->ty); - cotcosh = cosh(2.0*f->ty); - cotden = 1.0/(cotcosh - cotcos); - f->p0 += weight * cotden * cotsin; - f->p1 += weight * cotden * -1 * cotsinh; -} - -void var90_sinh (flam3_iter_helper *f, double weight) { - //Hyperbolic Sine SINH - double sinhsin,sinhcos,sinhsinh,sinhcosh; - sincos(f->ty,&sinhsin,&sinhcos); - sinhsinh = sinh(f->tx); - sinhcosh = cosh(f->tx); - f->p0 += weight * sinhsinh * sinhcos; - f->p1 += weight * sinhcosh * sinhsin; -} - -void var91_cosh (flam3_iter_helper *f, double weight) { - //Hyperbolic Cosine COSH - double coshsin,coshcos,coshsinh,coshcosh; - sincos(f->ty,&coshsin,&coshcos); - coshsinh = sinh(f->tx); - coshcosh = cosh(f->tx); - f->p0 += weight * coshcosh * coshcos; - f->p1 += weight * coshsinh * coshsin; -} - -void var92_tanh (flam3_iter_helper *f, double weight) { - //Hyperbolic Tangent TANH - double tanhsin,tanhcos,tanhsinh,tanhcosh; - double tanhden; - sincos(2.0*f->ty,&tanhsin,&tanhcos); - tanhsinh = sinh(2.0*f->tx); - tanhcosh = cosh(2.0*f->tx); - tanhden = 1.0/(tanhcos + tanhcosh); - f->p0 += weight * tanhden * tanhsinh; - f->p1 += weight * tanhden * tanhsin; -} - -void var93_sech (flam3_iter_helper *f, double weight) { - //Hyperbolic Secant SECH - double sechsin,sechcos,sechsinh,sechcosh; - double sechden; - sincos(f->ty,&sechsin,&sechcos); - sechsinh = sinh(f->tx); - sechcosh = cosh(f->tx); - sechden = 2.0/(cos(2.0*f->ty) + cosh(2.0*f->tx)); - f->p0 += weight * sechden * sechcos * sechcosh; - f->p1 -= weight * sechden * sechsin * sechsinh; -} - -void var94_csch (flam3_iter_helper *f, double weight) { - //Hyperbolic Cosecant CSCH - double cschsin,cschcos,cschsinh,cschcosh; - double cschden; - sincos(f->ty,&cschsin,&cschcos); - cschsinh = sinh(f->tx); - cschcosh = cosh(f->tx); - cschden = 2.0/(cosh(2.0*f->tx) - cos(2.0*f->ty)); - f->p0 += weight * cschden * cschsinh * cschcos; - f->p1 -= weight * cschden * cschcosh * cschsin; -} - -void var95_coth (flam3_iter_helper *f, double weight) { - //Hyperbolic Cotangent COTH - double cothsin,cothcos,cothsinh,cothcosh; - double cothden; - sincos(2.0*f->ty,&cothsin,&cothcos); - cothsinh = sinh(2.0*f->tx); - cothcosh = cosh(2.0*f->tx); - cothden = 1.0/(cothcosh - cothcos); - f->p0 += weight * cothden * cothsinh; - f->p1 += weight * cothden * cothsin; -} - -void var96_auger (flam3_iter_helper *f, double weight) { - - // Auger, by Xyrus01 - double s = sin(f->xform->auger_freq * f->tx); - double t = sin(f->xform->auger_freq * f->ty); - double dy = f->ty + f->xform->auger_weight*(f->xform->auger_scale*s/2.0 + fabs(f->ty)*s); - double dx = f->tx + f->xform->auger_weight*(f->xform->auger_scale*t/2.0 + fabs(f->tx)*t); - - f->p0 += weight * (f->tx + f->xform->auger_sym*(dx-f->tx)); - f->p1 += weight * dy; -} - -void var97_flux (flam3_iter_helper *f, double weight) { - - // Flux, by meckie - double xpw = f->tx + weight; - double xmw = f->tx - weight; - double avgr = weight * (2 + f->xform->flux_spread) * sqrt( sqrt(f->ty*f->ty + xpw*xpw) / sqrt(f->ty*f->ty + xmw*xmw)); - double avga = ( atan2(f->ty, xmw) - atan2(f->ty,xpw) ) * 0.5; - - double s = sin(avga); - double c = cos(avga); - - f->p0 += avgr * cos(avga); - f->p1 += avgr * sin(avga); -} - -void var98_mobius (flam3_iter_helper *f, double weight) { - - // Mobius, by eralex - double re_u, im_u, re_v, im_v, rad_v; - - re_u = f->xform->mobius_re_a * f->tx - f->xform->mobius_im_a * f->ty + f->xform->mobius_re_b; - im_u = f->xform->mobius_re_a * f->ty + f->xform->mobius_im_a * f->tx + f->xform->mobius_im_b; - re_v = f->xform->mobius_re_c * f->tx - f->xform->mobius_im_c * f->ty + f->xform->mobius_re_d; - im_v = f->xform->mobius_re_c * f->ty + f->xform->mobius_im_c * f->tx + f->xform->mobius_im_d; - - rad_v = weight / (re_v*re_v + im_v*im_v); - - f->p0 += rad_v * (re_u*re_v + im_u*im_v); - f->p1 += rad_v * (im_u*re_v - re_u*im_v); -} - - -/* Precalc functions */ - -void perspective_precalc(flam3_xform *xf) { - double ang = xf->perspective_angle * M_PI / 2.0; - xf->persp_vsin = sin(ang); - xf->persp_vfcos = xf->perspective_dist * cos(ang); -} - -void juliaN_precalc(flam3_xform *xf) { - xf->julian_rN = fabs(xf->julian_power); - xf->julian_cn = xf->julian_dist / (double)xf->julian_power / 2.0; -} - -void wedgeJulia_precalc(flam3_xform *xf) { - xf->wedgeJulia_cf = 1.0 - xf->wedge_julia_angle * xf->wedge_julia_count * M_1_PI * 0.5; - xf->wedgeJulia_rN = fabs(xf->wedge_julia_power); - xf->wedgeJulia_cn = xf->wedge_julia_dist / xf->wedge_julia_power / 2.0; -} - -void juliaScope_precalc(flam3_xform *xf) { - xf->juliascope_rN = fabs(xf->juliascope_power); - xf->juliascope_cn = xf->juliascope_dist / (double)xf->juliascope_power / 2.0; -} - -void radial_blur_precalc(flam3_xform *xf) { - sincos(xf->radial_blur_angle * M_PI / 2.0, - &xf->radialBlur_spinvar, &xf->radialBlur_zoomvar); -} - -void waves_precalc(flam3_xform *xf) { - double dx = xf->c[2][0]; - double dy = xf->c[2][1]; - - xf->waves_dx2 = 1.0/(dx * dx + EPS); - xf->waves_dy2 = 1.0/(dy * dy + EPS); -} - -void disc2_precalc(flam3_xform *xf) { - double add = xf->disc2_twist; - double k; - - xf->disc2_timespi = xf->disc2_rot * M_PI; - - sincos(add,&xf->disc2_sinadd,&xf->disc2_cosadd); - xf->disc2_cosadd -= 1; - - if (add > 2 * M_PI) { - k = (1 + add - 2*M_PI); - xf->disc2_cosadd *= k; - xf->disc2_sinadd *= k; - } - - if (add < -2 * M_PI) { - k = (1 + add + 2*M_PI); - xf->disc2_cosadd *= k; - xf->disc2_sinadd *= k; - } -} - -void supershape_precalc(flam3_xform *xf) { - xf->super_shape_pm_4 = xf->super_shape_m / 4.0; - xf->super_shape_pneg1_n1 = -1.0 / xf->super_shape_n1; -} - -void xform_precalc(flam3_genome *cp, int xi) { - - perspective_precalc(&(cp->xform[xi])); - juliaN_precalc(&(cp->xform[xi])); - juliaScope_precalc(&(cp->xform[xi])); - radial_blur_precalc(&(cp->xform[xi])); - waves_precalc(&(cp->xform[xi])); - disc2_precalc(&(cp->xform[xi])); - supershape_precalc(&(cp->xform[xi])); - wedgeJulia_precalc(&(cp->xform[xi])); -} - -int prepare_precalc_flags(flam3_genome *cp) { - - double d; - int i,j,totnum; - - /* Loop over valid xforms */ - for (i = 0; i < cp->num_xforms; i++) { - d = cp->xform[i].density; - if (d < 0.0) { - fprintf(stderr, "xform %d weight must be non-negative, not %g.\n",i,d); - return(1); - } - - if (i != cp->final_xform_index && d == 0.0) - continue; - - totnum = 0; - - cp->xform[i].vis_adjusted = adjust_percentage(cp->xform[i].opacity); - - cp->xform[i].precalc_angles_flag=0; - cp->xform[i].precalc_atan_xy_flag=0; - cp->xform[i].precalc_atan_yx_flag=0; - cp->xform[i].has_preblur=0; - cp->xform[i].has_post = !(id_matrix(cp->xform[i].post)); - - - for (j = 0; j < flam3_nvariations; j++) { - - if (cp->xform[i].var[j]!=0) { - - cp->xform[i].varFunc[totnum] = j; - cp->xform[i].active_var_weights[totnum] = cp->xform[i].var[j]; - - if (j==VAR_POLAR) { - cp->xform[i].precalc_atan_xy_flag=1; - } else if (j==VAR_HANDKERCHIEF) { - cp->xform[i].precalc_atan_xy_flag=1; - } else if (j==VAR_HEART) { - cp->xform[i].precalc_atan_xy_flag=1; - } else if (j==VAR_DISC) { - cp->xform[i].precalc_atan_xy_flag=1; - } else if (j==VAR_SPIRAL) { - cp->xform[i].precalc_angles_flag=1; - } else if (j==VAR_HYPERBOLIC) { - cp->xform[i].precalc_angles_flag=1; - } else if (j==VAR_DIAMOND) { - cp->xform[i].precalc_angles_flag=1; - } else if (j==VAR_EX) { - cp->xform[i].precalc_atan_xy_flag=1; - } else if (j==VAR_JULIA) { - cp->xform[i].precalc_atan_xy_flag=1; - } else if (j==VAR_POWER) { - cp->xform[i].precalc_angles_flag=1; - } else if (j==VAR_RINGS) { - cp->xform[i].precalc_angles_flag=1; - } else if (j==VAR_FAN) { - cp->xform[i].precalc_atan_xy_flag=1; - } else if (j==VAR_BLOB) { - cp->xform[i].precalc_atan_xy_flag=1; - cp->xform[i].precalc_angles_flag=1; - } else if (j==VAR_FAN2) { - cp->xform[i].precalc_atan_xy_flag=1; - } else if (j==VAR_RINGS2) { - cp->xform[i].precalc_angles_flag=1; - } else if (j==VAR_JULIAN) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_JULIASCOPE) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_RADIAL_BLUR) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_NGON) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_DISC2) { - cp->xform[i].precalc_atan_xy_flag=1; - } else if (j==VAR_SUPER_SHAPE) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_FLOWER) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_CONIC) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_CPOW) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_ESCHER) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_PRE_BLUR) { - cp->xform[i].has_preblur=cp->xform[i].var[j]; - } else if (j==VAR_POLAR2) { - cp->xform[i].precalc_atan_xy_flag=1; - } else if (j==VAR_WEDGE) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_WEDGE_JULIA) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_WEDGE_SPH) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_WHORL) { - cp->xform[i].precalc_atan_yx_flag=1; - } else if (j==VAR_LOG) { - cp->xform[i].precalc_atan_yx_flag=1; - } - - totnum++; - } - } - - cp->xform[i].num_active_vars = totnum; - - } - - return(0); -} - - -int apply_xform(flam3_genome *cp, int fn, double *p, double *q, randctx *rc) -{ - flam3_iter_helper f; - int var_n; - double next_color,s,s1; - double weight; - - f.rc = rc; - - s1 = cp->xform[fn].color_speed; - - q[2] = s1 * cp->xform[fn].color + (1.0-s1) * p[2]; - q[3] = cp->xform[fn].vis_adjusted; - - //fprintf(stderr,"%d : %f %f %f\n",fn,cp->xform[fn].c[0][0],cp->xform[fn].c[1][0],cp->xform[fn].c[2][0]); - - f.tx = cp->xform[fn].c[0][0] * p[0] + cp->xform[fn].c[1][0] * p[1] + cp->xform[fn].c[2][0]; - f.ty = cp->xform[fn].c[0][1] * p[0] + cp->xform[fn].c[1][1] * p[1] + cp->xform[fn].c[2][1]; - - /* Pre-xforms go here, and modify the f.tx and f.ty values */ - if (cp->xform[fn].has_preblur!=0.0) - var67_pre_blur(&f, cp->xform[fn].has_preblur); - - /* Always calculate sumsq and sqrt */ - f.precalc_sumsq = f.tx*f.tx + f.ty*f.ty; - f.precalc_sqrt = sqrt(f.precalc_sumsq); - - /* Check to see if we can precalculate any parts */ - /* Precalculate atanxy, sin, cos */ - if (cp->xform[fn].precalc_atan_xy_flag > 0) { - f.precalc_atan = atan2(f.tx,f.ty); - } - - if (cp->xform[fn].precalc_angles_flag > 0) { - f.precalc_sina = f.tx / f.precalc_sqrt; - f.precalc_cosa = f.ty / f.precalc_sqrt; - } - - /* Precalc atanyx */ - if (cp->xform[fn].precalc_atan_yx_flag > 0) { - f.precalc_atanyx = atan2(f.ty,f.tx); - } - - f.p0 = 0.0; - f.p1 = 0.0; - f.xform = &(cp->xform[fn]); - - - for (var_n=0; var_n < cp->xform[fn].num_active_vars; var_n++) { - - weight = cp->xform[fn].active_var_weights[var_n]; - - switch (cp->xform[fn].varFunc[var_n]) { - - case (VAR_LINEAR): - var0_linear(&f, weight); break; - case (VAR_SINUSOIDAL): - var1_sinusoidal(&f, weight); break; - case (VAR_SPHERICAL): - var2_spherical(&f, weight); break; - case (VAR_SWIRL): - var3_swirl(&f, weight); break; - case (VAR_HORSESHOE): - var4_horseshoe(&f, weight); break; - case (VAR_POLAR): - var5_polar(&f, weight); break; - case (VAR_HANDKERCHIEF): - var6_handkerchief(&f, weight); break; - case (VAR_HEART): - var7_heart(&f, weight); break; - case (VAR_DISC): - var8_disc(&f, weight); break; - case (VAR_SPIRAL): - var9_spiral(&f, weight); break; - case (VAR_HYPERBOLIC): - var10_hyperbolic(&f, weight); break; - case (VAR_DIAMOND): - var11_diamond(&f, weight); break; - case (VAR_EX): - var12_ex(&f, weight); break; - case (VAR_JULIA): - var13_julia(&f, weight); break; - case (VAR_BENT): - var14_bent(&f, weight); break; - case (VAR_WAVES): - var15_waves(&f, weight); break; - case (VAR_FISHEYE): - var16_fisheye(&f, weight); break; - case (VAR_POPCORN): - var17_popcorn(&f, weight); break; - case (VAR_EXPONENTIAL): - var18_exponential(&f, weight); break; - case (VAR_POWER): - var19_power(&f, weight); break; - case (VAR_COSINE): - var20_cosine(&f, weight); break; - case (VAR_RINGS): - var21_rings(&f, weight); break; - case (VAR_FAN): - var22_fan(&f, weight); break; - case (VAR_BLOB): - var23_blob(&f, weight); break; - case (VAR_PDJ): - var24_pdj(&f, weight); break; - case (VAR_FAN2): - var25_fan2(&f, weight); break; - case (VAR_RINGS2): - var26_rings2(&f, weight); break; - case (VAR_EYEFISH): - var27_eyefish(&f, weight); break; - case (VAR_BUBBLE): - var28_bubble(&f, weight); break; - case (VAR_CYLINDER): - var29_cylinder(&f, weight); break; - case (VAR_PERSPECTIVE): - var30_perspective(&f, weight); break; - case (VAR_NOISE): - var31_noise(&f, weight); break; - case (VAR_JULIAN): - var32_juliaN_generic(&f, weight); break; - case (VAR_JULIASCOPE): - var33_juliaScope_generic(&f, weight);break; - case (VAR_BLUR): - var34_blur(&f, weight); break; - case (VAR_GAUSSIAN_BLUR): - var35_gaussian(&f, weight); break; - case (VAR_RADIAL_BLUR): - var36_radial_blur(&f, weight); break; - case (VAR_PIE): - var37_pie(&f, weight); break; - case (VAR_NGON): - var38_ngon(&f, weight); break; - case (VAR_CURL): - var39_curl(&f, weight); break; - case (VAR_RECTANGLES): - var40_rectangles(&f, weight); break; - case (VAR_ARCH): - var41_arch(&f, weight); break; - case (VAR_TANGENT): - var42_tangent(&f, weight); break; - case (VAR_SQUARE): - var43_square(&f, weight); break; - case (VAR_RAYS): - var44_rays(&f, weight); break; - case (VAR_BLADE): - var45_blade(&f, weight); break; - case (VAR_SECANT2): - var46_secant2(&f, weight); break; - case (VAR_TWINTRIAN): - var47_twintrian(&f, weight); break; - case (VAR_CROSS): - var48_cross(&f, weight); break; - case (VAR_DISC2): - var49_disc2(&f, weight); break; - case (VAR_SUPER_SHAPE): - var50_supershape(&f, weight); break; - case (VAR_FLOWER): - var51_flower(&f, weight); break; - case (VAR_CONIC): - var52_conic(&f, weight); break; - case (VAR_PARABOLA): - var53_parabola(&f, weight); break; - case (VAR_BENT2): - var54_bent2(&f, weight); break; - case (VAR_BIPOLAR): - var55_bipolar(&f, weight); break; - case (VAR_BOARDERS): - var56_boarders(&f, weight); break; - case (VAR_BUTTERFLY): - var57_butterfly(&f, weight); break; - case (VAR_CELL): - var58_cell(&f, weight); break; - case (VAR_CPOW): - var59_cpow(&f, weight); break; - case (VAR_CURVE): - var60_curve(&f, weight); break; - case (VAR_EDISC): - var61_edisc(&f, weight); break; - case (VAR_ELLIPTIC): - var62_elliptic(&f, weight); break; - case (VAR_ESCHER): - var63_escher(&f, weight); break; - case (VAR_FOCI): - var64_foci(&f, weight); break; - case (VAR_LAZYSUSAN): - var65_lazysusan(&f, weight); break; - case (VAR_LOONIE): - var66_loonie(&f, weight); break; - case (VAR_MODULUS): - var68_modulus(&f, weight); break; - case (VAR_OSCILLOSCOPE): - var69_oscope(&f, weight); break; - case (VAR_POLAR2): - var70_polar2(&f, weight); break; - case (VAR_POPCORN2): - var71_popcorn2(&f, weight); break; - case (VAR_SCRY): - var72_scry(&f, weight); break; - case (VAR_SEPARATION): - var73_separation(&f, weight); break; - case (VAR_SPLIT): - var74_split(&f, weight); break; - case (VAR_SPLITS): - var75_splits(&f, weight); break; - case (VAR_STRIPES): - var76_stripes(&f, weight); break; - case (VAR_WEDGE): - var77_wedge(&f, weight); break; - case (VAR_WEDGE_JULIA): - var78_wedge_julia(&f, weight); break; - case (VAR_WEDGE_SPH): - var79_wedge_sph(&f, weight); break; - case (VAR_WHORL): - var80_whorl(&f, weight); break; - case (VAR_WAVES2): - var81_waves2(&f, weight); break; - case (VAR_EXP): - var82_exp(&f, weight); break; - case (VAR_LOG): - var83_log(&f, weight); break; - case (VAR_SIN): - var84_sin(&f, weight); break; - case (VAR_COS): - var85_cos(&f, weight); break; - case (VAR_TAN): - var86_tan(&f, weight); break; - case (VAR_SEC): - var87_sec(&f, weight); break; - case (VAR_CSC): - var88_csc(&f, weight); break; - case (VAR_COT): - var89_cot(&f, weight); break; - case (VAR_SINH): - var90_sinh(&f, weight); break; - case (VAR_COSH): - var91_cosh(&f, weight); break; - case (VAR_TANH): - var92_tanh(&f, weight); break; - case (VAR_SECH): - var93_sech(&f, weight); break; - case (VAR_CSCH): - var94_csch(&f, weight); break; - case (VAR_COTH): - var95_coth(&f, weight); break; - case (VAR_AUGER): - var96_auger(&f, weight); break; - case (VAR_FLUX): - var97_flux(&f, weight); break; - case (VAR_MOBIUS): - var98_mobius(&f, weight); break; - } - - } - /* apply the post transform */ - if (cp->xform[fn].has_post) { - q[0] = cp->xform[fn].post[0][0] * f.p0 + cp->xform[fn].post[1][0] * f.p1 + cp->xform[fn].post[2][0]; - q[1] = cp->xform[fn].post[0][1] * f.p0 + cp->xform[fn].post[1][1] * f.p1 + cp->xform[fn].post[2][1]; - } else { - q[0] = f.p0; - q[1] = f.p1; - } - - /* Check for badvalues and return randoms if bad */ - if (badvalue(q[0]) || badvalue(q[1])) { - q[0] = flam3_random_isaac_11(rc); - q[1] = flam3_random_isaac_11(rc); - return(1); - } else - return(0); - -} - -void initialize_xforms(flam3_genome *thiscp, int start_here) { - - int i,j; - for (i = start_here ; i < thiscp->num_xforms ; i++) { - thiscp->xform[i].padding = 0; - thiscp->xform[i].density = 0.0; - thiscp->xform[i].color_speed = 0.5; - thiscp->xform[i].animate = 1.0; - thiscp->xform[i].color = i&1; - thiscp->xform[i].opacity = 1.0; - thiscp->xform[i].var[0] = 1.0; - thiscp->xform[i].motion_freq = 0; - thiscp->xform[i].motion_func = 0; - thiscp->xform[i].num_motion = 0; - thiscp->xform[i].motion = NULL; - for (j = 1; j < flam3_nvariations; j++) - thiscp->xform[i].var[j] = 0.0; - thiscp->xform[i].c[0][0] = 1.0; - thiscp->xform[i].c[0][1] = 0.0; - thiscp->xform[i].c[1][0] = 0.0; - thiscp->xform[i].c[1][1] = 1.0; - thiscp->xform[i].c[2][0] = 0.0; - thiscp->xform[i].c[2][1] = 0.0; - thiscp->xform[i].post[0][0] = 1.0; - thiscp->xform[i].post[0][1] = 0.0; - thiscp->xform[i].post[1][0] = 0.0; - thiscp->xform[i].post[1][1] = 1.0; - thiscp->xform[i].post[2][0] = 0.0; - thiscp->xform[i].post[2][1] = 0.0; - thiscp->xform[i].wind[0] = 0.0; - thiscp->xform[i].wind[1] = 0.0; - thiscp->xform[i].blob_low = 0.0; - thiscp->xform[i].blob_high = 1.0; - thiscp->xform[i].blob_waves = 1.0; - thiscp->xform[i].pdj_a = 0.0; - thiscp->xform[i].pdj_b = 0.0; - thiscp->xform[i].pdj_c = 0.0; - thiscp->xform[i].pdj_d = 0.0; - thiscp->xform[i].fan2_x = 0.0; - thiscp->xform[i].fan2_y = 0.0; - thiscp->xform[i].rings2_val = 0.0; - thiscp->xform[i].perspective_angle = 0.0; - thiscp->xform[i].perspective_dist = 0.0; - thiscp->xform[i].persp_vsin = 0.0; - thiscp->xform[i].persp_vfcos = 0.0; - thiscp->xform[i].radial_blur_angle = 0.0; - thiscp->xform[i].disc2_rot = 0.0; - thiscp->xform[i].disc2_twist = 0.0; - thiscp->xform[i].disc2_sinadd = 0.0; - thiscp->xform[i].disc2_cosadd = 0.0; - thiscp->xform[i].disc2_timespi = 0.0; - thiscp->xform[i].flower_petals = 0.0; - thiscp->xform[i].flower_holes = 0.0; - thiscp->xform[i].parabola_height = 0.0; - thiscp->xform[i].parabola_width = 0.0; - thiscp->xform[i].bent2_x = 1.0; - thiscp->xform[i].bent2_y = 1.0; - thiscp->xform[i].bipolar_shift = 0.0; - thiscp->xform[i].cell_size = 1.0; - thiscp->xform[i].cpow_r = 1.0; - thiscp->xform[i].cpow_i = 0.0; - thiscp->xform[i].cpow_power = 1.0; - thiscp->xform[i].curve_xamp = 0.0; - thiscp->xform[i].curve_yamp = 0.0; - thiscp->xform[i].curve_xlength = 1.0; - thiscp->xform[i].curve_ylength = 1.0; - thiscp->xform[i].escher_beta = 0.0; - thiscp->xform[i].lazysusan_space = 0.0; - thiscp->xform[i].lazysusan_twist = 0.0; - thiscp->xform[i].lazysusan_spin = 0.0; - thiscp->xform[i].lazysusan_x = 0.0; - thiscp->xform[i].lazysusan_y = 0.0; - thiscp->xform[i].modulus_x = 0.0; - thiscp->xform[i].modulus_y = 0.0; - thiscp->xform[i].oscope_separation = 1.0; - thiscp->xform[i].oscope_frequency = M_PI; - thiscp->xform[i].oscope_amplitude = 1.0; - thiscp->xform[i].oscope_damping = 0.0; - thiscp->xform[i].popcorn2_c = 0.0; - thiscp->xform[i].popcorn2_x = 0.0; - thiscp->xform[i].popcorn2_y = 0.0; - thiscp->xform[i].separation_x = 0.0; - thiscp->xform[i].separation_xinside = 0.0; - thiscp->xform[i].separation_y = 0.0; - thiscp->xform[i].separation_yinside = 0.0; - thiscp->xform[i].split_xsize = 0.0; - thiscp->xform[i].split_ysize = 0.0; - thiscp->xform[i].splits_x = 0.0; - thiscp->xform[i].splits_y = 0.0; - thiscp->xform[i].stripes_space = 0.0; - thiscp->xform[i].stripes_warp = 0.0; - thiscp->xform[i].wedge_angle = 0.0; - thiscp->xform[i].wedge_hole = 0.0; - thiscp->xform[i].wedge_count = 1.0; - thiscp->xform[i].wedge_swirl = 0.0; - thiscp->xform[i].wedge_sph_angle = 0.0; - thiscp->xform[i].wedge_sph_hole = 0.0; - thiscp->xform[i].wedge_sph_count = 1.0; - thiscp->xform[i].wedge_sph_swirl = 0.0; - - thiscp->xform[i].wedge_julia_power = 1.0; - thiscp->xform[i].wedge_julia_dist = 0.0; - thiscp->xform[i].wedge_julia_count = 1.0; - thiscp->xform[i].wedge_julia_angle = 0.0; - thiscp->xform[i].wedgeJulia_cf = 0.0; - thiscp->xform[i].wedgeJulia_cn = 0.5; - thiscp->xform[i].wedgeJulia_rN = 1.0; - thiscp->xform[i].whorl_inside = 0.0; - thiscp->xform[i].whorl_outside = 0.0; - - thiscp->xform[i].waves2_scalex = 0.0; - thiscp->xform[i].waves2_scaley = 0.0; - thiscp->xform[i].waves2_freqx = 0.0; - thiscp->xform[i].waves2_freqy = 0.0; - - thiscp->xform[i].auger_freq = 1.0; - thiscp->xform[i].auger_weight = 0.5; - thiscp->xform[i].auger_sym = 0.0; - thiscp->xform[i].auger_scale = 1.0; - - thiscp->xform[i].flux_spread = 0.0; - - thiscp->xform[i].julian_power = 1.0; - thiscp->xform[i].julian_dist = 1.0; - thiscp->xform[i].julian_rN = 1.0; - thiscp->xform[i].julian_cn = 0.5; - thiscp->xform[i].juliascope_power = 1.0; - thiscp->xform[i].juliascope_dist = 1.0; - thiscp->xform[i].juliascope_rN = 1.0; - thiscp->xform[i].juliascope_cn = 0.5; - thiscp->xform[i].radialBlur_spinvar = 0.0; - thiscp->xform[i].radialBlur_zoomvar = 1.0; - thiscp->xform[i].pie_slices = 6.0; - thiscp->xform[i].pie_rotation = 0.0; - thiscp->xform[i].pie_thickness = 0.5; - thiscp->xform[i].ngon_sides = 5; - thiscp->xform[i].ngon_power = 3; - thiscp->xform[i].ngon_circle = 1; - thiscp->xform[i].ngon_corners = 2; - thiscp->xform[i].curl_c1 = 1.0; - thiscp->xform[i].curl_c2 = 0.0; - thiscp->xform[i].rectangles_x = 1.0; - thiscp->xform[i].rectangles_y = 1.0; - thiscp->xform[i].amw_amp = 1.0; - thiscp->xform[i].super_shape_rnd = 0.0; - thiscp->xform[i].super_shape_m = 0.0; - thiscp->xform[i].super_shape_n1 = 1.0; - thiscp->xform[i].super_shape_n2 = 1.0; - thiscp->xform[i].super_shape_n3 = 1.0; - thiscp->xform[i].super_shape_holes = 0.0; - thiscp->xform[i].conic_eccentricity = 1.0; - thiscp->xform[i].conic_holes = 0.0; - - thiscp->xform[i].mobius_re_a = 0.0; - thiscp->xform[i].mobius_re_b = 0.0; - thiscp->xform[i].mobius_re_c = 0.0; - thiscp->xform[i].mobius_re_d = 0.0; - thiscp->xform[i].mobius_im_a = 0.0; - thiscp->xform[i].mobius_im_b = 0.0; - thiscp->xform[i].mobius_im_c = 0.0; - thiscp->xform[i].mobius_im_d = 0.0; - } -} |