dotnet 在 WPF 里显示数学 π 的颜色

2021-08-31 11:09:45 浏览数 (1)

有逗比小伙伴问我,数学的 π 视觉效果是啥。于是我就来写一个逗比的应用将 π 的颜色在 WPF 应用画出来。原理就是读取 π 的小数点后的数值,然后使用逗比算法转换为 RGB 颜色像素,接着将这些像素转换为一张图片

以下就是我用程序生成的 π 图片

我先从某个有趣的地方随便找到了 π 小数点之后很长的数值,接下来将这个数值存放作为字符串,再对这个字符串执行如下算法

  1. 读取两个 0-9 的字符
  2. 将此两个字符拼接为两位数的数值
  3. 将这些数值放在一个列表

此时就可以获取这个列表的内容

如以下代码,下面代码的 NumberText.PI 就是一个 π 的字符串

代码语言:javascript复制
        private static List<int> StringNumberToList()
        {
            var stringReader = new StringReader(NumberText.PI);
            stringReader.Read();
            stringReader.Read();

            var list = new List<int>();
            while (true)
            {
                var height = ReadNumber(stringReader);
                if (height < 0)
                {
                    break;
                }

                var low = ReadNumber(stringReader);
                if (low < 0)
                {
                    break;
                }

                var number = height * 10   low;
                list.Add(number);
            }

            return list;
        }

        private static int ReadNumber(StringReader reader)
        {
            while (true)
            {
                var text = reader.Read();
                if (text == -1)
                {
                    return -1;
                }

                var c = (char)text;

                var n = c - '0';
                if (n is >= 0 and <= 9)
                {
                    return n;
                }
            }
        }

接下来通过 WriteableBitmap 将上面生成的数值列表转换为 RGB 像素写入到图片,算法如下

  1. 按照顺序遍历数值列表
  2. 按照 BGR 的顺序填充像素的数值
  3. 像素每个数值计算方法是按照 0-100 的比例对应 0-255 的比例拉伸

代码如下

代码语言:javascript复制
        private static unsafe WriteableBitmap ToBitmap(List<int> list, double width, double height)
        {
            var writeableBitmap = new WriteableBitmap((int)width, (int)height, 96, 96, PixelFormats.Bgra32, null);

            writeableBitmap.Lock();

            var backBuffer = (byte*)writeableBitmap.BackBuffer;
            var length = writeableBitmap.PixelWidth * writeableBitmap.PixelHeight *
                writeableBitmap.Format.BitsPerPixel / 8;
            for (int i = 0, j = 0; i   4 < length && j   3 < list.Count; i = i   4, j  = 3)
            {
                var blue = backBuffer[i];
                var green = backBuffer[i   1];
                var red = backBuffer[i   2];
                var alpha = backBuffer[i   3];

                blue = (byte)Math.Round(list[j   2] / 100.0 * byte.MaxValue);
                green = (byte)Math.Round(list[j   1] / 100.0 * byte.MaxValue);
                red = (byte)Math.Round(list[j   0] / 100.0 * byte.MaxValue);
                alpha = 0xFF;

                backBuffer[i] = blue;
                backBuffer[i   1] = green;
                backBuffer[i   2] = red;
                backBuffer[i   3] = alpha;
            }

            writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, writeableBitmap.PixelWidth, writeableBitmap.PixelHeight));
            writeableBitmap.Unlock();
            return writeableBitmap;
        }

通过上面代码就可以拿到 π 的图片,将此图片在界面显示就可以看到效果

当然了,除了以上算法之外,还有其他很多有趣的方法,欢迎大家乱写

本文所有代码放在 github 和 gitee 欢迎访问

可以通过如下方式获取本文的源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码

代码语言:javascript复制
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 747c17ef199dddf7f13f8cae7ffc9aefc9d117ad

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源

代码语言:javascript复制
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git

获取代码之后,进入 KohaykowurchemJaibuqajijiyeco 文件夹


本文会经常更新,请阅读原文: https://blog.lindexi.com/post/dotnet-在-WPF-里显示数学-π-的颜色.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者前往 CSDN 关注我的主页

0 人点赞