|
|
2019/3/27(Wed) 19:45:37|NO.86971
こんな感じで、「最上段のグラデーションと、最下段のグラデーションを作る」
→「各縦列について、上下方向のグラデーションを作る」という流れだとどうでしょうか?
#define boxf2(%1,%2,%3,%4) boxf %1,%2,(%1)+(%3)-1,(%2)+(%4)-1
xnum=18 //グラデーション表のx方向の要素数
ynum=9 //グラデーション表のy方向の要素数
xmax=xnum-1 : ymax=ynum-1
dim gra,xnum,ynum,3 //グラデーションの内容
dim l_u,3 : l_u=255,0,0 //左上の色
dim r_u,3 : r_u=0,255,0 //右上の色
dim l_d,3 : l_d=255,255,0 //左下の色
dim r_d,3 : r_d=0,0,255 //右下の色
//最上段のグラデーションを作る
repeat 3
cnt0=cnt
setease l_u(cnt0),r_u(cnt0),ease_liner
repeat xnum
gra(cnt,0,cnt0)=getease(cnt,xmax)
loop
loop
//最下段のグラデーションを作る
repeat 3
cnt0=cnt
setease l_d(cnt0),r_d(cnt0),ease_liner
repeat xnum
gra(cnt,ymax,cnt0)=getease(cnt,xmax)
loop
loop
//各縦列の上下方向のグラデーションを作る
repeat xnum
cnt1=cnt
repeat 3
cnt0=cnt
setease gra(cnt1,0,cnt0),gra(cnt1,ymax,cnt0),ease_liner
repeat ynum
gra(cnt1,cnt,cnt0)=getease(cnt,ymax)
loop
loop
loop
//表示
repeat xnum
cnt0=cnt
repeat ynum
color gra(cnt0,cnt,0),gra(cnt0,cnt,1),gra(cnt0,cnt,2)
boxf2 32*cnt0,32*cnt,32,32
loop
loop
|
|
2019/3/29(Fri) 01:36:54|NO.86979
式はわかりませんが、結果だけを取得するという手もあります。
bx = 0,ginfo_winx-1,ginfo_winx-1,0
by = 0,0,ginfo_winy-1,ginfo_winy-1
c = $FF0000, $00FF00, $FFFF00, $0000FF
gsquare -2571, bx,by, c
*main
await 16
pget mousex, mousey
title "(R, G, B) = (" + strf("%d, %d, %d", ginfo_r, ginfo_g, ginfo_b) + ")"
goto *main
式は…2点間がわかるなら、横と縦とで2回に分けて計算すればいいだけのような気がします。あ、3回か。
|
|
2019/3/29(Fri) 01:39:38|NO.86980
しまった、こうでした。
c = $FF0000, $00FF00, $0000FF, $FFFF00
そして真ん中あたりの色が微妙に違うことにも気づきました。これじゃだめですね。(´・ω・`)
|
|
2019/3/29(Fri) 13:06:01|NO.86981
参考URLを見る限り内分の公式を使ってるだけだと思います。
screen 0,450,225
lu=255,0,0
ru=0,255,0
ld=255,255,0
rd=0,0,255
x=0
y=0
repeat 18
x=cnt
repeat 9
y=cnt
r=(((lu(0)*(18-x)+ru(0)*x)/18*(9-y)+(ld(0)*(18-x)+rd(0)*x)/18*y))/9
g=(((lu(1)*(18-x)+ru(1)*x)/18*(9-y)+(ld(1)*(18-x)+rd(1)*x)/18*y))/9
b=(((lu(2)*(18-x)+ru(2)*x)/18*(9-y)+(ld(2)*(18-x)+rd(2)*x)/18*y))/9
color r,g,b
boxf x*25,y*25,x*25+25,y*25+25
color 0,0,0
line x*25,0,x*25,225
line 0,y*25,450,y*25
await 0
loop
await 0
loop
見た感じ色が同じに見えますがどうでしょう?
|
|
2019/3/29(Fri) 13:26:43|NO.86982
計算で求める場合だとこんな感じになるでしょうか?
#module
#define global ctype get_c(%1,%2) (((%1)>>(8*%2))&0xFF) //色コードp1から色を抽出。p2=0で青、1で緑、2で赤
#define global col_code(%1) color get_c(%1,2),get_c(%1,1),get_c(%1,0) //色コードから現在色をセット
#define global ctype line_ease(%1,%2,%3,%4) limit(((%2)-(%1))*(%3)/(%4)+(%1),lower(%1,%2),higher(%1,%2))
//line_ease(p1,p2,p3,p4) …… 「setease p1,p2,ease_linear」の後の「getease(p3,p4)」と同じ
#const int_max 2147483647
#defcfunc lower int la,int lb //p1かp2のうち小さい方を返す
if la<lb : return la
return lb
#defcfunc higher int ha,int hb //p1かp2のうち大きい方を返す
if ha>hb : return ha
return hb
#defcfunc gra_4 int col1,int col2,int col3,int col4,int xnum,int ynum,int xpos,int ypos
//gra_4 p1,p2,p3,p4,p5,p6,p7,p8
//p1〜p4には左上・右上・左下・右下の色の色コードを「0xRRGGBB」という形で指定。
//横要素数p5、縦要素数p6のグラデーション表を考えた場合の、横位置p7、縦位置p8に位置する色を返す。
//位置の最小は0、最大は要素数-1。
xmax=limit(xnum-1,1,int_max) : ymax=limit(ynum-1,1,int_max)
ret=0
repeat 3
a=get_c(col1,cnt) : b=get_c(col2,cnt)
c=line_ease(a,b,xpos,xmax)
a=get_c(col3,cnt) : b=get_c(col4,cnt)
d=line_ease(a,b,xpos,xmax)
e=line_ease(c,d,ypos,ymax)
ret=ret|(e<<(cnt*8))
loop
return ret
#global
//以下サンプル
xitem=18 : yitem=9 //グラデーションの横の分割数と縦の分割数
xtgt=5 : ytgt=4 //色を取得したい位置
get=gra_4(0xFF0000,0x00FF00,0xFFFF00,0x0000FF,xitem,yitem,xtgt,ytgt)
col_code get
boxf 0,0,100,100
| |
|
2019/3/29(Fri) 13:27:37|NO.86983
被ってしまった。
|
|
2019/3/29(Fri) 15:53:18|NO.86985
>>沢渡さん
イージング関数というものがあるのですね。知りませんでした…
>>GENKIさん
不思議なグラデーションですね。これはどういう仕組みでグラデーションを作っているのか気になります…
>>kanamaruさん
4点座標の内分ってこんな式になるのですね。当方 数学はまるきりなので詳しく理解するには少し時間がかかりそうです…
お三方、ありがとうございます。イージング関数や内分点あたりを研究してみたいと思います。
ありがとうございました。
|
|
2019/3/29(Fri) 15:53:31|NO.86986
解決忘れ
|
|