情人节用C++给女朋友比个心
本来情人节可以回学校陪女朋友的,但因为疫情延迟开学,无奈只能异地。
异地过节不想落入俗套,索性就用C++给女朋友比个心吧,顺便重新理解一下C++的用处(手动狗头:巩固C++不是我的真正目的)
有两种比心方法,下面分别介绍。第一种方法是基础,第二种方法是进阶。
##方法一
这里用到的心形曲线方程如下:
先回顾一下圆的方程,比如: x^{2} + y^{2} = 1 ,那么对于所有的点 (x, y):
若使得 x^{2} + y^{2} = 1 ,则这个点在圆的边界线上;
若使得 x^{2} + y^{2} < 1 ,则这个点在圆内;
若使得 x^{2} + y^{2} > 1 ,则这个点在圆外。
同理,对于这个方程:
若点 (x, y) 让方程左边等于0,则这个点在这个心形曲线上;
若点 (x, y) 让方程左边小于0,则这个点在这个心形线内;
若点 (x, y) 让方程左边大于0,则这个点在这个心形线外。
那么需要做的就是写一个双重循环,遍历x和y的值,将心形线以内的地方,涂上某一个字符,比如‘*’。
双重循环的边界和步长的确定:
观察一下,可以看到y的上界大概是1.3;下界大概是-1.1;所以,我们可以从1.3逐渐减少到-1.1,我们可以选取步长为0.1。
同理,对于x,可以看出它的左右边界大概为-1.2和+1.2,我们就从-1.2遍历到1.2,步长选择0.05。
代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
for (float y = 1.3; y >= -1.1; y -= 0.1)
{
for (float x = -1.2; x <= 1.2; x += 0.05)
if (pow((x*x + y*y - 1.0), 3) - x*x*y*y*y <= 0.0)
cout << '*';
else
cout << ' ';
cout << endl;
}
return 0;
}
输出结果:
其中改变x和y的步长就可以改变输出心形的高度和宽度。
改变函数即可改变输出心形的形状,如:
对应代码如下:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
for (float y = 1.3; y >= -1.1; y -= 0.06)
{
for (float x = -1.1; x <= 1.1; x += 0.025)
if (x*x + pow(5.0*y / 4.0 - sqrt(fabs(x)), 2) - 1 <= 0.0)
cout << '*';
else
cout << ' ';
cout << endl;
}
return 0;
}
这一种方法只能输出单一字符,当然也可以做成镂空效果,只要改变两部分输出的填充物即可。
下面介绍一种可以输出字符串的进阶方法。
##方法二
代码如下:
#include <iostream>
#include <math.h>
using namespace std;
#define X_DIVIDED_BY_Y 0.5
#define MAX_X (35.0 / X_DIVIDED_BY_Y)
#define MAX_Y 35.0
#define THRESHOLD 0.5
#define A 13
char getSentenceChar(const char*sentence, int &index)
{
while (true)
{
if (index >= strlen(sentence))
{
index = 0;
}
char c = sentence[index++];
if (' ' == c)
{
index++;
}
else
{
return c;
}
}
}
inline float getX(float x)
{
return (x - MAX_X / 2)* X_DIVIDED_BY_Y;
}
inline float getY(float y)
{
return MAX_Y / 7.0 -y;
}
bool func(float x, float y)
{
return (pow(x, 2) + pow(y, 2) +A * x - A * sqrt(pow(x, 2) + pow(y, 2))) < THRESHOLD;
}
void main(int argc, char** argv)
{
const char *LOVE_SENTENCE ="Write_whatever_you_want.";
int sentenceIndex = 0;
for (int y = 0; y <= MAX_Y; y++)
{
for (int x = 0; x <= MAX_X; x++)
{
cout << (func(getY(y), getX(x)) ? getSentenceChar(LOVE_SENTENCE, sentenceIndex) : ' ');
}
cout <<endl;
}
}
输出结果:
代码写好之后,还要生成格式后缀为.exe的可执行文件发给女朋友才行。
##Visual Studio上生成可执行文件的方法
1.找到菜单中的配置管理器,从Debug切换至Release,如图所示:
2.【菜单栏】->【项目】->【(项目名称)属性】->【配置属性】->【C/C++】->【代码生成】->【运行库】,由【多线程DLL(/MD)】改为【多线程(/MT)】,点击确定,如图所示:
3.【菜单栏】->【生成】->【重新生成解决方案】
4.重新生成解决方案后会在项目文件目录的x64文件夹中多出Release文件夹,里面的exe文件就是可执行文件,如图所示:
5.打开该可执行文件,发现程序运行后一闪而过,只需在代码最后加上system(“pause”)语句使程序运行后暂停即可
void main(int argc, char** argv)
{
const char *LOVE_SENTENCE ="Write_whatever_you_want.";
int sentenceIndex = 0;
for (int y = 0; y <= MAX_Y; y++)
{
for (int x = 0; x <= MAX_X; x++)
{
cout << (func(getY(y), getX(x)) ? getSentenceChar(LOVE_SENTENCE, sentenceIndex) : ' ');
}
cout <<endl;
}
system("pause");
}
6.默认生成的可执行文件名字就是项目的名字,这是由项目属性里配置的
【菜单栏】->【项目】->【(项目名称)属性】->【配置属性】->【常规】->【目标文件名】,默认为$(ProjectName),修改文件名之后重新生成解决方案即可
All for my beloved