Package org.jwildfire.create

Source Code of org.jwildfire.create.DLACreator

/*
  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;

import java.awt.Color;
import java.awt.Graphics;

import org.jwildfire.base.Property;
import org.jwildfire.base.PropertyMin;
import org.jwildfire.base.Tools;
import org.jwildfire.image.SimpleImage;


public class DLACreator extends ImageCreator {

  @Property(description = "Foreground color")
  Color color = new Color(255, 0, 0);

  @Property(description = "Background color")
  Color bgColor = new Color(0, 0, 0);

  @Property(description = "Number of iterations")
  @PropertyMin(0)
  private int maxIter = 30000;

  @Property(description = "Seed for the random number generator")
  @PropertyMin(0)
  private int seed = 0;

  @Override
  protected void fillImage(SimpleImage res) {
    int width = res.getImageWidth();
    int height = res.getImageHeight();
    // fill the background
    {
      Graphics g = res.getBufferedImg().getGraphics();
      g.setColor(bgColor);
      g.fillRect(0, 0, width, height);
    }
    // create the object
    int cx = width / 2;
    int cy = height / 2;
    double pi2 = 2.0 * Math.PI;
    int w2 = width - 2;
    int h2 = height - 2;
    short q[][] = new short[height][width];
    Tools.srand123(this.seed);
    /* create the cluster */
    q[cy][cx] = 1;
    double r1 = 3.0;
    double r2 = 3.0 * r1;
    for (int i = 0; i < this.maxIter; i++) {
      double phi = pi2 * Tools.drand();
      double ri = r1 * Math.cos(phi);
      double rj = r1 * Math.sin(phi);
      int ci = cy + (int) (ri + 0.5);
      int cj = cx + (int) (rj + 0.5);
      short qt = 0;
      while (qt == 0) {
        double rr = Tools.drand();
        rr += rr;
        rr += rr;
        int rd = (int) rr;
        switch (rd) {
          case 0:
            ci++;
            break;
          case 1:
            cj--;
            break;
          case 2:
            ci--;
            break;
          default:
            cj++;
        }
        if ((ci < 1) || (ci > h2) || (cj < 1) || (cj > w2)) {
          qt = 1;
          i--;
        }
        else {
          int sum = q[ci - 1][cj] + q[ci + 1][cj] + q[ci][cj - 1] + q[ci][cj + 1];
          if (sum != 0) {
            q[ci][cj] = qt = 1;
            double r3 = (double) (ci - cy);
            double r4 = (double) (cj - cx);
            r3 *= r3;
            r4 *= r4;
            r3 += r4;
            r3 = Math.sqrt(r3);
            if (r3 > r1) {
              r1 = r3;
              r2 = 2.1 * r1;
            }
          }
          else {
            double r3 = (double) (ci - cy);
            double r4 = (double) (cj - cx);
            r3 *= r3;
            r4 *= r4;
            r3 += r4;
            r3 = Math.sqrt(r3);
            if (r3 > r2) {
              qt = 1;
              i--;
            }
          }
        }
      }
    }

    /* apply the cluster to the image */
    {
      int r = color.getRed();
      int g = color.getGreen();
      int b = color.getBlue();
      for (int i = 0; i < height; i++) {
        for (int j = 0; j < width; j++) {
          if (q[i][j] != 0) {
            res.setRGB(j, i, r, g, b);
          }
        }
      }
    }

  }

  public Color getColor() {
    return color;
  }

  public void setColor(Color color) {
    this.color = color;
  }

  public Color getBgColor() {
    return bgColor;
  }

  public void setBgColor(Color bgColor) {
    this.bgColor = bgColor;
  }

  public int getMaxIter() {
    return maxIter;
  }

  public void setMaxIter(int maxIter) {
    this.maxIter = maxIter;
  }

  public int getSeed() {
    return seed;
  }

  public void setSeed(int seed) {
    this.seed = seed;
  }

}
TOP

Related Classes of org.jwildfire.create.DLACreator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.