-
dotnet 在 WPF 里显示数学 π 的颜色
有逗比小伙伴问我,数学的 π 视觉效果是啥。于是我就来写一个逗比的应用将 π 的颜色在 WPF 应用画出来。原理就是读取 π 的小数点后的数值,然后使用逗比算法转换为 RGB 颜色像素,接着将这些像素转换为一张图片
以下就是我用程序生成的 π 图片
我先从某个有趣的地方随便找到了 π 小数点之后很长的数值,接下来将这个数值存放作为字符串,再对这个字符串执行如下算法
- 读取两个 0-9 的字符
- 将此两个字符拼接为两位数的数值
- 将这些数值放在一个列表
此时就可以获取这个列表的内容
如以下代码,下面代码的 NumberText.PI
就是一个 π 的字符串
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 像素写入到图片,算法如下
- 按照顺序遍历数值列表
- 按照 BGR 的顺序填充像素的数值
- 像素每个数值计算方法是按照 0-100 的比例对应 0-255 的比例拉伸
代码如下
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 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 747c17ef199dddf7f13f8cae7ffc9aefc9d117ad
以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源
git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
获取代码之后,进入 KohaykowurchemJaibuqajijiyeco 文件夹
出处:https://www.cnblogs.com/lindexi/p/15187828.html
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数