七夕又快到了,分享一个曾经玩过的代码,用 C 语言画一个跳动的心,很有逼格有木有。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | #include <stdio.h> #include <math.h> #include <windows.h> #include <tchar.h> float f(float x, float y, float z) { float a = x * x 9.0f / 4.0f * y * y z * z - 1; return a * a * a - x * x * z * z * z - 9.0f / 80.0f * y * y * z * z * z; } float h(float x, float z) { for (float y = 1.0f; y >= 0.0f; y -= 0.001f) if (f(x, y, z) <= 0.0f) return y; return 0.0f; } int main() { HANDLE o = GetStdHandle(STD_OUTPUT_HANDLE); _TCHAR buffer[25][80] = { _T(' ') }; _TCHAR ramp[] = _T(".:-= *#%@"); for (float t = 0.0f;; t = 0.1f) { int sy = 0; float s = sinf(t); float a = s * s * s * s * 0.2f; for (float z = 1.3f; z > -1.2f; z -= 0.1f) { _TCHAR* p = &buffer[sy ][0]; float tz = z * (1.2f - a); for (float x = -1.5f; x < 1.5f; x = 0.05f) { float tx = x * (1.2f a); float v = f(tx, 0.0f, tz); if (v <= 0.0f) { float y0 = h(tx, tz); float ny = 0.01f; float nx = h(tx ny, tz) - y0; float nz = h(tx, tz ny) - y0; float nd = 1.0f / sqrtf(nx * nx ny * ny nz * nz); float d = (nx ny - nz) * nd * 0.5f 0.5f; *p = ramp[(int)(d * 5.0f)]; } else *p = ' '; } } for (sy = 0; sy < 25; sy ) { COORD coord = { 0, sy }; SetConsoleCursorPosition(o, coord); WriteConsole(o, buffer[sy], 79, NULL, 0); } Sleep(33); } } |
---|
exe 文件下载