“绘制”由控制台应用程序中的字符组成的填充椭圆

时间:2017-01-19 14:10:57

标签: java c# .net algorithm drawing

我想将一个给定的角色绘制到一个控制台应用程序中,形成一个椭圆形。

我不知道如何解决的问题是,一旦我知道了角度和半径(使用Sin和Cos函数),我只知道绘制角色的位置,但是我可能会留下空白。

它更复杂,因为我想“画”一个填充的椭圆,而不仅仅是边框。

我该怎么办?

我想要的方法是这样的:

PROFILE MATCH (n:Label1)-[r1:REL1]-(a:Label2) 
WHERE a.prop1 = 2 
WITH n 
WITH COLLECT(n) AS rows 
WITH [a IN rows WHERE a.prop2 < 1484764200] AS less_than_rows, 
[b IN rows WHERE b.prop2 = 1484764200 AND b.prop3 < 2] AS other_rows 
WITH size(less_than_rows) + size(other_rows) AS count, less_than_rows, other_rows
FOREACH (sub IN less_than_rows | 
  MERGE (sub)-[r:REL2]-(:Label2) 
  DELETE r 
  MERGE(l2:Label2{id:540}) 
  MERGE (sub)-[:APPEND_TO {s:0}]->(l2) 
  SET sub.prop3=1, sub.prop2=1484764200) 
WITH DISTINCT other_rows, count 
FOREACH (sub IN other_rows | 
  MERGE(l2:Label2{id:540}) 
  MERGE (sub)-[:APPEND_TO {s:0}]->(l2) 
  SET sub.prop3=sub.prop3+1)
RETURN count

只是一个想法:我可以在椭圆的矩形区域中编写一个带有内环的循环,并确定位置是在椭圆区域的内部还是外部。

2 个答案:

答案 0 :(得分: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);
        }
    }
}

答案 1 :(得分: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 );
        }
    }
}