2010-12-07 9 views
2

ねえ。私の数学は素晴らしくないので、誰かがこれで私を助けてくれることを願っています。私はピクセルの1次元配列を持っています(2D画像を表しています)。特定のピクセルにアクセスするためには、私はこの式を使用しています:周囲のピクセルを配列で取得する

image.Pixels[row * imageWidth + col] = pixelColor; 

これは働いているが、私はまた、選択された画素の周囲の画素を含めたいです。ポインタを直接使用せずに、半径rのピクセルのグループを取得し、その値をpixelColorに設定する最も速い方法はありますか?私はペイントタイプのアプリケーションを作成しようとしていると、半径のサイズによって指示されるブラシのサイズを変更したいと思います。 ありがとうございました。私は、特にC#のを知りませんが、この君を行う必要があります

for (i=-r ; i< r ; i++) { 
    for (j=-(r - i); j<(r - i); j++) { 
     image.Pixels[(row+i)*imageWidth + (col+j)]=pixelColour; 
    } 
} 

編集上記の効果に何かが実際にダイヤモンドを塗る

+2

最も簡単な方法は、2D配列を使用することです。または、少なくとも、2D配列のようにアクセスできるようにプロパティを設定する。 –

答えて

6

、私が行うには私の最初のハックのアイデアを与えてくれましたRおよびCOL + - - R、および反転ROWおよび反転COLからの距離がrより大きくない計算

for (i=-r ; i<r ; i++) { 
    for (j=-r; j<r; j++) { 
     if((i*i + j*j)<(r*r)){ 
      image.Pixels[(row+i)*imageWidth + (col+j)]=pixelColour; 
     } 
    } 
} 
+0

あなたは実際に円ではなくダイヤモンドを描いています。しかし、それは簡単に修正することができます。 –

+0

良い点、素朴なサークルペインタで更新! – tobyodavies

3

以下適切な円は、単純な遅い方法は+行の画素の範囲をステップすることであろう。列からの距離、行は平方根(xの差の二乗+ yの差の二乗)です。

少し速い方法は、半径の2乗をyの2乗の差+ yの2乗の差と比較することです。

それでも速いBresenham's circle algorithmで、

別の記事: Bresenham's Line and Circle Algorithms

あなたが任意の行のための鞍部からの距離を持っていたら、COLからのピクセルを埋めることができます - +距離をCOLまでの距離、する必要はありませんが両方を計算する。だから、円の半分だけを計算することで逃げることができます。

関連する問題