import interfascia.*; /** * Dynamic Attractor. * * Created June 16 2007. */ class GUIMathItem { String labelString; IFLabel label; int x; int y; int scaledValue; float value; IFButton incButton; IFButton decButton; void setupButtons(int xSource, int ySource) { int x = xSource, y = ySource; incButton = new IFButton("+ " + labelString, x, y, defaultItemWidth, defaultItemHeight); x += defaultItemWidth + defaultItemHorizSpace; decButton = new IFButton("- " + labelString, x, y, defaultItemWidth, defaultItemHeight); x += defaultItemWidth + defaultItemHorizSpace; label = new IFLabel(labelString + " = ", x, y, defaultItemHeight); //incButton.addActionListener(this); //decButton.addActionListener(this); gui.add(incButton); gui.add(decButton); gui.add(label); } void updateLabels(float newValue) { label.setLabel(labelString + " = " + newValue); } void setValue(float value) { scaledValue = int(value * scaler); addToValue(0); } void addToValue(int inc) { scaledValue += inc; value = float(scaledValue) / scaler; } }; GUIMathItem aItem, bItem, cItem, dItem; float scaler = 100.0; float a = 1.5; float b = -1.8; float c = 1.6 ; float d = 0.9; float xn = 0; float yn = 0; float xn1 = 0; float yn1 = 0; float midx, midy, scalex, scaley; int redInc = 5, blueInc = 1, greenInc = 1; int maxIterations = 1500000, iterations = 0; boolean bClearOnDraw = false; // GUI GUIController gui; IFLookAndFeel lookAndFeel; int defaultItemWidth = 40; int defaultItemHeight = 17; int defaultItemHorizSpace = 10; int defaultItemVertSpace = 10; void setup() { size(800, 600); background(0, 0, 0); frameRate(30); midx = width / 2; midy = height / 2; scalex = midx / 3; scaley = midy / 3; gui = new GUIController (this); lookAndFeel = new IFLookAndFeel(this, IFLookAndFeel.DEFAULT); lookAndFeel.textColor = color(255, 255, 255); gui.setLookAndFeel(lookAndFeel); aItem = new GUIMathItem(); setupItem(aItem, 40, 40, "A", a); bItem = new GUIMathItem(); setupItem(bItem, 40, 60, "B", b); cItem = new GUIMathItem(); setupItem(cItem, 40, 80, "C", c); dItem = new GUIMathItem(); setupItem(dItem, 40, 100, "D", d); } void setupItem(GUIMathItem item, int xSource, int ySource, String itemlabel, float newValue) { item.labelString = itemlabel; item.setValue(newValue); item.setupButtons(xSource, ySource); item.updateLabels(newValue); // Need to add action listeners here to ensure "this" pointer is correct! item.incButton.addActionListener(this); item.decButton.addActionListener(this); } void draw() { if (bClearOnDraw == true) { background(0,0,0); bClearOnDraw = false; } loadPixels(); for (int i = 0; i < 5000 && iterations < maxIterations ; i++, iterations++) { xn1 = sin(aItem.value * yn) + cItem.value * cos(aItem.value * xn); yn1 = sin(bItem.value * xn) + dItem.value * cos(bItem.value * yn); int x = int((xn1 * scalex) + midx); int y = int( height - ((yn1 * scaley) + midy)); if (x >= 0 && x < width && y >= 0 && y < height) { int pixIdx = int( x + (y * width)); color oldcol = pixels[pixIdx]; pixels[pixIdx] = color(int(red(oldcol)) + redInc, int(green(oldcol)) + greenInc, int(blue(oldcol)) + blueInc); } xn = xn1; yn = yn1; } updatePixels(); } void actionPerformed (GUIEvent e) { if (e.getSource() == aItem.incButton) { updateValue(1, aItem); } else if ( e.getSource() == aItem.decButton) { updateValue(-1, aItem); } if (e.getSource() == bItem.incButton) { updateValue(1, bItem); } else if (e.getSource() == bItem.decButton) { updateValue(-1, bItem); } if (e.getSource() == cItem.incButton) { updateValue(1, cItem); } else if (e.getSource() == cItem.decButton) { updateValue(-1, cItem); } if (e.getSource() == dItem.incButton) { updateValue(1, dItem); } else if (e.getSource() == dItem.decButton) { updateValue(-1, dItem); } } void updateValue(int inc, GUIMathItem item) { item.addToValue(inc); item.updateLabels(item.value); bClearOnDraw = true; iterations = 0; }