2016-10-31 11 views
2

私は楕円を描くC++の関数を持っています。今度は、その楕円に塗りつぶしオプションを追加したいと思います。それ、どうやったら出来るの?私はflood fillアルゴリズムを使ってみましたが、サーフェスに既に絵が含まれていると正しく動作しません。楕円形の塗り方は?

がここに私の現在のアルゴリズムである:

const double TwoPI = (PI * 2); 
const double Step = (PI/180.0f); 

for(double i = 0; i < TwoPI; i += Step) 
{ 
    float x_offset = (radiusX * cos((float) i)); 
    float y_offset = (radiusY * sin((float) i)); 

    int x = int(a_X + x_offset); 
    int y = int(a_Y + y_offset); 

    if(prevX == -1 && prevY == -1) 
     Plot(x, y, color); 
    else 
     Line(prevX, prevY, x, y, color); 
} 
+2

どのライブラリを使用していますか? 'C++ 'には標準で定義されているグラフィックスライブラリはありません。あなたはOpenGLなどを指していますか? – CoryKramer

+0

なぜあなたはそれを描画するように記入していませんか? – stark

+1

@CoryKramer:アルゴリズムの質問については、それはかなり無関係です。明らかに、実際のグラフィックライブラリでは、答えは "提供された' DrawEllipse'関数を使用しますが、それは既に非塗りつぶし楕円の答えだったでしょう。 – MSalters

答えて

3

さて、あるアイデアは、ちょうど半分の円を横切る、その代わりに対称即ちy軸の周りに配置されている点を計算することができました。次に、それらの間に水平線を引いて、すべてのピクセルを塗りつぶします。

+0

'Line()'関数を直接使用する代わりに、すべてを計算するために使用します1つの軸上の2点間のピクセル? – Z0q

+0

@Zoq:いいえ、アイデアはあなたがラインを使用することですが、(-X、Y)から(X、Y)までラインを描きます。すべての行に別の色を使用すると、横縞のパターンが表示されます。 (しかし、あなたの_fixed angle_ステップサイズでは、これらの行の多くは重なり合うでしょう。あなたは_fixed vertical_ stepを取る方が良いでしょう) – MSalters

+0

私は理解します。楕円が小さいときは重なりがありますが、楕円が大きいときは奥が遠くなります – Z0q

0

あなたは両方の方向に移動し、このような 何かエッジにエッジからのラインをドラウ:私はit.Itが満たされた円を描くことになってちょうどidea.Itsだ実行しようとしませんでした を。

const double TwoPI = (PI * 2); 
const double Step = (PI/180.0f); 
double start=0; 
for(double i = 0; i < TwoPI; i += Step) 
{ 
    float x_offset = (radiusX * cos((float)start+ i)); 
    float y_offset = (radiusY * sin((float) start+i)); 

    float x2_offset = (radiusX * cos((float)start - i)); 


    int x = int(a_X + x_offset); 
    int x2 = int(a_X + x_offset); 
    int y = int(a_Y + y_offset); 


    Line(x, y, x2, y, color); 
} 
関連する問題