c# – 控制台图表

我需要一种绘制字典< int,int>进入控制台应用程序
Dictionary<int,int> chartList = new Dictionary<int,int>()
{
        {50,31},// x = 50,y = 31
        {71,87},{25,66},{94,15},{33,94}
};
DrawChart(chartList);

应该会产生类似的东西

我来了这么远,但我被困在IsHit方法,它决定了当前的坐标是否应该设置一个点.有人可以帮我吗?它始终是真的.

public static void DrawChart(Dictionary<int,int> dict)
{
    int consoleWidth = 78;
    int consoleHeight = 20;

    Console.WriteLine(dict.Max(x => x.Key).ToString());

    Func<int,int,bool> IsHit = (hx,hy) => dict.Any(dct => dct.Key / dict.Max(x => x.Key) == hx / dict.Max(x => x.Key) && dct.Value / dict.Max(x => x.Value) == hy / dict.Max(x => x.Value));

    for (int i = 0; i < consoleHeight; i++)
    {
        Console.Write(i == 0 ? '┌' : '│');
        for (int j = 0; j < consoleWidth; j++)
        {
            int actualheight = i * 2;

            if (IsHit(j,actualheight) && IsHit(j,actualheight + 1))
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.BackgroundColor = ConsoleColor.Black;
                Console.Write('█');
            }
            else if (IsHit(j,actualheight))
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.BackgroundColor = ConsoleColor.Black;
                Console.Write('▀');
            }
            else if (IsHit(j,actualheight + 1))
            {
                Console.ForegroundColor = ConsoleColor.Black;
                Console.BackgroundColor = ConsoleColor.Red;
                Console.Write('▀');
            }
        }
        Console.ResetColor();
        Console.WriteLine();
    }
    Console.WriteLine('└' + new string('─',(consoleWidth / 2) - 1) + '┴' + new string('─',(consoleWidth / 2) - 1) + '┘');
    Console.Write((dict.Min(x => x.Key) + "/" + dict.Min(x => x.Value)).padright(consoleWidth / 3));
    Console.Write((dict.Max(x => x.Value) / 2).ToString().PadLeft(consoleWidth / 3 / 2).padright(consoleWidth / 3));
    Console.WriteLine(dict.Max(x => x.Value).ToString().PadLeft(consoleWidth / 3));
}

解决方法

下面的代码应该给你一些想法.
首先需要介绍一个Point,因为使用Dictionary,它的Key和Value属性而不是正常的名字,如X和Y是一个噩梦.此外,在字典中,您不能存储具有相同X坐标的多个点,这没有任何意义.
public struct Point {
    public Point(int x,int y) {
       this.X = x;
        this.Y = y;
    }

    public int X { get; }
    public int Y { get; }
}

然后有点修改DrawChart:

public static void DrawChart(List<Point> dict)
    {
        int consoleWidth = 78;
        int consoleHeight = 20;
        int actualConsoleHeight = consoleHeight * 2;
        var minX = dict.Min(c => c.X);
        var minY = dict.Min(c => c.Y);            
        var maxX = dict.Max(c => c.X);
        var maxY = dict.Max(c => c.Y);

        Console.WriteLine(maxX);
        // normalize points to new coordinates
        var normalized = dict.
            Select(c => new Point(c.X - minX,c.Y - minY)).
            Select(c => new Point((int)Math.Round((float) (c.X) / (maxX - minX) * (consoleWidth - 1)),(int)Math.Round((float) (c.Y) / (maxY - minY) * (actualConsoleHeight - 1)))).ToArray();
        Func<int,hy) => {
            return normalized.Any(c => c.X == hx && c.Y == hy);
        };

        for (int y = actualConsoleHeight - 1; y > 0; y -= 2)
        {
            Console.Write(y == actualConsoleHeight - 1 ? '┌' : '│');
            for (int x = 0; x < consoleWidth; x++)
            {
                bool hitTop = IsHit(x,y);
                bool hitBottom = IsHit(x,y - 1);                    
                if (hitBottom && hitTop)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.BackgroundColor = ConsoleColor.Black;
                    Console.Write('█');
                }
                else if (hitTop)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.BackgroundColor = ConsoleColor.Black;
                    Console.Write('▀');
                }
                else if (hitBottom)
                {
                    Console.ForegroundColor = ConsoleColor.Black;
                    Console.BackgroundColor = ConsoleColor.Red;
                    Console.Write('▀');
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Black;
                    Console.BackgroundColor = ConsoleColor.Black;
                    Console.Write('▀');
                }                    
            }                
            Console.ResetColor();
            Console.WriteLine();
        }
        Console.WriteLine('└' + new string('─',(consoleWidth / 2) - 1) + '┘');
        Console.Write((dict.Min(x => x.X) + "/" + dict.Min(x => x.Y)).padright(consoleWidth / 3));
        Console.Write((dict.Max(x => x.Y) / 2).ToString().PadLeft(consoleWidth / 3 / 2).padright(consoleWidth / 3));
        Console.WriteLine(dict.Max(x => x.Y).ToString().PadLeft(consoleWidth / 3));
    }

使用方法

static void Main(string[] args) {
    var chartList = new List<Point> {
        new Point(50,31),y = 31
        new Point(71,87),new Point(71,89),new Point(25,66),new Point(94,15),new Point(33,94)
    };
    DrawChart(chartList);
    Console.ReadKey();
}

结果:

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...