中点円アルゴリズム

ブレゼンハム中点円アルゴリズムを用いて、半径23の円をラスタライズします。緑色の部分のみが八分儀が実際に計算されると、単純に 8 回反転されて他の 7 つの八分儀が形成されます。
ブレゼンハムアルゴリズムによって描かれた半径23の円

コンピュータグラフィックスにおいて中点円アルゴリズムは、円ラスタライズするために必要な点を決定するために使用されるアルゴリズムです。これは、ブレゼンハムの直線アルゴリズムの一般化です。このアルゴリズムは、円錐曲線にもさらに一般化できます[1] [2] [3]

要約

このアルゴリズムは、各基本方向(0°、90°、180°、270°)から始めて、両方向に45°の最も近い倍数(45°、135°、225°、315°)まで、8つの八分円を同時に描画します。y = x のとき、45°に達しているため、停止位置を決定できます。これらの角度を使用する理由は上の図に示されています。x増加すると、 45°に達するまでxの値をスキップしたり繰り返したりすることはありません。したがって、 whileループ中、xは各反復で1ずつ増加し、yは時々1ずつ減少しますが、1回の反復で1を超えることはありません。これは45°で変化します。これは、接線がrise = runとなる点だからです。一方、rise > run before、rise < run afterです

問題の 2 番目の部分である行列式は、はるかに扱いにくいです。これは、yをいつ減分するかを決定します。最初のピクセルで半径を下回ることはないため、通常は各反復でピクセルを描画した後に行われます。連続関数では、球の関数は、半径がz (または 3 番目の変数) に依存する円の関数であるため、離散 (ボクセル) 球のアルゴリズムでも中点円アルゴリズムを使用するのは当然です。ただし、球を見ると、隣接する円の整数半径は同じですが、同じ半球内にまったく同じ円が隣接することは想定されていません。代わりに、同じ半径の円には、曲線が中心に少し近づいたり、さらに外側に広がったりできるように、異なる行列式が必要です。

アルゴリズム

このアルゴリズムの目的は円を近似することです。より正式には、ピクセルを使用して曲線を近似することです。簡単に言えば、円の定義と同様に、すべてのピクセルは中心からほぼ同じ距離にある必要があります。各ステップで、を満たすが最大化する隣接ピクセルを選択することで、経路が延長されます。候補ピクセルは隣接しているため、後者の式を計算する演算は簡略化され、ビットシフトと加算のみが必要です。しかし、ビットシフトを理解するために簡略化を行うことができます。2進数の左ビットシフトは2を掛けることと同じであることを覚えておいてください。したがって、半径の左ビットシフトは、半径の2倍として定義される直径のみを生成します

このアルゴリズムは円の方程式から始まります。簡単のため、円の中心は にあると仮定します。まず、第一八分円のみを考え、点 から反時計回りに進み、角度 45° に達する曲線を描きます。

ここでの速い方向値の増加が大きい基底ベクトル)は方向です(三角関数の微分を参照)。アルゴリズムは常に正の方向(上方向)にステップを踏み、時折、遅い方向(負の方向)にステップを踏みます

円方程式から変換された方程式 が得られます。ここで、は初期化中に 1 回だけ計算されます。

円上の点を、点へのベクトルの座標列(通常の基底)とします。点は描画順に番号が付けられ、最初の点には が割り当てられます

各点について、次のことが当てはまります。

これを次のように並べ替えることができます。

次の点についても同様です。

最初の八分円では、次の点は常に最後の点より少なくとも 1 ピクセル高くなります (ただし、連続性を維持するために最大でも 1 ピクセル高くなります)。したがって、次の式は成り立ちます。

したがって、次の式を代入して次の点の式を再帰的に書き直します

円の連続性と両軸の最大値が同じであることから、数列を進むにつれてx点が飛ばされることは明らかにありません。通常は同じx座標に留まりますが、時には左に1つ進むこともあります。

得られた座標は、中点座標を加算することで変換されます。これらの頻繁な整数加算は、平方根計算を内側のループで省略できるため、パフォーマンスに大きな影響を及ぼしません。ここでも、変換された円周方程式のゼロは誤差項に置き換えられます。

誤差項の初期化は、開始時の1/2ピクセルのオフセットから導出されます。垂直線との交点まで、誤差項には累積値が生じるため、この値が初期化に使用されます。

円方程式、三角関数の式、平方根における頻繁な平方の計算は、すべてを単一のステップに分解し、前​​の反復からの二次項の再帰計算を使用することによって、再び回避できます。

整数ベースの演算を持つバリアント

ブレゼンハムの直線アルゴリズムと同様に、このアルゴリズムは整数ベースの計算に最適化できます。対称性のため、1つの八分円のピクセルのみを計算するアルゴリズムが見つかれば、それらのピクセルを反転させて円全体を求めることができます。

まず、半径誤差を、円の正確な表現と各ピクセルの中心点(または、すべてのピクセルで一貫している限り、ピクセル上の任意の数学的点)との差として定義します。 を中心とする任意のピクセルについて、半径誤差は次のように定義されます。

分かりやすくするために、この円の式は原点を基準に導出されていますが、このアルゴリズムは任意の位置に適用できます。X軸の正方向の点から始めるのが便利です。半径は整数ピクセルとなるため、半径誤差は明らかにゼロになります。

最初の反時計回りの正の八分円から始まるため、移動量が最大となる方向、つまりY方向に進みます。したがって、 であることは明らかです。また、この八分円のみに関係するため、X値には、前の反復と同じままにするか、1ずつ減少するかの2つの選択肢しかありません。次の条件が満たされるかどうかを判断する決定変数を作成できます。

この不等式が成り立つ場合は をプロットし、成り立たない場合は をプロットします。では、この不等式が成り立つかどうかをどのように判断するのでしょうか?まず、半径誤差の定義から始めましょう。

絶対値関数は役に立ちません。平方は常に正なので、両辺を平方します。

x > 0なので、 の項となるので、割ると次のようになります。

したがって、決定基準は浮動小数点演算から、単純な整数加算、減算、およびビットシフト(2倍演算の場合)に変わります。の場合、xの値を減算します。⁠の場合、 xの値はそのままです。繰り返しますが、これらの点をすべての八分円で反射させることで、完全な円が得られます。

この決定式の値と、前のステップでの値との差分を計算するだけで計算量を削減できます。まず、 ⁠を(式の初期値)として代入します。その後は、各ステップで ⁠ ⁠ が成立する場合は(そして X を減算)し成立ない場合は⁠ (そしてY を通常通り増分)します。

ジェスコ法

アルゴリズムについてはすでに大部分説明されていますが、さらなる最適化が行われます

新たに提案された手法[4]は、1ステップ(8ピクセル)あたりわずか5回の算術演算で済むため、低性能システムに最適です。「if」演算では、符号(正か負か)のみがチェックされ、変数への代入も行われますが、これも算術演算とはみなされません。1行目の初期化(4ビット右シフト)は見た目上の都合であり、実際には不要です。

したがって、メインループ内では可算な演算が実行されます。

  1. 比較 x >= y (減算としてカウントされます: x - y >= 0)
  2. y=y+1 [y++]
  3. t1 + y
  4. t1 - x
    t2 >= 0 の比較は、実数演算が行われないためカウントされません。変数の2の補数表現では、符号ビットのみをチェックする必要があります。
  5. x=x-1 [x--]

演算: 5

t1 = r / 16 x = r y = 0 x < yになるまで繰り返す  ピクセル(x, y)とすべての対称ピクセルが色付けされる(8回) y = y + 1 t1 = t1 + y  t2 = t1 - x  t2 >= 0 の 場合 t1 = t2 x = x - 1 

不完全な八分円の描画

上記の実装では、常に完全な八分円または円のみが描画されます。角度から角度までの特定の円弧のみを描画するには、アルゴリズムはまずこれらの端点の座標と座標を計算する必要があり、三角関数または平方根の計算に頼る必要があります(平方根の計算方法を参照)。次に、ブレゼンハムアルゴリズムを完全な八分円または円に対して実行し、必要な間隔内にあるピクセルのみを設定します。この円弧を描画した後、アルゴリズムを途中で終了することができます

角度が傾きとして与えられている場合は、三角法や平方根は必要ありません。が目的の傾きの間であることを確認するだけです。

一般化

同じ概念を使って、放物線楕円、その他の2次元曲線をラスタライズすることも可能です。[5]

参考文献

  1. ^ ドナルド・ハーン、M・ポーリン・ベイカー(1994年)。コンピュータグラフィックス。プレンティス・ホール。ISBN 978-0-13-161530-4
  2. ^ Pitteway, MLV, 「デジタルプロッタによる楕円または双曲線の描画アルゴリズム」、Computer J.、10(3) 1967年11月、282~289ページ
  3. ^ Van Aken, JR、「効率的な楕円描画アルゴリズム」、CG&A、4(9)、1984年9月、24~35ページ
  4. ^ このアルゴリズムの公開履歴については、https://schwarzers.com/algorithms を参照してください。
  5. ^ Zingl, Alois (2014年12月). 「Bresenhamアルゴリズムの美しさ:直線、円、楕円、ベジェ曲線をプロットするためのシンプルな実装」easy.Filter . Alois Zingl . 2017年2月16日閲覧
  • 円の描き方 - シンプルな図から効率的な図まで、円の描き方に関する記事
  • いくつかのプログラミング言語における中点円アルゴリズム
Retrieved from "https://en.wikipedia.org/w/index.php?title=Midpoint_circle_algorithm&oldid=1320089937"