| ColorGenerator.java |
1 /*
2 * ColorGenerator.java
3 *
4 * Copyright (c) 1998-2004, The University of Sheffield.
5 *
6 * This file is part of GATE (see http://gate.ac.uk/), and is free
7 * software, licenced under the GNU Library General Public License,
8 * Version 2, June 1991 (in the distribution as file licence.html,
9 * and also available at http://gate.ac.uk/gate/licence.html).
10 *
11 * Valentin Tablan, 11/07/2000
12 *
13 * $Id: ColorGenerator.java,v 1.5 2004/07/21 17:10:09 akshay Exp $
14 */
15 package gate.swing;
16
17 import java.awt.Color;
18 import java.util.LinkedList;
19
20 /**
21 * This class is used to generate random colours that are evenly distributed in
22 * the colours space.
23 *
24 */
25 public class ColorGenerator {
26
27 /** Debug flag
28 */
29 private static final boolean DEBUG = false;
30
31 /**
32 * Creates a new ColorGenerator
33 *
34 */
35 public ColorGenerator() {
36 for(int i = 0; i < 8; i++)availableSpacesList[i] = new LinkedList();
37 ColorSpace usedCS = new ColorSpace(0,0,0,255);
38 availableSpacesList[0].addLast(new ColorSpace(usedCS.baseR +
39 usedCS.radius/2,
40 usedCS.baseG,
41 usedCS.baseB,
42 usedCS.radius/2));
43 availableSpacesList[1].addLast(new ColorSpace(usedCS.baseR,
44 usedCS.baseG + usedCS.radius/2,
45 usedCS.baseB,
46 usedCS.radius/2));
47 availableSpacesList[2].addLast(new ColorSpace(usedCS.baseR +
48 usedCS.radius/2,
49 usedCS.baseG + usedCS.radius/2,
50 usedCS.baseB,
51 usedCS.radius/2));
52
53 availableSpacesList[3].addLast(new ColorSpace(usedCS.baseR,
54 usedCS.baseG,
55 usedCS.baseB + usedCS.radius/2,
56 usedCS.radius/2));
57 availableSpacesList[4].addLast(new ColorSpace(usedCS.baseR +
58 usedCS.radius/2,
59 usedCS.baseG,
60 usedCS.baseB + usedCS.radius/2,
61 usedCS.radius/2));
62 availableSpacesList[5].addLast(new ColorSpace(usedCS.baseR,
63 usedCS.baseG + usedCS.radius/2,
64 usedCS.baseB + usedCS.radius/2,
65 usedCS.radius/2));
66 /*
67 availableSpacesList[6].addLast(new ColorSpace(usedCS.baseR +
68 usedCS.radius/2,
69 usedCS.baseG + usedCS.radius/2,
70 usedCS.baseB + usedCS.radius/2,
71 usedCS.radius/2));
72
73 */
74 // Color foo = getNextColor();
75 }
76
77 /**
78 * Gets the next random colour
79 *
80 */
81 public Color getNextColor(){
82 ColorSpace usedCS;
83 listToRead = listToRead % 8;
84
85 if(availableSpacesList[listToRead].isEmpty()){
86 usedCS = (ColorSpace)usedSpacesList.removeFirst();
87 availableSpacesList[listToRead].addLast(new ColorSpace(usedCS.baseR,
88 usedCS.baseG,
89 usedCS.baseB,
90 usedCS.radius/2));
91 availableSpacesList[listToRead].addLast(new ColorSpace(
92 usedCS.baseR + usedCS.radius/2,
93 usedCS.baseG,
94 usedCS.baseB,
95 usedCS.radius/2));
96 availableSpacesList[listToRead].addLast(new ColorSpace(usedCS.baseR,
97 usedCS.baseG + usedCS.radius/2,
98 usedCS.baseB,
99 usedCS.radius/2));
100 availableSpacesList[listToRead].addLast(new ColorSpace(
101 usedCS.baseR + usedCS.radius/2,
102 usedCS.baseG + usedCS.radius/2,
103 usedCS.baseB,
104 usedCS.radius/2));
105
106 availableSpacesList[listToRead].addLast(new ColorSpace(usedCS.baseR,
107 usedCS.baseG,
108 usedCS.baseB + usedCS.radius/2,
109 usedCS.radius/2));
110 availableSpacesList[listToRead].addLast(new ColorSpace(
111 usedCS.baseR + usedCS.radius/2,
112 usedCS.baseG,
113 usedCS.baseB + usedCS.radius/2,
114 usedCS.radius/2));
115 availableSpacesList[listToRead].addLast(new ColorSpace(usedCS.baseR,
116 usedCS.baseG + usedCS.radius/2,
117 usedCS.baseB + usedCS.radius/2,
118 usedCS.radius/2));
119 availableSpacesList[listToRead].addLast(new ColorSpace(
120 usedCS.baseR + usedCS.radius/2,
121 usedCS.baseG + usedCS.radius/2,
122 usedCS.baseB + usedCS.radius/2,
123 usedCS.radius/2));
124
125 }
126 usedCS = (ColorSpace)availableSpacesList[listToRead].removeFirst();
127 Color res = new Color(usedCS.baseR + usedCS.radius/2,
128 usedCS.baseG + usedCS.radius/2,
129 usedCS.baseB + usedCS.radius/2);
130 usedSpacesList.addLast(usedCS);
131 listToRead++;
132 res = res.brighter();
133 return res;
134 }
135
136 /**
137 * Represents a colur space. A colour space is a cube in a tridimiensional
138 * space (where the axes represent red/green/blue values) defined by a point
139 * and a radius(the length of the edge).
140 */
141 class ColorSpace{
142 /**
143 * Creates a new ColorSpace
144 *
145 * @param r
146 * @param g
147 * @param b
148 * @param radius
149 */
150 ColorSpace(int r, int g, int b, int radius){
151 baseR = r;
152 baseG = g;
153 baseB = b;
154 this.radius = radius;
155 }
156
157 /** *
158 */
159 int baseR, baseG, baseB;
160 /** */
161 int radius;
162 }
163
164 /** */
165 LinkedList[] availableSpacesList = new LinkedList[8];
166
167 /** */
168 LinkedList usedSpacesList = new LinkedList();
169
170 /** */
171 int listToRead = 0;
172
173 } // ColorGenerator
174