C语言控制台 模拟简单的物理球摆(不小心召唤了一位故人)

C语言控制台 模拟简单的物理球摆(不小心召唤了一位故人)_第1张图片

我说这是我粗心少写了个系数召唤出来的信不信哈哈哈。

OK了,我们来了解下算法原理。

当一个球被悬挂着,给它施加一点力,它就会开始摇摆,此时俯视球的运动轨迹,你会发现和sin函数很像。

C语言控制台 模拟简单的物理球摆(不小心召唤了一位故人)_第2张图片

没错就是sin函数,但sin函数的循环范围是不变的,球的摆动幅度会慢慢变小,因为给它施加的力在逐渐消失,只要将力✖sin函数,就可以实现sin函数波随着力的消失而逐渐变小,从而模拟出球摆运动。

C语言控制台 模拟简单的物理球摆(不小心召唤了一位故人)_第3张图片

圆和按角度画线的算法可以看我主页。

#include

#include//windows:

#include

using namespace std;

class screen

{

#define PI 3.1415926

#define SCRN_W 48//屏幕宽度

#define SCRN_L 98//屏幕长度

public:

    char s[SCRN_W][SCRN_L];//屏幕

    char c='#';//用此字符绘制

    screen(char mc=' ',char fc=' ')//初始化屏幕

    {

        int x,y;

        for(x=0; x

            for(y=0; y

                s[x][y]=mc;

        for(x=0; x

            s[x][0]=s[x][SCRN_L-1]=fc;

        for(y=0; y

            s[0][y]=s[SCRN_W-1][y]=fc;

    }

    void refresh()//刷新屏幕

    {

        cout<<"\033[H\033[2J";

        for(int x=0; x

        {

            for(int y=0; y

                putchar(s[x][y]);

            cout<

        }

    }

    void line(int x1,int y1,int x2,int y2)//绘制线

    {

        float l=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));

        float xs=(x2-x1)/l,ys=(y2-y1)/l;

        for(int n=0; n<=l; n++)

            s[(int)(xs*n+x1)][(int)(ys*n+y1)]=c;

    }

    void circle(int x,int y,int r)//绘制圆

    {

        for(int l=-r; l<=r; l++)

            for(int h=-r; h<=r; h++)

                if(l*l+h*h<=r*r)

                    s[x+l][y+h*2]=c;

    }

    void angle_line(int x,int y,float a,int l)//绘制球摆

    {

        int x2=x+l*sin(a*PI/180),y2=y+l*cos(a*PI/180)*2;

        line(x,y,x2,y2);

        circle(x2,y2,5);

    }

};

int main()

{

    screen scrn;

    int x=10,y=50,l=20;

    for(float n=60; n>0; n-=0.2)

    {

        float t=n*sin(n)+90;//球摆的角度

        scrn.angle_line(x,y,t,l);

        usleep(20000);//windows:sleep(20);

        scrn.refresh();

        scrn.c=' ';

        scrn.angle_line(x,y,t,l);

        scrn.c='#';

    }

}

算法就体现在t=n*sin(n)这里,t会波动着并随n逐渐趋近于0。

windows系统运行需要改的有标注。

运行效果

C语言控制台 模拟简单的物理球摆(不小心召唤了一位故人)_第4张图片

你可能感兴趣的:(算法,c++)