重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

ドットレベルで図形を描画するソースを作成しているのですが、
アンチエイリアスの計算をどのようにしたらいいのかが分かりません。
どのような感じに修正したらいいでしょうか?

// 画面に円を敷き詰めるロジック 円内部は塗りつぶす為、画面全体を走査して描画する
// windowXXX : ウィンドウのサイズ
// size : 円の直径
int white = 0xffffff;
int black = 0xffffff;
for(int y=0; y<windowHeight; y++){
 for(int x=0; x<windowWidth; x++){
  int cirX = x % size;
  int cirY = y % size;
  int sizePow = size * size;
  cirX = cirX * 2 - size;
  cirY = cirY * 2 - size;
  if((cirX*cirX+cirY*cirY) <= sizePow){
   setPixel( x, y, white );
  }else{
   setPixel( x, y, black );
  }
 }
}

A 回答 (1件)

・オーバーサンプリングを使う


(windowWidth * n) * (windowHeight * n) の配列を用意して、座標もsizeもn倍にして、配列に「描画」
→ 1/nに縮小。このときに中間色を使う。単純にはn*nの画素の平均を取る。

あるいは、配列を使わず、 X,Yを各 +0,+1/n,+2/n,..., +(n-1)/n したn*n個の座標について円内になる数を数え、その割合に合せて色を決める。
整数ではなくなるので、double,float等の実数型を使う。

・ドットを座標を中心とした1x1の正方形と考える。
4角の座標は (x-0.5,y-0.5),(x-0.5,y+0.5),(x+0.5,y-0.5),(x+0.5,y+0.5)となる。
全て円の中なら100%、そうでないなら、正方形内のうち円内になる面積比で色を計算する。
まじめにやるなら、正方形と円の交点や弧の角度等から計算。
手を抜くなら、上のオーバーサンプリングみたいに円内になる割り合いでやってもそれなりに見える。


あと、最近では処理系が賢いので、最適化により同じになる可能性があるのですが。
sizePow はループ中で変化しません。
cirYはXのループ中では変化しません。cirYが変化しないのなら、cirY*cirYも変化しません。
こういうのは、ループの外に出した方がよいです。最適化を無効にしたとき等、無駄な計算になりますから。

int sizePow = size * size;
for(int y=0; y<windowHeight; y++){
 int cirY = y % size;
 cirY = cirY * 2 - size;
 int cirYPow = cirY * cirY;
 int size_cirYPow = sizePow - cirYPow;
 for(int x=0; x<windowWidth; x++){
  int cirX = x % size;
  cirX = cirX * 2 - size;
  if(cirX*cirX <= size_cirYPow){ /* cirYPowを右辺へ移項 */

また、for( int cirY=0 ; cirY < size ;cirY ++), for( int cirX=0 ; cirX < size ;cirX ++)で円1つだけ計算して、それをx =cirX+size, cirX+size * 2 ...... (yも同様) にコピーする、という方法もあります。

それと
> int white = 0xffffff;
> int black = 0xffffff;
同じ値になっていますが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!