網站首頁 編程語言 正文
首先我先在每行(除空白以及{}外)代碼上標上序號(無序號源碼放在了文末)
#include <stdio.h> #include <math.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() { for (float z = 1.5f; z > -1.5f; z -= 0.1f) { for (float x = -1.5f; x < 1.5f; x += 0.05f) { float v = f(x, 0.0f, z); if (v <= 0.0f) { float y0 = h(x, z); float ny = 0.01f; float nx = h(x + ny, z) - y0; float nz = h(x, z + ny) - y0; float nd = 1.0f / sqrtf(nx*nx + ny*ny + nz*nz); float d = (nx + ny - nz)*nd*0.5f + 0.5f; putchar(".:-=+*#%@"[(int)(d * 5.0f)]); } else putchar(' '); } putchar('\n'); } return 0; }
此次空白行以及語句塊{}空白花括號就不再多加贅述,簡要來說,就是為了整體的完整性與可讀性。
首先先說一下數值后面加f的問題,例如: y=1.0f 1.0后面的f用于強調前面的1.0是一個float量。 如果不加,默認為double,加了之后,賦值給y時會自動轉換為float 的。
逐行分析(除空白以及{}空白行外):
★頭文件部分:
1.頭文件的定義,可以說是老朋友了,stdio頭文件,非常常用的頭文件。
2.math頭文件,看到math,我們應該會想起數學這個名字,其實沒錯,math.h頭文件定義了各種數學函數和一個宏。此處定義這個頭文件的原因就是用到了數學函數sqrtf。
★主函數外自定義函數部分:
3.定義了一個float類型的函數f,有三個float類型的形參x,y,z。
4.定義了一個float類型的變量a,將其賦值為x * x + 9.0f / 4.0f* y * y + z * z - 1;
5.返回一個表達式的值:return a *a * a - x * x * z * z * z - 9.0f/80.0f * y * y * z * z * z;
有關4和5的解釋:這其實跟上一次平面心形圖方程類型,只不過增加到了第三維度,此處為立體感心形方程:
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;
6.定義了一個float類型的函數h,有兩個float類型的形參x,z。
7.float定義y=1.0f,1.0后面的f用于強調前面的1.0是一個float量。 如果不加,默認為double,加了之后,賦值給y時會自動轉換為float 的。
y>=0.0f 判斷條件;
z-=0.1f; 也就是z=z-0.1f; 可以類比i-=2; 即 i=i-2;
8.if (f(x, y, z) <= 0.0f)條件判斷,調用函數f傳參x,y,z看函數返回值是否小于等于0,如果小于,說明y的值就對了,返回y的值到主函數。
9.見8.
10.return返回0.0f表示結束了該函數的執行。
★主函數部分:
11.主函數的定義。
12.見7.分析
? ps:12和13不再多加闡述,和7道理相同。
13.見7.分析
14.float定義了一個v變量,接收了y=0.0f即y為定值時函數f的返回值。
15.條件判斷,看函數返回的v值是否小于等于0,如果小于等于0,則執行語句塊內容,輸出所設定字符。
16.由15可知,15成立則進入語句16的執行,此處定義變量y0來接收返回值。
17.定義浮點型變量ny,并給它賦值為0.01f。
18.float nx = h(x + ny, z) - y0; 經h函數返回之后相當于,nx=y(x變化)-y0;
19.float nz = h(x, z + ny) - y0; 經h函數返回之后相當于,nz=y(z變化)-y0;
20.float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz); 這里的nd的值就相當于(x * x+y * y+z * z)開方再取倒數。
21.float d = (nx + ny - nz) * nd * 0.5f + 0.5f; d值相當于 d=(x+y-z)*1.0f/sqrtf(x * x+y * y+z * z)+0.5f。
22.putchar(".:-=+*#%@"[(int)(d * 5.0f)]); 輸出所設定字符,更好地呈現出立體感心形。
關于17——22這些都是為了更好的呈現立體感圖形所寫,關聯到輸出的位置,輸出的形狀等多個方面,可以說,是立體感心形代碼中核心代碼之一(而且是很關鍵的)。
23.if else中else否則部分;
24.如果執行else語句,則輸出空白;
25.輸出換行;
26.return 0; return語句結束main()函數的執行,把0返還給操作系統。
無序號源碼:
#include <stdio.h> #include <math.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() { for (float z = 1.5f; z > -1.5f; z -= 0.1f) { for (float x = -1.5f; x < 1.5f; x += 0.05f) { float v = f(x, 0.0f, z); if (v <= 0.0f) { float y0 = h(x, z); float ny = 0.01f; float nx = h(x + ny, z) - y0; float nz = h(x, z + ny) - y0; float nd = 1.0f / sqrtf(nx*nx + ny*ny + nz*nz); float d = (nx + ny - nz)*nd*0.5f + 0.5f; putchar(".:-=+*#%@"[(int)(d * 5.0f)]); } else putchar(' '); } putchar('\n'); } }
希望這篇文章對你有所幫助!
總結
原文鏈接:https://blog.csdn.net/qq_51646682/article/details/121851178
相關推薦
- 2022-04-03 Android?PopUpWindow實現卡片式彈窗_Android
- 2022-04-21 Android自定義View實現標簽流效果_Android
- 2022-12-29 R語言apply系列函數實例詳解_R語言
- 2022-08-04 docker搭建fastdfs環境的方法步驟_docker
- 2023-01-31 Combine中錯誤處理和Scheduler使用詳解_Swift
- 2024-01-28 ThreadLocal,提供線程局部變量
- 2022-10-07 Android實現點擊圖片上傳SQLite數據庫_Android
- 2023-12-13 python處理Excel文檔(一)合并Excel工作表
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支