001 /*
002 * ColorGenerator.java
003 *
004 * Copyright (c) 1995-2010, The University of Sheffield. See the file
005 * COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
006 *
007 * This file is part of GATE (see http://gate.ac.uk/), and is free
008 * software, licenced under the GNU Library General Public License,
009 * Version 2, June 1991 (in the distribution as file licence.html,
010 * and also available at http://gate.ac.uk/gate/licence.html).
011 *
012 * Valentin Tablan, 11/07/2000
013 *
014 * $Id: ColorGenerator.java 12006 2009-12-01 17:24:28Z thomas_heitz $
015 */
016 package gate.swing;
017
018 import java.awt.Color;
019 import java.util.LinkedList;
020
021 /**
022 * This class is used to generate random colours that are evenly distributed in
023 * the colours space.
024 *
025 */
026 public class ColorGenerator {
027
028 /** Debug flag
029 */
030 private static final boolean DEBUG = false;
031
032 /**
033 * Creates a new ColorGenerator
034 *
035 */
036 public ColorGenerator() {
037 for(int i = 0; i < 8; i++)availableSpacesList[i] = new LinkedList();
038 ColorSpace usedCS = new ColorSpace(0,0,0,255);
039 availableSpacesList[0].addLast(new ColorSpace(usedCS.baseR +
040 usedCS.radius/2,
041 usedCS.baseG,
042 usedCS.baseB,
043 usedCS.radius/2));
044 availableSpacesList[1].addLast(new ColorSpace(usedCS.baseR,
045 usedCS.baseG + usedCS.radius/2,
046 usedCS.baseB,
047 usedCS.radius/2));
048 availableSpacesList[2].addLast(new ColorSpace(usedCS.baseR +
049 usedCS.radius/2,
050 usedCS.baseG + usedCS.radius/2,
051 usedCS.baseB,
052 usedCS.radius/2));
053
054 availableSpacesList[3].addLast(new ColorSpace(usedCS.baseR,
055 usedCS.baseG,
056 usedCS.baseB + usedCS.radius/2,
057 usedCS.radius/2));
058 availableSpacesList[4].addLast(new ColorSpace(usedCS.baseR +
059 usedCS.radius/2,
060 usedCS.baseG,
061 usedCS.baseB + usedCS.radius/2,
062 usedCS.radius/2));
063 availableSpacesList[5].addLast(new ColorSpace(usedCS.baseR,
064 usedCS.baseG + usedCS.radius/2,
065 usedCS.baseB + usedCS.radius/2,
066 usedCS.radius/2));
067 /*
068 availableSpacesList[6].addLast(new ColorSpace(usedCS.baseR +
069 usedCS.radius/2,
070 usedCS.baseG + usedCS.radius/2,
071 usedCS.baseB + usedCS.radius/2,
072 usedCS.radius/2));
073
074 */
075 // Color foo = getNextColor();
076 }
077
078 /**
079 * Gets the next random colour
080 *
081 */
082 public Color getNextColor(){
083 ColorSpace usedCS;
084 listToRead = listToRead % 8;
085
086 if(availableSpacesList[listToRead].isEmpty()){
087 usedCS = (ColorSpace)usedSpacesList.removeFirst();
088 availableSpacesList[listToRead].addLast(new ColorSpace(usedCS.baseR,
089 usedCS.baseG,
090 usedCS.baseB,
091 usedCS.radius/2));
092 availableSpacesList[listToRead].addLast(new ColorSpace(
093 usedCS.baseR + usedCS.radius/2,
094 usedCS.baseG,
095 usedCS.baseB,
096 usedCS.radius/2));
097 availableSpacesList[listToRead].addLast(new ColorSpace(usedCS.baseR,
098 usedCS.baseG + usedCS.radius/2,
099 usedCS.baseB,
100 usedCS.radius/2));
101 availableSpacesList[listToRead].addLast(new ColorSpace(
102 usedCS.baseR + usedCS.radius/2,
103 usedCS.baseG + usedCS.radius/2,
104 usedCS.baseB,
105 usedCS.radius/2));
106
107 availableSpacesList[listToRead].addLast(new ColorSpace(usedCS.baseR,
108 usedCS.baseG,
109 usedCS.baseB + usedCS.radius/2,
110 usedCS.radius/2));
111 availableSpacesList[listToRead].addLast(new ColorSpace(
112 usedCS.baseR + usedCS.radius/2,
113 usedCS.baseG,
114 usedCS.baseB + usedCS.radius/2,
115 usedCS.radius/2));
116 availableSpacesList[listToRead].addLast(new ColorSpace(usedCS.baseR,
117 usedCS.baseG + usedCS.radius/2,
118 usedCS.baseB + usedCS.radius/2,
119 usedCS.radius/2));
120 availableSpacesList[listToRead].addLast(new ColorSpace(
121 usedCS.baseR + usedCS.radius/2,
122 usedCS.baseG + usedCS.radius/2,
123 usedCS.baseB + usedCS.radius/2,
124 usedCS.radius/2));
125
126 }
127 usedCS = (ColorSpace)availableSpacesList[listToRead].removeFirst();
128 Color res = new Color(usedCS.baseR + usedCS.radius/2,
129 usedCS.baseG + usedCS.radius/2,
130 usedCS.baseB + usedCS.radius/2);
131 usedSpacesList.addLast(usedCS);
132 listToRead++;
133 res = res.brighter();
134 return res;
135 }
136
137 /**
138 * Represents a colur space. A colour space is a cube in a tridimiensional
139 * space (where the axes represent red/green/blue values) defined by a point
140 * and a radius(the length of the edge).
141 */
142 class ColorSpace{
143 /**
144 * Creates a new ColorSpace
145 *
146 * @param r
147 * @param g
148 * @param b
149 * @param radius
150 */
151 ColorSpace(int r, int g, int b, int radius){
152 baseR = r;
153 baseG = g;
154 baseB = b;
155 this.radius = radius;
156 }
157
158 /** *
159 */
160 int baseR, baseG, baseB;
161 /** */
162 int radius;
163 }
164
165 /** */
166 LinkedList[] availableSpacesList = new LinkedList[8];
167
168 /** */
169 LinkedList usedSpacesList = new LinkedList();
170
171 /** */
172 int listToRead = 0;
173
174 } // ColorGenerator
|