COIN-OR::LEMON - Graph Library

source: lemon-0.x/lemon/color.h @ 2388:c6d537888fe5

Last change on this file since 2388:c6d537888fe5 was 2260:4274224f8a7d, checked in by Alpar Juttner, 17 years ago

concept -> concepts (namespace & directory)

File size: 5.6 KB
Line 
1/* -*- C++ -*-
2 *
3 * This file is a part of LEMON, a generic C++ optimization library
4 *
5 * Copyright (C) 2003-2006
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 *
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
12 *
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
15 * purpose.
16 *
17 */
18
19#ifndef LEMON_COLOR_H
20#define LEMON_COLOR_H
21
22#include<vector>
23#include<cmath>
24#include<lemon/maps.h>
25
26
27///\ingroup misc
28///\file
29///\brief Tools to manage RGB colors.
30///
31///\author Alpar Juttner
32
33namespace lemon {
34
35
36/// \addtogroup misc
37/// @{
38
39///Data structure representing RGB colors.
40
41///Data structure representing RGB colors.
42class Color
43{
44  double _r,_g,_b;
45public:
46  ///Default constructor
47  Color() {}
48  ///Constructor
49  Color(double r,double g,double b) :_r(r),_g(g),_b(b) {};
50  ///Set the red component
51  double & red() {return _r;}
52  ///Return the red component
53  const double & red() const {return _r;}
54  ///Set the green component
55  double & green() {return _g;}
56  ///Return the green component
57  const double & green() const {return _g;}
58  ///Set the blue component
59  double & blue() {return _b;}
60  ///Return the blue component
61  const double & blue() const {return _b;}
62  ///Set the color components
63  void set(double r,double g,double b) { _r=r;_g=g;_b=b; };
64};
65
66  /// White color constant
67  extern const Color WHITE; 
68  /// Black color constant
69  extern const Color BLACK;
70  /// Red color constant
71  extern const Color RED;
72  /// Green color constant
73  extern const Color GREEN;
74  /// Blue color constant
75  extern const Color BLUE;
76  /// Yellow color constant
77  extern const Color YELLOW;
78  /// Magenta color constant
79  extern const Color MAGENTA;
80  /// Cyan color constant
81  extern const Color CYAN;
82  /// Grey color constant
83  extern const Color GREY;
84  /// Dark red color constant
85  extern const Color DARK_RED;
86  /// Dark green color constant
87  extern const Color DARK_GREEN;
88  /// Drak blue color constant
89  extern const Color DARK_BLUE;
90  /// Dark yellow color constant
91  extern const Color DARK_YELLOW;
92  /// Dark magenta color constant
93  extern const Color DARK_MAGENTA;
94  /// Dark cyan color constant
95  extern const Color DARK_CYAN;
96
97///Map <tt>int</tt>s to different \ref Color "Color"s
98
99///This map assigns one of the predefined \ref Color "Color"s
100///to each <tt>int</tt>. It is possible to change the colors as well as their
101///number. The integer range is cyclically mapped to the provided set of colors.
102///
103///This is a true \ref concepts::ReferenceMap "reference map", so you can also
104///change the actual colors.
105
106class Palette : public MapBase<int,Color>
107{
108  std::vector<Color> colors;
109public:
110  ///Constructor
111
112  ///Constructor
113  ///\param have_white indicates whether white is
114  ///amongst the provided color (\c true) or not (\c false). If it is true,
115  ///white will be assigned to \c 0.
116  ///\param num the number of the allocated colors. If it is \c 0,
117  ///the default color configuration is set up (26 color plus the white).
118  ///If \c num is less then 26/27 then the default color list is cut. Otherwise
119  ///the color list is filled repeatedly with the default color list.
120  ///(The colors can be changed later on.)
121  Palette(bool have_white=false,int num=0)
122  {
123    do {
124      if(have_white) colors.push_back(Color(1,1,1));
125
126      colors.push_back(Color(0,0,0));
127      colors.push_back(Color(1,0,0));
128      colors.push_back(Color(0,1,0));
129      colors.push_back(Color(0,0,1));
130      colors.push_back(Color(1,1,0));
131      colors.push_back(Color(1,0,1));
132      colors.push_back(Color(0,1,1));
133     
134      colors.push_back(Color(.5,0,0));
135      colors.push_back(Color(0,.5,0));
136      colors.push_back(Color(0,0,.5));
137      colors.push_back(Color(.5,.5,0));
138      colors.push_back(Color(.5,0,.5));
139      colors.push_back(Color(0,.5,.5));
140     
141      colors.push_back(Color(.5,.5,.5));
142      colors.push_back(Color(1,.5,.5));
143      colors.push_back(Color(.5,1,.5));
144      colors.push_back(Color(.5,.5,1));
145      colors.push_back(Color(1,1,.5));
146      colors.push_back(Color(1,.5,1));
147      colors.push_back(Color(.5,1,1));
148     
149      colors.push_back(Color(1,.5,0));
150      colors.push_back(Color(.5,1,0));
151      colors.push_back(Color(1,0,.5));
152      colors.push_back(Color(0,1,.5));
153      colors.push_back(Color(0,.5,1));
154      colors.push_back(Color(.5,0,1));
155    } while(int(colors.size())<num);
156    //    colors.push_back(Color(1,1,1));
157    if(num>0) colors.resize(num);
158  }
159  ///\e
160  Color &operator[](int i)
161  {
162    return colors[i%colors.size()];
163  }
164  ///\e
165  const Color &operator[](int i) const
166  {
167    return colors[i%colors.size()];
168  }
169  ///\e
170  void set(int i,const Color &c)
171  {
172    colors[i%colors.size()]=c;
173  }
174  ///Sets the number of the exiting colors.
175  void resize(int s) { colors.resize(s);}
176  ///Returns the number of the existing colors.
177  std::size_t size() const { return colors.size();}
178};
179
180///Returns a visible distinct \ref Color
181
182///Returns a \ref Color which is as different from the given parameter
183///as it is possible.
184inline Color distantColor(const Color &c)
185{
186  return Color(c.red()<.5?1:0,c.green()<.5?1:0,c.blue()<.5?1:0);
187}
188///Returns black for light colors and white for the dark ones.
189
190///Returns black for light colors and white for the dark ones.
191inline Color distantBW(const Color &c){
192  return (.2125*c.red()+.7154*c.green()+.0721*c.blue())<.5 ? WHITE : BLACK;
193}
194
195/// @}
196
197} //END OF NAMESPACE LEMON
198
199#endif // LEMON_COLOR_H
Note: See TracBrowser for help on using the repository browser.