c++ ドット グラデーション

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
calbee
記事: 10
登録日時: 3年前

c++ ドット グラデーション

#1

投稿記事 by calbee » 3年前

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);
}
}
何故これで色が薄まるのか分からないです…
半分まで徐々に薄めて(赤→白)、もう半分はその逆(白→赤)を作りたいのですが、どうすれば良いのでしょう…?
添付ファイル
グラデーション.PNG
グラデーション.PNG (2.28 KiB) 閲覧数: 5142 回

アバター
usao
記事: 1887
登録日時: 11年前

Re: c++ ドット グラデーション

#2

投稿記事 by usao » 3年前

> 何故これで色が薄まるのか分からないです…

まず,

> 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増えるごとに色をどう変動させるのかを適切に(好きに)決めて実装すればよい.

Butter
記事: 18
登録日時: 3年前

Re: c++ ドット グラデーション

#3

投稿記事 by Butter » 3年前

単純に、

コード:

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);
    }
}
みたいに、半々ずつ別の式でr以外の
値を設定すれば良いんじゃないですか?

※上のコードは 参考程度に見てください。
 多分どこか間違っています。
 あと、コーディング変ですすいません

dxlibしかやってないので、
全然違うかもですけど…
とても暇で忙しい

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: c++ ドット グラデーション

#4

投稿記事 by みけCAT » 3年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
calbee さんが書きました:
3年前
何故これで色が薄まるのか分からないです…
間違っているかはともかく、今のコードを見ると、
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で考えると、彩度が小さくなることを「色が薄くなる」という、と考えることもできます。
usao さんが書きました:
3年前
r = x<255 ? x+1 : 255;
これは、

コード:

r = x<255 ? x : 255;
の間違いかな、と思う。
今回のxの値は0~255であり、わざわざ1ずらすのは不自然だと感じるのが理由。
もちろん自分が勝手に間違いと思ってただけで、間違ってないかもしれない。
この後の説明との整合性がとれていることも、間違ってないことを示唆している。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

calbee
記事: 10
登録日時: 3年前

Re: c++ ドット グラデーション

#5

投稿記事 by calbee » 3年前

皆様ありがとうございます。先程始めたばかりで、ソースの貼り方も知らずにすみません。
Butterさんのソースコードで概ね合っています。
色が薄まる理由も分かり、納得できました。

アバター
usao
記事: 1887
登録日時: 11年前

Re: c++ ドット グラデーション

#6

投稿記事 by usao » 3年前

オフトピック
#2を書いてるときに,1行目:

> int r = 255, g = 0, b = 0;

が自分に見えてなかったような気がするけど,とりあえず何かは伝わったような気がするからヨシ!

返信

“C言語何でも質問掲示板” へ戻る