• ベストアンサー

条件式について・・・・・・・・・・・・

画像の左下隅と右上隅を結んだ線分を考え、この線分よりも下の三角形の領域をネズミ色(RGB成分の輝度値が128)にした画像を生成するプログラムをやっているのですが、左下隅と右上隅を結んだ線分を考え、この線分よりも下の三角形の領域の色を変えたい場合は、 まず、for(k = 0; k < nWidth; k++) を変えるべきだと思うのですが・・・・・・・四角の画像の右下から上に徐々に色を変えてくかんじだと思うのですが、三角形の公式みたいなのって関係ありますか? /* nWidth:画像の幅、nHeight:画像の高さ、nVal:輝度値*/ int nWidth,nHeight; /* 画像を生成する */ for(j = 0; j < nHeight; j++) for(k = 0; k < nWidth; k++) { DllBmpSetPixelValueR(pBmpOrig, j, k, 255); DllBmpSetPixelValueG(pBmpOrig, j, k, 255); DllBmpSetPixelValueB(pBmpOrig, j, k, 255); } わかる方は、教えてください。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.3

★アドバイス  左下隅と右上隅を結んだ線分を計算できるのなら  線分の座標軸(x,y)から右側の端までを直線で  描画すれば良いのではないか。 ・あるいは線分の計算結果を横軸のみ配列に保存して  あとで描画するとか。 ・三角関数の公式を使って数学的に綺麗に三角形を  塗りつぶせるか疑問です。理由は線分の計算が  三角関数とは微妙に(1ドットとか)ずれると思います。  だから線分の計算結果を元に横方向に水平線を  描画したほうがスマートな気がします。 ・ちなみに線分の計算方法は分かりますか?  Windows APIに便利な関数があります。  もしWindows専用ならば次の関数が使えます。  http://msdn.microsoft.com/ja-jp/library/cc410426.aspx→『LineDDA』  http://msdn.microsoft.com/ja-jp/library/cc410427.aspx→『LineDDAProc』  使い方は次のリンクをどうぞ。  http://eternalwindows.jp/graphics/gdi/gdi08.html→『直線判定』

fantazical
質問者

お礼

詳しくありがとうございます。 参考にします。

その他の回答 (4)

noname#62605
noname#62605
回答No.5

ここ数日質問を頻発していますが、前の質問を締め切ってから質問されてはどうですか?もしくは回答に対する反応くらいあってもいいと思います。 でないと折角回答してくれた方があなたが解決したという意思も伝わりませんし、ここのサイトでの禁止事項「続きの質問」「課題の丸投げ」にあたると考えます。 サイトの禁止事項でないにしても、回答をして下さっている方々に失礼だと思います。 これだけのレベルのコーティングをしているのですから、ある程度言語について知っていて、専門的知識があるはず。 アドバイスをするならば、前の質問の対する回答でも書きましたが、いきなり言語上で考えるのではなく、図とかメモとかでもいいのでどう処理するか書き出してシミュレートしたほうがいいと思います。とりあえず動かす。一気にあれもこれも実現しようと考えない。 まずは「画像の取り込み」→「加工(ここでいう画像生成)」→「画像の保存」(場合によっては加工処理は後回し) と基本をしっかり作ってから肉付けしないと、どこかで不具合があったときにどこがおかしいか目星がつけにくくなります。 (これも前に書きましたね。) まずここで正解を求めて「正しく動いた!」と考えるよりもとりあえず自分の考えで動かしてみてもし正しく動かなかった場合に「どこがおかしかったんだろう」→デバッグ→修正→「正しく動いた!」と過程を踏んだほうが今後システム開発をするためには重要だと思います。 実際の処理・方法については他の方が述べられているので割愛します。

fantazical
質問者

お礼

すみませんでした。 ありがとうございます。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.4

この画像はビットマップ形式(左下が(0, 0))ですかね j > nHeight / nWidth * k の領域を塗ればいいので for(j = 0; j < nHeight; j++) { for(k = 0; k < nWidth; k++) { if (j * nWidth > k * nHeight) { DllBmpSetPixelValueR(pBmpOrig, j, k, 128); DllBmpSetPixelValueG(pBmpOrig, j, k, 128); DllBmpSetPixelValueB(pBmpOrig, j, k, 128); } } } かな

fantazical
質問者

お礼

助かりました。 ありがとうございます!!!!!!!

  • 10239
  • ベストアンサー率22% (2/9)
回答No.2

左下座標(Lx, Ly)右上座標(Rx,Ry) (Rx-Lx) / (Ry-Ly)=傾きa y = axとなるので、 for文の中で if (nHeight * a > nWigth) { //色をつける }; これでどうでしょうか?

fantazical
質問者

お礼

ありがとうございます。 ぜひ試してみます。

  • ebinamori
  • ベストアンサー率21% (96/439)
回答No.1

具体的な処理がよくわからないので条件だけ。 おっしゃる通り三角関数の考えかたを利用するとできそうですね。 使うの正接(タンジェント)です。 正接は底辺分の高さですから 最初に画像全体の底辺分の高さを求めて、 あとは各ピクセルごとに正接(左下隅を原点として) y/xをして、先ほど求めた値よりも大きければ線分の上だし 小さければ輝度を変えればよい。

fantazical
質問者

お礼

本当にありがとうございます。

関連するQ&A