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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0120
カラーチャートを作っているのですが・・・8解決


リンク

2014/1/20(Mon) 20:33:19|NO.59421


Screen 0,1000,1000 中心点x=ginfo_sx/2//円のx方向の中心点 中心点y=ginfo_sy/2//円のy方向の中心点 円サイズ=500//円の半径 V=255//HSVのVの位置を代入 repeat 円サイズ 距離=double(cnt)//中心からの距離を代入 S=double(cnt)/(double(円サイズ)/255.0)//HSVのSの値を代入 repeat 720 角度=double(360-cnt)/114.59156 x = 中心点x + (sin(角度) * 距離)//psetの位置を代入 y = 中心点y + (cos(角度) * 距離)//psetの位置を代入 H=double(cnt)/3.75//HSVのHの位置を代入 hsvcolor H,S,V//カレントカラーを変更。 pset x,y//描画 await; ウェイト loop loop
このようなカラーチャートを作っているのですが、円のサイズを大きくすると、隙間が開いてしまいます。
どこをいじればいいのでしょうか?



この記事に返信する


(’’

リンク

2014/1/20(Mon) 21:56:21|NO.59423

cos、sinの点で詰まった円を描こうとするとそうなるわけで
ピクセルの座標から色を計算して1dot単位で描けばいいと思います
(↓は適当にやってみたんですが適当すぎて正確になりませんでした。
すいません、各自調整して下さい。)


中心点x=ginfo_sx/2//円のx方向の中心点 中心点y=ginfo_sy/2//円のy方向の中心点 縦サイズ=ginfo_sx 横サイズ=ginfo_sy 中心点x=ginfo_sx/2//円のx方向の中心点 中心点y=ginfo_sy/2//円のy方向の中心点 円サイズplus=500.0/255.0//円の半径/255 V=255//HSVのVの位置を代入 repeat 縦サイズ x=cnt repeat 横サイズ y=cnt //x,yの点の色を求める angle=atan(x,y) distance=sqrt(x*x+y*y)//距離 S=distance/円サイズplus 元CNT=int(360.0-(angle*114.59156)) hsvcolor 元CNT/3.75,S,V//カレントカラーを変更。 pset x,y await loop loop



FunnyMaker

リンク

2014/1/20(Mon) 22:01:14|NO.59424

あ、先人がいらした...。

けど、作っちゃったので、載せときます。
参考になれば幸いです。


radius = 300 ;半径 Φ = radius*2+1 ;直径(※中心を余分に1pxとってあるので、数学的に厳密ではない。) #const π×2 m_pi*2 pos_center = radius,radius ;中心点のウィンドウ座標系座標。これを原点とする座標系を「座標系O」とする。 screen 0,Φ,Φ,0 x = 0 : y = 0 ;吟味する点。この動点をPとする。 V = 255 repeat Φ*Φ dx = x - pos_center(0) : dy = y - pos_center(1) ;吟味点のx,y座標系座標 distance = sqrt(dx*dx + dy*dy) ;距離OP if distance <= radius { ;Pが円内にあるならば... θ = atan(dy,dx) ;逆三角関数を用いて偏角を求める if θ < 0 : θ + π×2 ;※ θ >= 0に限定 H = θ/π×2*360 S = distance/radius*255 hsvcolor H,S,V//カレントカラーを変更。 pset x,y//描画 } if x = Φ : x = 0 : y ++ : else : x++ ;次のPの位置を決める await 0 ;フリーズ防止のおまじない loop



FunnyMaker

リンク

2014/1/20(Mon) 22:05:00|NO.59426

補足。↑改めてみるとなんかおかしいです。
にわかにhsv形式について調べたものでHSV形式に詳しくありません。ごめんなさい。適当に変えてください。



リンク

2014/1/20(Mon) 22:07:06|NO.59428

(’’さん、回答していただきありがとうございます。
2つほど気になった点がありました。
atanはp1にy、p2にxを指定すると書いているのですが、このソースコードではp1にx、p2にyを指定していますよね。
仕様ですか?それとも、単純なミスですか?


repeat 縦サイズ y=cnt repeat 横サイズ x=cnt
こちらもxとyが逆ではないでしょうか?



(’’

リンク

2014/1/20(Mon) 22:17:22|NO.59429

ぐは、すいません。
その通りです、ミスです・・・



きのよー

リンク

2014/1/20(Mon) 22:22:17|NO.59430

重いので先人さんたちのソースのほうが効率がいいかも…


Screen 0,1000,1000 中心点x=ginfo_sx/2//円のx方向の中心点 中心点y=ginfo_sy/2//円のy方向の中心点 円サイズ=500//円の半径 V=255//HSVのVの位置を代入 穴埋め度=3 //←追加要素。3あたりで十分。 repeat 円サイズ 距離=double(cnt)//中心からの距離を代入 S=double(cnt)/(double(円サイズ)/255.0)//HSVのSの値を代入 //repeat 720 繰り返し回数=距離*2*M_PI*穴埋め度 repeat 繰り返し回数 //角度=double(720-cnt)/114.59156 角度=double(繰り返し回数-cnt)/(距離*穴埋め度) x = 中心点x + (sin(角度) * 距離)//psetの位置を代入 y = 中心点y + (cos(角度) * 距離)//psetの位置を代入 H=double(cnt)/double(繰り返し回数/192)//HSVのHの位置を代入 hsvcolor H,S,V//カレントカラーを変更。 pset x,y//描画 loop await//時間がかかるので、ちょっとウェイト時間を減らす loop

穴埋め度の計算が思いつかない。



(’’

リンク

2014/1/20(Mon) 22:39:39|NO.59431

ミスを直したらうまくいったんですが、なぜかatanのxとyを逆にしないと
空さんの最初のチャートと合致しません

中心点x=ginfo_sx/2//円のx方向の中心点
中心点y=ginfo_sy/2//円のy方向の中心点 縦サイズ=ginfo_winy 横サイズ=ginfo_winx 中心点x=ginfo_sx/2//円のx方向の中心点 中心点y=ginfo_sy/2//円のy方向の中心点 円サイズplus=500.0/255.0//円の半径/255 V=255//HSVのVの位置を代入 repeat 縦サイズ y=cnt repeat 横サイズ x=cnt x2=x-中心点x:y2=y-中心点y //x,yの点の色を求める angle=atan(x2,y2) distance=sqrt(x2*x2+y2*y2)//距離 S=distance/円サイズplus 元CNT=360.0-(angle*114.59156) hsvcolor 元CNT/3.75,S,V//カレントカラーを変更。 pset x,y await loop loop
これで最初のチャート通りになりました


あ、ミスは縦サイズと横サイズ逆にしてたのと、中心点を考慮してなかっただけでした



リンク

2014/1/20(Mon) 23:11:18|NO.59436

皆さん、わかりやすく見やすいソースコードを書いていただき、本当にありがとうございます。
最終的に、このようなソースコードになりました。ベースは(’’さんのソースコードです。

#module//HSVをRGBに変換するモジュール→http://ror.cs.land.to/hsp/colortest.html ;; 四捨五入マクロ #define global Round(%1) double(int((%1)+0.5)) #define global Round2(%1) int((%1)+0.5) ;実数に戻さない ;; HSVをRGBに変換 ;; HSVは、Hは0.0〜360.0、SVは0.0〜1.0で指定 ;; RGBは0〜255で結果を返す #deffunc HSV2RGB double dH , double dS , double dV , var vR , var vG , var vB if dS=0.0{ ;dS(彩度)がゼロ vR = int(dV*255) ;無彩色なので全てdVの値になる vG = vR vB = vR }else{ tH = dH repeat ;dHを0.0〜360.0に揃える if tH>=360.0 : tH - 360.0 : continue if tH<0.0 : tH + 360.0 : continue break loop Hi = int(tH/60) f = tH / 60 - Hi p = Round2( dV * (1.0 - dS) * 255 ) ;HSP標準命令の「hsvcolor」に近づけようと思ったら q = Round2( dV * (1.0 - dS * f) * 255 ) ;四捨五入する必要があるっぽい? t = Round2( dV * (1.0 - dS * (1.0 - f)) * 255 ) iV = int( dV * 255 ) if Hi<=2{ ;見づらくならない程度に分岐を整理 if Hi=0 : vR = iV : vG = t : vB = p if Hi=1 : vR = q : vG = iV : vB = p if Hi=2 : vR = p : vG = iV : vB = t }else{ if Hi=3 : vR = p : vG = q : vB = iV if Hi=4 : vR = t : vG = p : vB = iV if Hi=5 : vR = iV : vG = p : vB = q } } return #global Screen 0,1000,1000 縦サイズ=ginfo_winy 横サイズ=ginfo_winx 中心点x=ginfo_sx/2//円のx方向の中心点 中心点y=ginfo_sy/2//円のy方向の中心点 円サイズplus=490.0/255.0//円の半径/255 V=255//HSVのVの位置を代入 repeat 縦サイズ y=cnt repeat 横サイズ x=cnt x2=x-中心点x:y2=y-中心点y //x,yの点の色を求める angle=atan(x2,y2) distance=sqrt(x2*x2+y2*y2)//距離 S=distance/円サイズplus 元CNT=360.0-(angle*114.59156) HSV2RGB (元CNT/2),(S/255),(V/255) , R,G,B//HSV→RGBに変換 color R,G,B //カレントカラーを変更。 pset x,y loop await loop

(’’さん、FunnyMakerさん、きのよーさん、本当にありがとうございました。



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