/** * rgbp (rgb petri, pixel fungus) * jeremyawon.info * jeremy awon, (c) all rights reserved. **/ /** * left click to reseed * left click and hold to affect * right click and hold to adjust radius **/ import java.util.Vector; color bgColor = color(248,248,248); Grid g; float mpTS; int mrX, mrY; void setup() { size(800,800); smooth(); //randomSeed(2); g = new Grid(); cmd_state = new cmdState(); cmd_state.setCmd_initialize(); background(255); g.Initialize((int)random(width*0.25,width*0.75),(int)random(height*0.25,height*0.75),color(255,0,0)); cmd_state.setCmd_none(); } class cmdState { final static int CMD_NONE = -1; final static int CMD_INITIALIZE = 0; final static int CMD_FIELD_EFFECT = 1; final static int CMD_ADJUST_FIELD = 2; int state; cmdState() { state = -1; } void setCmd_none() { state = CMD_NONE; } void setCmd_initialize() { state = CMD_INITIALIZE; } void setCmd_field_effect() { state = CMD_FIELD_EFFECT; } void setCmd_adjust_field() { state = CMD_ADJUST_FIELD; } boolean isCmd_none() { return (state==CMD_NONE); } boolean isCmd_initialize() { return (state==CMD_INITIALIZE); } boolean isCmd_field_effect() { return (state==CMD_FIELD_EFFECT); } boolean isCmd_adjust_field() { return (state==CMD_ADJUST_FIELD); } } cmdState cmd_state; void mousePressed() { mpTS = millis(); if(mouseButton==LEFT) { cmd_state.setCmd_field_effect(); } else if(mouseButton==RIGHT) { cmd_state.setCmd_adjust_field(); } } void mouseReleased() { if((millis()-mpTS)<1000) { cmd_state.setCmd_initialize(); mrX = mouseX; mrY = mouseY; } else if(cmd_state.isCmd_field_effect()) { cmd_state.setCmd_none(); } else if(cmd_state.isCmd_adjust_field()) { cmd_state.setCmd_none(); } } void keyPressed() { println("rgbp (rgb petri, pixel fungus) - created by jeremy awon, jeremyawon.info, contact@jeremyawon.info, jeremy.awon@gmail.com"); } void draw() { if(cmd_state.isCmd_initialize()) { if(g.getState(mrX,mrY)) { g.Initialize(mouseX,mouseY, g.getColor(mrX,mrY)); } else { g.Initialize(mouseX,mouseY, color(255,0,0)); } cmd_state.setCmd_none(); } else if(cmd_state.isCmd_field_effect()) { g.Step(g.sayCmd_field_effect()); } else if(cmd_state.isCmd_adjust_field()) { g.Step(g.sayCmd_adjust_field()); } else if(cmd_state.isCmd_none()) { g.Step(g.sayCmd_none()); } } class Grid { final int[][] offset = new int[][]{{-1, -1}, {-1, 0}, {-1, 1}, { 0, -1}, { 0, 1}, { 1, -1}, { 1, 0}, { 1, 1}}; PImage _capture; int _direction[]; boolean _state[]; color _color[]; Vector _perimeter; float _controlX, _controlY, _controlR, _controlDR; float _mutationMin, _mutationMax; float _approachFactor; float _growth, _limit; Grid() { _direction = new int[width*height]; _state = new boolean[width*height]; _color = new color[width*height]; _capture = new PImage(width, height); _controlX = width/2; _controlY = height/2; _controlR = 80; _mutationMin = -4; _mutationMax = 5; _approachFactor = 0.4; _growth = 0.2; _limit = 4000; String param_mmin = param("mmin"); String param_mmax = param("mmax"); String param_approach = param("a"); String param_growth = param("growth"); String param_limit = param("limit"); if(param_mmin!=null) { _mutationMin = float(param_mmin); } if(param_mmax!=null) { _mutationMax = float(param_mmax); } if(param_approach!=null) { _approachFactor = float(param_approach); _approachFactor = max(0,min(1,_approachFactor)); } if(param_growth!=null) { _growth = float(param_growth); _growth = max(0,min(1,_growth)); } if(param_limit!=null) { _limit = float(param_limit); _limit = max(0,_limit); } } void Initialize(int x, int y, color cc) { background(bgColor); _perimeter = new Vector((width+height)*3); for(int i=0;i0) { stroke(0); noFill(); ellipse(_controlX, _controlY, _controlR*2, _controlR*2); fill(0); for(float r=0;r<=(2*PI);r+=rStep) { translate(_controlX,_controlY); rotate(r); translate(0,abs(_controlR)); ellipse(0,_controlR*_approachFactor,4,4); translate(0,-abs(_controlR)); rotate(-r); translate(-_controlX,-_controlY); } noStroke(); } return; } float crS = _controlR*_controlR; float crA = (abs(_controlR)+(_controlR*_approachFactor)); crA *= crA; float crD = crA - crS; float nBstep = min((perimeterSize*_growth),_limit); for(int p=0;p=0)==(distance