c语言画猪程序,数学思维+C语言画小猪佩奇,来试试?

95bab1e07ae91a41c87d6bfa7fd79958.png

用C语言画小猪佩奇,

你能想到什么实现方式?

83ade768efe9ce7878b9e8ec72d34277.png

No, no, no~

让我们玩点生猛的。

30c2ee377fcf45b4eea83543f8b0cbc9.png

直接编辑代码,

用命令行(CMD)编译及运行!

(此处安利Sublime,瞬间提升逼格的神器)

然而,

CMD只能显示字符

(不依赖第三方软件的话)

难道……

没错

你没有想错

让我们来用ASCII码画图!

以下是步骤:

35dc1419b9a087781c0008809c52eb03.png

当然不是了!!

要学会魔法,

我们还要了解一些基础知识。

(突然正经分割线)

7023303b2ee96daec7f33f4bd97ce484.gifGIF

显示图案

没有颜色的地方,输出空格,

有颜色的地方,输出“.+!=#@”等符号。

(这里不是乱码)

眯上眼睛看符号矩阵

是不是能分出不同的灰度?

78065a1ada8d09772aac8ae1a518cb4d.png

706beb16d80cfd2f20787d460e7470f3.gifGIF

计算图形

字符输出的行和列,

我们可以看成是坐标轴。

47f7fabd37c9770a606764324d261ddf.png

很自然的,

我们引入平面几何。

由一条直线分割开的平面

309a477c9f3c96cef670b15d7a5b2ca5.png

说明:

为了让输出的图形符合我们对象限的认知,y从1到-1,而x从-1到1;

由于每一个所占的空间不是正方形,而是矩形,因此行和列(x轴和y轴)的步长不同

fc283aa68a7c3cbed11693590290db09.gifGIF

919c91bc8113820b2f16523520e99843.png

由多条相交直线分割开的平面:

c2053f6ca0009d6812a985a1be059b06.gifGIF

a8168711b5b7d9a9aa69df2163be388d.png

由两条平行直线构成粗线

7a0c2ce4e10a7c3a03706c82abbed521.gifGIF

6773c38022e3769e734a05821f726187.png

理论上,

这样的操作能把所有图形画出来,

即使是曲线也可以通过化曲为直绘制

(毕竟都是像素点了-_-||)

虽然这种方法可以表示曲线,

但为免太过繁琐。

既然我们把行列看作坐标,

那就用平面几何的方式来解决吧!

(椭)圆

59ea6aa0885714ba3a296ab91070b892.gifGIF

629a2305d4c1f837cc4d1b42a9cbee90.png

(效果差,看不出来)

(椭)圆面:

e4bdaf6c5e150ef5425784f01dad3eca.gifGIF

9faaafca27d7cf4bc143b6ca956eeb44.png

(椭)圆环

135027a49375050f63423085d07790da.gifGIF

bdc0ad533c09b9b4eda0012b6a87267e.png

双曲线的内部

59a1d136da1a58a40c421c1a81fd493b.gifGIF

6468cfd63f43ee68a84ae3b3ec47a4fe.png

爱心曲线

611ae2ee4302e7695dba1ea38b7a0ac6.gifGIF

be06642a230881d751ec7dfe977a4337.png

我再略施魔法

52863c8f026f3821ac124fc98b115437.gifGIF

53478603bf9033d72639a12ada84a534.png

拿去表白吧~

形体组合

acbecb5675289c7c914981ca00f22abc.gifGIF

这个时候,

我们就可以为小猪佩奇

拟合一些基本平面几何元素,

经过一系列的组合,

就可以勾勒出小猪佩奇的形状了。

先试试简单形体的组合

两个(椭)圆形的组合

fcc29de36d6913ab42d9c761980352dc.png

1cac18a52d9d4aaf17a5c7e3601ea63d.gifGIF

125c6a7d4482d9612d8ac833a9296dba.png

如果有n个(椭)圆组合的话,

岂不是要写n个这样的语句……

6835b5fb309533bf2c1e16ba73ea3b0b.png

No,no,no~

当然是再写一个函数了

我们引入符号距离函数

(SDF,SignedDistance Function)。

ecb2093f5129ea40031e560d2e854466.png

说明:

x表示一个点,Ω表示某个形状,∂Ω表示这个这个形状的边界。d(i,j)是距离函数。

也就是说,如果某个点在形状外,则返回该点和边界的距离(d),反之,则返回距离的相反数(-d)。

这样一来,

我们不但能够判断点是否在形状里,

还能额外获得该点与边界的位置关系。

你知道这意味着什么吗?

我们可以直接画描边的形状!!!

好的,来实践一下。

先来绘制一个描边的圆形。

(因为圆形的边界距离函数最好表示)

描边的圆

a31c45bddced4fcd170067e8c7b49f3e.png

7b43b8029e149ec8a6067a294243175e.gifGIF

9f3ca117e25391626719407b453d0ae6.png

图形的补集

f3d67ed61aaca8e5a0046c38bd0289b2.gifGIF

0d3349bafdc1d89b235ea33a5974165a.png

多个描边图形的并

(即多个SDF值取最小)

590a07c013e0c6ec77d2d773a114d5c4.gifGIF

4d65943ec3a5852e8365a2b0960d39c5.png

用这种方式可以拼出佩奇的吹风机头

多个描边图形的交

(即多个SDF值取最大)

70276618ac8c9283f996a53c9236c00c.gifGIF

155b05fb79a22dea5e024c42a8f8b447.png

9fad3ad5898f6dac39e2944cd2a27394.gifGIF

8046c62011933d4b9761b6161b5d12af.png

用这种方式可以拼出佩奇微笑的嘴

到这里就够了吗?

追求完美的我们,

怎么可能止步于此呢!

描边的优化

6dc26daf5de6568567d7dff2f5174593.gifGIF

可以看到,

不同方向的边线,

如果能够用“|/=\”表示,

就会好看很多。

比如,这样:

===

//................\\

\\................//

===

我们再引入SDF函数的梯度,

用atan2求出梯度的角度

来表示边线法线的方向。

我们用差分来求近似值。

464727351fad565bee0a355838e3ecb2.png

5a3b5fdd9cd5d2477c4db0bc41a033be.gifGIF

a560cfe23722cf156853bb4579294683.png

发挥想象力,

组合形状,比如福禄

ca00983ff15b9143ab028069ae4b1b7f.png

用各种圆形

交、并、求补、挤压、旋转,

锵锵锵锵!~

a4674791d18b69e5e39b2aabf1e2080d.gifGIF

完整代码:

e4b0c86e9cba4b43c985a8e76da0b6cc.png

编译运行时

更改a的大小

可实现更改精致程度。

36b7011f89307b1615d6f8728fabb70f.gifGIF

每天改变一点点,

做精致的猪猪女孩。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值