これを行います単純な物理モデルはありません、画家の色は光で非常に精巧な相互作用を有します。幸いにも私たちは物理的な世界をモデル化することに限定されないコンピュータを持っています - 私たちは彼らが望む任意のことをすることができます!
最初のステップは、必要な色相分布を持つカラーホイールを赤、黄、青で120度単位で作成することです。ウェブには多くの例があります。ここでは完全に飽和した色しか持たないため、完全なRGB色域を生成するために使用することができます。ホイールの色は完全に任意です。私は赤と黄の中間点が赤すぎるので、オレンジ(60°)を255,160,0に設定しました。240°の代わりに純粋な青(0,0,255)を240°の代わりに250°に移動しました。青はより良く見えます。あなたが一緒にあなたが不明瞭な茶色がかった灰色を得る赤、黄、青の等量を混ぜるとき、私の子供の頃の実験を思い出し

。私はあなたがカラーホイールの中央で見ることができる適切な色を選択しました。コードの中で私は愛称でそれを「泥」と呼んでいます。
赤、黄、青以上の色が必要な場合は、白と黒を混ぜる必要があります。たとえば、赤と白を混ぜてピンクにし、オレンジ(黄+赤)を黒と混ぜてブラウンにします。
変換は、絶対値ではなく比率で行われます。実際のペイントと同様に、赤色100部と黄色100部との間に、赤色1部と黄色1部の混合に違いはありません。
コードはPythonで提供されていますが、他の言語に変換するのは難しくありません。最も難しいのは、色相角を作るために赤、黄、青を追加することです。私はベクトル加算を使用し、atan2
で角度に戻って変換します。ほとんどすべては線形補間(lerp)で行われます。
# elementary_colors.py
from math import degrees, radians, atan2, sin, cos
red = (255, 0, 0)
orange = (255, 160, 0)
yellow = (255, 255, 0)
green = (0, 255, 0)
cyan = (0, 255, 255)
blue = (0, 0, 255)
magenta = (255, 0, 255)
white = (255, 255, 255)
black = (0, 0, 0)
mud = (94, 81, 74)
colorwheel = [(0, red), (60, orange), (120, yellow), (180, green),
(215, cyan), (250, blue), (330, magenta), (360, red)]
red_x, red_y = cos(radians(0)), sin(radians(0))
yellow_x, yellow_y = cos(radians(120)), sin(radians(120))
blue_x, blue_y = cos(radians(240)), sin(radians(240))
def lerp(left, right, left_part, total):
if total == 0:
return left
ratio = float(left_part)/total
return [l * ratio + r * (1.0 - ratio) for l,r in zip(left, right)]
def hue_to_rgb(deg):
deg = deg % 360
previous_angle, previous_color = colorwheel[0]
for angle, color in colorwheel:
if deg <= angle:
return lerp(previous_color, color, angle - deg, angle - previous_angle)
previous_angle = angle
previous_color = color
def int_rgb(rgb):
return tuple(int(c * 255.99/255) for c in rgb)
def rybwk_to_rgb(r, y, b, w, k):
if r == 0 and y == 0 and b == 0:
rgb = white
else:
hue = degrees(atan2(r * red_y + y * yellow_y + b * blue_y,
r * red_x + y * yellow_x + b * blue_x))
rgb = hue_to_rgb(hue)
rgb = lerp(mud, rgb, min(r, y, b), max(r, y, b))
gray = lerp(white, black, w, w+k)
rgb = lerp(rgb, gray, r+y+b, r+y+b+w+k)
return int_rgb(rgb)
「RGB値の加算カラーミキシングのアルゴリズム」(http://stackoverflow.com/questions/726549/algorithm-for-add-color-mixing-for-rgb-values)を見てきましたか? "[実際の色を混ぜるように機能するカラーミキシングのアルゴリズムはありますか?](http://stackoverflow.com/questions/1351442/is-there-an-algorithm-for-color-mixing-that-works-like-ミキシング - リアル - カラー) "? – kmote