封面来源:链接
简介
Long Long Ago,在知乎上看了叶大的“一百行以下有哪些给力代码“和“用C语言绘制心形”的回答,可谓是我图形学的开始之一,最近才好好理解完了后者思路和实现,自己做了个球体版的。然后便看一幅幅图片就这样神奇地画出来...
大概的功能就是:
- 输出一些字符到(黑糊糊的)控制台,模拟一个圆/球的视觉效果;
- 生成一幅ppm格式的图像文件;
- 加入考虑高光、光照角度变化等因素生成动画帧序列等等。
接下来依次简要介绍它们的原理与效果,代码地址见文末。
平面圆形
首先,从简单的开始,这一切的根本都是源于一个方程:
没错,高中的姿势,这是笛卡尔坐标系下的圆形方程,圆心在原点(0,0),半径为1。把一个坐标(x,y)带入方程f(x)之后,如果f值等于0,那么这个坐标点在圆上,如小于0就在圆内,反之在圆外。
于是,可以把控制台窗口的行和列作为XY轴,窗口中每一个位置即可以用一个坐标(行序号,列序号)表示,然后将用循环把坐标一个个代入方程,判断,小于等于0就输出一个符号(如'@'),大于0就输出一个空格,并在相应位置换行。这样你就有个圆啦。
判断控制台坐标属不属于圆的这个过程,对应在图形学中叫做光栅化(rasterization);计算一个坐标控制台坐标该绘制什么符号的过程叫Pixel Operation(像素操作);二者合起来也叫光栅化...
【细节不看区域】
/* 这里面比较妙的是,控制台本来就是自上而下、从左到右依次输