polycasso-commit Mailing List for polycasso (Page 9)
Brought to you by:
dbrosius
You can subscribe to this list here.
| 2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(115) |
Dec
(92) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2010 |
Jan
(6) |
Feb
|
Mar
|
Apr
|
May
|
Jun
(3) |
Jul
|
Aug
|
Sep
(1) |
Oct
(4) |
Nov
|
Dec
|
| 2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(13) |
Aug
(3) |
Sep
|
Oct
|
Nov
|
Dec
|
| 2012 |
Jan
(2) |
Feb
|
Mar
(2) |
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: <dbr...@us...> - 2009-11-25 04:22:45
|
Revision: 50
http://polycasso.svn.sourceforge.net/polycasso/?rev=50&view=rev
Author: dbrosius
Date: 2009-11-25 04:22:39 +0000 (Wed, 25 Nov 2009)
Log Message:
-----------
javadoc
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/Improver.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/Improver.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/Improver.java 2009-11-25 04:18:33 UTC (rev 49)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/Improver.java 2009-11-25 04:22:39 UTC (rev 50)
@@ -27,6 +27,11 @@
import java.util.List;
import java.util.Random;
+/**
+ * a class that applies various improvement attempts to a polygon, attempts to prioritize
+ * which algorithms to pick based on what has worked in the past, as well as priorities which
+ * polygons have had success being transformed.
+ */
public class Improver {
public static final int NUM_POLYS = 50;
@@ -34,15 +39,30 @@
private List<PolygonData> polygons = null;
private Random r;
+ /**
+ * create an improver using a specified image size
+ *
+ * @param size the size of the image
+ */
public Improver(Dimension size) {
imageSize = size;
r = new Random();
}
+ /**
+ * sets the new set of polygons by copying them
+ *
+ * @param data the best set of polygon data so far
+ */
public void setData(PolygonData[] data) {
polygons = new LinkedList<PolygonData>(Arrays.<PolygonData>asList(data));
}
+ /**
+ * get the list of polygons usually after attempted to be improved
+ *
+ * @return the list of polygons
+ */
public List<PolygonData> getData() {
return polygons;
}
@@ -228,6 +248,9 @@
return type;
}
+ /**
+ * generates a random polygon change (all values)
+ */
private void randomCompleteChange() {
int idx = r.nextInt(polygons.size());
polygons.set(idx, PolygonData.randomPoly(imageSize));
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-25 04:18:41
|
Revision: 49
http://polycasso.svn.sourceforge.net/polycasso/?rev=49&view=rev
Author: dbrosius
Date: 2009-11-25 04:18:33 +0000 (Wed, 25 Nov 2009)
Log Message:
-----------
pull stuff out of sync block that doesn't need to be synchronized
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-25 03:58:52 UTC (rev 48)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-25 04:18:33 UTC (rev 49)
@@ -47,6 +47,7 @@
private Feedback feedback;
private Thread[] t = null;
private Object lock = new Object();
+ private Object startStopLock = new Object();
/**
* creates an ImageGenerator for the given target image, and size
@@ -99,7 +100,7 @@
* starts up threads to start looking for images that are closest to the target
*/
public void startGenerating() {
- synchronized(lock) {
+ synchronized(startStopLock) {
if (t == null) {
t = new Thread[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; i++) {
@@ -114,7 +115,7 @@
* shuts down threads that were looking for images
*/
public void stopGenerating() {
- synchronized(lock) {
+ synchronized(startStopLock) {
if (t != null) {
try {
for (int i = 0; i < NUM_THREADS; i++) {
@@ -162,6 +163,7 @@
double delta = feedback.calculateDelta(image);
String message = null;
+ boolean newBest = false;
synchronized(lock) {
attempt++;
if (delta < bestScore) {
@@ -169,15 +171,20 @@
bestScore = delta;
if (Polycasso.DEBUG)
message = "Attempt: " + attempt + " BestScore: " + bestScore + " type: " + type.name();
- fireImageGenerated(image);
- image = new BufferedImage(imageSize.width, imageSize.height, BufferedImage.TYPE_4BYTE_ABGR);
- g2d = (Graphics2D)image.getGraphics();
+ newBest = true;
}
}
+
if (Polycasso.DEBUG) {
if (message != null)
System.out.println(message);
}
+
+ if (newBest) {
+ fireImageGenerated(image);
+ image = new BufferedImage(imageSize.width, imageSize.height, BufferedImage.TYPE_4BYTE_ABGR);
+ g2d = (Graphics2D)image.getGraphics();
+ }
}
} catch (Exception e) {
e.printStackTrace();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-25 03:59:00
|
Revision: 48
http://polycasso.svn.sourceforge.net/polycasso/?rev=48&view=rev
Author: dbrosius
Date: 2009-11-25 03:58:52 +0000 (Wed, 25 Nov 2009)
Log Message:
-----------
pull out improving to a separate class, start out with no polygons, add AddPolygon and RemovePolygon improvem
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
trunk/polycasso/src/com/mebigfatguy/polycasso/ImprovementType.java
trunk/polycasso/src/com/mebigfatguy/polycasso/PolygonData.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-25 03:57:47 UTC (rev 47)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-25 03:58:52 UTC (rev 48)
@@ -27,6 +27,7 @@
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.HashSet;
+import java.util.List;
import java.util.Set;
/**
@@ -59,7 +60,7 @@
g.drawImage(image, 0, 0, size.width, size.height, Color.WHITE, null);
feedback = new Feedback(targetImage);
imageSize = size;
- bestData = PolygonData.randomPolys(size);
+ bestData = new PolygonData[0];
}
/**
@@ -139,20 +140,21 @@
BufferedImage image = new BufferedImage(imageSize.width, imageSize.height, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2d = (Graphics2D)image.getGraphics();
Composite srcOpaque = AlphaComposite.getInstance(AlphaComposite.SRC, 1.0f);
+ Improver improver = new Improver(imageSize);
while (!Thread.interrupted()) {
- PolygonData[] data;
synchronized(lock) {
- data = bestData.clone();
+ improver.setData(bestData);
}
- ImprovementType type = PolygonData.improveRandomly(data, imageSize);
+ ImprovementType type = improver.improveRandomly();
g2d.setColor(Color.BLACK);
g2d.setComposite(srcOpaque);
g2d.fillRect(0, 0, imageSize.width, imageSize.height);
-
+
+ List<PolygonData> data = improver.getData();
for (PolygonData pd : data) {
pd.draw(g2d);
}
@@ -163,7 +165,7 @@
synchronized(lock) {
attempt++;
if (delta < bestScore) {
- bestData = data;
+ bestData = data.toArray(new PolygonData[data.size()]);
bestScore = delta;
if (Polycasso.DEBUG)
message = "Attempt: " + attempt + " BestScore: " + bestScore + " type: " + type.name();
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImprovementType.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImprovementType.java 2009-11-25 03:57:47 UTC (rev 47)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImprovementType.java 2009-11-25 03:58:52 UTC (rev 48)
@@ -23,6 +23,8 @@
* to make to an image.
*/
public enum ImprovementType {
+ AddPolygon,
+ RemovePolygon,
AddPoint,
RemovePoint,
MovePoint,
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/PolygonData.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/PolygonData.java 2009-11-25 03:57:47 UTC (rev 47)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/PolygonData.java 2009-11-25 03:58:52 UTC (rev 48)
@@ -30,7 +30,6 @@
* and alpha level.
*/
public class PolygonData implements Cloneable {
- public static final int NUM_POLYS = 50;
public static final int MAX_POINTS = 8;
private Color color;
@@ -50,6 +49,22 @@
polygon = poly;
}
+ public Polygon getPolygon() {
+ return polygon;
+ }
+
+ public void setAlpha(float xpar) {
+ alpha = xpar;
+ }
+
+ public Color getColor() {
+ return color;
+ }
+
+ public void setColor(Color newColor) {
+ color = newColor;
+ }
+
/**
* creates a totally random polygon that is limited by the specified size
*
@@ -69,23 +84,7 @@
return new PolygonData(c, r.nextFloat(), polygon);
}
-
- /**
- * creates an array of NUM_POLYS polygons that are randomly generated
- *
- * @param size the maximum size of the bounding box of any one polygon
- * @return an array of polygon datas
- */
- public static PolygonData[] randomPolys(Dimension size) {
- PolygonData[] data = new PolygonData[NUM_POLYS];
- for (int i = 0; i < NUM_POLYS; i++) {
- data[i] = randomPoly(size);
- }
-
- return data;
- }
-
/**
* clones this polygon data data
*
@@ -104,152 +103,6 @@
}
/**
- * attempts to improve on one polygon randomly by adjusting it according to a randomly
- * selected improvement type
- *
- * @param data the array of polygondata objects
- * @param size the maximum size of the bounding box of any polygon
- *
- * @return the improvement type used to alter the data
- */
- public static ImprovementType improveRandomly(PolygonData[] data, Dimension size) {
- Random r = new Random();
- int idx = r.nextInt(data.length);
- PolygonData pd = data[idx] = (PolygonData)data[idx].clone();
-
- ImprovementType type = ImprovementType.getRandomImprovement();
- switch (type) {
- case AddPoint: {
- if (pd.polygon.npoints <= MAX_POINTS) {
- pd.polygon.addPoint(0, 0);
- int insPos = r.nextInt(pd.polygon.npoints);
- int x = r.nextInt(size.width);
- int y = r.nextInt(size.height);
-
- System.arraycopy(pd.polygon.xpoints, insPos, pd.polygon.xpoints, insPos + 1, pd.polygon.npoints - insPos - 1);
- pd.polygon.xpoints[insPos] = x;
- System.arraycopy(pd.polygon.ypoints, insPos, pd.polygon.ypoints, insPos + 1, pd.polygon.npoints - insPos - 1);
- pd.polygon.ypoints[insPos] = y;
- } else {
- type = ImprovementType.CompleteChange;
- PolygonData sd = PolygonData.randomPoly(size);
- pd.polygon = sd.polygon;
- pd.color = sd.color;
- pd.alpha = sd.alpha;
- }
- }
- break;
-
- case RemovePoint:
- if (pd.polygon.npoints > 3) {
- int delPos = r.nextInt(pd.polygon.npoints);
-
- System.arraycopy(pd.polygon.xpoints, delPos+1, pd.polygon.xpoints, delPos, pd.polygon.npoints - delPos - 1);
- System.arraycopy(pd.polygon.ypoints, delPos+1, pd.polygon.ypoints, delPos, pd.polygon.npoints - delPos - 1);
- pd.polygon.npoints--;
- } else {
- type = ImprovementType.CompleteChange;
- PolygonData sd = PolygonData.randomPoly(size);
- pd.polygon = sd.polygon;
- pd.color = sd.color;
- pd.alpha = sd.alpha;
- }
- break;
-
- case MovePoint:
- int movePos = r.nextInt(pd.polygon.npoints);
- pd.polygon.xpoints[movePos] = r.nextInt(size.width);
- pd.polygon.ypoints[movePos] = r.nextInt(size.height);
- break;
-
- case ReorderPoly:
- System.arraycopy(data, idx+1, data, idx, NUM_POLYS - idx - 1);
- idx = r.nextInt(NUM_POLYS);
- System.arraycopy(data, idx, data, idx+1, NUM_POLYS - idx - 1);
- data[idx] = pd;
-
- break;
-
- case ShrinkPoly: {
- double midX = pd.polygon.xpoints[0];
- double midY = pd.polygon.ypoints[0];
- for (int i = 1; i < pd.polygon.npoints; i++) {
- midX += pd.polygon.xpoints[i];
- midY += pd.polygon.ypoints[i];
- }
- midX /= pd.polygon.npoints;
- midY /= pd.polygon.npoints;
-
- int shrinkFactor = r.nextInt(5);
- for (int i = 0; i < pd.polygon.npoints; i++) {
- pd.polygon.xpoints[i] += (pd.polygon.xpoints[i] < midX) ? shrinkFactor : -shrinkFactor;
- pd.polygon.ypoints[i] += (pd.polygon.ypoints[i] < midY) ? shrinkFactor : -shrinkFactor;
- }
- }
- break;
-
- case EnlargePoly: {
- double midX = pd.polygon.xpoints[0];
- double midY = pd.polygon.ypoints[0];
- for (int i = 1; i < pd.polygon.npoints; i++) {
- midX += pd.polygon.xpoints[i];
- midY += pd.polygon.ypoints[i];
- }
- midX /= pd.polygon.npoints;
- midY /= pd.polygon.npoints;
-
- int expandFactor = r.nextInt(5);
- for (int i = 0; i < pd.polygon.npoints; i++) {
- pd.polygon.xpoints[i] += (pd.polygon.xpoints[i] < midX) ? -expandFactor : expandFactor;
- pd.polygon.ypoints[i] += (pd.polygon.ypoints[i] < midY) ? -expandFactor : expandFactor;
- pd.polygon.xpoints[i] = clipToRange(0, size.width, pd.polygon.xpoints[i]);
- pd.polygon.ypoints[i] = clipToRange(0, size.height, pd.polygon.ypoints[i]);
- }
- }
- break;
-
- case ChangeColor:
- int comp = r.nextInt(3);
- switch (comp) {
- case 0: {
- int newColor = pd.color.getRed() + (r.nextInt(10) - 5);
- newColor = clipToRange(0, 255, newColor);
- pd.color = new Color(newColor, pd.color.getGreen(), pd.color.getBlue());
- }
- break;
-
- case 1: {
- int newColor = pd.color.getGreen() + (r.nextInt(10) - 5);
- newColor = clipToRange(0, 255, newColor);
- pd.color = new Color(pd.color.getRed(), newColor, pd.color.getBlue());
- }
- break;
-
- case 2: {
- int newColor = pd.color.getBlue() + (r.nextInt(10) - 5);
- newColor = clipToRange(0, 255, newColor);
- pd.color = new Color(pd.color.getRed(), pd.color.getGreen(), r.nextInt(255));
- }
- break;
- }
- break;
-
- case ChangeAlpha:
- pd.alpha = r.nextFloat();
- break;
-
- case CompleteChange:
- PolygonData sd = PolygonData.randomPoly(size);
- pd.polygon = sd.polygon;
- pd.color = sd.color;
- pd.alpha = sd.alpha;
- break;
- }
-
- return type;
- }
-
- /**
* draws this polygondata on a specified graphics object
*
* @param g the graphics object on which to draw this polygon
@@ -259,21 +112,4 @@
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
g.fillPolygon(polygon);
}
-
- /**
- * clip a value between a min and max value
- *
- * @param min the min value
- * @param max the max value
- * @param value the value to clip
- *
- * @return the clipped value
- */
- private static int clipToRange(int min, int max, int value) {
- if (value < min)
- return min;
- else if (value > max)
- return max;
- return value;
- }
}
\ No newline at end of file
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-25 03:57:56
|
Revision: 47
http://polycasso.svn.sourceforge.net/polycasso/?rev=47&view=rev
Author: dbrosius
Date: 2009-11-25 03:57:47 +0000 (Wed, 25 Nov 2009)
Log Message:
-----------
pull out improving to a separate class, start out with no polygons, add AddPolygon and RemovePolygon improvement types.
Added Paths:
-----------
trunk/polycasso/src/com/mebigfatguy/polycasso/Improver.java
Added: trunk/polycasso/src/com/mebigfatguy/polycasso/Improver.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/Improver.java (rev 0)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/Improver.java 2009-11-25 03:57:47 UTC (rev 47)
@@ -0,0 +1,253 @@
+/*
+ * polycasso - Cubism Artwork generator
+ * Copyright 2009 MeBigFatGuy.com
+ * Copyright 2009 Dave Brosius
+ * Inspired by work by Roger Alsing
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and limitations
+ * under the License.
+ */
+package com.mebigfatguy.polycasso;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Polygon;
+import java.awt.Rectangle;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Random;
+
+public class Improver {
+ public static final int NUM_POLYS = 50;
+
+ private Dimension imageSize;
+ private List<PolygonData> polygons = null;
+ private Random r;
+
+ public Improver(Dimension size) {
+ imageSize = size;
+ r = new Random();
+ }
+
+ public void setData(PolygonData[] data) {
+ polygons = new LinkedList<PolygonData>(Arrays.<PolygonData>asList(data));
+ }
+
+ public List<PolygonData> getData() {
+ return polygons;
+ }
+
+ /**
+ * attempts to improve on one polygon randomly by adjusting it according to a randomly
+ * selected improvement type
+ *
+ * @return the improvement type used to alter the data
+ */
+ public ImprovementType improveRandomly() {
+ int numPolys = polygons.size();
+ if (numPolys == 0) {
+ polygons.add(PolygonData.randomPoly(imageSize));
+ return ImprovementType.AddPolygon;
+ }
+
+ ImprovementType type = ImprovementType.getRandomImprovement();
+
+ switch (type) {
+ case AddPolygon: {
+ if (polygons.size() < NUM_POLYS) {
+ PolygonData pd = PolygonData.randomPoly(imageSize);
+ polygons.add(pd);
+ } else {
+ randomCompleteChange();
+ type = ImprovementType.CompleteChange;
+ }
+ }
+ break;
+
+ case RemovePolygon: {
+ int idx = r.nextInt(polygons.size());
+ polygons.remove(idx);
+ }
+ break;
+
+ case AddPoint: {
+ int idx = r.nextInt(polygons.size());
+ PolygonData pd = (PolygonData)polygons.get(idx).clone();
+ Polygon polygon = pd.getPolygon();
+ if (polygon.npoints <= PolygonData.MAX_POINTS) {
+ polygon.addPoint(0, 0);
+ int insPos = r.nextInt(polygon.npoints);
+ int x = r.nextInt(imageSize.width);
+ int y = r.nextInt(imageSize.height);
+
+ System.arraycopy(polygon.xpoints, insPos, polygon.xpoints, insPos + 1, polygon.npoints - insPos - 1);
+ polygon.xpoints[insPos] = x;
+ System.arraycopy(polygon.ypoints, insPos, polygon.ypoints, insPos + 1, polygon.npoints - insPos - 1);
+ polygon.ypoints[insPos] = y;
+ polygons.set(idx, pd);
+
+ } else {
+ randomCompleteChange();
+ type = ImprovementType.CompleteChange;
+ }
+ }
+ break;
+
+ case RemovePoint: {
+ int idx = r.nextInt(polygons.size());
+ PolygonData pd = (PolygonData)polygons.get(idx).clone();
+ Polygon polygon = pd.getPolygon();
+ if (polygon.npoints > 3) {
+ int delPos = r.nextInt(polygon.npoints);
+
+ System.arraycopy(polygon.xpoints, delPos+1, polygon.xpoints, delPos, polygon.npoints - delPos - 1);
+ System.arraycopy(polygon.ypoints, delPos+1, polygon.ypoints, delPos, polygon.npoints - delPos - 1);
+ polygon.npoints--;
+ polygons.set(idx, pd);
+ } else {
+ randomCompleteChange();
+ type = ImprovementType.CompleteChange;
+ }
+ }
+ break;
+
+ case MovePoint: {
+ int idx = r.nextInt(polygons.size());
+ PolygonData pd = (PolygonData)polygons.get(idx).clone();
+ Polygon polygon = pd.getPolygon();
+ int movePos = r.nextInt(polygon.npoints);
+ polygon.xpoints[movePos] = r.nextInt(imageSize.width);
+ polygon.ypoints[movePos] = r.nextInt(imageSize.height);
+ polygons.set(idx, pd);
+ }
+ break;
+
+ case ReorderPoly: {
+ if (polygons.size() > 2) {
+ PolygonData pd = polygons.remove(r.nextInt(polygons.size()));
+ polygons.add(r.nextInt(polygons.size()), pd);
+ } else {
+ randomCompleteChange();
+ type = ImprovementType.CompleteChange;
+ }
+ }
+ break;
+
+ case ShrinkPoly: {
+ int idx = r.nextInt(polygons.size());
+ PolygonData pd = (PolygonData)polygons.get(idx).clone();
+ Polygon polygon = pd.getPolygon();
+ Rectangle bbox = polygon.getBounds();
+
+ double midX = bbox.getCenterX();
+ double midY = bbox.getCenterY();
+
+ int shrinkFactor = r.nextInt(5);
+ for (int i = 0; i < polygon.npoints; i++) {
+ polygon.xpoints[i] += (polygon.xpoints[i] < midX) ? shrinkFactor : -shrinkFactor;
+ polygon.ypoints[i] += (polygon.ypoints[i] < midY) ? shrinkFactor : -shrinkFactor;
+ }
+ polygons.set(idx, pd);
+ }
+ break;
+
+ case EnlargePoly: {
+ int idx = r.nextInt(polygons.size());
+ PolygonData pd = (PolygonData)polygons.get(idx).clone();
+ Polygon polygon = pd.getPolygon();
+ Rectangle bbox = polygon.getBounds();
+
+ double midX = bbox.getCenterX();
+ double midY = bbox.getCenterY();
+
+ int expandFactor = r.nextInt(5);
+ for (int i = 0; i < polygon.npoints; i++) {
+ polygon.xpoints[i] += (polygon.xpoints[i] < midX) ? -expandFactor : expandFactor;
+ polygon.ypoints[i] += (polygon.ypoints[i] < midY) ? -expandFactor : expandFactor;
+ polygon.xpoints[i] = clipToRange(0, imageSize.width, polygon.xpoints[i]);
+ polygon.ypoints[i] = clipToRange(0, imageSize.height, polygon.ypoints[i]);
+ }
+ polygons.set(idx, pd);
+ }
+ break;
+
+ case ChangeColor: {
+ int idx = r.nextInt(polygons.size());
+ PolygonData pd = (PolygonData)polygons.get(idx).clone();
+ Color color = pd.getColor();
+ int comp = r.nextInt(3);
+ switch (comp) {
+ case 0: {
+ int newColor = color.getRed() + (r.nextInt(10) - 5);
+ newColor = clipToRange(0, 255, newColor);
+ pd.setColor(new Color(newColor, color.getGreen(), color.getBlue()));
+ }
+ break;
+
+ case 1: {
+ int newColor = color.getGreen() + (r.nextInt(10) - 5);
+ newColor = clipToRange(0, 255, newColor);
+ pd.setColor(new Color(color.getRed(), newColor, color.getBlue()));
+ }
+ break;
+
+ case 2: {
+ int newColor = color.getBlue() + (r.nextInt(10) - 5);
+ newColor = clipToRange(0, 255, newColor);
+ pd.setColor(new Color(color.getRed(), color.getGreen(), r.nextInt(255)));
+ }
+ break;
+ }
+ polygons.set(idx, pd);
+ }
+ break;
+
+ case ChangeAlpha:
+ int idx = r.nextInt(polygons.size());
+ PolygonData pd = (PolygonData)polygons.get(idx).clone();
+ pd.setAlpha(r.nextFloat());
+ polygons.set(idx, pd);
+ break;
+
+ case CompleteChange: {
+ randomCompleteChange();
+ }
+ break;
+ }
+
+ return type;
+ }
+
+ private void randomCompleteChange() {
+ int idx = r.nextInt(polygons.size());
+ polygons.set(idx, PolygonData.randomPoly(imageSize));
+ }
+
+ /**
+ * clip a value between a min and max value
+ *
+ * @param min the min value
+ * @param max the max value
+ * @param value the value to clip
+ *
+ * @return the clipped value
+ */
+ private static int clipToRange(int min, int max, int value) {
+ if (value < min)
+ return min;
+ else if (value > max)
+ return max;
+ return value;
+ }
+
+}
Property changes on: trunk/polycasso/src/com/mebigfatguy/polycasso/Improver.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-25 01:32:58
|
Revision: 46
http://polycasso.svn.sourceforge.net/polycasso/?rev=46&view=rev
Author: dbrosius
Date: 2009-11-25 01:32:44 +0000 (Wed, 25 Nov 2009)
Log Message:
-----------
fix serial ver due to last change
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedEvent.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedEvent.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedEvent.java 2009-11-25 01:32:11 UTC (rev 45)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedEvent.java 2009-11-25 01:32:44 UTC (rev 46)
@@ -27,7 +27,7 @@
*/
public class ImageGeneratedEvent extends EventObject {
- private static final long serialVersionUID = 1478846574394938989L;
+ private static final long serialVersionUID = -7067803452935840915L;
private transient Image bestImage;
/**
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-25 01:32:17
|
Revision: 45
http://polycasso.svn.sourceforge.net/polycasso/?rev=45&view=rev
Author: dbrosius
Date: 2009-11-25 01:32:11 +0000 (Wed, 25 Nov 2009)
Log Message:
-----------
bestImage is transient so as not to be serializable
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedEvent.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedEvent.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedEvent.java 2009-11-25 01:31:05 UTC (rev 44)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedEvent.java 2009-11-25 01:32:11 UTC (rev 45)
@@ -28,7 +28,7 @@
public class ImageGeneratedEvent extends EventObject {
private static final long serialVersionUID = 1478846574394938989L;
- private Image bestImage;
+ private transient Image bestImage;
/**
* creates the event object with the source of the event as well as the image
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-25 01:31:13
|
Revision: 44
http://polycasso.svn.sourceforge.net/polycasso/?rev=44&view=rev
Author: dbrosius
Date: 2009-11-25 01:31:05 +0000 (Wed, 25 Nov 2009)
Log Message:
-----------
FCBL
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-25 01:30:19 UTC (rev 43)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-25 01:31:05 UTC (rev 44)
@@ -42,7 +42,6 @@
private Set<ImageGeneratedListener> listeners = new HashSet<ImageGeneratedListener>();
private PolygonData[] bestData;
private double bestScore = Double.MAX_VALUE;
- private BufferedImage targetImage;
private Dimension imageSize;
private Feedback feedback;
private Thread[] t = null;
@@ -55,7 +54,7 @@
* @param size the dimension of the image
*/
public ImageGenerator(Image image, Dimension size) {
- targetImage = new BufferedImage(size.width, size.height, BufferedImage.TYPE_4BYTE_ABGR);
+ BufferedImage targetImage = new BufferedImage(size.width, size.height, BufferedImage.TYPE_4BYTE_ABGR);
Graphics g = targetImage.getGraphics();
g.drawImage(image, 0, 0, size.width, size.height, Color.WHITE, null);
feedback = new Feedback(targetImage);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-25 01:30:26
|
Revision: 43
http://polycasso.svn.sourceforge.net/polycasso/?rev=43&view=rev
Author: dbrosius
Date: 2009-11-25 01:30:19 +0000 (Wed, 25 Nov 2009)
Log Message:
-----------
findbugs file
Added Paths:
-----------
trunk/polycasso/polycasso.fb
Added: trunk/polycasso/polycasso.fb
===================================================================
--- trunk/polycasso/polycasso.fb (rev 0)
+++ trunk/polycasso/polycasso.fb 2009-11-25 01:30:19 UTC (rev 43)
@@ -0,0 +1,8 @@
+[Jar files]
+./classes
+[Source dirs]
+./src
+[Aux classpath entries]
+./lib/commons-io-1.4.jar
+[Options]
+relative_paths=true
Property changes on: trunk/polycasso/polycasso.fb
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-25 01:25:35
|
Revision: 42
http://polycasso.svn.sourceforge.net/polycasso/?rev=42&view=rev
Author: dbrosius
Date: 2009-11-25 01:25:28 +0000 (Wed, 25 Nov 2009)
Log Message:
-----------
min/max heap is 400/800
Modified Paths:
--------------
trunk/polycasso/etc/polycasso.jnlp
Modified: trunk/polycasso/etc/polycasso.jnlp
===================================================================
--- trunk/polycasso/etc/polycasso.jnlp 2009-11-25 01:24:39 UTC (rev 41)
+++ trunk/polycasso/etc/polycasso.jnlp 2009-11-25 01:25:28 UTC (rev 42)
@@ -15,7 +15,7 @@
<all-permissions/>
</security>
<resources>
- <j2se version="1.6+" initial-heap-size="800m" max-heap-size="1500m"/>
+ <j2se version="1.6+" initial-heap-size="400m" max-heap-size="800m"/>
<jar href="polycasso-$VERSION.jar"/>
<jar href="commons-io-1.4.jar"/>
</resources>
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-25 01:24:48
|
Revision: 41
http://polycasso.svn.sourceforge.net/polycasso/?rev=41&view=rev
Author: dbrosius
Date: 2009-11-25 01:24:39 +0000 (Wed, 25 Nov 2009)
Log Message:
-----------
no need to save/restore colors,etc
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-25 01:22:16 UTC (rev 40)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-25 01:24:39 UTC (rev 41)
@@ -139,7 +139,8 @@
try {
BufferedImage image = new BufferedImage(imageSize.width, imageSize.height, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g2d = (Graphics2D)image.getGraphics();
-
+ Composite srcOpaque = AlphaComposite.getInstance(AlphaComposite.SRC, 1.0f);
+
while (!Thread.interrupted()) {
PolygonData[] data;
@@ -150,19 +151,13 @@
ImprovementType type = PolygonData.improveRandomly(data, imageSize);
g2d.setColor(Color.BLACK);
- g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 1.0f));
+ g2d.setComposite(srcOpaque);
g2d.fillRect(0, 0, imageSize.width, imageSize.height);
- Color saveColor = g2d.getColor();
- Composite saveComposite = g2d.getComposite();
- try {
- for (PolygonData pd : data) {
- pd.draw(g2d);
- }
- } finally {
- g2d.setColor(saveColor);
- g2d.setComposite(saveComposite);
+
+ for (PolygonData pd : data) {
+ pd.draw(g2d);
}
-
+
double delta = feedback.calculateDelta(image);
String message = null;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-25 01:22:25
|
Revision: 40
http://polycasso.svn.sourceforge.net/polycasso/?rev=40&view=rev
Author: dbrosius
Date: 2009-11-25 01:22:16 +0000 (Wed, 25 Nov 2009)
Log Message:
-----------
8 threads max
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-24 14:08:05 UTC (rev 39)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-25 01:22:16 UTC (rev 40)
@@ -35,7 +35,7 @@
* This class generates multiple images in parallel to keep multicore processors busy.
*/
public class ImageGenerator implements Runnable {
- private static final int NUM_THREADS = 10;
+ private static final int NUM_THREADS = 8;
private static int attempt = 0;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 14:08:15
|
Revision: 39
http://polycasso.svn.sourceforge.net/polycasso/?rev=39&view=rev
Author: dbrosius
Date: 2009-11-24 14:08:05 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
only generate the buffered image when necessary
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-24 06:01:51 UTC (rev 38)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-24 14:08:05 UTC (rev 39)
@@ -18,6 +18,7 @@
*/
package com.mebigfatguy.polycasso;
+import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Composite;
import java.awt.Dimension;
@@ -136,6 +137,9 @@
*/
public void run() {
try {
+ BufferedImage image = new BufferedImage(imageSize.width, imageSize.height, BufferedImage.TYPE_4BYTE_ABGR);
+ Graphics2D g2d = (Graphics2D)image.getGraphics();
+
while (!Thread.interrupted()) {
PolygonData[] data;
@@ -143,12 +147,10 @@
data = bestData.clone();
}
-
ImprovementType type = PolygonData.improveRandomly(data, imageSize);
- BufferedImage image = new BufferedImage(imageSize.width, imageSize.height, BufferedImage.TYPE_4BYTE_ABGR);
- Graphics2D g2d = (Graphics2D)image.getGraphics();
g2d.setColor(Color.BLACK);
+ g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 1.0f));
g2d.fillRect(0, 0, imageSize.width, imageSize.height);
Color saveColor = g2d.getColor();
Composite saveComposite = g2d.getComposite();
@@ -172,6 +174,8 @@
if (Polycasso.DEBUG)
message = "Attempt: " + attempt + " BestScore: " + bestScore + " type: " + type.name();
fireImageGenerated(image);
+ image = new BufferedImage(imageSize.width, imageSize.height, BufferedImage.TYPE_4BYTE_ABGR);
+ g2d = (Graphics2D)image.getGraphics();
}
}
if (Polycasso.DEBUG) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 06:02:01
|
Revision: 38
http://polycasso.svn.sourceforge.net/polycasso/?rev=38&view=rev
Author: dbrosius
Date: 2009-11-24 06:01:51 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
keep debug false
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/Polycasso.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/Polycasso.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/Polycasso.java 2009-11-24 05:39:15 UTC (rev 37)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/Polycasso.java 2009-11-24 06:01:51 UTC (rev 38)
@@ -25,7 +25,7 @@
*/
public class Polycasso {
- public static final boolean DEBUG = true;
+ public static final boolean DEBUG = false;
/**
* the main entry point to the web start app
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 05:39:22
|
Revision: 37
http://polycasso.svn.sourceforge.net/polycasso/?rev=37&view=rev
Author: dbrosius
Date: 2009-11-24 05:39:15 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
javadoc
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/PolygonData.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/PolygonData.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/PolygonData.java 2009-11-24 05:34:14 UTC (rev 36)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/PolygonData.java 2009-11-24 05:39:15 UTC (rev 37)
@@ -25,6 +25,10 @@
import java.awt.Polygon;
import java.util.Random;
+/**
+ * an immutable class for holding the information for one polygon, including points, color
+ * and alpha level.
+ */
public class PolygonData implements Cloneable {
public static final int NUM_POLYS = 50;
public static final int MAX_POINTS = 8;
@@ -33,12 +37,25 @@
private float alpha;
private Polygon polygon;
+ /**
+ * creates a polygon data structure with required information
+ *
+ * @param c the color of the polygon
+ * @param xpar the alpha level of the polygon
+ * @param poly the points of the polygon
+ */
public PolygonData(Color c, float xpar, Polygon poly) {
color = c;
alpha = xpar;
polygon = poly;
}
+ /**
+ * creates a totally random polygon that is limited by the specified size
+ *
+ * @param size the maximum size of the bounding box of the polygon
+ * @return a random polygon
+ */
public static PolygonData randomPoly(Dimension size) {
Random r = new Random();
Polygon polygon = new Polygon();
@@ -53,6 +70,12 @@
return new PolygonData(c, r.nextFloat(), polygon);
}
+ /**
+ * creates an array of NUM_POLYS polygons that are randomly generated
+ *
+ * @param size the maximum size of the bounding box of any one polygon
+ * @return an array of polygon datas
+ */
public static PolygonData[] randomPolys(Dimension size) {
PolygonData[] data = new PolygonData[NUM_POLYS];
@@ -63,6 +86,11 @@
return data;
}
+ /**
+ * clones this polygon data data
+ *
+ * @return a copy of the polygon data
+ */
public Object clone() {
try {
PolygonData clone = (PolygonData)super.clone();
@@ -75,6 +103,15 @@
}
}
+ /**
+ * attempts to improve on one polygon randomly by adjusting it according to a randomly
+ * selected improvement type
+ *
+ * @param data the array of polygondata objects
+ * @param size the maximum size of the bounding box of any polygon
+ *
+ * @return the improvement type used to alter the data
+ */
public static ImprovementType improveRandomly(PolygonData[] data, Dimension size) {
Random r = new Random();
int idx = r.nextInt(data.length);
@@ -212,12 +249,26 @@
return type;
}
+ /**
+ * draws this polygondata on a specified graphics object
+ *
+ * @param g the graphics object on which to draw this polygon
+ */
public void draw(Graphics2D g) {
g.setColor(color);
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
g.fillPolygon(polygon);
}
+ /**
+ * clip a value between a min and max value
+ *
+ * @param min the min value
+ * @param max the max value
+ * @param value the value to clip
+ *
+ * @return the clipped value
+ */
private static int clipToRange(int min, int max, int value) {
if (value < min)
return min;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 05:34:21
|
Revision: 36
http://polycasso.svn.sourceforge.net/polycasso/?rev=36&view=rev
Author: dbrosius
Date: 2009-11-24 05:34:14 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
javadoc
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/PolycassoBundle.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/PolycassoBundle.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/PolycassoBundle.java 2009-11-24 05:31:28 UTC (rev 35)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/PolycassoBundle.java 2009-11-24 05:34:14 UTC (rev 36)
@@ -20,8 +20,14 @@
import java.util.ResourceBundle;
+/**
+ * manages the resource bundle properties file for this application
+ */
public class PolycassoBundle {
+ /**
+ * an enumeration of all the possible entries in the bundle
+ */
enum Key {
Title("pc.title"),
File("pc.file"),
@@ -30,10 +36,20 @@
String id;
+ /**
+ * creates a key given the properties file name
+ *
+ * @param id the properties file entry name
+ */
Key(String id) {
this.id = id;
}
+ /**
+ * retrieves the properties file entry name for this Key
+ *
+ * @return the properties file entry name id
+ */
public String id() {
return id;
}
@@ -41,10 +57,19 @@
private static ResourceBundle bundle = ResourceBundle.getBundle("com/mebigfatguy/polycasso/resource");
+ /**
+ * protects this class from being instantiated as it is meant to be accessed as a static class
+ */
private PolycassoBundle() {
}
+ /**
+ * retrieves a string from a resource bundle given a key
+ *
+ * @param key the key of the property item that is to be retrieved
+ * @return the string representing the localized name
+ */
public static String getString(Key key) {
return bundle.getString(key.id());
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 05:31:43
|
Revision: 35
http://polycasso.svn.sourceforge.net/polycasso/?rev=35&view=rev
Author: dbrosius
Date: 2009-11-24 05:31:28 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
javadoc
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/Polycasso.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/Polycasso.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/Polycasso.java 2009-11-24 05:30:45 UTC (rev 34)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/Polycasso.java 2009-11-24 05:31:28 UTC (rev 35)
@@ -20,10 +20,18 @@
import java.awt.Dimension;
+/**
+ * the main web start application class
+ */
public class Polycasso {
public static final boolean DEBUG = true;
+ /**
+ * the main entry point to the web start app
+ *
+ * @param args unused
+ */
public static void main(String[] args) {
PainterFrame pf = new PainterFrame();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 05:30:52
|
Revision: 34
http://polycasso.svn.sourceforge.net/polycasso/?rev=34&view=rev
Author: dbrosius
Date: 2009-11-24 05:30:45 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
javadoc
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/PainterPanel.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/PainterPanel.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/PainterPanel.java 2009-11-24 05:27:57 UTC (rev 33)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/PainterPanel.java 2009-11-24 05:30:45 UTC (rev 34)
@@ -24,6 +24,10 @@
import javax.swing.JPanel;
+/**
+ * the panel that holds the image considered to be the best representation of the target
+ * image so far.
+ */
public class PainterPanel extends JPanel {
private static final long serialVersionUID = -4005448126783525299L;
@@ -31,6 +35,12 @@
private Image targetImage;
private Image bestImage;
+ /**
+ * set the ideal image that we are trying to generate. It is only shown while in debug mode
+ * @see com.mebigfatguy.polycasso.Polycasso#DEBUG
+ *
+ * @param image the target image
+ */
public void setTarget(Image image) {
synchronized(lock) {
targetImage = image;
@@ -38,6 +48,11 @@
}
}
+ /**
+ * sets the best generated image thus far.
+ *
+ * @param image the best generated image
+ */
public void setImage(Image image) {
synchronized(lock) {
bestImage = image;
@@ -46,6 +61,11 @@
repaint();
}
+ /**
+ * overrides the method to redraw this panel, so that the best generated image is shown
+ *
+ * @param g the graphics object of the panel
+ */
public void paintComponent(Graphics g) {
super.paintComponent(g);
synchronized(lock) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 05:28:04
|
Revision: 33
http://polycasso.svn.sourceforge.net/polycasso/?rev=33&view=rev
Author: dbrosius
Date: 2009-11-24 05:27:57 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
javadoc
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/PainterFrame.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/PainterFrame.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/PainterFrame.java 2009-11-24 05:25:51 UTC (rev 32)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/PainterFrame.java 2009-11-24 05:27:57 UTC (rev 33)
@@ -34,6 +34,9 @@
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
+/**
+ * the main window for showing the image as it is being improved on.
+ */
public class PainterFrame extends JFrame implements ImageGeneratedListener {
private static final long serialVersionUID = 7729602294481171194L;
@@ -42,6 +45,9 @@
private JMenuItem quitItem;
ImageGenerator generator;
+ /**
+ * creates the main window, setups up menus and listeners
+ */
public PainterFrame() {
setTitle(PolycassoBundle.getString(PolycassoBundle.Key.Title));
initComponents();
@@ -51,15 +57,20 @@
generator = null;
}
+ /**
+ * creates and lays out components for this frame
+ */
private void initComponents() {
Container cp = getContentPane();
cp.setLayout(new BorderLayout(4, 4));
panel = new PainterPanel();
cp.add(panel, BorderLayout.CENTER);
-
}
+ /**
+ * initializes the menus
+ */
private void initMenus() {
JMenuBar mb = new JMenuBar();
JMenu fileMenu = new JMenu(PolycassoBundle.getString(PolycassoBundle.Key.File));
@@ -72,6 +83,9 @@
setJMenuBar(mb);
}
+ /**
+ * initializes the listeners for the various components
+ */
private void initListeners() {
addWindowListener(new WindowAdapter() {
@@ -115,6 +129,11 @@
});
}
+ /**
+ * implements the ImageGeneratedListener interface to redraw the new best image
+ *
+ * @param event the event describing the new best image
+ */
public void imageGenerated(ImageGeneratedEvent event) {
panel.setImage(event.getImage());
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 05:25:57
|
Revision: 32
http://polycasso.svn.sourceforge.net/polycasso/?rev=32&view=rev
Author: dbrosius
Date: 2009-11-24 05:25:51 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
javadoc
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImprovementType.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImprovementType.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImprovementType.java 2009-11-24 05:24:31 UTC (rev 31)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImprovementType.java 2009-11-24 05:25:51 UTC (rev 32)
@@ -18,7 +18,10 @@
*/
package com.mebigfatguy.polycasso;
-
+/**
+ * an enumeration of all the different improvement types that an ImageGenerator can attempt
+ * to make to an image.
+ */
public enum ImprovementType {
AddPoint,
RemovePoint,
@@ -30,6 +33,11 @@
ChangeAlpha,
CompleteChange;
+ /**
+ * returns a improvement type at random to try on an image
+ *
+ * @return an improvement type
+ */
public static ImprovementType getRandomImprovement() {
ImprovementType[] types = ImprovementType.values();
return types[(int)((int)(Math.random() * types.length))];
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 05:24:45
|
Revision: 31
http://polycasso.svn.sourceforge.net/polycasso/?rev=31&view=rev
Author: dbrosius
Date: 2009-11-24 05:24:31 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
javadoc
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-24 05:18:38 UTC (rev 30)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-24 05:24:31 UTC (rev 31)
@@ -28,6 +28,11 @@
import java.util.HashSet;
import java.util.Set;
+/**
+ * class that generates test images iteratively looking for the best image that matches a target.
+ * The images are generated from semi-transparent polygons that are improved upon over time.
+ * This class generates multiple images in parallel to keep multicore processors busy.
+ */
public class ImageGenerator implements Runnable {
private static final int NUM_THREADS = 10;
@@ -42,6 +47,12 @@
private Thread[] t = null;
private Object lock = new Object();
+ /**
+ * creates an ImageGenerator for the given target image, and size
+ * @param image the target image
+ *
+ * @param size the dimension of the image
+ */
public ImageGenerator(Image image, Dimension size) {
targetImage = new BufferedImage(size.width, size.height, BufferedImage.TYPE_4BYTE_ABGR);
Graphics g = targetImage.getGraphics();
@@ -51,22 +62,41 @@
bestData = PolygonData.randomPolys(size);
}
+ /**
+ * allows interested parties to register to receive events when a new best image has been
+ * found.
+ *
+ * @param listener the listener that is interested in events
+ */
public void addImageGeneratedListener(ImageGeneratedListener listener) {
listeners.add(listener);
}
+ /**
+ * allows uninterested parties to unregister to receive events when a new best image is
+ * found
+ *
+ * @param listener the listener that is no longer needed
+ */
public void removeImageGeneratedListener(ImageGeneratedListener listener) {
listeners.remove(listener);
}
+ /**
+ * informs all listeners that a new best image has been found
+ *
+ * @param image the new best image
+ */
public void fireImageGenerated(Image image) {
ImageGeneratedEvent event = new ImageGeneratedEvent(this, image);
for (ImageGeneratedListener listener : listeners) {
listener.imageGenerated(event);
}
-
}
+ /**
+ * starts up threads to start looking for images that are closest to the target
+ */
public void startGenerating() {
synchronized(lock) {
if (t == null) {
@@ -79,6 +109,9 @@
}
}
+ /**
+ * shuts down threads that were looking for images
+ */
public void stopGenerating() {
synchronized(lock) {
if (t != null) {
@@ -97,6 +130,10 @@
}
}
+ /**
+ * the runnable interface implementation to repeatedly improve upon the image and check to
+ * see if it is closer to the target image.
+ */
public void run() {
try {
while (!Thread.interrupted()) {
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 05:18:46
|
Revision: 30
http://polycasso.svn.sourceforge.net/polycasso/?rev=30&view=rev
Author: dbrosius
Date: 2009-11-24 05:18:38 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
javadoc
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedListener.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedListener.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedListener.java 2009-11-24 05:16:35 UTC (rev 29)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedListener.java 2009-11-24 05:18:38 UTC (rev 30)
@@ -18,7 +18,17 @@
*/
package com.mebigfatguy.polycasso;
+/**
+ * an interface that interested parties should implement if they wish to be
+ * informed when a new best image has been found.
+ */
public interface ImageGeneratedListener {
+ /**
+ * a method to be implement that will give the interested party what image
+ * is now considered to be the best
+ *
+ * @param event the event object describing the new best image
+ */
public void imageGenerated(ImageGeneratedEvent event);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 05:16:47
|
Revision: 29
http://polycasso.svn.sourceforge.net/polycasso/?rev=29&view=rev
Author: dbrosius
Date: 2009-11-24 05:16:35 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
javadoc
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedEvent.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedEvent.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedEvent.java 2009-11-24 05:14:47 UTC (rev 28)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGeneratedEvent.java 2009-11-24 05:16:35 UTC (rev 29)
@@ -21,16 +21,32 @@
import java.awt.Image;
import java.util.EventObject;
+/**
+ * an event object that is fired when a new test image has been found that is
+ * the best so far.
+ */
public class ImageGeneratedEvent extends EventObject {
private static final long serialVersionUID = 1478846574394938989L;
private Image bestImage;
+ /**
+ * creates the event object with the source of the event as well as the image
+ * that is now the best image found.
+ *
+ * @param source the object that generated this event (an image generator)
+ * @param image the best image found so far
+ */
public ImageGeneratedEvent(Object source, Image image) {
super(source);
bestImage = image;
}
+ /**
+ * retrieve the best image as described by this event
+ *
+ * @return the best image
+ */
public Image getImage() {
return bestImage;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 05:14:56
|
Revision: 28
http://polycasso.svn.sourceforge.net/polycasso/?rev=28&view=rev
Author: dbrosius
Date: 2009-11-24 05:14:47 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
javadoc
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/Feedback.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/Feedback.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/Feedback.java 2009-11-24 05:12:11 UTC (rev 27)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/Feedback.java 2009-11-24 05:14:47 UTC (rev 28)
@@ -22,11 +22,20 @@
import java.awt.image.DataBufferByte;
import java.awt.image.WritableRaster;
+/**
+ * an immutable class for processing a test image against target image for closeness.
+ */
public class Feedback {
private byte[] targetBuffer;
private int size;
+ /**
+ * creates a feedback object with a given targetImage. Caches the image bytes in
+ * member variables.
+ *
+ * @param targetImage the target image that will be the judge of test images
+ */
public Feedback(BufferedImage targetImage) {
WritableRaster raster = targetImage.getRaster();
DataBufferByte dbb = (DataBufferByte)raster.getDataBuffer();
@@ -34,6 +43,12 @@
size = dbb.getSize();
}
+ /**
+ * returns a score of how close the test image is to the target
+ *
+ * @param testImage the image to score
+ * @return a value that represents its closeness to ideal
+ */
public double calculateDelta(BufferedImage testImage) {
WritableRaster raster = testImage.getRaster();
DataBufferByte dbb = (DataBufferByte)raster.getDataBuffer();
@@ -63,5 +78,4 @@
return error;
}
-
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 05:12:18
|
Revision: 27
http://polycasso.svn.sourceforge.net/polycasso/?rev=27&view=rev
Author: dbrosius
Date: 2009-11-24 05:12:11 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
rely on separated feedback class for better clarity
Modified Paths:
--------------
trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
Modified: trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-24 05:09:39 UTC (rev 26)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/ImageGenerator.java 2009-11-24 05:12:11 UTC (rev 27)
@@ -25,8 +25,6 @@
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
-import java.awt.image.DataBufferByte;
-import java.awt.image.WritableRaster;
import java.util.HashSet;
import java.util.Set;
@@ -40,6 +38,7 @@
private double bestScore = Double.MAX_VALUE;
private BufferedImage targetImage;
private Dimension imageSize;
+ private Feedback feedback;
private Thread[] t = null;
private Object lock = new Object();
@@ -47,6 +46,7 @@
targetImage = new BufferedImage(size.width, size.height, BufferedImage.TYPE_4BYTE_ABGR);
Graphics g = targetImage.getGraphics();
g.drawImage(image, 0, 0, size.width, size.height, Color.WHITE, null);
+ feedback = new Feedback(targetImage);
imageSize = size;
bestData = PolygonData.randomPolys(size);
}
@@ -124,7 +124,7 @@
g2d.setComposite(saveComposite);
}
- double delta = calculateDelta(image, targetImage);
+ double delta = feedback.calculateDelta(image);
String message = null;
synchronized(lock) {
@@ -146,40 +146,4 @@
e.printStackTrace();
}
}
-
- private double calculateDelta(BufferedImage image1, BufferedImage image2) {
- WritableRaster raster1 = image1.getRaster();
- WritableRaster raster2 = image2.getRaster();
-
- DataBufferByte db1 = (DataBufferByte)raster1.getDataBuffer();
- DataBufferByte db2 = (DataBufferByte)raster2.getDataBuffer();
-
- byte[] buffer1 = db1.getData();
- byte[] buffer2 = db2.getData();
-
- int size = db1.getSize();
- double error = 0.0;
-
- for (int i = 0; i < size; i+=4) {
- int blue1 = buffer1[i+1] & 0x0FF;
- int blue2 = buffer2[i+1] & 0x0FF;
- double blueError = blue1 - blue2;
- blueError *= blueError;
-
- int green1 = buffer1[i+2] & 0x0FF;
- int green2 = buffer2[i+2] & 0x0FF;
- double greenError = green1 - green2;
- greenError *= greenError;
-
- int red1 = buffer1[i+3] & 0x0FF;
- int red2 = buffer2[i+3] & 0x0FF;
- double redError = red1 - red2;
- redError *= redError;
-
- error += redError + greenError + blueError;
- }
-
- return error;
- }
-
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <dbr...@us...> - 2009-11-24 05:09:46
|
Revision: 26
http://polycasso.svn.sourceforge.net/polycasso/?rev=26&view=rev
Author: dbrosius
Date: 2009-11-24 05:09:39 +0000 (Tue, 24 Nov 2009)
Log Message:
-----------
separate out feedback into it's own class
Added Paths:
-----------
trunk/polycasso/src/com/mebigfatguy/polycasso/Feedback.java
Added: trunk/polycasso/src/com/mebigfatguy/polycasso/Feedback.java
===================================================================
--- trunk/polycasso/src/com/mebigfatguy/polycasso/Feedback.java (rev 0)
+++ trunk/polycasso/src/com/mebigfatguy/polycasso/Feedback.java 2009-11-24 05:09:39 UTC (rev 26)
@@ -0,0 +1,67 @@
+/*
+ * polycasso - Cubism Artwork generator
+ * Copyright 2009 MeBigFatGuy.com
+ * Copyright 2009 Dave Brosius
+ * Inspired by work by Roger Alsing
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and limitations
+ * under the License.
+ */
+package com.mebigfatguy.polycasso;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.DataBufferByte;
+import java.awt.image.WritableRaster;
+
+public class Feedback {
+
+ private byte[] targetBuffer;
+ private int size;
+
+ public Feedback(BufferedImage targetImage) {
+ WritableRaster raster = targetImage.getRaster();
+ DataBufferByte dbb = (DataBufferByte)raster.getDataBuffer();
+ targetBuffer = dbb.getData();
+ size = dbb.getSize();
+ }
+
+ public double calculateDelta(BufferedImage testImage) {
+ WritableRaster raster = testImage.getRaster();
+ DataBufferByte dbb = (DataBufferByte)raster.getDataBuffer();
+ byte[] testBuffer = dbb.getData();
+
+ double error = 0.0;
+
+ //index 0 is alpha, start at 1 (blue)
+ for (int i = 1; i < size; i++) {
+ int blue1 = targetBuffer[i] & 0x0FF;
+ int blue2 = testBuffer[i++] & 0x0FF;
+ double blueError = blue1 - blue2;
+ blueError *= blueError;
+
+ int green1 = targetBuffer[i] & 0x0FF;
+ int green2 = testBuffer[i++] & 0x0FF;
+ double greenError = green1 - green2;
+ greenError *= greenError;
+
+ int red1 = targetBuffer[i] & 0x0FF;
+ int red2 = testBuffer[i++] & 0x0FF;
+ double redError = red1 - red2;
+ redError *= redError;
+
+ error += redError + greenError + blueError;
+ }
+
+ return error;
+ }
+
+}
Property changes on: trunk/polycasso/src/com/mebigfatguy/polycasso/Feedback.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Added: svn:eol-style
+ native
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|