跳
動
的
愛
心
- LOVE -
完整程序
#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() {system("color 0c"); //設計程序顏色system("mode con cols=60 lines=28"); ?//設計控制臺大小HANDLE o = GetStdHandle(STD_OUTPUT_HANDLE);_TCHAR buffer[25][80] = { _T(' ') };_TCHAR ramp[] = _T(".:-=+*#%@");HWND consoleHandle = GetConsoleWindow();// 獲取系統屏幕分辨率int screenWidth = GetSystemMetrics(SM_CXSCREEN);int screenHeight = GetSystemMetrics(SM_CYSCREEN);// 獲取窗口大小RECT consoleRect;GetWindowRect(consoleHandle, &consoleRect);int consoleWidth = consoleRect.right - consoleRect.left;int consoleHeight = consoleRect.bottom - consoleRect.top;// 計算窗口應該出現的位置int x = (screenWidth - consoleWidth) / 2;int y = (screenHeight - consoleHeight) / 2;// 使用SetWindowPos函數設置新的窗口位置SetWindowPos(consoleHandle, 0, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);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(40);}
}
程序分析:
這段代碼是一個跳動的愛心,使用了數學函數和控制臺輸出來實現。下面是具體的分析:
代碼的第3到5行是引入所需要的庫文件,其中math.h和windows.h是必須的,而tchar.h是用于處理字符串的。
接下來是代碼的主要函數f,它用來計算出一個點在三維空間中的函數值,如果這個值小于等于0,則表明這個點在愛心的表面上。
函數h用來計算在給定的x和z坐標下,最高點的y坐標。
在主函數中,首先設置了程序的顏色和控制臺的大小。接著通過GetConsoleWindow()獲取控制臺的句柄,進而獲得控制臺的大小和位置,計算出它應該出現的位置,并通過SetWindowPos函數移動控制臺窗口到指定位置。
進入主循環后,通過sin函數計算出一個s值,用來控制愛心的縮放。然后通過循環輸出每一行的字符,根據每個點的函數值計算出它在愛心表面上的位置并輸出相應的字符。最后通過SetConsoleCursorPosition和WriteConsole函數輸出到控制臺上。
通過Sleep函數讓程序等待一段時間,實現愛心跳動的效果。
總的來說,這段代碼通過控制臺輸出的方式,利用函數計算出每一個點在愛心表面上的位置,實現了一個動態的、跳動的愛心效果。
運行結果