HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0327
とあるプログラマ中間色の求め方8解決


とあるプログラマ

リンク

2019/3/27(Wed) 01:16:25|NO.86965

現在クリップスタジオの中間色パレットと似たようなものを作りたいと考えております。
(参考URL:https://www.clip-studio.com/site/gd/csp/manual/userguide/csp_userguide/540_color_plt/540_color_category_plt_chukanshoku.htm)
中間色の求め方なのですが、帯状のグラデーションのように直線上の2点間の中間色の求め方は分かるのですが、このように4点間の二次元的な中間色を求める式が分からず悩んでおります。
このような4点間の中間色の求め方って分かりますでしょうか。よろしくお願いします。



この記事に返信する


沢渡

リンク

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



GENKI

リンク

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回か。



GENKI

リンク

2019/3/29(Fri) 01:39:38|NO.86980

しまった、こうでした。
c = $FF0000, $00FF00, $0000FF, $FFFF00
そして真ん中あたりの色が微妙に違うことにも気づきました。これじゃだめですね。(´・ω・`)



kanamaru

リンク

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

解決忘れ



ONION software Copyright 1997-2023(c) All rights reserved.