前两天在玩知乎时候见到有个用C语言画心的小代码感觉还是蛮好玩的,不过,里面有行代码看了好久才懂: putchar(".:-=+*#%@"[(int)(d * 5.0f)]); ,先来看看putchar这个函数,用man查看一下其原型: int putchar(int c)
然后我们写个例程看看:
1 #include <stdio.h> 2 int main(int argc, char const *argv[]) 3 { 4 /*int putchar(int c)等价于int putc(int c, FILE *stream)*/ 5 putchar(".:-=+*#%@"[8]); 6 return 0; 7 }
输出是下面这样的,就只有一个@这个字符
再多写几行把那串字符串里的'@'这个字符改一下再输出:
1 #include <stdio.h> 2 int main(int argc, char const *argv[]) 3 { 4 /*int putchar(int c)等价于int putc(int c, FILE *stream)*/ 5 putchar(".:-=+*#%@"[8]); 6 putchar(".:-=+*#%3"[8]); 7 putchar(".:-=+*#%s"[8]); 8 putchar(".:-=+*#%h"[8]); 9 return 0; 10 }
输出:
仔细看看貌似输出的字符都是我们改过来的,我们再数数发现那个'@'字符正好是".:-=+*#%@"这个字符串的第9个元素……
我天,这其实就相当于str[8]嘛……真的是蠢到家!!!
最后把原始代码贴出来吧,知乎在这里:如何用 C 语言画「心形」?
1 #include <stdio.h> 2 #include <math.h> 3 4 float f(float x, float y, float z) 5 { 6 float a = x * x + 9.0f / 4.0f * y * y + z * z - 1; 7 return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z; 8 } 9 10 float h(float x, float z) 11 { 12 for (float y = 1.0f; y >= 0.0f; y -= 0.001f) 13 if(f(x, y, z) <= 0.0f) 14 return y; 15 return 0.0f; 16 } 17 18 int main(int argc, char const *argv[]) 19 { 20 for (float z = 1.5f; z > -1.5f; z -= 0.05f) 21 { 22 for (float x = -1.5f; x < 1.5f; x += 0.025f) 23 { 24 float v = f(x, 0.0f, z); 25 if(v <= 0.0f) 26 { 27 float y0 = h(x, z); 28 float ny = 0.01f; 29 float nx = h(x + ny, z) - y0; 30 float nz = h(x, ny + z) - y0; 31 float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz); 32 float d = (nx + ny - nz) * nd * 0.5f + 0.5f; 33 putchar(".:-=+*#%@"[(int)(d * 5.0f)]); 34 } 35 else 36 { 37 putchar(' '); 38 } 39 } 40 putchar(' '); 41 } 42 return 0; 43 }