搞老久,然后就实现了。
以下文字需要些许天文基础和程序基础~。
一、准备数据:
5等以上星表,M天体星表,EXCEL整整,弄到TXT,丢到主控板的TF卡~(估计以后需要丢到SPI FLASH,TF感觉弄起来速度不快的样子)
星表包含信息:
RA,DEC,Magnitude,
M天体:RA,DEC,对于星等无所谓。
星座连线信息:
这里参考PP3的开源软件里边的一个dat文件,找得半死,自己不想整理这些连线,太多了!
然后耗时一天修修改改,最后用EXCEL转换成自己需要的数据。
最后体现出来的是一系列的数字序号,搞成CONST数组丢到单片机ROM去了,再弄TF卡那更XX慢了~
星座名称信息:
这个啊,直接按照星座英文简写,还有定义了下文中提到的一个“星座管理结构体”,直接指定在每个星座的α星旁边把星座名称显示出来。
二、程序准备:
1、星点绘图结构体,星座管理结构体
typedef struct _ConsDef
{
unsigned char Cname[3];
unsigned short Cnumber;
}Constellation;
//这个上文提到了,Cname是星座英文简写,很明显,这是3个字符的字符串哦也。
//Cnumber呢,是这个星座的α星在我整理的星表里边的序号。数据都XX大,不贴出来,有兴趣可以找我要。
/*
星等规约 Magi的规定:(涉及画点的大小)
4等为0,
3等为1,
2等为2,
1等为3,
0等为4,
-1等为5,
*/
typedef struct _Draw
{
signed short DDX;
signed short DDY;
signed char Magi; //星等
}StarDraw;
DDX: 赤平投影后的星点平面横坐标
DDY: 赤平投影后的星点平面纵坐标
2、极射赤平投影计算函数,用来实现三维到二维变换。 这里参考了国内某期刊老旧的文件,自己分析了下。
//单点极射赤平投影计算,计算对象单位:弧度
MapStar* Stereographic(MapStar* star)
{
static MapStar pr_star;
float Long1,Lat1,
Sin1,Sin2,Sin3,Cos1,Cos2,Cos3,
K;
Long1 = 0.0;//SysCoordinate.longitude;//这个结构体用来管理地理经纬度,海拔高度
Lat1 = 0.0//SysCoordinate.latitude;
star->X = star->X*PI/180.0;
star->Y = star->Y*PI/180.0;
Sin1 = arm_sin_f32(Lat1);
// 这类arm_sin_f32类似的函数是ARM_MATH的LIB文件提供的,使用时必须包含头文件,对于F4这涉及FPU的使用
Sin2 = arm_sin_f32(star->Y);
Sin3 = arm_sin_f32(star->X - Long1);
Cos1 = arm_cos_f32(Lat1);
Cos2 = arm_cos_f32(star->Y);
Cos3 = arm_cos_f32(star->X - Long1);
K = 2 / (1 + Sin1*Sin2 + Cos1*Cos2*Cos3);
pr_star.X = K*Radius*Cos2*Sin3;
pr_star.Y = K*Radius*(Cos1*Sin2 - Sin1*Cos2*Cos3);
return &pr_star;
}
3、实时恒星时计算//这里参考stellarium 的程序,直接COPY使用了,二话不说啊!自己没演算过。
Sidereal_def Sidereal_time; //实时恒星时
extern Obliquity_def Obliquity;
extern Nutation_def Nutation_cal;
//function:
//Get the Sidereal_Time on xxx longitude
//平恒星时
void Mean_Sidereal_Time(double longitude,double JD)
{
double T,s,num;
T = (JD - 2451545.0) / 36525.0;
s = 280.46061837 + (360.98564736629 * (JD - 2451545.0)) + (0.000387933 * T * T) - (T * T * T / 38710000.0);
num = s + longitude;
Sidereal_time.mean_sidereal_time = fmod(num,360)/15.0;
//return lms;
}
//真恒星时
void Apparent_Sidereal_Time(void)
{
double correction = 0.0;
correction = Nutation_cal.nl * arm_cos_f32(Obliquity.apparent_obliquity*PI/180.0);
Sidereal_time.apparent_sidereal_time = (Sidereal_time.mean_sidereal_time*15.0 + correction)/15.0;
}
平恒星时和真恒星时,算了一下后发现相差很小,于是无所谓了。对于星图显示,超级无所谓。
4、GUI界面:ucGUI
程序啥子就不能贴了,不可能贴得出来的,太多。。。
本来想自己写一下GUI来弄星图界面,但是当时发现超级麻烦的,太头大了。其实现在想一下,是可以实现的,就是那些窗口重绘什么比较麻烦,大概需要参考下ucGUI的核心代码部分。
5、星点绘制
程序比较多了,不想贴也不能贴。
思路:
读星点数据->赤平投影变换->根据星点坐标和星等大小打点。M天体打点的时候用了黄色,大小都相等,以示区分
6、星座连线绘制
读星座连线数组->指定到赤平投影后的星点->画直线。
7、星座名称显示
读星座结构体->指定到赤平投影后的星点->显示字符串、
8、
看实际效果么:
单纯画星点效果:
这个是一个礼拜前的结果。
赤平投影的时候选择的天球半径为400
这个有所不同了,这个是这个星期的最后结果了
黄色的点是M天体,星座名称有,星点连线也有。。。赤平投影所用半径为200
完
|
|