Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- JWildfire - an image and animation processor written in Java
- Copyright (C) 1995-2011 Andreas Maschke
- This is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser
- General Public License as published by the Free Software Foundation; either version 2.1 of the
- License, or (at your option) any later version.
- This software 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
- Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License along with this software;
- if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
- package org.jwildfire.create.tina.variation;
- import static org.jwildfire.base.mathlib.MathLib.M_PI;
- import static org.jwildfire.base.mathlib.MathLib.atan2;
- import static org.jwildfire.base.mathlib.MathLib.cos;
- import static org.jwildfire.base.mathlib.MathLib.iabs;
- import static org.jwildfire.base.mathlib.MathLib.pow;
- import static org.jwildfire.base.mathlib.MathLib.sin;
- import static org.jwildfire.base.mathlib.MathLib.sqr;
- import static org.jwildfire.base.mathlib.MathLib.sqrt;
- import org.jwildfire.base.Tools;
- import org.jwildfire.create.tina.base.Layer;
- import org.jwildfire.create.tina.base.XForm;
- import org.jwildfire.create.tina.base.XYZPoint;
- public class StrangeScopeFunc extends VariationFunc {
- private static final long serialVersionUID = 1L;
- private static final String PARAM_POWER = "power";
- private static final String PARAM_DIST = "dist";
- private static final String PARAM_A = "a";
- private static final String PARAM_B = "b";
- private static final String PARAM_C = "c";
- private static final String PARAM_D = "d";
- private static final String PARAM_E = "e";
- private static final String PARAM_F = "f";
- private static final String PARAM_WAVEX = "wavex";
- private static final String PARAM_WAVEY = "wavey";
- private static final String PARAM_CA = "ca";
- private static final String PARAM_C1 = "c1";
- private static final String PARAM_C2 = "c2";
- private static final String[] paramNames = { PARAM_POWER, PARAM_DIST, PARAM_A, PARAM_B, PARAM_C, PARAM_D, PARAM_E, PARAM_F, PARAM_WAVEX, PARAM_WAVEY, PARAM_CA, PARAM_C1, PARAM_C2 };
- private int power = genRandomPower();
- private double dist = 1.0;
- private double a = 1.0;
- private double b = 0.0;
- private double c = 0.0;
- private double d = 1.0;
- private double e = 0.0;
- private double f = 0.0;
- private double wavex = 1.0;
- private double wavey = 1.0;
- private double ca = 0.5;
- private double c1 = 0.0;
- private double c2 = 0.0;
- @Override
- public void transform(FlameTransformationContext pContext, XForm pXForm, XYZPoint pAffineTP, XYZPoint pVarTP, double pAmount) {
- // if (power == 2)
- // transformPower2(pContext, pXForm, pAffineTP, pVarTP, pAmount);
- // else if (power == -2)
- // transformPowerMinus2(pContext, pXForm, pAffineTP, pVarTP, pAmount);
- // else if (power == 1)
- // transformPower1(pContext, pXForm, pAffineTP, pVarTP, pAmount);
- // else if (power == -1)
- // transformPowerMinus1(pContext, pXForm, pAffineTP, pVarTP, pAmount);
- // else
- transformFunction(pContext, pXForm, pAffineTP, pVarTP, pAmount);
- }
- public void transformPower2(FlameTransformationContext pContext, XForm pXForm, XYZPoint pAffineTP, XYZPoint pVarTP, double pAmount) {
- double a2;
- double x = a * pAffineTP.x + b * pAffineTP.y + e;
- double y = c * pAffineTP.x + d * pAffineTP.y + f;
- if (pContext.random(2) == 0) {
- a2 = atan2(pAffineTP.y, pAffineTP.x) / 2.0;
- }
- else {
- a2 = M_PI - atan2(pAffineTP.y, pAffineTP.x) / 2.0;
- }
- double sina = sin(a2*wavex);
- double cosa = cos(a2*wavey);
- double r = pAmount * sqrt(sqrt(sqr(x) + sqr(y)));
- pVarTP.x = pVarTP.x + r * cosa;
- pVarTP.y = pVarTP.y + r * sina;
- if (pContext.isPreserveZCoordinate()) {
- pVarTP.z += pAmount * pAffineTP.z;
- }
- }
- public void transformPowerMinus2(FlameTransformationContext pContext, XForm pXForm, XYZPoint pAffineTP, XYZPoint pVarTP, double pAmount) {
- double a2;
- double x = a * pAffineTP.x + b * pAffineTP.y + e;
- double y = c * pAffineTP.x + d * pAffineTP.y + f;
- if (pContext.random(2) == 0)
- a2 = atan2(pAffineTP.y, pAffineTP.x) / 2.0;
- else
- a2 = M_PI - atan2(pAffineTP.y, pAffineTP.x) / 2.0;
- double sina = sin(a2*wavex);
- double cosa = cos(a2*wavey);
- double r = pAmount / sqrt(sqrt(sqr(x) + sqr(y)));
- pVarTP.x = pVarTP.x + r * cosa;
- pVarTP.y = pVarTP.y - r * sina;
- if (pContext.isPreserveZCoordinate()) {
- pVarTP.z += pAmount * pAffineTP.z;
- }
- }
- public void transformPower1(FlameTransformationContext pContext, XForm pXForm, XYZPoint pAffineTP, XYZPoint pVarTP, double pAmount) {
- pVarTP.x = pVarTP.x + pAmount * pAffineTP.x;
- pVarTP.y = pVarTP.y + pAmount * pAffineTP.y;
- if (pContext.isPreserveZCoordinate()) {
- pVarTP.z += pAmount * pAffineTP.z;
- }
- }
- public void transformPowerMinus1(FlameTransformationContext pContext, XForm pXForm, XYZPoint pAffineTP, XYZPoint pVarTP, double pAmount) {
- double x = a * pAffineTP.x + b * pAffineTP.y + e;
- double y = c * pAffineTP.x + d * pAffineTP.y + f;
- double r = pAmount / (sqr(x) + sqr(y));
- pVarTP.x = pVarTP.x + r * pAffineTP.x;
- pVarTP.y = pVarTP.y + r * pAffineTP.y;
- if (pContext.isPreserveZCoordinate()) {
- pVarTP.z += pAmount * pAffineTP.z;
- }
- }
- public void transformFunction(FlameTransformationContext pContext, XForm pXForm, XYZPoint pAffineTP, XYZPoint pVarTP, double pAmount) {
- int rnd = pContext.random(absPower);
- double a2;
- double x = a * pAffineTP.x + b * pAffineTP.y + e;
- double y = c * pAffineTP.x + d * pAffineTP.y + f;
- if ((rnd & 1) == 0)
- a2 = (2 * M_PI * rnd + atan2(pAffineTP.y, pAffineTP.x)) / power;
- else
- a2 = (2 * M_PI * rnd - atan2(pAffineTP.y, pAffineTP.x)) / power;
- double sina = sin(a2*wavex);
- double cosa = cos(a2*wavey);
- double re = 1 + c1 * pAffineTP.x + c2 * (sqr(pAffineTP.x) - sqr(pAffineTP.y));
- double im = c1 * pAffineTP.y + c2 * 2 * pAffineTP.x * pAffineTP.y;
- double r = pAmount * pow(sqr(x) + sqr(y) , cPower);
- double r2 = ca / (sqr(re) + sqr(im));
- pVarTP.x = pVarTP.x + r * cosa + (pAffineTP.x * re + pAffineTP.y * im) * r2;
- pVarTP.y = pVarTP.y + r * sina + (pAffineTP.y * re - pAffineTP.x * im) * r2;;
- if (pContext.isPreserveZCoordinate()) {
- pVarTP.z += pAmount * pAffineTP.z;
- }
- }
- @Override
- public String[] getParameterNames() {
- return paramNames;
- }
- @Override
- public Object[] getParameterValues() {
- return new Object[] { power, dist, a, b, c, d, e, f, wavex, wavey, ca, c1, c2 };
- }
- @Override
- public void setParameter(String pName, double pValue) {
- if (PARAM_POWER.equalsIgnoreCase(pName))
- power = Tools.FTOI(pValue);
- else if (PARAM_DIST.equalsIgnoreCase(pName))
- dist = pValue;
- else if (PARAM_A.equalsIgnoreCase(pName))
- a = pValue;
- else if (PARAM_B.equalsIgnoreCase(pName))
- b = pValue;
- else if (PARAM_C.equalsIgnoreCase(pName))
- c = pValue;
- else if (PARAM_D.equalsIgnoreCase(pName))
- d = pValue;
- else if (PARAM_E.equalsIgnoreCase(pName))
- e = pValue;
- else if (PARAM_F.equalsIgnoreCase(pName))
- f = pValue;
- else if (PARAM_WAVEX.equalsIgnoreCase(pName))
- wavex = pValue;
- else if (PARAM_WAVEY.equalsIgnoreCase(pName))
- wavey = pValue;
- else if (PARAM_CA.equalsIgnoreCase(pName))
- ca = pValue;
- else if (PARAM_C1.equalsIgnoreCase(pName))
- c1 = pValue;
- else if (PARAM_C2.equalsIgnoreCase(pName))
- c2 = pValue;
- else
- throw new IllegalArgumentException(pName);
- }
- @Override
- public String getName() {
- return "strangescope";
- }
- private int genRandomPower() {
- int res = (int) (Math.random() * 5.0 + 2.5);
- return Math.random() < 0.5 ? res : -res;
- }
- private int absPower;
- private double cPower;
- @Override
- public void init(FlameTransformationContext pContext, Layer pLayer, XForm pXForm, double pAmount) {
- absPower = iabs(Tools.FTOI(power));
- cPower = dist / power * 0.5;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement