# simulator **Repository Path**: hou-yunren/simulator ## Basic Information - **Project Name**: simulator - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-02 - **Last Updated**: 2026-10-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目名 simulator.exe是一个基于开普勒二体运动模型模拟纸世界天体运动规律的天文模拟器。 通过输入时间和地球经纬度,可以输出一张实时星图,包含太阳、月亮、中心引力源的位置。 ## 简介 模拟器中内置一套天体运动模型的初始状态参量。规定: 在希拉哥世1年1月1日0时0分0秒,太阳运行到轨道远心点,地球运行春分点。 基本坐标系:以春分点方向为x轴,以黄极为z轴。 centre_sun系统,以中心引力源为原点的基本坐标系: - 太阳和中心引力源运动的不变平面与黄道的夹角为0.523599弧度。 - 升交点经度为2.234021弧度。 - 近心点辐角为0.907571弧度。 - 其余轨道根数参考get_vector.cpp sun_earth系统,以太阳为原点的基本坐标系: - 地球和太阳运动的不变平面与黄道的夹角为0弧度。 - 近心点经度为1.7966弧度,即设升交点经度为0弧度,近心点辐角为1.7966弧度。 - 其余轨道根数参考get_vector.cpp earth_moon系统,以地球为原点的基本坐标系: - 月球和地球运动的不变平面与黄道的夹角为0.089533弧度。 - 升交点经度为2.182440弧度。 - 近心点辐角为5.555535弧度。 - 其余轨道根数参考get_vector.cpp ## 功能 - 单点输出星图 - 连续时间段输出星图 - 日出日落/月出月落预测 - 日食月食预测 ## 联系方式 - 作者:希羽岚梦 - 邮箱:3527899915@qq.com # 采样表达式输入说明 ## 基本概念 - **变量 `i`**:帧序号,从 0 开始。 - **表达式结果**:下一帧与当前帧的间隔秒数,必须是正数。 ## 支持的符号 | 类型 | 符号 | 说明 | |-------|------------------------------|-----------------------------| | 运算符 | `+` `-` `*` `/` `^` `( )` | 加减乘除、幂、括号 | | 常量 | `PI` | 圆周率 3.14159... | | 函数 | `sin(x)` `cos(x)` | 正弦、余弦,x 为弧度,必须带括号 | | 变量 | `i` | 当前帧序号(0,1,2,...) | ## 常用示例 - 固定间隔:`86400`(每天一次) - 月亮日:`89400`(24h50m) - 朔望月:`2551443` - 递进采样:`86400 + 60*i`(每次多 1 分钟) - 周期调制:`86400 + 3600*sin(2*PI*i/365)` ## 错误写法 - `sin 5`(函数必须带括号) - `2PI`(乘号不能省略,应写 `2*PI`) - `86400+`(缺少操作数) - 结果为负数或 0(会被程序拦截) ## 提示 - 空格可随意添加,不影响结果。 - 表达式越简单越好,能用常数就别写复杂公式。 # Hurraeogon (天文台) v1.0 Beta 一个基于 C++ 和 OpenCV 的天文模拟与天象预报系统。 Hurraeogon 结合了天体力学计算、自定义奇幻历法,能够实现星图绘制、星轨生成、天象(日食、月食、日出日落等)扫描预报,以及日期名称的互相转换。 ## 🌟 主要功能 * **0:星图星轨计算** * **单点星图**:输入单点时间,绘制太阳、月亮及中心引力源在天空中的具体位置。 * **星轨生成**:输入时间段和自定义采样表达式(支持变量 `i`、`PI`、四则运算及 `sin`/`cos`),生成天体运动轨迹。 * **导出模式**: * 非逐帧导出:直接生成一张完整的星轨叠加图。 * 逐帧导出:支持“每帧独立”或“后一帧叠加在前一帧”两种模式,适合制作延时动画。 * **1:天象预报** * 支持按固定时间范围扫描,或直接扫描至“世界末日”(系统设定的极限时间)。 * 支持筛选特定天象:日全食(`tse`)、日偏食(`pse`)、日环食(`ase`)、月全食(`tle`)、月偏食(`ple`)、半影月食(`pele`)、日出(`sr`)、日落(`ss`)、月出(`mr`)、月落(`ms`)。 * 扫描过程中支持按 `ESC` 键随时中断。 * **2:日期名称转换** * 支持数字日期与奇幻历法名称(如“冬月”、“灵苏月”、“夏月”等)的双向转换。 ## 📁 项目结构 * `main.cpp`:程序入口。负责用户交互菜单、命令解析、天象扫描调度及星图/星轨的流程控制。 * `get_vector.cpp`:核心物理引擎。包含开普勒方程求解 (`solveKepler`)、坐标旋转矩阵 (`computePQ`)、地心黄道系到地平坐标系的转换 (`toHorizon`),以及各类天象的判定算法(如日食、月食、升落)。 * `solve_time.cpp`:时间与历法模块。包含自定义历法的天数计算 (`zeller`)、世界时到恒星时的转换 (`LST`)、时间反推日期 (`t_to_date`),以及庞大的日期名称/月份映射表。 * `output.cpp`:图形渲染模块。基于 OpenCV 绘制底图、星体(实心/空心圆)、方位标记,并负责图片的保存与逐帧导出。 * `expr.cpp`:简易的数学表达式解析器。用于解析用户输入的星轨帧间隔表达式。 * 头文件:`expr.h`, `get_vector.h`, `output.h`, `solve_time.h` 对应上述模块的声明与 `elements` 结构体的定义。 ## 🛠️ 编译与依赖 * **开发环境**:Visual Studio(参考截图中的解决方案结构)。 * **依赖库**:[OpenCV](https://opencv.org/)(需配置好包含目录和库目录)。 * **C++ 标准**:建议 C++11 或更高(使用了 ``、`` 等特性)。 * **平台特性**:代码包含 `#ifdef _WIN32` 下的 `_kbhit()` 和 `_getch()`,用于在 Windows 控制台中监听 ESC 键,跨平台编译需注意修改。 ## 🚀 快速开始 1. 使用 Visual Studio 打开解决方案 `Simulator.sln`。 2. 确保已正确配置 OpenCV 的附加依赖项。 3. 编译运行项目。 4. 在控制台按照提示输入时代号(1-18)、年份(1-400)、月份(1-12)等信息。 5. 底图文件(`star_map_base_4096.png` 和 `star_map_base_1024.png`)需要提前通过 `draw_base()` 函数生成,或者自行提供在项目根目录下。 ## ⚠️ 注意事项 * **硬编码路径**:代码中部分保存路径硬编码为 `C:\\Users\\Lenovo\\Desktop\\`,请根据你的实际环境修改 `main.cpp` 中的保存路径,或使用 `output.cpp` 中相应的自定义文件名逻辑。 * **控制台颜色**:程序使用了 ANSI 转义序列(如 `\033[31m`)输出彩色文字。在旧版 Windows CMD 中可能无法正常显示,建议在 **Windows Terminal** 或 **PowerShell** 中运行以获得最佳色彩体验。 * **历法系统**:本程序不使用格里高利历(公历),而是采用了一套自定义的历法(1-18个时代,每时代400年,每年12个月,大小月规则已在 `checkDate` 和 `t_to_date` 中明确设定)。8、9、10、11、12月的天数分别为30、31、30、31、31天。 * **物理引擎**:底层使用开普勒轨道根数(`elements`)进行二体问题模拟,并通过旋转矩阵计算位置。包含月球升交点西退(`dOmega`)和近心点东进(`dw`)的长期摄动项。 ## 📝 待办事项 / 已知问题 * [ ] `probeYearLengths()` 和 `probeHourAngle()` 目前为测试性函数,会输出大量的调试信息,可在正式使用时注释掉。 * [ ] 部分天象判定(如日食、月食)未加入视差修正(Topocentric Correction)的精细模型,采用的是地心视角的近似计算。 ## 📄 开源协议 本项目仅供学习和研究使用。请遵循相关开源协议(若有)。