トップページ > 過去ログ > 記事閲覧
DrawCircleGaugeについて
名前:Aquid 日時: 2010/06/19 13:47

現状のDrawCircleGaugeは、上から時計回りに増やす使い方しかできませんが、 これを任意の場所から、任意の方向に増やすことが出来るようにできませんでしょうか? DrawCircleGaugeを使わずに、以下のような処理で似たような事を再現しようとしたのですが、 表示ががたついてしまい、どこが致命的に悪いのかがわかりませんでした。 // paramに負を与えると反対方向、sangleが開始角。 void DrawMyCircleGauge(const int x,const int y,const int handle,const float param,const float sangle){ //パラメータを取得 float useparam=fabs(param)/25.0f; int rev=(param>0.0)*2-1; //長さを取得 int SX,SY; GetGraphSize(handle,&SX,&SY); //4つに分ける for(int i=0;i<4;++i){ //使用する角度分 float ang=useparam; if(ang>1.0f)ang=1.0f; //使用した分だけ消費 useparam-=ang; //宣言 VERTEX vec[3]; //位置を指定 vec[0].x=x+sinf(sangle +(i+ 0)*0.5f*PHI_F*rev)*SX; vec[0].y=y+cosf(sangle +(i+ 0)*0.5f*PHI_F*rev)*SY; vec[1].x=x+sinf(sangle +(i+ang)*0.5f*PHI_F*rev)*SX; vec[1].y=y+cosf(sangle +(i+ang)*0.5f*PHI_F*rev)*SY; vec[2].x=(float)x; vec[2].y=(float)y; //色は暫定 for(int j=0;j<3;++j){ vec[j].a=255; vec[j].r=255; vec[j].g=255; vec[j].b=255; } //テクスチャ座標 vec[0].u=sinf(sangle +(i+ 0)*0.5f*PHI_F*rev)*1.0f+0.5f; vec[0].v=cosf(sangle +(i+ 0)*0.5f*PHI_F*rev)*1.0f+0.5f; vec[1].u=sinf(sangle +(i+ang)*0.5f*PHI_F*rev)*1.0f+0.5f; vec[1].v=cosf(sangle +(i+ang)*0.5f*PHI_F*rev)*1.0f+0.5f; vec[2].u=0.5f; vec[2].v=0.5f; //描画 DrawPolygon(vec,3,handle,TRUE,FALSE); //角度を消費しきってたら中断 if(useparam<=0.0f)break; } }

Page: 1 |

Re: DrawCircleGaugeについて ( No.1 )
名前:管理人 日時:2010/06/21 01:17

DrawMyCircleGauge にちょっと処理を追加すれば完成です こちらの座標計算全てに -0.5f を追加してみてください //位置を指定 vec[0].x=x+sinf(sangle +(i+ 0)*0.5f*PHI_F*rev)*SX; vec[0].y=y+cosf(sangle +(i+ 0)*0.5f*PHI_F*rev)*SY; vec[1].x=x+sinf(sangle +(i+ang)*0.5f*PHI_F*rev)*SX; vec[1].y=y+cosf(sangle +(i+ang)*0.5f*PHI_F*rev)*SY; vec[2].x=(float)x; vec[2].y=(float)y; ↓ //位置を指定 vec[0].x=x+sinf(sangle +(i+ 0)*0.5f*PHI_F*rev)*SX-0.5f; vec[0].y=y+cosf(sangle +(i+ 0)*0.5f*PHI_F*rev)*SY-0.5f; vec[1].x=x+sinf(sangle +(i+ang)*0.5f*PHI_F*rev)*SX-0.5f; vec[1].y=y+cosf(sangle +(i+ang)*0.5f*PHI_F*rev)*SY-0.5f; vec[2].x=(float)x-0.5f; vec[2].y=(float)y-0.5f; 恐らく安定すると思います( 私の手元の環境では安定しました ) Direct3D の仕様で、頂点座標が 0.0f や 1.0f など小数点以下の値が0に近ければ近いほど テクスチャの何処のドットを画面に書き込むかが不安定になるというものがあります << Direct3D の最近点サンプリングの説明 >> http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1821 描画する面積がテクスチャサイズと等倍であればあるほど不安定になりますので ( 因みに DrawCircleGauge も DrawGraph も描画座標をx,y共に -0.5f してから描画しています ) よろしければお試し下さい m(_ _)m あ、Aquidさんには DrawMyCircleGauge があるのでもう関係ありませんが、DrawCircleGauge 関数は あまりにも用途が限定されていてDXライブラリ内部の関数として追加したのをちょっと後悔している ので、機能追加の予定はありません (・・;
Re: DrawCircleGaugeについて ( No.2 )
名前:Aquid 日時:2010/06/25 04:31

無事手元の環境でもガタガタにならずに描画できるようになりました。 ありがとうございました。

Page: 1 |