web-dev-qa-db-ja.com

境界ボックスから楕円を描画しますか?

バウンディングボックスから楕円を描くための優れたアルゴリズムを知っている人はいますか?

draw_ellipse(int s1, int s2, int s3, int s4, color c); 

理解できない、読めない効率に最適化されたものは必要ありません。単純な描画APIを使用するのに十分なだけの何か。アルゴリズムをすべてのプログラミング言語または疑似コードで回答に含めることができますが、C++またはC++に似た構文を使用する場合はそれを使用します。

3

パラメトリック極方程式を使用して楕円を描くための、非常に基本的で完全にテストされていない疑似コードを以下に示します。

Function draw_ellipse(int X1, int Y1, int X2, int Y2)
     RX = (X2 - X1) / 2
     RY = (Y2 - Y1) / 2
     CX = (X2 + X1) / 2
     CY = (Y2 + Y1) / 2

     for Angle = 0 to 360
          X = CX + cos(Angle) * RX
          Y = CY + sin(Angle) * RY

          if (Angle > 0) DrawLine(LastX, LastY, X, Y)

          LastX = X
          LastY = Y
     Next Angle
End Function

注意/コメント:

  • 回転していない楕円を想定しています。
  • 言語cos/sinがラジアン単位の角度を取る場合(C/C +のように)、ラジアン(0から2 pi)に変更します。
  • 対称性を使用して、ループサイズを0〜90度に縮小できます。
  • 必要に応じて、ループステップ量(図のように1度)を変更して、描画精度を変更します。
7
uesp

通常、中心点、半長径、半短径、および回転角度で楕円を定義しました。

あなたが説明したのは、中心点を決定する必要があり、回転されない楕円です。円のグラフィックスで最も広く使用されているアルゴリズムは、Bresenhamによるものです Kennedy 楕円に適合させました。

2
mhoran_psprep