这篇文章主要介绍“怎么利用C语言输出3D立体感心形图”,在日常操作中,相信很多人在怎么利用C语言输出3D立体感心形图问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用C语言输出3D立体感心形图”的疑惑有所
这篇文章主要介绍“怎么利用C语言输出3D立体感心形图”,在日常操作中,相信很多人在怎么利用C语言输出3D立体感心形图问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么利用C语言输出3D立体感心形图”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
首先我先在每行(除空白以及{}外)代码上标上序号(无序号源码放在了文末)
#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 的。
逐行分析(除空白以及{}空白行外):
头文件的定义,可以说是老朋友了,stdio头文件,非常常用的头文件。
math头文件,看到math,我们应该会想起数学这个名字,其实没错,math.h头文件定义了各种数学函数和一个宏。此处定义这个头文件的原因就是用到了数学函数sqrtf。
定义了一个float类型的函数f,有三个float类型的形参x,y,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;
有关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;
定义了一个float类型的函数h,有两个float类型的形参x,z。
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;
if (f(x, y, z) <= 0.0f)条件判断,调用函数f传参x,y,z看函数返回值是否小于等于0,如果小于,说明y的值就对了,返回y的值到主函数。
见8.
return返回0.0f表示结束了该函数的执行。
主函数的定义。
见7.分析
ps:12和13不再多加阐述,和7道理相同。
见7.分析
float定义了一个v变量,接收了y=0.0f即y为定值时函数f的返回值。
条件判断,看函数返回的v值是否小于等于0,如果小于等于0,则执行语句块内容,输出所设定字符。
由15可知,15成立则进入语句16的执行,此处定义变量y0来接收返回值。
定义浮点型变量ny,并给它赋值为0.01f。
float nx = h(x + ny, z) - y0; 经h函数返回之后相当于,nx=y(x变化)-y0;
float nz = h(x, z + ny) - y0; 经h函数返回之后相当于,nz=y(z变化)-y0;
float nd = 1.0f / sqrtf(nx * nx + ny * ny + nz * nz); 这里的nd的值就相当于(x * x+y * y+z * z)开方再取倒数。
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。
putchar(".:-=+*#%@"[(int)(d * 5.0f)]); 输出所设定字符,更好地呈现出立体感心形。
关于17——22这些都是为了更好的呈现立体感图形所写,关联到输出的位置,输出的形状等多个方面,可以说,是立体感心形代码中核心代码之一(而且是很关键的)。
if else中else否则部分;
如果执行else语句,则输出空白;
输出换行;
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'); }}
到此,关于“怎么利用C语言输出3D立体感心形图”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!
--结束END--
本文标题: 怎么利用C语言输出3D立体感心形图
本文链接: https://lsjlt.com/news/306381.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0