package org.jwildfire.create.tina.variation; import static org.jwildfire.base.mathlib.MathLib.M_2PI; import static org.jwildfire.base.mathlib.MathLib.sinAndCos; import static org.jwildfire.base.mathlib.MathLib.sqrt; import odk.lang.DoubleWrapper; import org.jwildfire.base.Tools; import org.jwildfire.create.tina.base.XForm; import org.jwildfire.create.tina.base.XYZPoint; public class VogelFunc extends VariationFunc { private static final long serialVersionUID = 1L; private static final String PARAM_N = "n"; private static final String PARAM_SCALE = "scale"; private static final String[] paramNames = { PARAM_N, PARAM_SCALE }; private final double M_PHI = 1.61803398874989484820; private final double M_2PI_PHI2 = M_2PI / (M_PHI * M_PHI); private final DoubleWrapper sina = new DoubleWrapper(); private final DoubleWrapper cosa = new DoubleWrapper(); private int n = 20; private double scale = 1.; @Override public String getName() { return "vogel"; } @Override public String[] getParameterNames() { return paramNames; } @Override public Object[] getParameterValues() { return new Object[] { n, scale }; } @Override public void setParameter(final String pName, final double pValue) { if (PARAM_N.equalsIgnoreCase(pName)) { n = limitIntVal(Tools.FTOI(pValue), 1, Integer.MAX_VALUE); } else if (PARAM_SCALE.equalsIgnoreCase(pName)) { scale = pValue; } else { throw new IllegalArgumentException(pName); } } @Override public void transform(FlameTransformationContext pContext, XForm pXForm, XYZPoint pAffineTP, XYZPoint pVarTP, double pAmount) { // Vogel function by Victor Ganora final int i = pContext.random(n) + 1; final double a = i * M_2PI_PHI2; sinAndCos(a, sina, cosa); final double r = pAmount * (pAffineTP.getPrecalcSqrt() + sqrt(i)); pVarTP.x += r * (cosa.value + (scale * pAffineTP.x)); pVarTP.y += r * (sina.value + (scale * pAffineTP.y)); if (pContext.isPreserveZCoordinate()) { pVarTP.z += pAmount * pAffineTP.z; } } }