回复 3楼 warmaps
纯熟个人短时间理解,分析相当不完全,抛砖引玉,欢迎指正。
这个代码很巧妙,从编程来说,结构清淅,代码简单,实现的输出图形很有意思。
编程方面,变量f在代码中仅仅起到一个比例的作用,具体数值大小是相对的。唯一要求是f不为零。对于外层y循环,也就是屏幕输出的纵坐标,得到(1.5+1.5)/0.1+2=32个点。内循环x,屏幕输出的横坐标,得到(1.5+1.5)/0.05+2=62个点。然后根据每个坐标点做出计算,根据结果得到当前(x,y)点的显示的字符。因为对c了解很贫泛,不知0.0f是何意,不过换成0也能得到原输出图形。Putchar中的代码也很够意思,唯一的三目运算符也有返回值。但感觉重点还是在计算方面。
没有搞图像处理,水平集这个概念不了解。以前只知道把高维问题降维处理,比如智能计算的时候简化知识要降维,另外学自动控制可能知道,非线性系统的相平面分析法,就是这样。而水平集是把低维问题升维,比如平面圆方程,将标准单位圆方程右边的1移到左边,左边写成z。就成了三维曲面方程,利用不同x,y对应的z值就可以实现代码中取得不同的字符输出,这也是相当有规律可循的。看代码输出的图形也可以看出字符的选择实际上是根据计算点离中心的位置来定的。
a值计算,为了贴近记忆,当作z1。如果高数没有还给学校,应该知道这个表达式表示的是怎样一个二次曲面S1,计算结果相当于S1曲面的z坐标,这个容易理解。f值计算,感觉比较迷惑,但还是有思路,可以看成是两个曲面S2和S3的z坐标求差。减号之前是z1的三次方,在三维坐标系中,这z1的三次方比较关键,变化很明显,形成一个尖头向下的漏头形,不过漏斗边界一般是下凹的,它是上凸的。如果有matlab可以试着画画,此曲面计为S2。减号右边代表的S3曲面也抽象,但想象对于某一x或y值作yoz或yox平面的投影,可以看出曲面随x或y值变化的大概情形,有条件也可试着画画。
能写出这个代码所下的功夫
远在编程之个,一般情况没必要纠结这个问题。
...
自己弥补,发现"远"字不正确。
[
本帖最后由 lianyicq 于 2015-6-10 14:15 编辑 ]