这里将以万有引力和势能动能守恒定律为基础,实现行星运动轨迹.然后再假设有两个固定的恒星,让行星在这两个恒星的力场中运动(这是三体问题的一种噢).前面我写过关于混沌曲线的文章:混沌数学及其软件模拟.这类混沌曲线的本质是一个导数方程,即我不知道这条曲线是什么样子,也不知道这条曲线最终通往何处去,我只知道,曲线上的任意一点的切线方向,从而得到它下一点的位置.从而得到整条曲线上的顶点位置.学过物理的人都知道,太阳系中行星的运动轨迹大致是一个椭圆,我们可以知道每个行星的椭圆方程.记得我刚学图形学时,就看过一个程序是太阳行星运动.但它不是以万有引力为基础的,只是让球体绕着固定的椭圆轨迹旋转.

本来我只打算使用万有引力定律,没有考虑势能动能守恒定律.但程序运行后发现,由于没有使用微积分,即使采样间隔时间再小,误差也很大.其实目前的算法误差也不小,呵呵,模拟一下吧,不要太计较.

先帖下基类代码,这代码与混沌数学及其软件模拟中的很相似,即是一个导数方程,用于由当前点计算下一点.

class DifferentiationFunction
{
public:virtual void Differentiate(float x, float y, float z, float t,float& outX, float& outY, float& outZ) = NULL;virtual float GetExtendT() const = NULL;virtual float GetStartX() const{return 0.0f;}virtual float GetStartY() const{return 0.0f;}virtual float GetStartZ() const{return 0.0f;}
};

行星方程:

// 行星的导数曲线
class Planet : public DifferentiationFunction
{
public:Planet(){m_star_weight = 1.0f;m_planet_x = 5.0f;m_planet_y = 8.0f;m_planet_z = 1.0f;m_planet_weight = 0.1f;m_planet_speed_x = 4.0f;m_planet_speed_y = 0.0f;m_planet_speed_z = 0.0f;m_g = 100.0f;m_ek = 0.5f*m_planet_weight*(m_planet_speed_x*m_planet_speed_x + m_planet_speed_y*m_planet_speed_y + m_planet_speed_z*m_planet_speed_z); // 1/2*m*v*vfloat r = sqrt(m_planet_x*m_planet_x + m_planet_y*m_planet_y + m_planet_z*m_planet_z);m_ep = -/*0.5f**/m_g*m_star_weight*m_planet_weight/r;m_e = m_ek + m_ep;}void Differentiate(float x, float y, float z, float t,float& outX, float& outY, float& outZ){t = t*10.0f;float sqd = x*x + y*y + z*z;float d = sqrt(sqd);float a = m_g*m_star_weight/sqd;float ax = -a*x/d;float ay = -a*y/d;float az = -a*z/d;outX = x + m_planet_speed_x*t + 0.5f*ax*t*t;outY = y + m_planet_speed_y*t + 0.5f*ay*t*t;outZ = z + m_planet_speed_z*t + 0.5f*az*t*t;m_planet_speed_x += ax*t;m_planet_speed_y += ay*t;m_planet_speed_z += az*t;float r = sqrt(outX*outX + outY*outY + outZ*outZ);m_ep = -/*0.5f**/m_g*m_star_weight*m_planet_weight/r;m_ek = m_e - m_ep;if (m_ek < 0.0f){m_ek = 0.0f;}float v = sqrt(2*m_ek/m_planet_weight);float w = sqrt(m_planet_speed_x*m_planet_speed_x + m_planet_speed_y*m_planet_speed_y + m_planet_speed_z*m_planet_speed_z);m_planet_speed_x *= v/w;m_planet_speed_y *= v/w;m_planet_speed_z *= v/w;}float GetExtendT() const{return 20.0f;}float GetStartX() const{return m_planet_x;}float GetStartY() const{return m_planet_y;}float GetStartZ() const{return m_planet_z;}public:float m_star_weight;float m_planet_x;float m_planet_y;float m_planet_z;float m_planet_weight;float m_planet_speed_x;float m_planet_speed_y;float m_planet_speed_z;float m_g;      // 万有引力系数float m_e;float m_ek;     // 动能float m_ep;     // 引力势能
};

行星在这两个恒星的力场中运动(三体问题)

// 三体问题的导数曲线
class ThreeBody : public DifferentiationFunction
{
public:ThreeBody(){m_star1_x = -10.0f;m_star1_y = 0.0f;m_star1_z = 0.0f;m_star1_weight = 1.0f;m_star2_x = 10.0f;m_star2_y = 0.0f;m_star2_z = 0.0f;m_star2_weight = 1.0f;m_planet_x = 5.0f;m_planet_y = 5.0f;m_planet_z = 0.1f;m_planet_weight = 0.1f;m_planet_speed_x = 0.0f;m_planet_speed_y = 2.0f;m_planet_speed_z = 0.0f;m_g = 50.0f;m_ek = 0.5f*m_planet_weight*(m_planet_speed_x*m_planet_speed_x + m_planet_speed_y*m_planet_speed_y + m_planet_speed_z*m_planet_speed_z); // 1/2*m*v*vfloat d1x = m_star1_x - m_planet_x;float d1y = m_star1_y - m_planet_y;float d1z = m_star1_z - m_planet_z;float sqd1 = d1x*d1x + d1y*d1y + d1z*d1z;float d1 = sqrt(sqd1);m_ep1 = -m_g*m_star1_weight*m_planet_weight/d1;float d2x = m_star2_x - m_planet_x;float d2y = m_star2_y - m_planet_y;float d2z = m_star2_z - m_planet_z;float sqd2 = d2x*d2x + d2y*d2y + d2z*d2z;float d2 = sqrt(sqd2);m_ep2 = -m_g*m_star2_weight*m_planet_weight/d2;m_e = m_ek + m_ep1 + m_ep2;}void Differentiate(float x, float y, float z, float t,float& outX, float& outY, float& outZ){t = t*20.0f;float d1x = m_star1_x - x;float d1y = m_star1_y - y;float d1z = m_star1_z - z;float sqd1 = d1x*d1x + d1y*d1y + d1z*d1z;float d1 = sqrt(sqd1);float d2x = m_star2_x - x;float d2y = m_star2_y - y;float d2z = m_star2_z - z;float sqd2 = d2x*d2x + d2y*d2y + d2z*d2z;float d2 = sqrt(sqd2);float a1 = m_g*m_star1_weight/sqd1;float a1x = a1*d1x/d1;float a1y = a1*d1y/d1;float a1z = a1*d1z/d1;float a2 = m_g*m_star2_weight/sqd2;float a2x = a2*d2x/d2;float a2y = a2*d2y/d2;float a2z = a2*d2z/d2;outX = x + m_planet_speed_x*t + 0.5f*(a1x + a2x)*t*t;outY = y + m_planet_speed_y*t + 0.5f*(a1y + a2y)*t*t;outZ = z + m_planet_speed_z*t + 0.5f*(a1z + a2z)*t*t;m_planet_speed_x += (a1x + a2x)*t;m_planet_speed_y += (a1y + a2y)*t;m_planet_speed_z += (a1z + a2z)*t;{float d1x = m_star1_x - outX;float d1y = m_star1_y - outY;float d1z = m_star1_z - outZ;float sqd1 = d1x*d1x + d1y*d1y + d1z*d1z;float d1 = sqrt(sqd1);m_ep1 = -m_g*m_star1_weight*m_planet_weight/d1;float d2x = m_star2_x - outX;float d2y = m_star2_y - outY;float d2z = m_star2_z - outZ;float sqd2 = d2x*d2x + d2y*d2y + d2z*d2z;float d2 = sqrt(sqd2);m_ep2 = -m_g*m_star2_weight*m_planet_weight/d2;m_ek = m_e - m_ep1 - m_ep2;if (m_ek < 0.0f){m_ek = 0.0f;}float v = sqrt(2*m_ek/m_planet_weight);float w = sqrt(m_planet_speed_x*m_planet_speed_x + m_planet_speed_y*m_planet_speed_y + m_planet_speed_z*m_planet_speed_z);m_planet_speed_x *= v/w;m_planet_speed_y *= v/w;m_planet_speed_z *= v/w;}}float GetExtendT() const{return 20.0f;}float GetStartX() const{return m_planet_x;}float GetStartY() const{return m_planet_y;}float GetStartZ() const{return m_planet_z;}public:float m_star1_x;float m_star1_y;float m_star1_z;float m_star1_weight;float m_star2_x;float m_star2_y;float m_star2_z;float m_star2_weight;float m_planet_x;float m_planet_y;float m_planet_z;float m_planet_weight;float m_planet_speed_x;float m_planet_speed_y;float m_planet_speed_z;float m_g;      // 万有引力系数float m_e;float m_ek;     // 动能float m_ep1;    // 引力势能float m_ep2;    // 引力势能
};

这是我写的测试程序,写它是为下一步的三体模拟软件做准备.下篇文章更精彩:三体运动的程序模拟

行星运动轨迹的程序实现相关推荐

  1. 行星轨迹制作_行星运动轨迹的程序实现

    //三体问题的导数曲线 class ThreeBody : publicDifferentiationFunction {public: ThreeBody() { m_star1_x= -10.0f ...

  2. matlab行星运动轨迹仿真动画,利用Matlab可视化功能实现微分方程求解行星运动轨迹...

    利用Matlab可视化功能实现微分方程求解行星运动轨迹 1.背景 在物理学璀璨的发展史上,物理学家花了很长时间研究我们头顶浩瀚的星空,试图探究星星的运行模式,以及地球自身的运动模式.其中不乏像亚里士多 ...

  3. html5 运动轨迹绘画,html5 canvas行星运动轨迹动画特效

    特效描述:html5 canvas 行星运动 轨迹动画特效.html5运动轨迹,行星动画特效 代码结构 1. 引入JS 2. HTML代码 Your browser doesn't support c ...

  4. 《流浪地球》程序员破解行星发动机到底靠不靠谱

    文 | 李勤 来源:雷锋网(leiphone-sz)报道 不好意思,又要蹭个热点了. 当我走进电影院,看见程序员李一一说要破解行星发动机的程序,替换成"春节十二响"那一刻,我就知道 ...

  5. 【Processing】行走的行星 动态海报 processing艺术与科技

    一个有趣的行星场景.程序中包含了粒子.星星.陨石.行星和卫星等元素.代码中导入了所需的库,设置了窗口大小,并创建了粒子和星星数组.陨石的数量.位置.速度.颜色和火焰的颜色和透明度等参数也被设置.在 d ...

  6. 一种实现人工智能程序自进化的概念原理

    本文主要论述六点: 1.能自我学习.自我控制.自我进化(此进化内涵更接近拉马克式自体进化,而非达尔文式代际进化)的信息处理控制能力就叫智能:(从动态式模式的角度定义智能内涵,而非从静态式功能的角度定义 ...

  7. 150行Python代码模拟太阳系行星运转

    今天我们用Python来模拟一下太阳系行星运动轨迹玩玩~ 先上成品图(运行效果含音乐的呦) 想要实现这样的效果并不难 1.准备材料 首先我们需要准备这样一些材料 宇宙背景图 背景透明的行星图 2:编写 ...

  8. fft的c语言和matlab对比_Matlab在绘制两相互垂直斜锯齿振动与简谐振动合成运动轨迹图形的应用...

    1 提出问题 在振动学中,相互垂直的两简谐振动合成时,如果两简谐振动的频率相同,则可形成稳定的椭圆曲线,极端条件为圆和直线:而当两相互垂直的简谐振动频率不同时,合成运动比较复杂,其运动轨迹一般不闭合, ...

  9. c语言输出三行星,C语言大作业观察行星的运行报告(16页)-原创力文档

    程序设计挑战式课程设计报告 - PAGE 15 - 作业名称: 观察行星的运行 学 院: 教育实验学院 班 级: HC001505 学 号: 2015300074 姓 名: 祖陆晗 团队组成: 祖陆晗 ...

最新文章

  1. Word 2013无法发布文章到博客园
  2. P3373 【模板】线段树 2
  3. cas 连接oracle,Oracle 生成系统数据导入测试系统及smarteam 连接更改
  4. VB中Unicode vs Ansi-From alpsong(阿尔卑斯之歌)
  5. 【Linux】一步一步学Linux——login命令(210)
  6. 上传文件Base64格式(React)
  7. Vue项目中自动将px转换为rem
  8. 从0到1:Python爬虫知识点梳理
  9. 鸿蒙轻内核源码分析:MMU协处理器
  10. 当打开VS2013卡到吐,并且点一下卡一下
  11. ArchLinux On Win10
  12. python和c 的区别-Python与C语言的区别
  13. 最好用的三款软件,满足你对截图的所有需求!
  14. dex2jar .\classes.dex - .\classes-dex2jar.jar com.googlecode.d2j.DexException: not support version
  15. wireshark密码嗅探侵入后台管理系统
  16. M0、M1、M2、M3
  17. 1068 Find More Coins (30分)
  18. Alpha 冲刺(6/10)
  19. Linux Python 导航目录
  20. 宝可梦合体再次流行?Pokemon Fusion的技术实现

热门文章

  1. codeforces 1567 A. Domino Disaster
  2. auto.js B0013 查找父控件子控件进入阅读文章视频学习每日答题2021-10-03
  3. 专业办公套件(Office 2019)for Mac
  4. 用计算机唱歌 丑八怪乐谱,《成都》计算器谱子 抖音计算器按出的音乐乐谱大全...
  5. 聚美优品启动上市,真的那么赚钱吗?
  6. 表情符号(emoji)大全,只此一文便够了
  7. Android P 正式到来
  8. 各大EMM厂商功能比较 第三部分 Network Gateway比较
  9. 微信营销KPI考核标准有哪些?
  10. python自定义二元一次函数_Python实现的拟合二元一次函数功能示例【基于scipy模块】...