2017-01-19 17 views
0

コンソールアプリケーションに、指定された文字をプロットして、楕円を形にしたいと思います。コンソールアプリケーションの文字で塗りつぶされた楕円を「描く」

解決方法がわからないという問題は、角度と半径(SinとCosの関数を使用して)を知ってから文字を描画する場所がわかるだけですが、ギャップが残ることがあります。

境界線だけでなく、塗りつぶした楕円を「描画」したいので、さらに複雑です。

どうすればいいですか?

欲しい方法は次のようである:

DrawEllipse(char ch, int centerX, int centerY, int width, int height) 

ちょうど考え: Iは楕円の矩形領域内の内部ループでループを作成し、位置が内部または外部であるかどうかを決定することができます楕円の面積

+1

どのような回答が欲しいですか? Java(JavaFX)、C#? – john16384

+0

私は重要な部分はアルゴリズムだと思いますが、C#では完璧です! – SuperJMN

+0

どの楕円ですか?任意の角度に軸合わせ? (プロトタイプは軸を整列させることを提案する)。あなたはこれを円の問題に変換して、 'x * x + y * y <= r * r'を利用することができます。これは充填に理想的です。あなたの長方形の塗りつぶし/テストを行い、描画する前に楕円に戻して、rescale内のすべての点を返します。 – Spektre

答えて

1

これは妥当な近似値です。

public static void DrawEllipse(char c, int centerX, int centerY, int width, int height) 
{ 
    for(int i = 0; i < width; i++) 
    { 
     int dx = i - width/2; 
     int x = centerX + dx; 

     int h = (int) Math.Round(height * Math.Sqrt(width * width/4.0 - dx * dx)/width); 
     for(int dy = 1; dy <= h; dy++) 
     { 
      Console.SetCursorPosition(x, centerY + dy); 
      Console.Write(c); 
      Console.SetCursorPosition(x, centerY - dy); 
      Console.Write(c); 
     } 

     if(h >= 0) 
     { 
      Console.SetCursorPosition(x, centerY); 
      Console.Write(c); 
     } 
    } 
} 
1

まず、塗りつぶした円を描く方法です(80x25のコンソールウィンドウを想定しています)。他の誰かが幅と高さのパラメータを許容する数学を知っているかもしれません。

static void DrawCircle(char ch, int centerX, int centerY, int radius) 
{ 
    for(int y = 0; y < 25; y++) 
    { 
     for(int x = 0; x < 80; x++) 
     { 
      char c = ' '; 

      var dX = x - centerX; 
      var dY = y - centerY; 

      if(dX * dX + dY * dY < (radius * radius)) 
      { 
       c = ch; 
      } 

      Console.Write(c); 
     } 
    } 
} 
関連する問題