本帖最后由 灰原姐姐 于 2013-3-18 22:22 编辑
世界三:已知一质点在无穷大光滑平面上的初始位置和速度,求任意时间后其位置。(注意哦!是任意时间哦!不是确定的时间t哦!) (在此假设“任意时间”流逝速度与灰原姐姐所处的世界流速相同,step是一个较短的时间,例如1毫秒) 算法: 读入初始位置P 读入初始速度V 置初始时间为0 循环 等待时间step 读取当前时间t 输出P+V*t 搞定(这个“搞定”永远也不会执行) C语言代码: int main () { double Px,Py; // position double Vx,Vy; // velocity double t = 0.0; // time double step = 1000; // step time
scanf ("%lf%lf",&Px,&Py); // read position scanf ("%lf%lf",&Vx,&Vy); // read velocity
while (1) { sleep (step); // call os api readtime (t); // call os api printf("%lf %lf",Px+Vx*t,Py+Vy*t); // output last position }
return 0; // end } 先解释一下,sleep 以及 readtime 调用了操作系统API,分别表示睡眠一段时间、读取程序运行时间。 这两个函数都是灰原姐姐随便写的,因为不同的操作系统API不一样。 所以具体这两句怎么写是不一定的。(当然调用这两个函数之前要include相应的头文件)(这已经不是C语言的范畴了) 上面这个程序严格来讲已经不是“算法”了,因为它永远不会停机。 他会每隔一段时间(step变量所表示的时间)输出一个坐标,表示质点当前的位置。 很明显,它是一个世界,而且比“世界一”、“世界二”更像我们的世界,如果你不信,我们可以这样诠释它: int main () { // 以下6行是大爆炸 double Px,Py; // position double Vx,Vy; // velocity double t = 0.0; // time double step = 1000; // step time
scanf ("%lf%lf",&Px,&Py); // read position scanf ("%lf%lf",&Vx,&Vy); // read velocity
// 以下5行是大爆炸之后的事情 while (1) { sleep (step); // call os api readtime (t); // call os api printf("%lf %lf",Px+Vx*t,Py+Vy*t); // output last position }
// 以下1行是大坍缩 return 0; // end } 有没有,有没有!是不是跟我们的世界一模一样? 只不过“世界三”明显是开放宇宙,而我们的世界是开放的还是封闭的,我们还不知道,也等不到了。 “世界一”与“世界二”虽然有时间的概念,但本质上它们还是静态的,输入与输出简单对应。 但是“世界三”就是个动态的世界了,它会实时输出质点当前的位置。 而且,由readtime(t)函数保证,“世界三”的时间流逝速度和我们“真实”世界时间流逝速度是一致的。 如果在readtime(t)后面加一句t = t*2;那么“世界三”的速度就比我们“真实”世界快! 我们只要缩放时间变量t的值,就可以改变虚拟世界的时间流逝。
至此,我们完成了静态宇宙到动态宇宙的仿真过程。
总结世界一二三,他们有个共同的特点: 当初始条件确定时,输出就已经确定了,观察者只需要盯着屏幕看输出就可以了。 但是现实世界哪有这么简单。再举个栗子,以世界三为基础,稍微复杂一点。
|