Värvide „lahkusegamine“

Kristjan Kannike, loodud 2024-05-01, muudetud 2024-05-02

Valime kahe kokkusegatava pool-läbipaistva värvi asemel taustavärvi ja segamise tulemuse.

Erinevad läbilaskvused taustavärvi ja segatud värvi jaoks:

unblendForeground[cb_?ColorQ,cr_?ColorQ,ab_?NumericQ,as_?NumericQ]:=Block[{colspace=Head[cb],cs=RGBColor@@MapThread[((ab (-1+as))/as) #1+(1-((ab (-1+as))/as)) #2&,{List@@ColorConvert[cb,RGBColor],List@@ColorConvert[cr,RGBColor]}]},
If[(Min@@cs)<0||(Max@@cs)>1,Print["Warning: the colours cannot be unblended (negative or too large components needed)."]];
ColorConvert[cs,colspace]
]

Sama läbilaskvus taustavärvi ja segatud värvi jaoks:

unblendForeground[cb_?ColorQ,cr_?ColorQ,a_?NumericQ]:=unblendForeground[cb,cr,a,a];

Saame ka taustavärvi lahku segada segatud ja peale kantud värvi põhjal:

unblendBackground[cr_?ColorQ,cs_?ColorQ,ab_?NumericQ,as_?NumericQ]:=Block[{colspace=Head[cs],cb=RGBColor@@MapThread[(as/(ab (-1+as))) #1-(((ab+as-ab as))/(ab (-1+as))) #2&,{List@@ColorConvert[cs,RGBColor],List@@ColorConvert[cr,RGBColor]}]},
If[(Min@@cb)<0||(Max@@cb)>1,Print["Warning: the colours cannot be unblended (negative or too large components needed)."]];
ColorConvert[cb,colspace]
]

Sama läbilaskvus taustavärvi ja värvi jaoks:

unblendBackground[cr_?ColorQ,cs_?ColorQ,a_?NumericQ]:=unblendBackground[cr,cs,a,a];

Kasutame esimese variandi jaoks ka lühemat sünonüümi:

unblend=unblendForeground;

lightred=;
lightblue=;

Lahku segatud värv on eredam kui algne:

unblend[lightred,lightblue,0.5]

Eriti kui lähtume taustavärvist:

unblendBackground[lightblue,lightred,0.5]

Helesinine helepunasel annab seguna punakashalli:

With[{op=0.5},Graphics[{Opacity[op],lightred,Rectangle[{0,0}],Opacity[op],lightblue,Rectangle[{1/3,1/3}]}]]

Võtame seguvärviks helesinise:

With[{op=0.5},Graphics[{Opacity[op],lightred,Rectangle[{0,0}],Opacity[op],unblend[lightred,lightblue,op],Rectangle[{1/3,1/3}]}]]

Kasutame erinevaid läbilaskvusi:

With[{opRed=0.3,opBlue=0.5},Graphics[{Opacity[opRed],lightred,Rectangle[{0,0}],Opacity[opBlue],unblend[lightred,lightblue,opRed,opBlue],Rectangle[{1/3,1/3}]}]]

Segame lahku hoopis taustavärvi:

With[{op=0.5},Graphics[{Opacity[op],unblendBackground[lightblue,lightred,op],Rectangle[{0,0}],Opacity[op],lightred,Rectangle[{1/3,1/3}]}]]

Mitte kõiki värve ei saa lahku segada:

unblend[lightblue,lightred,0.5]