由于控制台中的字符高宽不是1:1,所以打印字符的时候需要使用到控制台的 行数与高度像素的比值 和 列数与宽度像素的比值。
代码中使用了 "golang.org/x/sys/unix"包来获取上述比值。
donut是通过一个圆绕着一个圆外的轴旋转
环是由圆绕着y轴旋转而来,所以可以使用y轴旋转矩阵计算:
如果需要绕着x轴和z轴也旋转,那么,环的公式就变成了(其中A,B为自定义的旋转角):
化简得:
将 和
从 0 转到
, 选定A、B的值,再将(x,y,z)坐标填上字符就可以得到一个donut了!
要给donut添加上阴影,添加一个光源并且计算出donut上每个点朝向光源的程度、添加上对应光强的字符就可以了。
首先,我们先确定光线的方向,例如(0,1,-1)-从视角的顶上往下照射。计算面向量(平面圆上点的向量乘以三个对应的旋转矩阵):
然后再计算donut上每个点所在面上的法向量 N 与光线向量的内积L ( ):
L<0说明该点背向光线,L>0说明该点朝向光线且L的大小代表光线强度
最后我们用 .,-~:;=!*#$@ 这几个符号代表光强即可勾勒出donut上的光影

