三体模拟器
  • 板块灌水区
  • 楼主LSc_666
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/5/14 11:10
  • 上次更新2023/10/23 15:48:18
查看原帖
三体模拟器
957595
LSc_666楼主2023/5/14 11:10

代码:

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
int toint(float a){return ((int)(a*10+5))/10;}
void Setpos(float x,float y){COORD pos;pos.X=toint(y*2),pos.Y=toint(x);SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);}
void Color(int a)
{
    if(a==4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
    if(a==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
    if(a==2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
    if(a==3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
//    if(a==4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
//    if(a==5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
//    if(a==6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
//    if(a==7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
//    if(a==7) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_BLUE);
//    if(a==8) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);
//    if(a==9) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
//    if(a==10) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
//    if(a==11) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
}
struct node
{
    float x,y,z;
    float vx,vy,vz;
    float r,m;
    bool life;
}Sun[1000001];
void Push(int a,int b)
{
    float Ax=Sun[a].x-Sun[b].x,Ay=Sun[a].y-Sun[b].y,Dis=sqrt(Ax*Ax+Ay*Ay)*1.0;
    if(Dis<=1) return;//未撞: Dis>=Sun[a].r||Dis>=Sun[b].r||

    float ac=Sun[a].m*Sun[b].m/(Dis*Dis)*1.0,afx,afy;
    if(abs(Ax)<=1) return;//afy=ac;
    else if(abs(Ay)<=1) return;//afx=ac;
    else
    {
        float d=abs(Ax/Ay*1.0);
        afy=sqrt(ac/(1+d*d))*1.0,afx=sqrt(ac/(1+d*d))*d*1.0;
    }
    if(Ax>0) afx*=-1;if(Ay>0) afy*=-1;
    Sun[a].vx+=afx/Sun[a].m*5.0;Sun[a].vy+=afy/Sun[a].m*5.0;
    Sun[b].vx-=afx/Sun[b].m*5.0;Sun[b].vy-=afy/Sun[b].m*5.0;
}
int b,T,More=10,Speed=100;
void Move()
{
    for(int i=1;i<=b;i++)
    {
        Setpos(Sun[i].x/More*1.0,Sun[i].y/More*1.0);cout<<"  ";
        Sun[i].x+=Sun[i].vx*More/10.0;Sun[i].y+=Sun[i].vy*More/10.0;
        if(Sun[i].x>=40*More) Sun[i].x=40*More,Sun[i].vx=0;
        if(Sun[i].x<=1) Sun[i].x=1,Sun[i].vx=-0;
        if(Sun[i].y>=40*More) Sun[i].y=40*More,Sun[i].vy=0;
        if(Sun[i].y<=1) Sun[i].y=1,Sun[i].vy=0;
        Setpos(Sun[i].x/More*1.0,Sun[i].y/More*1.0);Color(i);cout<<"●";
    }
    for(int i=1;i<=b;i++)
    for(int j=i+1;j<=b;j++) Push(i,j);
}
int main()
{
    system("mode con cols=82 lines=42");
    CONSOLE_CURSOR_INFO cursor_info={1,0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
    srand((unsigned)time(NULL));

//  自己改速度与放大倍数(出界会速度清零),白的是三体行星,还有三个太阳。 

    b=4;
    Sun[1].x=20,Sun[1].y=20,Sun[1].vx=5,Sun[1].vy=10,Sun[1].m=1000;
    Sun[2].x=5,Sun[2].y=5,Sun[2].vx=1,Sun[2].vy=-5,Sun[2].m=1000;
    Sun[3].x=10,Sun[3].y=15,Sun[3].vx=10,Sun[3].vy=-9,Sun[3].m=1000;
    Sun[4].x=13,Sun[4].y=30,Sun[4].vx=1,Sun[4].vy=1,Sun[4].m=1;//改这里! 
    while(1)
    {
        T++;
        Move();
        Sleep(Speed);
    }
}
2023/5/14 11:10
加载中...