36分 庞加莱表示心碎
查看原帖
36分 庞加莱表示心碎
184055
Beyond616楼主2020/11/6 11:47
constexpr auto G = 6.67408e-11;
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <cstring>
#pragma warning (disable:4996)
template<typename T>
constexpr auto empty(T &a) { return memset(a,0,sizeof a); }
#define ld double
constexpr auto N = 32;
constexpr auto dt = 0.01;
using namespace std;
ld xa[N], ya[N], za[N], xv[N], yv[N], zv[N], x[N], y[N], z[N], m[N], dx, dy, dz, l, t;
int n, Time, T;
void updataF(int s1, int s2)
{
	if (s1 == s2) return;
	//	printf("a");
	ld F=0.0;
	dx = x[s2] - x[s1];
	dy = y[s2] - y[s1];
	dz = z[s2] - z[s1];
	l = sqrt(dx * dx + dy * dy + dz * dz);
//	if (abs(l) <= 1e-7) return;
	F = G * m[s2] / l / l;
	//	printf("l:%Lf\n",l);
	xa[s1] += dx * 1.0 / l * F;
	ya[s1] += dy * 1.0 / l * F;
	za[s1] += dz * 1.0 / l * F;
}
void updatatime()
{
//	printf("time:%d\n", Time);
	for (int i = 1; i <= n; ++i)
		xa[i] = ya[i] = za[i] = 0.0;
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= n; ++j)
			updataF(i, j);
	for (int i = 1; i <= n; ++i)
	{
		x[i] += xv[i] * dt;
		y[i] += yv[i] * dt;
		z[i] += zv[i] * dt;
		xv[i] += xa[i] * dt;
		yv[i] += ya[i] * dt;
		zv[i] += za[i] * dt;
	}
	//	printf("%Lf %Lf %Lf\n",x[1],y[1],z[1]);
	Time += 1;
//	for (int i = 1; i <= n; ++i)
//		printf("%Lf %Lf %Lf\n", x[i], y[i], z[i]);
	//	printf("%d<=%d\n",time,T);
}
int main()
{
	scanf("%d%lf", &n, &t);
	T = (int)(t * 100);
	for (int i = 1; i <= n; ++i)
		scanf("%lf%lf%lf%lf%lf%lf%lf", &x[i], &y[i], &z[i], &m[i], &xv[i], &yv[i], &zv[i]);
	Time = 0;
	while (Time < T) updatatime();
	for (int i = 1; i <= n; ++i)
		printf("%.12lf %.12lf %.12lf\n", x[i], y[i], z[i]);
	return EXIT_SUCCESS;
}
2020/11/6 11:47
加载中...