<分析>计算机男表白神器,用C/C++画出心型

发表于 C/C++, 程序语言, 闲谈 2017-01-10 阅读数: 297

参考文档:http://mathworld.wolfram.com/HeartCurve.htmlhttps://www.zhihu.com/question/20187195

使用的公式:

用C++画心

效果图:

用C++画心

公式仅仅是画出弧度,如果我们想要填充里面的东西,仅需要判断公式是否小于0,若小于零则打印星号:

cout<< (a \* a \* a - x \* x \* y \* y \* y <= 0.0f ? '*' : ' ');

(a即x^2+y^2-1,见下图完整代码)

完整代码:

用C++画心

其中,第一个循环输出的是行,按照这个算法,应该是40行,第二个循环输出的是列,应该有80列。

如果我们把行数改小,图形就会变矮。如:

for (float y = 2.0f; y > -2.0f; y = y - 0.2f)

用C++画心

若我们把列等比例缩小。

for (float x = -2.0f; x < 2.0f; x = x + 0.1f)

其效果就是整个图形缩小。如图:

用C++画心

这样似乎理解依旧不够透彻,让我们更深刻地理解这个代码。修改代码为:

用C++画心

我们看运行结果是:

用C++画心

可见x=0,y=0就是图像的中心。其实这个程序是按照坐标轴进行绘制的。那我们就能做一些更有趣的改动了。

cout << (a \* a \* a - x \* x \* y \* y \* y <= 0.0f && a \* a \* a - x \* x \* y \* y \* y >= -0.1f ? '*' : ' ');

用C++画心

这是....猫耳?

如果我们想镶嵌一个心型呢?我们注意到当x,y分别等于零时y和x都分别为正负1.可以进行这样的尝试:

if (y <= 0.5f && y>= -0.5f && x<=0.5f && x>=-0.5f)

   cout << "+";

else

   cout << (a * a * a - x * x * y * y * y <= 0.0f ? '*' : ' ');

用C++画心

这很尴尬。但没关系,快对了,我们需要把它化成心型,也就是我们需要把小心型的轨迹求出来。带入x=0.5,y=0,我们得到结果是-0.42.

这样修改:

用C++画心

用C++画心

然而还是不太完善。那我们手动修改吧(捂脸)

蛤蛤,差不多啦。如果你有兴趣的话可以试试别的公式,蛮有意思的。

欢迎关注微信公众号:幻象客网站:www.huanxiangke.com

幻象客 二维码

Add comment