|
|
2007/5/13(Sun) 22:34:01|NO.8232
2つの色を混ぜあわせたいのですが、RGBの平均値を取るだけだと
変な結果になってしまいます。
どうすれば上手く色を混ぜられるのでしょうか。
一応今のスクリプトです。
#define color_r(%1,%2,%3,%4) %1_r=%2:%1_g=%3:%1_b=%4
#define color_copy(%1,%2) %1_r=%2_r:%1_g=%2_g:%1_b=%2_b
#define colorr(%1) color %1_r,%1_g,%1_b
color_r color1,255,0,0
color_r color2,0,0,255
gosub *byoga
onclick gosub *onc
onkey goto *a
stop
*byoga
colorr color1
boxf 0,0,ginfo_winx>>1,ginfo_winy
colorr color2
boxf ginfo_winx>>1,0,ginfo_winx,ginfo_winy
return
*onc
dialog ,33
if mousex<ginfo_winx/2:color_copy color1,ginfo:else:color_copy color2,ginfo
gosub *byoga
return
//色を混ぜる
*a
onclick 0:onkey 0
color_r mixcolor,(color1_r+color2_r)/2,(color1_g+color2_g)/2,(color1_b+color2_b)/2
colorr mixcolor
boxf
stop
よろしくお願いします。
|
|
2007/5/13(Sun) 23:17:16|NO.8233
はじめまして、PCオタといいます。
久しぶりに投稿。
色を混ぜる計算は面倒だから、本当に混ぜてそこから色をとる。
dim ac,3:dim bc,3:dim cc,3
ac(0)=255:ac(1)=0:ac(2)=0
bc(0)=0:bc(1)=0:bc(2)=255
gmode 3,10,10,255
color ac(0),ac(1),ac(2)
grect
gmode 3,10,10,127
color bc(0),bc(1),bc(2)
grect
pget 0,0
cc(0)=ginfo_r:cc(1)=ginfo_g:cc(2)=ginfo_b
pos 0,12
mes "R:"+cc(0)+"G:"+cc(1)+"B:"+cc(2)
それっぽくなってるので、結果重視な感じ。
|
|
2007/5/14(Mon) 16:48:25|NO.8241
> RGBの平均値を取るだけだと変な結果になってしまいます。
PCオタさんのやり方と比べて見たら、平均値でもちゃんと出来ている様です。
おそらくますさんのスクリプトは、
複雑なマクロがかみ合わずに計算を誤ったのかも知れません。
#enum R=0
#enum G
#enum B
//初期値
c1=255,0,0
c2=0,0,255
//簡易カラーパレット
buffer 1,127,191
repeat 191 :c=cnt
repeat 127
hsvcolor c,cnt*2,255 :pset c,cnt
loop
loop
gsel 0
*main
redraw 0
//クリック取得
stick key,256+512
if key=256 :pget mousex,mousey :c1=ginfo_r,ginfo_g,ginfo_b
if key=512 :pget mousex,mousey :c2=ginfo_r,ginfo_g,ginfo_b
//色混ぜる
c3(R) = ( c1(R) + c2(R) ) / 2
c3(G) = ( c1(G) + c2(G) ) / 2
c3(B) = ( c1(B) + c2(B) ) / 2
//画面初期化+パレット表示
color 255,255,255 :boxf
gmode 0 :pos 0,0 :gcopy 1,0,0,127,191
//それぞれの色を表示
color c1(R),c1(G),c1(B) :boxf 150,0,250,80
color c2(R),c2(G),c2(B) :boxf 150,100,250,180
color c3(R),c3(G),c3(B) :boxf 300,0,400,180
//gmode+grect で色を混ぜる
gmode 3,100,180,255 :color c1(R),c1(G),c1(B) :grect 500,90
gmode 3,100,180,127 :color c2(R),c2(G),c2(B) :grect 505,95
//それぞれの色の値表示
color
pos 150,80 :mes "c1="+c1(R)+","+c1(G)+","+c1(B)
pos 150,180 :mes "c2="+c2(R)+","+c2(G)+","+c2(B)
pos 300,180 :mes "c3="+c3(R)+","+c3(G)+","+c3(B)
//gmode+grect の色の値を取得して表示
pget 455,5
pos 450,190 :mes "gmode+grect="+ginfo_r+","+ginfo_g+","+ginfo_b
redraw 1
wait 10
goto *main
| |
|
2007/5/14(Mon) 18:13:21|NO.8243
ありがとうございます。
しかし、これでは
黄+青=灰色という結果になってしまいます。
|
|
2007/5/14(Mon) 19:25:03|NO.8247
・・・黄に青を足したら、何色になるのが正しいの?
|
|
2007/5/14(Mon) 20:09:15|NO.8250
一応緑です。
|
|
2007/5/14(Mon) 20:43:59|NO.8252
> 一応緑です。
あれ・・・白じゃないですか?
|
|
2007/5/14(Mon) 20:57:35|NO.8253
>一応緑です。
そうでしたか?
黄色に青混ぜると・・・
黄色には赤の要素が混ざってるから緑にはならないと思います。
緑を作るのなら、黄色から赤の要素を抽出(取り出し)しなければなりません。
>黄+青=灰色という結果になってしまいます。
色を4byteで管理するのがよいと思います。
RGBで3byte, そしてブレンド率を表す値を1byte使うのはどうでしょうか。
緑色と、青色でテストします。
dialog "緑色と青色を混ぜます-↑↓でブレンド率設定"
// ブレンド値 (0〜255)
α = 128
; clr1 → RGB (use 3byte)
poke clr1, 0, 0 ; R
poke clr1, 1, 255 ; G
poke clr1, 2, 0 ; B
; clr2 → RGB (use 3byte)
poke clr2, 0, 0 ; R
poke clr2, 1, 0 ; G
poke clr2, 2, 255 ; B
gosub *sub
repeat
stick k, 15, 1 : if k == 0 : wait 1 : continue
if k & 2 : α++ : α = limit(α, 0, 255)
if k & 8 : α-- : α = limit(α, 0, 255)
gosub *sub
loop
*sub
title "ブレンド率 = " + double(α)/255*100 + "%"
R = (peek(clr1) + peek(clr2))
G = (peek(clr1, 1) + peek(clr2, 1))
B = (peek(clr1, 2) + peek(clr2, 2))
color double(α)/255*R, double(α)/255*G, double(α)/255*B
boxf
return
|
|
2007/5/14(Mon) 21:14:12|NO.8254
>一応緑です。
それは・・・
黄色+青は普通「白」です
それを半分にしてるので灰色になるのは間違っていません。
緑は黄色と青が0にならないといけないので、足して割るだけでは無理です。
もしかして、色の設定ダイアログみたいな虹色の並びで2色間の色が欲しい?
|
|
2007/5/16(Wed) 19:19:46|NO.8295
皆様、誤解する書き方をして申し訳ありませんでした。
GENKIさんの言うとおり色の三原色です。
GENKIさんのアドレスを参考にさせていただきます。
皆様、ありがとうございました。
|
|
2007/6/23(Sat) 19:23:12|NO.9089
#enum R=0
#enum G
#enum B
//初期値
c1=255,0,0
c2=0,0,255
//簡易カラーパレット
buffer 1,127,191
repeat 191 :c=cnt
repeat 127
hsvcolor c,cnt*2,255 :pset c,cnt
loop
loop
gsel 0
*main
redraw 0
//クリック取得
stick key,256+512
if key=256 :pget mousex,mousey :c1=ginfo_r,ginfo_g,ginfo_b
if key=512 :pget mousex,mousey :c2=ginfo_r,ginfo_g,ginfo_b
//色混ぜる
c3(R) = ( c1(R) + c2(R) ) / 2
c3(G) = ( c1(G) + c2(G) ) / 2
c3(B) = ( c1(B) + c2(B) ) / 2
//画面初期化+パレット表示
color 255,255,255 :boxf
gmode 0 :pos 0,0 :gcopy 1,0,0,127,191
//それぞれの色を表示
color c1(R),c1(G),c1(B) :boxf 150,0,250,80
color c2(R),c2(G),c2(B) :boxf 150,100,250,180
color c3(R),c3(G),c3(B) :boxf 300,0,400,180
//gmode+grect で色を混ぜる
gmode 3,100,180,255 :color c1(R),c1(G),c1(B) :grect 500,90
gmode 3,100,180,127 :color c2(R),c2(G),c2(B) :grect 505,95
//それぞれの色の値表示
color
pos 150,80 :mes "c1="+c1(R)+","+c1(G)+","+c1(B)
pos 150,180 :mes "c2="+c2(R)+","+c2(G)+","+c2(B)
pos 300,180 :mes "c3="+c3(R)+","+c3(G)+","+c3(B)
//gmode+grect の色の値を取得して表示
pget 455,5
pos 450,190 :mes "gmode+grect="+ginfo_r+","+ginfo_g+","+ginfo_b
redraw 1
wait 10
goto *main
はだめです!
| |
|