On 03/02/2010 8:50 AM, Ken Knoblauch wrote:
baptiste auguie <baptiste.auguie <at> googlemail.com> writes:
Adding two semi-transparent colours results in non-intuitive colour
mixing (a mystery for me anyway). Is it additive (light), substractive
(paint), or something else? Consider the following example, depending
on the order of the two "layers" the overlap region is either purple
or dark red. I have no idea why.
png("testingOrder.png")
plot.new()
# Red below
rect(0.3, 0.5, 1, 1, col=rgb(1, 0, 0, alpha=0.5))
rect(0, 0.5, 0.7, 1, col=rgb(0, 0, 1, alpha=0.5))
# Blue below
rect(0, 0, 0.7, 0.5, col=rgb(0, 0, 1, alpha=0.5))
rect(0.3, 0, 1, 0.5, col=rgb(1, 0, 0, alpha=0.5))
I think it's a fairly simple calculation. In the first example: We are
writing red (1,0,0) at alpha=0.5 onto white (1,1,1), so we get a mixture
of half existing and half new, i.e. (1,0.5,0.5). Then we write blue
(0,0,1) at alpha 0.5 onto that, giving (0.5, 0.25, 0.75).
In the second pair, the first write yields (0.5,0.5,1), and the second
yields (0.75, 0.25, 0.5).
So this is like mixing paints: you don't get the same colour if you mix
equal parts red and white, then take equal parts of that mixture with
blue, as you get if you put the blue in first. You've got less red in
the first mixture than in the second.
You would get the same color in both mixtures if you didn't mix the
white in:
# Red below
rect(0.3, 0.5, 1, 1, col=rgb(1, 0, 0, alpha=1))
rect(0, 0.5, 0.7, 1, col=rgb(0, 0, 1, alpha=0.5))
# Blue below
rect(0, 0, 0.7, 0.5, col=rgb(0, 0, 1, alpha=1))
rect(0.3, 0, 1, 0.5, col=rgb(1, 0, 0, alpha=0.5))
Duncan Murdoch
dev.off()
I would expect overlaid transparencies to act like filters and
multiply, producing so-called subtractive color mixing,
so blue and yellow gives green. Interestingly, however,
overlaying filters is not necessarily a commutative
operation, since a transparent filter can yield an
additive component (through scatter, for example)
though I suspect that the non-commutativity comes
about in R because these rules apply to physical lights,
filters and surfaces and in R, it is some uncalibrated combination
of frame buffer values that is being used.
Best,
baptiste
Ken
______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.