putchar(".:-=+*#%@"[(int)(d * 5.0f)])


前兩天在玩知乎時候見到有個用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('\n');
41     }
42     return 0;
43 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM