114 lines
3.3 KiB
C
114 lines
3.3 KiB
C
|
/*
|
||
|
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).
|