int r = 255, g = 0, b = 0;
for(x = 0; x < 256; ++x) {
r = r<255? r+1: 255;
g = g<255? g+1: 255;
b = b<255? b+1: 255;
col = RGB(r, g, b);
for(y = 0; y < 256; ++y) {
SetPixel(hdc, x, y, col);
}
}
何故これで色が薄まるのか分からないです…
半分まで徐々に薄めて(赤→白)、もう半分はその逆(白→赤)を作りたいのですが、どうすれば良いのでしょう…?
c++ ドット グラデーション
Re: c++ ドット グラデーション
> 何故これで色が薄まるのか分からないです…
まず,
> r = r<255? r+1: 255;
これは,
r = x<255 ? x+1 : 255;
の間違いかな,と思う.
そうであれば,xの値毎に,r,g,b の値がいくつになっているのかを実際に見てみれば分るのでは.
・x=0のとき,r=1になる.
・x=100のとき,r=101になる.
・xが255以上のときには,r=255となる.
つまり,xが増える(右に行く)ほど,rの値は増える.
g,bについても同様ならば,xが増える(右に行く)ほど,色は白に近づく.
xが255よりでかい場所は全て真っ白になる.
上記の話がわかれば,
> 半分まで徐々に薄めて(赤→白)、もう半分はその逆(白→赤)を作りたい
は簡単であろう.
とりえあず単純には,xが「半分」より大きいか小さいかで(ifか何かで)処理を分けてしまえばよい.
後はそれぞれ,xに対応する色を決めれば良いだけだ.
xが1増えるごとに色をどう変動させるのかを適切に(好きに)決めて実装すればよい.
まず,
> r = r<255? r+1: 255;
これは,
r = x<255 ? x+1 : 255;
の間違いかな,と思う.
そうであれば,xの値毎に,r,g,b の値がいくつになっているのかを実際に見てみれば分るのでは.
・x=0のとき,r=1になる.
・x=100のとき,r=101になる.
・xが255以上のときには,r=255となる.
つまり,xが増える(右に行く)ほど,rの値は増える.
g,bについても同様ならば,xが増える(右に行く)ほど,色は白に近づく.
xが255よりでかい場所は全て真っ白になる.
上記の話がわかれば,
> 半分まで徐々に薄めて(赤→白)、もう半分はその逆(白→赤)を作りたい
は簡単であろう.
とりえあず単純には,xが「半分」より大きいか小さいかで(ifか何かで)処理を分けてしまえばよい.
後はそれぞれ,xに対応する色を決めれば良いだけだ.
xが1増えるごとに色をどう変動させるのかを適切に(好きに)決めて実装すればよい.
Re: c++ ドット グラデーション
単純に、
みたいに、半々ずつ別の式でr以外の
値を設定すれば良いんじゃないですか?
※上のコードは 参考程度に見てください。
多分どこか間違っています。
あと、コーディング変ですすいません
dxlibしかやってないので、
全然違うかもですけど…
int r = 255, g = 0, b = 0;
for(int x = 0 ; x < 256 ; x++){
if(x < 128) { //赤→白
b = g = x * 2;
}
else { //白→赤
b = g = (255 - x) * 2;
}
col = RGB(r, g, b);
for(int y = 0 ; y < 256 ; y++) {
SetPixel(hdc, x, y, col);
}
}
値を設定すれば良いんじゃないですか?
※上のコードは 参考程度に見てください。
多分どこか間違っています。
あと、コーディング変ですすいません
dxlibしかやってないので、
全然違うかもですけど…
とても暇で忙しい
Re: c++ ドット グラデーション
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
rについては最初から255なので次の値も255なので変わらず、
g, bについては最初は255より小さい値なので255になるまで1ずつ増えていくので、
赤だけが目立っている状態(R,G,B)=(255,0,0)から白(R,G,B)=(255,255,255)に近づいていくので、
これが「色が薄くなる」というように見えるのでしょう。
また、
RGBとHSV・HSBの相互変換ツールと変換計算式 - PEKO STEP
を参考にHSVで考えると、彩度が小さくなることを「色が薄くなる」という、と考えることもできます。
今回のxの値は0~255であり、わざわざ1ずらすのは不自然だと感じるのが理由。
もちろん自分が勝手に間違いと思ってただけで、間違ってないかもしれない。
この後の説明との整合性がとれていることも、間違ってないことを示唆している。
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
間違っているかはともかく、今のコードを見ると、
rについては最初から255なので次の値も255なので変わらず、
g, bについては最初は255より小さい値なので255になるまで1ずつ増えていくので、
赤だけが目立っている状態(R,G,B)=(255,0,0)から白(R,G,B)=(255,255,255)に近づいていくので、
これが「色が薄くなる」というように見えるのでしょう。
また、
RGBとHSV・HSBの相互変換ツールと変換計算式 - PEKO STEP
を参考にHSVで考えると、彩度が小さくなることを「色が薄くなる」という、と考えることもできます。
これは、 の間違いかな、と思う。
今回のxの値は0~255であり、わざわざ1ずらすのは不自然だと感じるのが理由。
もちろん自分が勝手に間違いと思ってただけで、間違ってないかもしれない。
この後の説明との整合性がとれていることも、間違ってないことを示唆している。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: c++ ドット グラデーション
皆様ありがとうございます。先程始めたばかりで、ソースの貼り方も知らずにすみません。
Butterさんのソースコードで概ね合っています。
色が薄まる理由も分かり、納得できました。
Butterさんのソースコードで概ね合っています。
色が薄まる理由も分かり、納得できました。
Re: c++ ドット グラデーション
オフトピック
#2を書いてるときに,1行目:
> int r = 255, g = 0, b = 0;
が自分に見えてなかったような気がするけど,とりあえず何かは伝わったような気がするからヨシ!
> int r = 255, g = 0, b = 0;
が自分に見えてなかったような気がするけど,とりあえず何かは伝わったような気がするからヨシ!