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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ガラくた屋

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

#1

投稿記事 by ガラくた屋 » 10年前

始めましてよろしくお願いします。
グラデーションの計算まではだいたいわかったつもりですが
始点と終点のカラーが表示したい色と別のものになってしまうのです。
あと始点と終点の情報を逆にしても色が違っているので見てもらえないでしょうか
環境は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;
	 }


  }

 
 

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

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

#2

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

浮動小数点の計算は誤差が出ることがあります。
足し算で色を変化させるのではなく、一回ずつ内分の計算

コード:

cd = (double)c0 + (double)(c1-c0) * (double)(x-x0)/(double)(x1-x0);
を行ってみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ガラくた屋

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

#3

投稿記事 by ガラくた屋 » 10年前

アドバイスありがとうございます
変更後と結果そのものはこんな感じでした
始点の色の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;


	 }
 

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

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

#4

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

ガラくた屋 さんが書きました:アドバイスありがとうございます
変更後と結果そのものはこんな感じでした
始点の色の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 ;


	 }
 
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ガラくた屋

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

#5

投稿記事 by ガラくた屋 » 10年前

ありがとうございます。
-1入れるだけでいいんですね
実際にやってみて成功しました。
またわからなくなったら掲示板使わせてもらいますね
その時はよろしくお願いします。

閉鎖

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