C语言永远不会过时

其实学编程关键是学习其思想,如果你精通了一门,再去学其他的时候也很容易上手。C不会过时的,尤其是在unix、linux操作平台上,学好C是必须的。

C跟C++在很多方面也是兼容的,c是c++的基础。

再者c能从很大的程度上帮你了解计算机的发展史,数据结构等方面的知识,很多软件、甚至操作系统中的很大部分是用c来实现的。

还有一些电器芯片的程序,比如电冰箱内制冷系统……可以说用c可以解决一切可能遇到的问题,关键是你要能精通它。

所以放开手脚去大胆的学吧,c永远不会过时


关于怎么快速学C/C++,可以加下小编的C/C++学习群:341+636+727,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,欢迎初学和进阶中的小伙伴。





每天晚上20:00都会开直播给大家分享C/C++游戏编程学习知识和路线方法,群里会不定期更新最新的教程和学习方法,最后祝所有程序员都能够走上人生巅峰,让代码将梦想照进现实




今天我们来用C语言画一只小猪佩奇---社会、社会....

在画小猪佩奇之前,我们先使用带符号的距离长 (signed distance field,SDF) 来画一个圆形。




使用这个方法表示形状,但是这次我们使用 ASCⅡ 字符 /= 画出形状的外框,并填充内部,类似这样:

=====

//.....\

||.....||

\....//

=====

SDF 的梯度(gradient)代表 SDF 变化最大的方向,可用这个方向去决定用哪一个字符。




我们通过差分求 SDF 的梯度近似值,然后用 atan2() 求出梯度的角度:




用 C 语言简单实现,在 [-1, 1] x [-1, 1] 画布中画一个半径 0.8 并带有 0.1 宽度外框的圆形:

#include <math.h>

#include <stdio.h>

#define T double

T f(T x, T y)

{

return sqrt(x x + y y) - 0.8f;

}

char outline(T x, T y)

{

T delta = 0.001;

if (fabs(f(x, y)) < 0.05)

{

T dx = f(x + delta, y) - f(x - delta, y);

T dy = f(x, y + delta) - f(x, y - delta);

return "|/=|/=|"[(int)((atan2(dy, dx) / 6.2831853072 + 0.5) * 8 + 0.5)];

}

else if (f(x, y) < 0)

{

return '.';

}

else

{

return ' ';

}

}

int main()

{

for (T i = -1; i < 1; i += 0.05, putchar(' '))

{

for (T j = -1; j < 1; j += 0.025)

{

putchar(outline(j, i));

}

}

getchar();

return 0;

}




然后,我们就可以通过画多个圆形,把它们适当地旋转和缩放,用构造实体几何比它们组合起来,从而就可以画出小猪佩奇了:

#include <math.h> #include <stdio.h> #include <stdlib.h> #define T double

T c(T x, T y, T r)

{

return sqrt(x x + y y) - r;

}

T u(T x, T y, T t)

{

return x cos(t) + y sin(t);

}

T v(T x, T y, T t)

{

return y cos(t) - x sin(t);

}

T fa(T x, T y)

{

return fmin(c(x, y, 0.5), c(x * 0.47 + 0.15, y + 0.25, 0.3));

}

T no(T x, T y)

{

return c(x * 1.2 + 0.97, y + 0.25, 0.2);

}

T nh(T x, T y)

{

return fmin(c(x + 0.9, y + 0.25, 0.03), c(x + 0.75, y + 0.25, 0.03));

}

T ea(T x, T y)

{

return fmin(c(x 1.7 + 0.3, y + 0.7, 0.15), c(u(x, y, 0.25) 1.7, v(x, y, 0.25)
+ 0.65, 0.15));

}

T ey(T x, T y)

{

return fmin(c(x + 0.4, y + 0.35, 0.1), c(x + 0.15, y + 0.35, 0.1));

}

T pu(T x, T y)

{

return fmin(c(x + 0.38, y + 0.33, 0.03), c(x + 0.13, y + 0.33, 0.03));

}

T fr(T x, T y)

{

return c(x * 1.1 - 0.3, y + 0.1, 0.15);

}

T mo(T x, T y)

{

return fmax(c(x + 0.15, y - 0.05, 0.2), -c(x + 0.15, y, 0.25));

}

T o(T x, T y, T(f)(T, T), T i)

{

T r =f(x, y);

return fabs(r) < 0.02 ? (atan2(f(x, y + 1e-3) - r, f(x + 1e-3, y) - r) + 0.3)
1.273 + 6.5 : r < 0 ? i : 0;

}

T s(T x, T y, T(*f)(T, T), T i)

{

return f(x, y) < 0 ? i : 0;

}

T f(T x, T y)

{

return o(x, y, no, 1) ? fmax(o(x, y, no, 1), s(x, y, nh, 12)) : fmax(o(x, y,
fa, 1), fmax(o(x, y, ey, 11), fmax(o(x, y, ea, 1), fmax(o(x, y, mo, 1),
fmax(s(x, y, fr, 13), s(x, y, pu, 12))))));

}

int main(int a, char **b)

{

for (T y = -1, s = a > 1 ? strtod(b[1], 0) : 1; y < 0.6; y += 0.05 / s,
putchar(' '))

{

for (T x = -1; x < 0.6; x += 0.025 / s)

{

putchar(" .|/=|/=| @!"[(int)f(u(x, y, 0.3), v(x, y, 0.3))]);

}

}

getchar();

return 0;

}




两倍:




四倍:




友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信