lemon/color.h
author deba
Tue, 17 Oct 2006 10:50:57 +0000
changeset 2247 269a0dcee70b
parent 2179 a3bb30be417c
child 2260 4274224f8a7d
permissions -rw-r--r--
Update the Path concept
Concept check for paths

DirPath renamed to Path
The interface updated to the new lemon interface
Make difference between the empty path and the path from one node
Builder interface have not been changed
// I wanted but there was not accordance about it

UPath is removed
It was a buggy implementation, it could not iterate on the
nodes in the right order
Right way to use undirected paths => path of edges in undirected graphs

The tests have been modified to the current implementation
     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 
    33 namespace lemon {
    34 
    35 
    36 /// \addtogroup misc
    37 /// @{
    38 
    39 ///Data structure representing RGB colors.
    40 
    41 ///Data structure representing RGB colors.
    42 class Color
    43 {
    44   double _r,_g,_b;
    45 public:
    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 concept::ReferenceMap "reference map", so you can also
   104 ///change the actual colors.
   105 
   106 class Palette : public MapBase<int,Color>
   107 {
   108   std::vector<Color> colors;
   109 public:
   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.
   184 inline 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.
   191 inline 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