[Rd] pre summary: mapping of colornames into hsv?
Jens Oehlschlägel-Akiyoshi
jens.oehlschlaegel-akiyoshi@mdfactory.de
Wed, 29 Mar 2000 18:37:29 +0200
Hi Martin,
Great that you follow this. My original intention was to be able to
translate colornames to hsv because this would allow using colornames to cut
out a certain part of the colorwheel for colorcoding (HSV component H, see
my code below)
I think internally we might have colors represented as
Colornames, ColorIntegers, ColorHexcodes, ColorRGBs, ColorHSVs (ColorCMYs?)
however the R-user probably shouldn't see the internal ColorIntegers of the
C-code, as this might lead to confusion with the colornumbers resulting from
the palette settings.
So the R-user should see functions translating
ColorName2ColorHexcode() ColorHexcode2ColorRGB() and ColorRGB2ColorHSV()
and backwards
ColorHSV2ColorRGB() ColorRGB2ColorHexcode(), rather not
ColorHexcode2Colorname() as not every possible color is granted to have a
name.
Regards
Jens
P.S. the folowing function colorcode() I think is more general than
rainbow() in three aspects:
1) works also with not-equidistant colorcodings
2) works around the 'borders' of the colorwheel
3) works both directions along the colorwheel
With the above mentioned translation functions one could specify start= and
end= as colornames, which would make code more readable. Feel free to
include into R.
# 0 = red
# 1/6 = yellow
# 2/6 = green
# 3/6 = cyan
# 4/6 = blue
# 5/6 = violet
# go from red via yellow to green: start=0, stop=2/6
# go from green via yellow to red: start=2/6, stop=0
# go from green via cyan-blue-violet to red: start=2/6, stop=1
# go from red via violet-blue-cyan to green: start=0, stop=-4/6
colorcode <- function (p, start=0, end=2/6, s=1, v=1, ...)
{
# make p 0..1
r <- range(p)
p <- (p - r[1])/diff(r)
# wrap hue
up <- start <= end
start <- start %% 1
end <- end %% 1
if (up)
if (start < end){
h <- (start + p*(end-start)) %% 1
}else{
h <- (start + p*(1+end-start)) %% 1
}
else
if (end < start){
h <- (start - p*(start-end)) %% 1
}else{
h <- (start - p*(1+start-end)) %% 1
}
# round against bug if start=1 end=4/3 with p=seq(0, 1, 0.05)
hsv( round(h, 5), s, v, ...)
}
> -----Original Message-----
> From: Martin Maechler [mailto:maechler@stat.math.ethz.ch]
> Sent: Tuesday, March 28, 2000 4:07 PM
> To: jens.oehlschlaegel-akiyoshi@mdfactory.de
> Cc: R-core@stat.math.ethz.ch
> Subject: Re: [Rd] pre summary: mapping of colornames into hsv?
>
>
> >>>>> <jens.oehlschlaegel-akiyoshi@mdfactory.de> writes on
> Feb.28, 2000 :
>
> Jens> etc/colors.big doesn't do the job currently, as:
>
> Jens> colors.big maps 455 names to rgb in S syntax
> Jens> rgb.txt maps 657 names to rgb in C syntax, but
> unlike colors() it has
> Jens> mixed upper and lower case
>
> Jens> The C source has the information twice
> Jens> rgb.c maps 657 names to rgb (mixed upper and lower case)
> Jens> graphics.c maps 657 names tp colorstrings (lower case only)
>
> Jens> internal name2col() and R colors() accesses those
> in graphics.c
>
> Jens> I tend to create a R representation which copies
> the info from
> Jens> graphics.c, unless someone plans to export internal
> name2col() to
> Jens> become an official R function, which of course
> would be a less
> Jens> redundant solution.
>
> and a day later, Jens provided
>
> .ColorDataBase <- matrix(c(
> "white", "#FFFFFF",
> "aliceblue", "#F0F8FF",
> "antiquewhite", "#FAEBD7",
> "antiquewhite1", "#FFEFDB",
> "antiquewhite2", "#EEDFCC",
> "antiquewhite3", "#CDC0B0",
> .............
> ))
>
> Now, we should stand back for a moment and
> think about what functionality we should provide on the R level.
>
> I think we should use the internal accessor functions to ColorDataBase
> (in graphics.c) in order ensure consistency not to further
> duplicate the
> information.
>
> {{Guido: Jens is right that src/gnuwin32/graphapp/rgb.c
> kind of replicates the table already available in
> src/main/graphics.c
> should we separate out this definition from graphics.c
> into a global src/main/rgb.c or something else
> after which (most of) graphapp/rgb.c wouldn't be needed anymore ?
> -- or just declare the tables in Graphics.h and use them in
> graphapp as well?
> }}
>
>
> Potential useful functions {from graphics.c} to be made
> available on the R
> level are
>
> hsv2rgb() (h,s,v) |-> (r,g,b)
>
> rgb2hsv() does *NOT* exist in graphics.c ;
> is it possible at all (i.e. is hsv <--> rgb 1:1 ?)}
>
> rgb2col(rgb_ch) |-> uint { := unsigned int }
> name2col (ch) |-> uint
> number2col(ch) |-> uint
> str2col (ch) |-> uint {calling one of the above 3 functions !}
>
> RGB2rgb(r,g,b) |-> #RRGGBB string
> col2name(uint) |-> name from colors() or #RRGGBB string
>
> -------
> I would tend to provide only
>
> * str2col() returning an R integer() {instead of uint; the
> R color model
> only needs the low order 24 bits,
> see beginning of Graphics.h }
> * col2name()
>
> at first, but one might also want
>
> uint <--> (r,g,b) <--> (h,s,v)
>
> o Further ideas ?
> o Are 24bit colors okay?
> gnuwin32's graphapp seems to use "transparency"
> additionally to 3x8 bit RGB {didn't look closely}
>
>
> Martin
>
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !) To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._