2016-04-27 4 views
0

bresenham/midpointアルゴリズムを使って塗りつぶし円を作成するには2通りの方法があります。 しかし、2番目の方法は最初の方法よりもはるかに優れています。Bresenham/midpoint circleアルゴリズムを少し変更してより良い結果が得られます

bresenham/midpoint

私は2番目の1のように、しかし、最初 1の方法で結果を作成したいです。私は、現時点ではこれ一つで距離を計算するための正しい式を必要とするので、私は最初の方法でそれをしたい:

function calcDistance (pos,pos2,range){ 
    var x1 = pos.hasOwnProperty('x') ? pos.x : pos[0], 
     y1 = pos.hasOwnProperty('y') ? pos.y : pos[1], 
     x2 = pos2.hasOwnProperty('x') ? pos2.x : pos2[0], 
     y2 = pos2.hasOwnProperty('y') ? pos2.y : pos2[1]; 
    return Math.pow((x1-x2),2) + Math.pow((y1-y2),2) - Math.pow(range, 2) 
}; 

ここjsfiddleです。

EDIT:最初のアプローチは、代わりに距離が<= 0ときの距離が<= radius*radius*zoomとき、点を描画する描画点のhere

+0

あなたの質問は? –

+0

@BrentWashburne私は第2のアプローチのような結果を作りたいと思いますが、最初のアプローチがあります。 – InsOp

+0

あなたの 'calcDistance'関数は円を描くことと何が関係していますか?どちらのアプローチでも言及されていません。 –

答えて

1

からwikipedia秒から採取した(8.0/radius)

function drawCircle(x0, y0, radius){ 
    var range = radius*radius*zoom*(8.0/radius); // calculate the range once 
    for(var x = 0; x < imageWidth/zoom; x++){ 
    for(var y = 0; y < imageHeight/zoom; y++){ 
     if(calcDistance([x0,y0],[x*zoom,y*zoom],radius*zoom) <= range){ 
     context.fillRect(x*zoom,y*zoom,zoom,zoom); 
     } 
    } 
    } 
} 
のスケーリングファクタを適用
+0

ありがとうございますが、ソリューションは数回の半径でしか動作しません。 f.e. 2-6は動作しませんが、9,11と同じではありません。 – InsOp

+0

これは半径1〜9に対応しました。 –

+0

ありがとう、しかし、私はすべての可能な半径のために、少なくとも1-30のためにそれを必要としています – InsOp

関連する問題