c语言代码表白_C语言+数学思维可以做什么?画个小猪佩奇试一试

a586abb43b89e19547ab20770c1da50d.png

1c7cd4bfb11a041611bdebe4b3195f84.png

用C语言画小猪佩奇,

你能想到什么实现方式?

326dc1addbccca356f6c99662d31309d.png

让我们玩点生猛的。

8b3a791a3188a0770a5bb78f2f4a7972.png

直接编辑代码,

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

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

然而,

CMD只能显示字符

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

难道……

没错

你没有想错

让我们来用ASCII码画图!

以下是步骤:

e5a2aa43e7e76883b970f1d4c53754f6.png

当然不是了!!

要学会魔法,

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

(突然正经分割线)

24ed587a25fcc798f7b993919225df9d.gif

显示图案

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

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

(这里不是乱码)

眯上眼睛看符号矩阵

是不是能分出不同的灰度

914094d375b6c8aed570f19fc892b7d3.png

24ed587a25fcc798f7b993919225df9d.gif

计算图形

字符输出的行和列,

我们可以看成是坐标轴

8591314c442dbda8d5e4cade73670aec.png

很自然的,

我们引入平面几何

由一条直线分割开的平面

877eb98625e713af1ccbaf7ae2250da1.png

说明

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

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

24ed587a25fcc798f7b993919225df9d.gif

fdb516ac561333e9ce533a5a7d736082.png

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

07e589cee4d12f322146e853ef6ca548.png

24ed587a25fcc798f7b993919225df9d.gif

5d7e1e2a2f247ef6bb70def8f3eedee7.png

由两条平行直线构成粗线

24ed587a25fcc798f7b993919225df9d.gif

142c39797892b8f86b883accf2163a48.png

理论上,

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

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

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

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

但为免太过繁琐

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

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

(椭)圆

4610c58a4fb39801d1c42f6226b55859.png

24ed587a25fcc798f7b993919225df9d.gif

73ff9d273f00fd861c4efc2ef7367dd8.png

(效果差,看不出来)

(椭)圆面:

8c8ea1c3844d00dc178c797e23440ec9.png

24ed587a25fcc798f7b993919225df9d.gif

b002ff63cac6f7f71c3d1eae766b75ad.png
#include <stdio.h>
int main()
{
	printf("学习从来不是一个人的事情,要有个相互监督的伙伴n");
	printf("工作需要学习C/C++或者为了入行、转行学习C/C++的伙伴n");
	printf("可以家我球球_2208165112n");

	return 0;
}

(椭)圆环

24ed587a25fcc798f7b993919225df9d.gif

29c1dc678369d4bdedce3b8a32cd8399.png

双曲线的内部

c36cda437fdabc42f1f603bcbcaef250.png

24ed587a25fcc798f7b993919225df9d.gif

35fd01eb7aefcefc7421a31cefcaf4a7.png

爱心曲线

24ed587a25fcc798f7b993919225df9d.gif

19defd561bc19a8fb730c0a5fe98b040.png

我再略施魔法

24ed587a25fcc798f7b993919225df9d.gif

f4de5b99f30309899d7a0c3567260889.png

拿去表白吧~

形体组合

24ed587a25fcc798f7b993919225df9d.gif

这个时候,

我们就可以为小猪佩奇

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

经过一系列的组合

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

先试试简单形体的组合

两个(椭)圆形的组合

dc417b281e07ed01be09c82bc6e5a8c1.png

24ed587a25fcc798f7b993919225df9d.gif

a66db4aa16942134406ae70550db58b0.png

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

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

d7f3482c00f00ff06e1d608d34712af9.png

No,no,no~

当然是再写一个函数

我们引入符号距离函数

SDF,Signed Distance Function)。

fea0c1661c22a66dcf4f46e549d0b7fb.png

说明

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

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

这样一来,

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

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

你知道这意味着什么吗?

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

好的,来实践一下。

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

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

描边的圆

94a4cae3fd17434467dcca17d113ef6f.png

24ed587a25fcc798f7b993919225df9d.gif

cd86ca3a487734020c43cdd167d0e1b4.png

图形的补集

ad9e7b6a41335f55c98651c99f19d385.png

24ed587a25fcc798f7b993919225df9d.gif

fa850e9e516c62aac0319667088720e2.png

多个描边图形的

(即多个SDF值取最小)

e619a56fbbff7e4cf612270d61a62328.png

24ed587a25fcc798f7b993919225df9d.gif

7d5fa23b189cd2f252e3e4e92e7e03ee.png

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

多个描边图形的

(即多个SDF值取最大)

782373ad6826af891e33375fa09a6201.png

24ed587a25fcc798f7b993919225df9d.gif

e0a03983762807af4c68d9f6fc31d676.png

24ed587a25fcc798f7b993919225df9d.gif

ebba1fb1759c8c31975d26dcfc65dff7.png

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

到这里就够了吗?

追求完美的我们,

怎么可能止步于此呢!

描边的优化

24ed587a25fcc798f7b993919225df9d.gif

可以看到,

不同方向的边线,

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

就会好看很多。

比如,这样:

===

//................

................//

===

我们再引入SDF函数的梯度

用atan2求出梯度的角度

来表示边线法线的方向。

我们用差分来求近似值。

efed574e07a54a773add65664649de70.png

d52d5be2d2445d8f385ae147a4026b36.png

24ed587a25fcc798f7b993919225df9d.gif

de9459a88e28965a3827af7a3b1ceb5d.png

发挥想象力,

组合形状,比如福禄

c03dd8c0ae71fda7ac00f66aa6e54b60.png

用各种圆形

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

锵锵锵锵!~

39bc91074f68d6fa3f39c15b40f36131.gif

完整代码:

0eb72cb9f04bd70036fa53219a5d2a4d.png

编译运行时

更改a的大小

可实现更改精致程度

17ba5f8a46946a12747ee85f9e0a66c6.gif

每天改变一点点,

做精致的猪猪女孩。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值