ページ 11

線へのグラデーションについて

Posted: 2014年11月18日(火) 12:01
by ガラくた屋
始めましてよろしくお願いします。
グラデーションの計算まではだいたいわかったつもりですが
始点と終点のカラーが表示したい色と別のものになってしまうのです。
あと始点と終点の情報を逆にしても色が違っているので見てもらえないでしょうか
環境はVC++2010でコマンドプロンプトでやってます

コード:

  void line_3(int x0,int  y0, int c0, int  x1,int  y1,int c1,  Ps * bb)
 {
	 int  color_d = 0;//カラー情報用
	 double cd = 0;//カラー計算用

	

	 //1回のカラー増加量を計算
	 double date =  (double) (c1 - c0) /(double)(x1 - x0);
	
	
	 cd = (double) c0;
	 for(int x = x0; x < x1 ; x++)
	 {
		//バックバッファに入力
        	color_d = (int)floor(cd);	
		    bb->back_buffer[x][y0] = 'B';
			bb->bb_color[x][y0] = color_d ;
			//次のカラーの計算
			cd += date;
	 }


  }

 
 

Re: 線へのグラデーションについて

Posted: 2014年11月18日(火) 21:39
by みけCAT
浮動小数点の計算は誤差が出ることがあります。
足し算で色を変化させるのではなく、一回ずつ内分の計算

コード:

cd = (double)c0 + (double)(c1-c0) * (double)(x-x0)/(double)(x1-x0);
を行ってみてください。

Re: 線へのグラデーションについて

Posted: 2014年11月18日(火) 22:22
by ガラくた屋
アドバイスありがとうございます
変更後と結果そのものはこんな感じでした
始点の色の0と終点の10が
逆にしてもどちらか片方にしか状態になってます
私の計算自体が間違っているのでしょうか?
line_3(0,0, 0, 0,10,10, &bb)
色の出力0123456789
line_3(0,0, 10, 0,10,0, &bb)
色の出力10987654321

コード:


	// cd = (double) c0;
	 for(int x = x0 ; x < x1 ; x++)
	 {
		//バックバッファに入力
		 	cd = (double)c0 + (double)(c1-c0) * (double)(x-x0 )/(double)(x1-x0);
        	color_d = (int)floor(cd);	
		    bb->back_buffer[x][y0] = 'B';
			bb->bb_color[x][y0] = color_d ;
			//次のカラーの計算
			//cd += date;
		
			//cd = (double)c0 + ((double)(c1-c0) /(double)(x1-x0)) * x;


	 }
 

Re: 線へのグラデーションについて

Posted: 2014年11月18日(火) 22:26
by みけCAT
ガラくた屋 さんが書きました:アドバイスありがとうございます
変更後と結果そのものはこんな感じでした
始点の色の0と終点の10が
逆にしてもどちらか片方にしか状態になってます
私の計算自体が間違っているのでしょうか?
申し訳ありません。
値域がx1を含まないことを見落としていました。
x1ではなく、x1-1を終点にしてください。

コード:


	// cd = (double) c0;
	 for(int x = x0 ; x < x1 ; x++)
	 {
		//バックバッファに入力
		 	cd = (double)c0 + (double)(c1-c0) * (double)(x-x0 )/(double)(x1-1-x0);
        	color_d = (int)floor(cd);	
		    bb->back_buffer[x][y0] = 'B';
			bb->bb_color[x][y0] = color_d ;


	 }
 

Re: 線へのグラデーションについて

Posted: 2014年11月18日(火) 22:52
by ガラくた屋
ありがとうございます。
-1入れるだけでいいんですね
実際にやってみて成功しました。
またわからなくなったら掲示板使わせてもらいますね
その時はよろしくお願いします。