apophysis7x/Plugin/rational3.c

114 lines
3.3 KiB
C
Raw Normal View History

/*
Apophysis Plugin
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 2 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, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
typedef struct
{
double rational3_vvar;
double rational3_t3;
double rational3_t2;
double rational3_t1;
double rational3_tc;
double rational3_b3;
double rational3_b2;
double rational3_b1;
double rational3_bc;
} Variables;
#include "apoplugin.h"
// Set the name of this plugin
APO_PLUGIN("rational3");
// Define the Variables
APO_VARIABLES(
VAR_REAL(rational3_t3, 1.0),
VAR_REAL(rational3_t2, 0.0),
VAR_REAL(rational3_t1, 0.0),
VAR_REAL(rational3_tc, 1.0),
VAR_REAL(rational3_b3, 0.0),
VAR_REAL(rational3_b2, 1.0),
VAR_REAL(rational3_b1, 0.0),
VAR_REAL(rational3_bc, 1.0)
);
// You must call the argument "vp".
int PluginVarPrepare(Variation* vp)
{
VAR(rational3_vvar) = VVAR;
// Always return TRUE.
return TRUE;
}
// You must call the argument "vp".
int PluginVarCalc(Variation* vp)
{
double xsqr = FTx * FTx;
double ysqr = FTy * FTy;
double xcb = FTx * FTx * FTx;
double ycb = FTy * FTy * FTy;
double tr = VAR(rational3_t3) * (xcb - 3 * FTx * ysqr) + VAR(rational3_t2) * (xsqr - ysqr) + VAR(rational3_t1) * FTx + VAR(rational3_tc);
double ti = VAR(rational3_t3) * (3 * xsqr * FTy - ycb) + VAR(rational3_t2) * 2 * FTx * FTy + VAR(rational3_t1) * FTy;
double br = VAR(rational3_b3) * (xcb - 3 * FTx * ysqr) + VAR(rational3_b2) * (xsqr - ysqr) + VAR(rational3_b1) * FTx + VAR(rational3_bc);
double bi = VAR(rational3_b3) * (3 * xsqr * FTy - ycb) + VAR(rational3_b2) * 2 * FTx * FTy + VAR(rational3_b1) * FTy;
double r3den = 1/(br * br + bi * bi);
FPx += VAR(rational3_vvar) * (tr * br + ti * bi) * r3den;
FPy += VAR(rational3_vvar) * (ti * br - tr * bi) * r3den;
// FPx += VAR(rational3_vvar) * FTx * 2;
// FPy += VAR(rational3_vvar) * FTy * 2;
return TRUE;
}
// Rational3 allows you to customize a rational function
// involving the complex variable z. It can be represented
// as the function...
// az^3 + bz^2 + cz + d
// -------------------- division line
// ez^3 + fz^2 + gz + h
// In this case,
// t3 = a (top z^3 coefficient)
// t2 = b
// t1 = c
// tc = d (top constant)
// b3 = e (bottom z^3 coefficient)
// b2 = f
// b1 = g
// bc = h (bottom constant)
// This baby was a beast to work out, so please don't ask
// me to explain the whole thing.
// This works sort of like Curl, except Curl uses the formula...
// z
// -------------
// bz^2 + az + 1
// Which is weird and abstract (one might say pointless,
// but that would be mean).