2012-01-17 13 views
-1

ここで誰かが擬似コードで助けてくれるのであれば、少なくともアンチエイリアスなしで円の線分を描く方法については正しい方向に向いていますか?円の部分を描く

答えて

1

円上の点のための式は、次のとおり

xcenterycenterは、円の中心である
x = xcenter + radius * sin(theta) 
y = ycenter + radius * cos(theta) 

radiusは半径であり、theta角度です。

あなたは、単に十分に小さなステップであなたの終了角度にご出発の角度からthetaを反復し、プロットするxy値を抽出し、ほとんどの三角関数はラジアンとしてその引数を取ることを念頭に維持する必要があります(0 (0〜360)ではなく、2 * PIを使用してください) - 開始角度と終了角度を調整してthetaステップを考慮してください。

擬似コードは、以下のようなものになるだろう

:あなたはおそらく0と2 * PIの間になるように角度を正規化し、その後場合、開始と終了の角度を交換したいと思いますが、

def plotCirle (xc, yc, rad, start, end): 
    theta = start 
    while theta <= end: 
     x = xc + rad * sin (theta) 
     y = yc + rad * cos (theta) 
     plot (x, y) 
     theta = theta + 0.01 

前者は後者よりも大きい。

より効率的なコードが必要な場合は、midpoint circle algorithmをご覧ください。数学は重く、セグメントを必要とするという要件(角度を知る必要があることを意味しますが、このアルゴリズムには通常は必要ではないもの)がほんの少しだけ複雑であるという要件によっては少し複雑ですが、上の単純化アルゴリズムは十分に速くはありません。

+0

ありがとうございました。しかし、このアルゴリズムの整数計算だけのバージョンはありますか? – Mattivc

+0

必要に応じて整数で作業できますが、標準trig関数では浮動小数点値が必要です。私はスケールアップされた値(0-360は0-3600になります)と値のルックアップテーブルを使用する前に整数trig関数を構築しましたが、これらの関数が時間的にはるかに高価だった私の昔の埋め込み空間でした。より効率的な円描画アルゴリズム(bresenhamまたはmidpoint circleを調べる)がありますが、答えに快適に収まるよりも多くの計算が必要です。 – paxdiablo

+0

'plot(int(x)、int(y))' –

0

整数専用の円描画については、wikipediaのmidpoint circle algorithmの記事を参照してください。これは、コードと共に、Bresenhamの線アルゴリズムの一種の円 - 変形を提示する。中点円アルゴリズム、Bresenhamの円アルゴリズム、および最適化された第3の方法の(コード付きの)比較については、codecircleを参照してください。

0
Result.X := Round(fCenter.X + cos(Angle/180*pi)* Radius); 
Result.Y := Round(fCenter.Y + sin(Angle/180*pi)* Radius); 
+0

これがどのように質問に答えるかを説明してください。 –