ACSII 动画演示:

不过本文介绍的是另一个作品:c 代码实现雅虎 logo ACSII 动图。

运行后,你将会看到:

它是一个 20fps、抗锯齿的 Yahoo! logo ASCII 动画。。

我鼓励大家研究一下代码中的常量:

S+=V+=(1-S)/10-V/4是该动画的欠阻尼控制系统——S 是缩放(=1/缩放倍数)、V 是速度、1/10 和 1/4 是PD常量。在第一帧中 S=0 相当于无穷放大。S<0 是非法的。

F 是帧数计数器。1.16 控制多边形绘制的缩放比例(68 是 79/1.16 的近似值,所以也需要对它进行校正),而 136、84、92033 定义了一个椭圆。14.64 是一个不可调参数(它是 46/π 的值)。

抗锯齿的方法很简单:

每个字符由三组垂直排列的样本和一个 8 字符的查找表(用于为三组打开或者关闭的排列中的每组提供像素)组成。每一帧包含 73×24 个字符或者 73×72 个像素。水平方向使用 73 列这个取值有些随意;我预测可以增加到 79(译注:一般终端一行可以容纳 80 个像素,去掉一个换行符就剩下 79)。 通过一种相当简洁的方法,亚像素精度和无帧缓冲,将 logo 绘制成一个椭圆和八个凸多边形。它需要一些设计上的权衡来生成两个可打印的字符数组,但是这比起绘制三角形到帧缓冲所需的代码要更少,这也是多边形栅格化的典型做法。

为了制作上述的图案,首先需要把 logo “Y!”向量化。我通过测量基准图和在坐标纸上画出坐标实现 logo “Y!”的向量化。然后,我写了一个应用程序,将点和多边形定义转换成如下定义的角度和偏移量。

这里的椭圆是高中数学中的标准椭圆:x2/a2 +y2/b2 < 1。检查每个点,如果该点在椭圆内,那么绘制该像素(136x2 + 84y2 < 92033 是对a和b进行简单移项的结果,其中a和b分别是从原图片测量出来、缩放到像素网格的椭圆的两个轴半径)。

每个多边形由一系列独立的半平面组成(一个半平面即一条无限延长线的一边中所有点的集合)。如果一个点在所有半平面“里面”,那么它就处于该多边形里面(这仅仅适用于凸多边形),而该像素用异或操作符 ^ 进行切换(因此不需要任何特殊的操作,就处理了椭圆里面的“反面”部分和“正面”的感叹号)。

多边形的每条边都被定义为方程式ax+by>c。我使用角度θ来表示a和b,即a= cos(θ) 和b= sin(θ),并以 π/46 的增量来量化角度——得到用 ASCII 码的 33 到 125(即 ‘!’ 到 ‘}’)来表示角度 -π 到 +π,其中角度 0 表示为 ‘O’(即 ASCII 码的 79)。然后对c进行求解,同样以缩放增量对 -47 到 47 进行量化,而这条边的中点也被认为在多边形内。

下面是粗略的示意图(这是我在纸上画的。大家将就一下):

阴影部分是ax+by

(a,b) 构成线段的正交向量。它们指向多边形的内部,所以我们可以直接从定义线段的点得到a和b,即将定义一条边的向量 (x1–x0,y1–y0) 旋转 90 度,得到 (a,b) = (y1–y0,x0–x1)。然后,由于实际的大小不重要,所以我们对 (a,b) 进行归一化。当我们求解角度时,它们会变成 1。我们在后面可以抵消c的取值(假设ax+by>c,那么对于缩放倍数 s>0,可以得到sax+sby>sc)。接着计算θ=atan2(a,b),将其量化成我们 94 个角度中的一个,并得到 (a,b) = (cos(θ), sin(θ))。

通过直接将多边形一条边上的任意一个点代入公式c=ax+by,可以很容易地得到c。我使用边上线段的中点,即 (xt,yt) = ((x0+x1)/2, (y0+y1)/2),因为在我们量化θ之后,边的角度会出现轻微的偏移,而这会导致超出边长的错误。

注意到开头的几帧(你可以按 ^S 来停止,^Q 来继续——xon/xoff),由于在分离半平面方程式时出现的量化错误,导致“Y”的底部被咬掉几口。(译注:^S 即键盘的 Ctrl+S,^Q 即键盘的 Ctrl+Q)

通过仔细地重排分离平面的数组,使得大部分绘图区被排除,可以稍微提高 CPU 的效率。我没有把这部分放到 generator 的代码中。

动画是由序列 [25A 完成——在任意终端仿真模式下,将光标上移 25 行。严格的说我只需上移 24 行,但是 puts 比 printf 简洁,而它会隐式地添加新行。如果你的终端少于 26 行,那么它会对你的终端回滚做一些奇怪的事情。另外,usleep 用来把动画的刷新率限制到 20fps,这也是唯一一个非 ANSIC 字符的地方。

然后通过使用精妙的 for 循环和 C 语言默认包含的不正规的逗号、条件语句和全局 int 变量的优点(这在 C 语言混乱代码中是比较常见的)。而那几乎展现出这段代码是如何实现的所有秘密。

使用一组不同的移动序列或者旋转(再或者任意的 3D 切换,这基本上是追踪 logo 的轨迹),可以很简单地改进这段动画。我仅仅用了缩放动画来证明一点:这个 logo 是被动态地绘制,而不仅仅是一个压缩后的 logo。并且我会使动画保持简短而流畅。

PS:文中或许有错误,向大家道歉,但是我想让你了解到了这个想法。希望对感兴趣的小伙伴们有些许帮助!

学C/C++不易,此路应携手前行。

欢迎关注我的编程公众號【草莓味狸猫】!

如果你想跟着小编一起学编程的话!

可以来我的C语言C++编程学习基地,【搜索进入】!

还有(源码,零基础教程,项目实战教学视频)!

c语言读取栅格文件代码,【C语言编程学习笔记】利用462字节代码实现雅虎logo ACSII 动画!...相关推荐

  1. 462 字节 C 代码实现雅虎 logo ACSII 动画

    [伯乐在线导读]:说到代码混淆艺术,大家可能会想到 IOCCC 大赛中的阿卡林作品(如下图). "阿卡林",动漫作品<摇曳百合>中的主人公之一 不过本文介绍 Andy ...

  2. python代码翻译-Python编程学习 -- 用十几行代码实现一个翻译器

    前言 本文所用的方法十分简(ruo)易(zhi),非常适用想用Python做点有趣的功能的Python初学者. 先上一波效果图 那么这到底是怎么实现的呢?其实说起来很简单,我们只需要写一个爬虫就行啦! ...

  3. python代码翻译器-Python编程学习 -- 用十几行代码实现一个翻译器

    前言 本文所用的方法十分简(ruo)易(zhi),非常适用想用Python做点有趣的功能的Python初学者. 先上一波效果图 那么这到底是怎么实现的呢?其实说起来很简单,我们只需要写一个爬虫就行啦! ...

  4. java2d游戏代码_JAVA游戏编程学习笔记(三)Java 2D游戏底层绘图框架

    前二篇记录了java如何绘制图形与动画,今天打算总结复习一下,把这些知识点集合起来,制作一个Java2D小游戏框架(暂且这么叫,好像挺牛逼似的!). Java AWT 下边提供一个 class Can ...

  5. c语言读文件编译,C语言读取wav文件的问题,请大侠,编译问题。

    已结贴√ 问题点数:20 回复次数:5 C语言读取wav文件的问题,请大侠,编译问题. 代码如下:#include #include LRESULT CALLBACK WndProc (HWND, U ...

  6. R语言读取csv文件,第一列列名出现乱码的解决方法

    在利用R语言读取csv文件时,第一列列名总是出现乱码,代码如下: setwd("E:\2.Model\4. Simulation") #设定文件路径 All.Soils = rea ...

  7. R语言读取csv文件,第一列列名出现乱码怎么办

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/weixin_45075290/art ...

  8. R语言读取xlsx文件

    R语言读取csv文件 关于R语言读取Excel文件,比较麻烦,我从来都反对直接读取xlsx文件,因为爬虫数据时,一般保存的格式都是csv文件,或者直接保存到数据库里面,没有谁会保存到Excel文件里面 ...

  9. Lasso线性回归学习笔记(公式与代码实现)

    目录 Lasso线性回归学习笔记(公式与代码实现) 1 为什么要在线性回归中引入正则化项(简介) 2 常见正则化项 3 损失函数图像与正则化之后的图像 3.1损失函数图像 3.2 加了 L~1~ 正则 ...

最新文章

  1. Java lambda 循环累加求和
  2. SAP MM初阶之事务代码MIGO界面里的HOLD
  3. 使用Ant将windows下开发的Struts2应用直接部署到Linux上
  4. JPA查找数据库最新一条消息
  5. 配置启动MySQL的Docker容器
  6. (转)如果知道dll文件是面向32位系统还是面向64位系统的?
  7. 构建属于你自己的dapr服务发现
  8. 漫画:什么是Base64算法
  9. 模板进阶——模板实参推断
  10. vc 可用的正则表达式库
  11. android 签名打包 Invalid keystore format
  12. PDF文件如何转JPG图片?简单三步轻松转换
  13. windows中office无法使用撤销键
  14. C++complex复数类
  15. 《好好说话》 学习笔记
  16. 使用eBPF将网络功能Offload到网卡
  17. 【RTX51 Tiny初级】09_K_TMO与K_IVL的区别和使用场合
  18. 关于intrins.h头文件的介绍,做流水灯时候更方便
  19. 全局设置下载方式为豆瓣镜像的方法
  20. Jmeter压力测试简单教程(包括服务器状态监控)-----转载自lsoqvle 的博客(https://blog.csdn.net/cbzcbzcbzcbz/article/details/780)

热门文章

  1. KDZD土壤电阻率测试仪
  2. STM32单片机三线制PT100温度采集控制系统LCD12864显示器
  3. DSP频谱分析——选取合适的N和窗函数得到6根非零谱线
  4. movavi video converter 21中文版(全能视频转换器) v21.0.0
  5. 营长来香港啦! 9位顶尖开发者、两大香港高校、现场编程, 共商区块链金融技术与落地!...
  6. WordPress主题制作全过程(九):制作single.php
  7. 滞后-超前或者超前滞后
  8. linux字体显示小方块,ubuntu18.04下 中文字体显示为方块 方框
  9. DNS协议隧道之iodine
  10. hive kv结构转map