中华农历论坛知识讨论区历法知识 → Swiss Ephemeris 应用程序编程接口(1)


  共有40408人关注过本帖树形打印

主题:Swiss Ephemeris 应用程序编程接口(1)

帅哥哟,离线,有人找我吗?
hero_hacker
  11楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:56 积分:682 威望:0 精华:1 注册:2010/8/12 21:56:00
  发帖心情 Post By:2016/9/26 11:22:00


8. Delta T 相关函数
/* delta t 来自儒略日数 */
double swe_deltat_ex(double tjd, int32 ephe_flag, char *serr);
/* delta t 来自儒略日数 */
double swe_deltat(double tjd);
/* 得到用于 swe_deltat() 的潮汐加速度 */
double swe_get_tid_acc(void);
/* 设置用于 swe_deltat() 的潮汐加速度 */
void swe_set_tid_acc(double t_acc);
/* 设置由 swe_deltat() 返回的固定 Delta T 值 */
void swe_set_delta_t_userdef (double t_acc);

你从出生日期计算的儒略日数, 将是世界时 (UT,  以前的 GMT) 并可用于计算恒星时间和宫位. 然而, 对于行星和其它因素, 你必须转换 UT 到 历书时 (ET):
8.1 swe_deltat_ex()
tjde = tjd + swe_deltat_ex(tjd, ephe_flag, serr); 
         where tjd = 儒略日 in UT, tjde = in ET
ephe_flag = 星历标志 (SEFLG_SWIEPH, SEFLG_JPLEPH, SEFLG_MOSEPH 其中之一)
serr = 警告信息的串指针.

如果函数在调用 swe_set_ephe_path() 之前用 SEFLG_SWIEPH 标志调用, 或在调用 swe_set_jpl_file() 之前用 SEFLG_JPLEPH 标志调用, 则函数返回一个警告.

UT 中星历的计算取决于 Delta T, 它取决于月亮的潮汐加速度在星历表内的值. 函数 swe_deltat_ex() 可以提供来源于星历的 Delta T 值并因此比老的函数 swe_deltat() 更好, 老的函数用不确定的猜测以确定使用的是什么星历. 因此它会作出一个警告:

我们不建议混合使用新旧星历文件 sepl*.se1, semo*.se1, seas*.se1, 因为旧的文件是基于 JPL 星历 DE406, 新的则是基于 DE431, 而且两个星历具有不同的月球潮汐加速度. 混合使用新旧星历文件可能导致不一致的星历表输出. 与新的一起使用旧的小行星文件se99999.se1, 是可以忍受的.

8.2 swe_deltat()
tjde = tjd + swe_deltat(tjd); 其中 tjd = 儒略日 in UT, tjde = in ET

此函数仅在以下情况下是安全的
- 如果你的程序总是使用相同的星历标志
- 如果你的程序总是使用相同的星历文件(使用 SEFLG_SWIEPH 和 SEFLG_MOSEPH)
- 如果你第一次调用swe_set_ephe_path() (使用 SEFLG_SWIEPH) 和 swe_set_jpl_file() (使用 SEFLG_JPLEPH)

(另外,如果你第一次用你想要的潮汐加速度来调用 swe_set_tid_acc(),这是安全的. 然而, 请不要使用此函数,非除你真的知道你在做什么.)

为最佳控制返回的值, 使用函数 swe_deltat_ex() 代替 (参见上面的8.1).

UT 中星历的计算取决于 Delta T, 它取决于月亮的潮汐加速度在星历表内的值. 在默认模式下, 函数 swe_deltat() 自动尝试查找要求的值. 不过它会作出两次警告:

1. 我们不建议混合使用新旧星历文件 sepl*.se1, semo*.se1, seas*.se1, 因为旧的文件是基于 JPL 星历 DE406, 新的则是基于 DE431, 而且两个星历具有不同的月球潮汐加速度. 混合使用新旧星历文件可能导致不一致的星历表输出. 与新的一起使用旧的小行星文件se99999.se1, 是可以忍受的.

2. 函数 swe_deltat() 使用默认的潮汐加速度值 (DE431 的). 然而, 在调用了一些老的星历后, 如莫希尔星历, DE200, 或 DE406, swe_deltat() 可能提供稍微不同的值.

在这两点相关的麻烦的情况下, 我们建议
- 要么使用函数 swe_deltat_ex(),
- 要么用函数 swe_set_tid_acc() 和 swe_get_tid_acc() 来控制潮汐加速度的值.

8.3 swe_set_tid_acc(), swe_get_tid_acc()
Swiss Ephemeris 版本直到1.80, 如果使用了像 DE200 或 DE421这样的非标准的星历,此函数总是被使用.
从 Swiss Ephemeris 版本 2.00 起, 通常不再需要此函数了, 因为值是根据选择或可用的星历文件而自动设定. 但是, 在某些 “8.1 swe_deltat()” 节中描述的情况下, 用户可能想要自己控制潮汐加速度.  

要找出当前使用的潮汐加速度的值, 调用函数
acceleration = swe_get_tidacc();

为了设置一个不同的值, 使用函数
swe_set_tid_acc(acceleration);  

acceleration 可以具有的值在文件 swephexp.h 中列出(例如 SE_TIDAL_200, 等.)

一但调用了函数 swe_set_tid_acc(), 潮汐加速度的自动设置就被锁定. 为了再次解锁它, 调用
swe_set_tid_acc(SE_TIDAL_AUTOMATIC);  

8.4. swe_set_delta_t_userdef()
此函数允许用户设置一个固定的,将由 swe_deltat() 或 swe_deltat_ex() 返回的 Delta T 值.
相同的 Delta T 值然后将被使用于 swe_calc_ut(), 食函数, 偕函数, 以及所有要求输入时间为 UT 的函数.
为了返回一个自动的 Delta T, 用以下值调用此函数:
swe_set_delta_t_userdef(SE_DELTAT_AUTOMATIC);  

8.4. Delta T 的未将来更新和文件 swe_deltat.txt
Delta T 未来几年的值只能估计. 严格的说, 瑞士星历表必须每年在过去一年的新 Delta T 值由 IERS 公布后更新. 我们将尽我们所能,希望瑞士星历每年更新. 但是, 如果用户不想等待我们的更新或不想下载一个新版本的瑞士星历表, 他可以在位于瑞士星历表路径中的文件 swe_deltat.txt 中添加新的 Delta T 值.
# 该文件允许生成新的、Swiss Ephemeris 知道的 Delta T.
# 注意, 这些值覆盖内部的 Swiss Ephemeris 的 Delta T
# 格式: 年和秒(十进制数)
2003 64.47
2004 65.80
2005 66.00
2006 67.00
2007 68.00
2008 68.00
2009 69.00


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hero_hacker
  12楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:56 积分:682 威望:0 精华:1 注册:2010/8/12 21:56:00
  发帖心情 Post By:2016/9/26 11:24:00


9. 函数 swe_set_topo() 关于天体行星的位置
void swe_set_topo(double geolon, double geolat, double altitude);
   /* 3 元素双精度数组 包含地理经度, 纬度, 海拔高度.
     * 东经为正,
    * 西经为负,
    * 北纬为正,
    * 南纬为负 */

此函数在计算某个出生地点的地面点的行星位置之前调用. 它告诉 Swiss Ephemeris,使用什么地理位置. 地理经度 geolon 和纬度 geolat 的单位必须为角度,海拔高度单位必须是米. 忽略高度会造致月亮在3000米高时大约 2 角秒 的错误结果. 在调用 swe_set_topo() 之后, 添加 SEFLG_TOPOCTR 到 iflag 并调用 swe_calc() 作为普通计算. 例如:

swe_set_topo(geo_lon, geo_lat, altitude_above_sea);
iflag | = SEFLG_TOPOCTR;

for (i = 0; i < NPLANETS; i++) {
  iflgret = swe_calc( tjd, ipl, iflag, xp, serr );
  printf(”%f\n”, xp[0]);


由 swe_set_topo() 设置的参数, 不受 swe_close() 影响.

10. 恒星模式函数
10.1. swe_set_sid_mode()
void swe_set_sid_mode (int32 sid_mode, double t0, double ayan_t0);

此函数可用于指定恒星计算模式.
swe_calc() 或 swe_fixstar() 然后可以用 SEFLG_SIDEREAL 标志调用SEFLG_SIDEREAL.
如果没有调用 swe_set_sid_mode(), 就使用默认的岁差 (费根/布拉德雷).
如果需要一个预定义的模式, 变量 sid_mode 必须设置, 此时不考虑 t0 和 ayan_t0, 即可以为0. 预定义的恒星模式是:

#define SE_SIDM_FAGAN_BRADLEY     0
#define SE_SIDM_LAHIRI            1
#define SE_SIDM_DELUCE            2
#define SE_SIDM_RAMAN             3
#define SE_SIDM_USHASHASHI        4
#define SE_SIDM_KRISHNAMURTI      5
#define SE_SIDM_DJWHAL_KHUL       6
#define SE_SIDM_YUKTESHWAR        7
#define SE_SIDM_JN_BHASIN         8
#define SE_SIDM_BABYL_KUGLER1     9
#define SE_SIDM_BABYL_KUGLER2    10
#define SE_SIDM_BABYL_KUGLER3    11
#define SE_SIDM_BABYL_HUBER     12
#define SE_SIDM_BABYL_ETPSC     13
#define SE_SIDM_ALDEBARAN_15TAU 14
#define SE_SIDM_HIPPARCHOS       15
#define SE_SIDM_SASSANIAN        16
#define SE_SIDM_GALCENT_0SAG     17
#define SE_SIDM_J2000            18
#define SE_SIDM_J1900            19
#define SE_SIDM_B1950            20
#define SE_SIDM_SURYASIDDHANTA  21
#define SE_SIDM_SURYASIDDHANTA_MSUN  22
#define SE_SIDM_ARYABHATA        23
#define SE_SIDM_ARYABHATA_MSUN   24
#define SE_SIDM_SS_REVATI        25
#define SE_SIDM_SS_CITRA         26
#define SE_SIDM_TRUE_CITRA       27
#define SE_SIDM_TRUE_REVATI      28
#define SE_SIDM_TRUE_PUSHYA      29
#define SE_SIDM_GALCENT_RGBRAND  30
#define SE_SIDM_GALEQU_IAU1958   31
#define SE_SIDM_GALEQU_TRUE      32
#define SE_SIDM_GALEQU_MULA      33
#define SE_SIDM_GALALIGN_MARDYKS  34
#define SE_SIDM_TRUE_MULA        35
#define SE_SIDM_GALCENT_MULA_WILHELM       36
#define SE_SIDM_ARYABHATA_522    37
#define SE_SIDM_BABYL_BRITTON    38
#define SE_SIDM_USER             255

函数 swe_get_ayanamsa_name() 返回 ayanamsah 的名字.
const char *swe_get_ayanamsa_name(int32 isidmode)

namely:
   "费根/布拉德雷",                    /*  0 SE_SIDM_FAGAN_BRADLEY */
   "Lahiri",                           /*  1 SE_SIDM_LAHIRI */
   "De Luce",                          /*  2 SE_SIDM_DELUCE */
   "Raman",                            /*  3 SE_SIDM_RAMAN */
   "Usha/Shashi",                      /*  4 SE_SIDM_USHASHASHI */
   "Krishnamurti",                     /*  5 SE_SIDM_KRISHNAMURTI */
   "Djwhal Khul",                      /*  6 SE_SIDM_DJWHAL_KHUL */
   "Yukteshwar",                       /*  7 SE_SIDM_YUKTESHWAR */
   "J.N. Bhasin",                      /*  8 SE_SIDM_JN_BHASIN */
   "Babylonian/Kugler 1",              /*  9 SE_SIDM_BABYL_KUGLER1 */
   "Babylonian/Kugler 2",              /* 10 SE_SIDM_BABYL_KUGLER2 */
   "Babylonian/Kugler 3",              /* 11 SE_SIDM_BABYL_KUGLER3 */
   "Babylonian/Huber",                 /* 12 SE_SIDM_BABYL_HUBER */
   "Babylonian/Eta Piscium",           /* 13 SE_SIDM_BABYL_ETPSC */
   "Babylonian/Aldebaran = 15 Tau",    /* 14 SE_SIDM_ALDEBARAN_15TAU */
   "Hipparchos",                       /* 15 SE_SIDM_HIPPARCHOS */
   "Sassanian",                        /* 16 SE_SIDM_SASSANIAN */
   "Galact. Center = 0 Sag",           /* 17 SE_SIDM_GALCENT_0SAG */
   "J2000",                            /* 18 SE_SIDM_J2000 */
   "J1900",                            /* 19 SE_SIDM_J1900 */
   "B1950",                            /* 20 SE_SIDM_B1950 */
   "Suryasiddhanta",                   /* 21 SE_SIDM_SURYASIDDHANTA */
   "Suryasiddhanta, mean Sun",         /* 22 SE_SIDM_SURYASIDDHANTA_MSUN */
   "Aryabhata",                        /* 23 SE_SIDM_ARYABHATA */
   "Aryabhata, mean Sun",              /* 24 SE_SIDM_ARYABHATA_MSUN */
   "SS Revati",                        /* 25 SE_SIDM_SS_REVATI */
   "SS Citra",                         /* 26 SE_SIDM_SS_CITRA */
   "True Citra",                       /* 27 SE_SIDM_TRUE_CITRA */
   "True Revati",                      /* 28 SE_SIDM_TRUE_REVATI */
   "True Pushya (PVRN Rao)",           /* 29 SE_SIDM_TRUE_PUSHYA */
   "Galactic Center (Gil Brand)",      /* 30 SE_SIDM_GALCENT_RGBRAND */
   "Galactic 赤道 (IAU1958)",       /* 31 SE_SIDM_GALEQU_IAU1958 */
   "Galactic 赤道",                 /* 32 SE_SIDM_GALEQU_TRUE */
   "Galactic 赤道 mid-Mula",        /* 33 SE_SIDM_GALEQU_MULA */
   "Skydram (Mardyks)",                /* 34 SE_SIDM_GALALIGN_MARDYKS */
   "True Mula (Chandra Hari)",         /* 35 SE_SIDM_TRUE_MULA */
   "Dhruva/Gal.Center/Mula (Wilhelm)", /* 36 SE_SIDM_GALCENT_MULA_WILHELM */
   "Aryabhata 522",                    /* 37 SE_SIDM_ARYABHATA_522 */
   "Babylonian/Britton",               /* 38 SE_SIDM_BABYL_BRITTON */

关于恒星模式的信息, 请阅读 swisseph.doc 中的恒星计算章节.
要定义你自己的恒星模式, 使用 SE_SIDM_USER (= 255) 并设置参照日期(t0) 并初始化岁差值 (ayan_t0).
ayan_t0 = tropical_position_t0 –sidereal _position_t0.
没有额外的规格, 使用传统的方法. 岁差是从回归位置涉及日期的黄道减去T0的黄道.

注意, 如果你想要的坐标涉及到以下一个分点的黄道, 这种方法将不会提供准确的结果:
#define SE_SIDM_J2000            18
#define SE_SIDM_J1900            19
#define SE_SIDM_B1950            20
作为替代, 你必须使用一个下面所描述的正确的坐标转换:

恒星函数的特殊用法:

a) 用户用T0定义UT格式的岁差

如果用 SE_SIDM_USER 设置了用户定义岁差, 则 t0 通常被认为是 TT (ET). 但是, 如果 SE_SIDM_USER 与 SE_SIDBIT_USER_UT 组合使用, t0可以提供 UT.

/* 使用用户定义岁差, t0 是 UT */
#define SE_SIDBIT_USER_UT        1024
例如 :
swe_set_sid_mode(SE_SIDM_USER + SE_SIDBIT_USER_UT, 1720935.589444445, 0);
iflag |= SEFLG_SIDEREAL;
for (i = 0; i < NPLANETS; i++) {
  iflgret = swe_calc(tjd, ipl, iflag, xp, serr);
  printf(”%f\n”, xp[0]);


b) 黄道坐标到特定日期的黄道的正确转换

如果需要一个 t0 的黄道的正确的转换, 以下位可以添加到变量 sid_mode 的值中:

/* 为了投影到 t0 的黄道*/
#define SE_SIDBIT_ECL_T0        256
例如:
swe_set_sid_mode(SE_SIDM_J2000 + SE_SIDBIT_ECL_T0, 0, 0);
iflag |= SEFLG_SIDEREAL;
for (i = 0; i < NPLANETS; i++) {
  iflgret = swe_calc(tjd, ipl, iflag, xp, serr);
  printf(”%f\n”, xp[0]);


该过程要求以下的恒星模式, 即转换标准的分点之一的黄道:
#define SE_SIDM_J2000            18
#define SE_SIDM_J1900            19
#define SE_SIDM_B1950            20

b) 计算岁差修正过渡

函数 swe_set_sidmode() 也可用于计算 ”岁差修正过渡”. 有两种方法, 你必须选择其中一个更适合你的:

1. 如果你已经有了命盘的回归位置, 您可按以下所述操作:

iflgret = swe_calc(tjd_et_natal, SE_ECL_NUT, 0, x, serr);
nut_long_nata = x[2];
swe_set_sid_mode( SE_SIDBIT_USER + SE_SIDBIT_ECL_T0, tjd_et, nut_long_natal );

其中 tjd_et_natal 是命盘 (历书时)的儒略日.
在这个计算通过后, 用 SEFLG_SIDEREAL 标志调用函数 swe_calc():

iflag |= SEFLG_SIDEREAL;
iflgret = swe_calc(tjd_et_transit, ipl_transit, iflag, xpt, serr);

2. 如果你还没有回归出生位置, 如果你不需要他们,只是对过境时间感兴趣, 你可以使它更简单:
swe_set_sid_mode( SE_SIDBIT_USER + SE_SIDBIT_ECL_T0, tjd_et, 0 );
iflag |= SEFLG_SIDEREAL;
iflgret = swe_calc(tjd_et_natal, ipl_natal, iflag, xp, serr);
iflgret = swe_calc(tjd_et_transit, ipl_transit, iflag, xpt, serr);

在这种情况下, 出生的位置 will be tropical 但没有章动. 注意,你不能将他们用于其他用途.

c) 太阳系旋转平面

对于涉及到太阳系旋转面的恒星位置, 使用以下标志

/* 用于太阳系旋转平面上的投影 */
#define SE_SIDBIT_SSY_PLANE     512

注意:由 swe_set_sid_mode() 设置的参数, 不受 swe_close() 影响.
10.2. swe_get_ayanamsa_ex_ut(), swe_get_ayanamsa_ex(), swe_get_ayanamsa() 和 swe_get_ayanamsa_ut()
这些函数计算岁差, 即热带春分点到黄道带的恒星零点的距离. 岁差用于计算恒星的回归行星位置:
pos_sid = pos_trop – 岁差
在调用这些函数中的一个时, 你必须用 swe_set_sid_mode() 设置恒星模式, 除非你想要默认的恒星模式, 也就是 费根/布拉德雷岁差.

/* 输入变量:
 * tjd_ut = 儒略日数 in UT
 * (tjd_et = 儒略日数 in ET/TT)
 * ephe_flag = 星历标志 (SEFLG_SWIEPH, SEFLG_JPLEPH, SEFLG_MOSEPH 中的一个)
 * 输出值
 * daya = 岁差值 (指向双精度的指针)
 * serr = 错误信息或警告 (指向串的指针)
 * 函数返回 使用的星历标志或 ERR (-1)
 */
int32 swe_get_ayanamsa_ex_ut(double tjd_ut, int32 ephe_flag, double *daya, char *serr);
int32 swe_get_ayanamsa_ex(double tjd_et, int32 ephe_flag, double *daya, char *serr);
double swe_get_ayanamsa_ut(double tjd_ut); /* 输入: 儒略日数 in UT */
double swe_get_ayanamsa(double tjd_et); /* 输入: 儒略日数 in ET/TT */

函数 swe_get_ayanamsa_ex_ut() 和 swe_get_ayanamsa_ex() 是在 Swiss Ephemeris 版本 2.02 中引入的, 前者期望输入时间为 UT, 后者为 ET/TT.
此函数较老的函数 swe_get_ayanamsa_ut() 和 swe_get_ayanamsa() 更好.
函数 swe_get_ayanamsa_ex_ut() 使用与 ephe_flag 中指定一致的 Delta T.
函数 swe_get_ayanamsa_ex() 不依靠 Delta T; 但使用 True Chitrapaksha 或 True Revati 这样的基于恒星的岁差, 恒星的位置也取决于太阳星历(恒星的周年光行差), 它可以由三种星历中的任何一个计算.

通过新老函数提供的值之间的差异是非常小的而且可能只与 precision fanatics 有关.

函数 swe_get_ayanamsa_ut() 在 Swisseph 版本 1.60 中引入,  而且要求用世界时计算代替了要求历书时. (参见 swe_calc_ut() 和 swe_calc())

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hero_hacker
  13楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:56 积分:682 威望:0 精华:1 注册:2010/8/12 21:56:00
  发帖心情 Post By:2016/9/26 11:25:00


11. 星历文件相关函数 (已移到1.)
涉及函数 swe_set_ephe_path(), swe_close(), swe_set_jpl_file(), 和 swe_version() 的信息已经移到第一章.

12. Swisseph 函数中地理经度标志
美国和欧洲的程序员之间有一个分歧, 到底东方或西方的地理经度应该是正的. 美国人宁愿西经为正, 欧洲人喜欢旧的传统,认为东经为正且西经为负.
天文年历仍遵循欧洲模式. 它给出了天文台在 "东经" 的地理坐标.
Swiss Ephemeris 也遵循欧洲风格. 所有使用地理坐标的 Swiss Ephemeris 函数认为正的地理经度为东而负的为西.
例如 87w39 = -87.65° (Chicago IL/USA) 和 8e33 = +8.55° (Zurich, Switzerland).
北部和南部的地理纬度是没有争议的. 北永远是正而南为负.
12.1. 地理对地心纬度
有一些混淆在占星家中, 他们究竟应该使用地理纬度 (也叫大地纬度, 它们是同义词) 还是地心纬度用于宫位计算, 行星的观测点位置, 食, 等等.

在 Swiss Ephemeris 函数中纬度是输入参数(或输出参数), 它总是地理纬度.这是可以在地图集和 Google Earth 中找到的纬度.

如果在一个函数内部转换为地心纬度是必需的 (因为三维点在扁圆的地球上是需要的), 这是自动完成的.

然而,对于这样的转换, Swiss Ephemeris 只使用一个椭圆形的地球的形式. 它不使用不规则的大地水准面. 这就导致了高度长达500米的误差, 或地面点的月亮错误达0.3弧秒.

占星家宣称计算上升或宫位需要地心纬度是错的. 地球的扁平化并没有在宫位计算中发挥作用. 地理纬度应该总是使用在宫位的计算上.

13. 宫头计算
13.1 swe_houses()
/* 宫头, 上升和天顶*/
int swe_houses(
double tjd_ut,  /* 儒略日数, UT */
double geolat,  /* 地理纬度, 单位为角度 */
double geolon,  /* 地理经度, 单位为角度
    * 东经为正,
    * 西经为负,
    * 北纬为正,
    * 南纬为负 */
int hsys,   /* 宫方法, ascii code of one of the letters documented below*/
double *cusps,  /* array for 13 (or 37 for system G) doubles */
double *ascmc); /* array for 10 元素双精度数组 */
13.2 swe_houses_armc()
int swe_houses_armc(
double armc,   /* ARMC */
double geolat,  /* 地理纬度, 单位为角度 */
double eps,   /* 黄赤交角, 单位为角度 */
int hsys,   /* 宫方法, ascii code of one of the letters documdented below */
double *cusps,  /* 13元素双精度数组(或 37 对于 system G) */
double *ascmc); /* 10 元素双精度数组 */
13.3 swe_houses_ex()

/* 扩展函数; 用于计算回归或恒星位置 */
int swe_houses_ex(
 double tjd_ut,  /* 儒略日数, UT */
 int32 iflag,   /* 0 或 SEFLG_SIDEREAL 或 SEFLG_ RADIANS */
 double geolat,  /* 地理纬度, 单位为角度 */
 double geolon,  /* 地理经度, 单位为角度
    * 东经为正,
    * 西经为负,
    * 北纬为正,
    * 南纬为负 */
 int hsys,   /* 宫方法, one-letter case sensitive code (list, see further below) */
 double *cusps,  /* 13元素双精度数组(或 37 for system G) */
double *ascmc); /* 10 元素双精度数组 */

13.4 swe_house_name()

/* 返回宫方法名字, 最大 40 字符
 */
char * swe_house_name(
 int hsys,   /* 宫方法, 字符串 PKORCAEVXHTBG 中的一个字母*/
 );

函数 swe_houses() 是最舒服的, 如果你需要一个给定的日期和地理位置宫位. 但有时, 你会想从 ARMC 来计算宫位, 例如只有复合星座没有日期, 只有两个出生时的 ARMCs 的复合 ARMC. 在这种情况下, 你可以用函数 swe_houses_armc(). 来计算复合黄赤交角 eps, 对于出生日期和计算计算两个 eps 的平均值, 你将不得不用 ipl = SE_ECL_NUT 调用 sweph_calc().
注意 tjd_ut 必须是世界时, 而行星是从历书时计算
tjd_et = tjd_ut + delta_t(tjd_ut).
也请注意数组 cusps 必须提供13 双精度(定义为 cusp[13]) 内存, 否则你会冒着一个程序崩溃的风险. 对于宫位系统 ‘G’ (高魁林盘 宫顶), 定义它为 cusp[37].

注意: 对于宫位系统 ‘G’, 宫顶编号为顺时针方向.
 
扩展的宫位函数 swe_houses_ex() 与 swe_houses() 进行完全相同的计算. 其区别在于 swe_houses_ex() 有一个参数 iflag, 它可以设置为 SEFLG_SIDEREAL, 如果需要恒星宫位. 在为恒星宫位调用 swe_houses_ex() 之前, 恒星模式可以调用函数 swe_set_sid_mode() 来设置. 如果没有这样做, 默认的恒星模式, 即费根/布拉德雷岁差, 将被使用.
swe_houses_armc() 没有扩展函数. 因此,如果你想要计算恒星复合宫头这种晦涩的东西, 过程将更加复杂:

/* 恒星复合宫位计算; 使用真 epsilon, 但不用黄经章动 */
swe_calc(tjd_et1, SE_ECL_NUT, 0, x1, serr);
swe_calc(tjd_et2, SE_ECL_NUT, 0, x2, serr);
armc1 = swe_sidtime(tjd_ut1) * 15; 
armc2 = swe_sidtime(tjd_ut2) * 15;
armc_comp = composite(armc1, armc2); /* 这是一个由用户创建的函数 */
eps_comp = (x1[0] + x2[0]) / 2;
nut_comp = (x1[2] + x2[2]) / 2;
tjd_comp = (tjd_et1 + tjd_et2) / 2;
aya = swe_get_ayanamsa(tjd_comp);
swe_houses_armc(armc_comp, geolat, eps_comp, hsys, cusps, ascmc);
for (i = 1; i <= 12; i++)
  cusp[i] = swe_degnorm(cusp[i] – aya – nut_comp);
for (i = 0; i < 10; i++)
  ascmc[i] = swe_degnorm(asc_mc[i] – aya – nut_comp);

输入和输入参数.
第一个数组元素 cusps[0] 总是 0, 12宫跟随在 cusps[1] .. [12] 中, 原因是在 C 中数组索引是以0 开始. 因此:
cusps[0] = 0
cusps[1] = house 1
cusps[2] = house 2
等等.

在数组 ascmc 中, 函数返回以下值:
ascmc[0] =  上升
ascmc[1] = 天顶
ascmc[2] = ARMC
ascmc[3] = 宿命点
ascmc[4] = "赤道上升"
ascmc[5] = "co-ascendant" (Walter Koch)
ascmc[6] = "co-ascendant" (Michael Munkasey)
ascmc[7] = "polar ascendant" (M. Munkasey)

以下定义可用于查找这些值:
#define SE_ASC  0
#define SE_MC  1
#define SE_ARMC  2
#define SE_VERTEX  3
#define SE_EQUASC    4 /* "赤道上升" */
#define SE_COASC1  5 /* "co-ascendant" (W. Koch) */
#define SE_COASC2  6 /* "co-ascendant" (M. Munkasey) */
#define SE_POLASC  7 /* "polar ascendant" (M. Munkasey) */
#define SE_NASCMC  8

ascmc 必须是一个10 元素双精度数组. ascmc[8... 9] 是 0 并可能用于以后版本的额外信息.

代码 hsys 中的最重要的宫方法是:
hsys =  ‘P’ Placidus
 ‘K’ Koch
 ‘O’ Porphyrius
 ‘R’ Regiomontanus
 ‘C’ Campanus
 ‘A’ or ‘E’ Equal (cusp 1 is Ascendant)
 ‘W’ Whole sign
完整的宫方法列表按字母排序是:
hsys =
 ‘B’ Alcabitus
 ‘Y’ APC houses
 ‘X’ Axial rotation system / Meridian system / Zariel
 ‘H’ 方位角al or horizontal system
 ‘C’ Campanus
 ‘F’ Carter "Poli-赤道"
 ‘A’ or ‘E’ Equal (cusp 1 is Ascendant)
 ‘D’ Equal MC (cusp 10 is MC)
 ‘N’ Equal/1=Aries
 ‘G’ 高魁林盘
   Goelzer -> Krusinski
   Horizontal system -> Azimthal system
 ‘I’ Sunshine (Makransky, solution Treindl)
 ‘i’ Sunshine (Makransky, solution Makransky)
 ‘K’ Koch
 ‘U’ Krusinski-Pisa-Goelzer
    Meridian system -> axial rotation
 ‘M’ Morinus
   Neo-Porphyry -> Pullen SD
   Pisa -> Krusinski
 ‘P’ Placidus
  Poli-赤道 -> Carter
 ‘T’ Polich/Page (“地面点的” system)
 ‘O’ Porphyrius
   ‘L’ Pullen SD (sinusoidal delta) – ex Neo-Porphyry
 ‘Q’ Pullen SR (sinusoidal ratio)
 ‘R’ Regiomontanus
 ‘S’ Sripati
   “地面点的” system -> Polich/Page
 ‘V’ Vehlow equal (Asc. in middle of house 1)
 ‘W’ Whole sign
   Zariel -> Axial rotation system

Placidus 和 Koch 宫头不能计算极圆外. 在这种情况下, swe_houses() 切换至 Porphyry 宫位制(每个象限分为三个相等的部分) 并返回错误代码 ERR.

宫方法代码实际上是区分大小写的. 此刻, 还有没有小写宫方法码. 目前, 如果一个小写的方法码传递给函数, 函数将转换为大写. 然而, 今后, 小写宫方法码可能会使用于新的宫方法. 在这种情况下, 小写和大写就不相等了.

宿命点是在黄道位于西部方向精确点.宿命点的对面是奔离点, 黄道东点.


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hero_hacker
  14楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:56 积分:682 威望:0 精华:1 注册:2010/8/12 21:56:00
  发帖心情 Post By:2016/9/26 11:27:00


14. 行星的宫位: swe_house_pos()
对于一个给定的 ARMC, 要计算给定星体的宫位, 你可以使用
double swe_house_pos(
 double armc,   /* ARMC */
 double geolat,  /* 地理纬度, 单位为角度 */
 double eps,   /* 黄赤交角, 单位为角度 */
 int hsys,   /* 宫方法, one of the letters PKRCAV */
 double *xpin,  /* array of 2 doubles: 行星的黄道经度和纬度 */
char *serr);  /* return area for error or warning message */

变量 armc, geolat, eps, 和 xpin[0] 和 xpin[1] (行星的黄道经度和纬度) 必须是单位为角度. 通常 serr 必须指向一个256 字节的串.
函数返回一个 1.0 到 12.999999 之间的值, 指出行星是在哪一宫以及离它的宫顶有多远.
在宫位系统 ‘G’ (高魁林盘), 返回一个1.0 到 36.9999999 之间的值. 注意, 在其他所有的宫位系统逆时针编号宫头时, 高魁林盘是按顺时针编号.

对于 Koch 宫位制, 函数有时候返回0, 如果计算不可能. 这种情况多数发生在极性区域, 但也会发生在纬度低于66°33’ 的区域, 例如如果一个星体具有高赤纬并落在极地的天空. 对于极地恒星(或小行星)  Koch 宫位制除了在赤道不可能在任何的地理位置.
用户必须决定如何处理这种情况.
你可以用此函数返回的宫位于宫位的星座 (or ”mundane” positions). 对于这一点, 你必须转换它为0 到 360 之间的角度. 从宫数里减去1,然后乘以30, 或 mund_pos = (hpos – 1) * 30;

你将了解象这样的宫位计算, 例如对于 Koch 宫位制, 不会完全同意那些你所应用的 Huber 手算方法. 如果你想要一个更好的协议, 设置黄道纬度 xpin[1]= 0;. 其余的差异是由于 Huber 的手算是一个简化, 而我们的计算是几何精度.

目前, 几何纠正宫位提供以下宫方法:
 P Placidus, K Koch, C Campanus, R Regiomontanus, U Krusinski,
 A/E Equal, V Vehlow, W Whole Signs, D Equal/MC, N Equal/Zodiac,
 O Porphyry, B Alcabitius, X Meridian, F Carter, M Morinus,
 T Polich/Page, H Horizon, G Gauquelin.
 
一个简化的宫位 (distance_from_cusp / house_size) 目前提供下列宫方法:
 Y APC houses, L Pullen SD, Q Pullen SR, I Sunshine, S Sripati.

此函数要求回归位置在 xpin 中. 恒星宫位在以下情况下是相同的回归:
? 如果用传统方法计算恒星行星 (sid_pos = trop_pos – 岁差). 这样函数 swe_house_pos() 对所有宫位系统都有效.
? 如果用一个非传统的方法 (投影到 t0 的黄道或太阳系旋转平面) 而且宫位系统不取决于黄道的定义. 对于Campanus, Regiomontanus, Placidus, Azimuth 宫位制, axial rotation 宫位制来说情况就是这样. 对于等分宫位制, Porphyry 和 Koch 宫位制来说情况不是这样. 你必须自己计算等分宫位制和 Porphyry 宫位制. 在这里我们建议避开 Koch 宫位制. 恒星 Koch 宫位制让这些恒星算法毫无意义.

14.1. 用swe_house_pos() 或 swe_gauquelin_sector() 计算行星的高魁林盘位置
关于高魁林盘的一般信息, 参阅第 swisseph.doc 文档的 6.5 章.

有两个函数可用于计算高魁林盘:
? swe_house_pos. 关于此函数的完整细节已在前面的章节中提供. 要计算高魁林盘参数 hsys 必须设置为 'G' (高魁林盘). 此函数然后将返回一个1.0 到 36.9999999之间的盘的位置值. 注意高魁林盘是顺时针编号的, 不像所有其它的宫位系统.
? swe_gauquelin_sector – 细节如下.

函数 swe_gauquelin_sector() 定义如下:

int32 swe_gauquelin_sector(
double tjd_ut,  /* 搜索该时间后 (UT) */
int32 ipl,   /* 行星编号, 如果是行星或月亮*/
char *starname,  /* 恒星名, 如果是恒星*/
int32 iflag,  /* 星历标志和 SEFLG_TOPOCTR */
int32 imeth,  /* 方法: 0 = 使用纬度, 1 = 不使用纬度,
   /*              2 = from rise/set, 3 = from rise/set with 折射 */
double *geopos,  /* 三元素双精度数组包含
    * 地理经度, 纬度, 海拔高度 */
double atpress,   /* 大气压力,仅 imeth=3 时有用;
     * 如果为 0, 默认 = 1013.25 mbar */
double attemp,   /* 大气温度 摄氏度, 仅 imeth=3 时有用 */
double *dgsect,  /* 返回高魁林盘位置地址 */
char *serr);  /* 返回错误信息地址 */

该函数返回 OK 或 ERR (-1). 它在有些情况下返回一个错误, 例如 imeth=2 的极地星体. 和其他 SE 函数一样, 如果发生错误, 一个错误信息写到 serr. dgsect 用于获取高魁林盘盘位置1.0 到 36.9999999之间的值. 高魁林盘是顺时针编号的.

有六种方法计算行星的高魁林盘位置:
1. 盘位置计算自黄道经度和纬度:
    有两种方法:
? 调用 swe_house_pos() 使用参数 hsys = 'G', xpin[0] = 行星的黄道经度, 以及 xpin[1] = 黄道纬度. 此函数返回1.0 到 36.9999999之间的值作为盘位置.
? 调用 swe_gauquelin_sector() 使用参数 imeth=0. 这样的效率低于 swe_house_pos, 因为它
  重新计算整个行星, 而 swe_house_pos() 有一个之前计算的黄道位置的输入数组.

2. 盘位置计算自黄道经度没有黄道纬度:
    有两种方法:
? 调用 swe_house_pos() 使用参数 hsys = 'G', xpin[0] = 行星的黄道经度, 而且 xpin[1] = 0. 此函数
返回1.0 到 36.9999999之间的值作为盘位置.
? 调用 swe_gauquelin_sector() 使用参数 imeth=1. 再说一次, 这样的效率低于 swe_house_pos.

3. 行星的盘位置计算自行星的升和落时间.
    使用圆盘中心的升落:
? 以 imeth=2 调用 swe_gauquelin_sector().

4. 行星的盘位置计算自行星的升和落时间, 考虑到大气折射.
    使用圆盘中心的升落:
? 以 imeth=3 调用 swe_gauquelin_sector().

5. 行星的盘位置计算自行星的升和落时间.
    使用圆盘边缘的升落:
? 以 imeth=4 调用 swe_gauquelin_sector().

6. 行星的盘位置计算自行星的升和落时间, 考虑到大气折射.
    使用圆盘边缘的升落:
? 以 imeth=5 调用 swe_gauquelin_sector().


15. 恒星时 swe_sidtime() 和 swe_sidtime0()
恒星时是在 houses() 函数内部计算并通过变量 armc 返回, 度量恒星时的单位为角度. 要得到恒星时的小时数,  armc 除以 15.
如果恒星时要求从宫位计算, 可以用这两个函数. 第二个版本的函数要求在函数计算时给出倾角和章动, 第一个函数内部计算它们. 两者返回在格林威治子午线的恒星时, 单位是小时.

double swe_sidtime(double tjd_ut);  /* 儒略日数, UT */
double swe_sidtime0(
 double tjd_ut,  /* 儒略日数, UT */
 double eps,   /* 黄赤交角, 单位为角度 */
 double nut);  /* 黄经章动, 单位为角度 */

支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hero_hacker
  15楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:56 积分:682 威望:0 精华:1 注册:2010/8/12 21:56:00
  发帖心情 Post By:2016/9/26 11:30:00


16. swisseph功能概述
16.1. 行星和恒星计算
行星, 月亮, 小行星, 月交点, 远地点, 假想星体

long swe_calc_ut(
 double tjd_ut, /* 儒略日数, 世界时 */
 int ipl,   /* 行星编号 */
 long iflag,  /* 标志位 */
       double *xx,        /* 6个位置值的目标地址: 经度, 纬度, 距离,
   经度速度, 纬度速度, 距离速度 */
 char *serr); /* 256 字节的错误串 */

long swe_calc(
 double tjd_et,  /* 儒略日数, 历书时 */
 int ipl,   /* 行星编号 */
 long iflag,  /* 标志位 */
 double *xx, /* 6个位置值的目标地址: 经度, 纬度, 距离,
   经度速度, 纬度速度, 距离速度 */
 char *serr); /* 256 字节的错误串 */
恒星
long swe_fixstar_ut(
 char *star,  /* 恒星名, 返回40字节的恒星名*/
 double tjd_ut,  /* 儒略日数, 世界时 */
 long iflag,  /* 标志位 */
 double *xx,        /* 6个位置值的目标地址: 经度, 纬度, 距离,
     经度速度, 纬度速度, 距离速度 */
 char *serr); /* 256 字节的错误串*/

long swe_fixstar(
 char *star,  /*恒星名, 返回40字节的恒星名*/
 double tjd_et,  /* 儒略日数, 历书时 */
 long iflag,  /* 标志位 */
 double *xx,      /* 6个位置值的目标地址: 经度, 纬度, 距离,
   经度速度, 纬度速度, 距离速度 */
 char *serr); /* 256 字节的错误串*/
为天体行星的计算设置几何位置
void swe_set_topo (
 double geolon,  /* 地理经度 */
 double geolat,  /* 地理纬度
     东经为正,
     西经为负,
     北纬为正,
     南纬为负 */
 double 高度); /* 海拔高度 */
为恒星位置设置恒星模式
void swe_set_sid_mode (
  int32 sid_mode,
 double t0,  /* reference epoch */
 double ayan_t0); /* 初始岁差 at t0 */

/* 函数计算给定 UT 日期的岁差.
  * 返回值是使用的星历标志或 ERR (-1) */
int32 swe_get_ayanamsa_ex_ut(
         double tjd_ut,     /* 儒略日数 in UT */
         int32 ephe_flag,  /* 星历标志, SEFLG_SWIEPH, SEFLG_JPLEPH, SEFLG_MOSEPH 之一 */
         double *daya,      /* 输出: 岁差值 (指向双精度的指针 */
         char *serr);          /* 输出: 错误信息或警告 (指向串) */

/* 函数计算给定 ET/TT 日期的岁差.
  * 返回值为使用的星历标志或 ERR (-1) */
int32 swe_get_ayanamsa_ex(
         double tjd_ut,     /* 儒略日数 in ET/TT */
         int32 ephe_flag,  /* 星在标志,  SEFLG_SWIEPH, SEFLG_JPLEPH, SEFLG_MOSEPH 其中之一 */
         double *daya,      /* 输出: 岁差值 (指向双精度的指针 */
         char *serr);          /* 输出: 错误信息或警告(指向串的指针) */

/*从 UT 格式的日期得到岁差*/
double swe_get_ayanamsa_ut(double tjd_ut);
 
/* 从 ET/TT 格式的日期得到岁差 */
double swe_get_ayanamsa(double tjd_et);

16.2 食和行星现象
查找给定地理位置的下一个食
int32 swe_sol_eclipse_when_loc(
double tjd_start,  /* 搜索的起始日期, 儒略日 UT */
int32 ifl,   /* 星历标志*/
double *geopos,   /* 3元素双精度数组 包含地理经度, 纬度, 高度 */
    * 东经为正,
     * 西经为负,
     * 北纬为正,
     * 南纬为负 */
double *tret,   /* 返回数组, 10 元素双精度数组, 见下 */
double *attr,   /* 返回数组, 20 元素双精度数组, 见下 */
AS_BOOL backward,  /* TRUE, 如果向前搜索 */
char *serr);  /* 返回错误串 */
全球地找出下一个日食
int32 swe_sol_eclipse_when_glob(
double tjd_start,  /* 搜索的起始日期, 儒略日 UT */
int32 ifl,   /* 星历标志*/
int32 ifltype,   /* 想要的食类型: SE_ECL_TOTAL 等 */
double *tret,   /* 返回数组, 10 元素双精度数组, 见下 */
AS_BOOL backward,  /* TRUE, 如果向前搜索 */
char *serr);  /* 返回错误串 */
对于给定tjd, 地理经度, 纬度和高度计算日食的属性
int32 swe_sol_eclipse_how(
double tjd_ut,   /* 时间, 儒略日 UT */
int32 ifl,   /* 星历标志*/
double *geopos,    /* 地理经度, 纬度, 高度 */
    * 东经为正,
     * 西经为负,
     * 北纬为正,
     * 南纬为负 */
double *attr,   /* 返回数组, 20 元素双精度数组, 见下 */
char *serr);  /* 返回错误串 */
当中心食达到中心或非中心食最大时找出它的地理位置
int32 swe_sol_eclipse_where (
double tjd_ut,   /* 时间, 儒略日 UT */
int32 ifl,    /* 星历标志*/
double *geopos,  /* 返回数组, 2 元素数组, 地理经度和纬度. */
    * 东经为正,
     * 西经为负,
     * 北纬为正,
     * 南纬为负 */
double *attr,   /* 返回数组, 20 元素双精度数组, 见下 */
char *serr);  /* 返回错误串 */



int32 swe_lun_occult_where (
double tjd_ut,  /* 时间, 儒略日 UT */
int32 ipl,  /* 行星编号 */
char* starname,  /* 恒星名字, 如果不是恒星同时是必须是 NULL 或 ”” */
int32 ifl,   /* 星历标志*/
double *geopos, /* 返回数组, 2 元素数组, 地理经度和纬度.
    * 东经为正,
    * 西经为负,
    * 北纬为正,
    * 南纬为负 */
double *attr,  /* 返回数组, 20 元素双精度数组, 见下 */
char *serr);  /* 返回错误串 */
查找给定地理位置的一个星体的下一个月掩星
(也可用于日食 )

int32 swe_lun_occult_when_loc(
double tjd_start,  /* 搜索的起始日期, 儒略日 UT */
int32 ipl,  /* 行星编号 */
char* starname,  /* 恒星名字, 如果不是恒星同时是必须是 NULL 或 ”” */
int32 ifl,  /* 星历标志*/
double *geopos,  /* 3 元素双精度数组,含地理经度, 纬度, 高度 东经为正,
     西经为负,  北纬为正,
     南纬为负 */
double *tret,  /* 返回数组, 10 元素双精度数组, 见下 */
double *attr,  /* 返回数组, 20 元素双精度数组, 见下 */
AS_BOOL backward,  /* TRUE, 如果向前搜索 */
char *serr); /* 返回错误串 */
全球地查找下一个掩星
(也可用于日食 )

int32 swe_lun_occult_when_glob(
double tjd_start,  /* 搜索的起始日期, 儒略日 UT */
int32 ipl,  /* 行星编号 */
char* starname,  /* 恒星名字, 如果不是恒星同时是必须是 NULL 或 ”” */
int32 ifl,  /* 星历标志*/
int32 ifltype,  /* 想要的食类型 */
double *geopos,  /* 3 元素双精度数组,含地理经度, 纬度, 高度 东经为正,
     西经为负,  北纬为正,
     南纬为负 */
double *tret,  /* 返回数组, 10 元素双精度数组, 见下 */
double *attr,  /* 返回数组, 20 元素双精度数组, 见下 */
AS_BOOL backward,  /* TRUE, 如果向前搜索 */
char *serr); /* 返回错误串 */
查找下一个月食, 从地理位置观察
int32 swe_lun_eclipse_when_loc(
double tjd_start,  /* 搜索的起始日期, 儒略日 UT */
int32 ifl,   /* 星历标志*/
double *geopos,  /* 3 元素双精度数组,含地理经度, 纬度, 高度 东经为正,
     西经为负,  北纬为正,
     南纬为负 */
double *tret,  /* 返回数组, 10 元素双精度数组, 见下 */
double *attr,  /* 返回数组, 20 元素双精度数组, 见下 */
AS_BOOL backward,  /* TRUE, 如果向前搜索 */
char *serr);  /* 返回错误串 */

查找下一个月食, 全局函数
int32 swe_lun_eclipse_when(
double tjd_start,  /* 搜索的起始日期, 儒略日 UT */
int32 ifl,    /* 星历标志*/
int32 ifltype,   /* 想要的食类型: SE_ECL_TOTAL etc. */
double *tret,   /* 返回数组, 10 元素双精度数组, 见下 */
AS_BOOL backward,  /* TRUE, 如果向前搜索 */
char *serr);  /* 返回错误串 */
计算给定时间的月食的属性
int32 swe_lun_eclipse_how(
double tjd_ut,   /* 时间, 儒略日 UT */
int32 ifl,   /* 星历标志*/
double *geopos,   /* 输入数组, 地理经度, 纬度, 高度 */
     东经为正,
      西经为负,
      北纬为正,
      南纬为负 */
double *attr,   /* 返回数组, 20 元素双精度数组, 见下 */
char *serr);  /* 返回错误串 */

计算一个星体的升降和中天
int32 swe_rise_trans(
double tjd_ut,  /* 搜索该时间后 (UT) */
int32 ipl,   /* 行星编号, 如果行星或月亮 */
char *starname,  /* 恒星名, 如果恒星 */
int32 epheflag,  /* 星历标志*/
int32 rsmi,  /* 整型, 用于指出想要的升, 落, 或两个中天之一.
      参见下面的定义 */
double *geopos,  /* 三元素双精度数组包含地理经度, 纬度, 海拔高度 */
double atpress,  /* 大气压力 毫巴/hPa */
double attemp, /* 大气温度 摄氏度 */
double *tret, /* 返回升的时间的等的双精度数的地址 */
char *serr); /* 返回错误信息地址 */

int32 swe_rise_trans_true_hor(
double tjd_ut,  /* 搜索该时间后 (UT) */
int32 ipl,   /* 行星编号, 如果行星或月亮 */
char *starname,  /* 恒星名, 如果恒星 */
int32 epheflag,  /* 星历标志*/
int32 rsmi,  /*整型, 用于指出想要的升, 落, 或两个中天之一.
   参见下面的定义 */
double *geopos,  /* 三元素双精度数组包含
    * 地理经度, 纬度, 海拔高度 */
double atpress,  /* 大气压力 毫巴/hPa */
double attemp, /* 大气温度 摄氏度 */
double horhgt, /* 星体升或落点的本地水平线高度, 单位为度 */
double *tret,  /* 返回升落等时间地址(双精度). */
char *serr);  /* 返回错误信息地址 */


计算行星现象
int32 swe_pheno_ut(
double tjd_ut,   /* 时间 儒略日 UT */
int32 ipl,   /* 行星编号 */
int32 iflag,   /* 星历标志*/
double *attr,   /* 返回数组, 20 元素双精度数组, 见下 */
char *serr);  /* 返回错误串 */
int32 swe_pheno(
double tjd_et,   /* 时间 儒略日 ET */
int32 ipl,   /* 行星编号 */
int32 iflag,   /* 星历标志*/
double *attr,   /* 返回数组, 20 元素双精度数组, 见下 */
char *serr);  /* 返回错误串 */

void swe_azalt(
      double tjd_ut, /* UT */
      int32 calc_flag, /* SE_ECL2HOR 或 SE_EQU2HOR */
      double *geopos, /* 3元素双精度数组: 包含地理经度, 纬度, 高度 */
      double atpress, /* 大气压力 毫巴 (hPa) */
      double attemp, /* 大气温度 单位为摄氏度 */
      double *xin,  /* 3元素双精度数组: 星体的黄道或赤道坐标位置,  取决于 calc_flag */
      double *xaz);  /* 返回数组 3元素双精度数组, 包含方位角, 真高度, 视高度 */

void swe_azalt_rev(
      double tjd_ut,
      int32 calc_flag, /* SE_HOR2ECL 或 SE_HOR2EQU */
      double *geopos, /* 3元素双精度数组, 包含观测者的地理位置 */
      double *xin,   /* 2 元素双精度数组, 包含行星的方位角和真高度 */
      double *xout);  /* 返回数组 2元素双精度数组包含黄道或赤道坐标, 取决于 calc_flag */
double swe_refrac(
double inalt,
double atpress,  /* 大气压力 毫巴 (hPa) */
double attemp,  /* 大气温度 单位为摄氏度 */
int32 calc_flag); /* SE_TRUE_TO_APP 或 SE_APP_TO_TRUE */


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hero_hacker
  16楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:56 积分:682 威望:0 精华:1 注册:2010/8/12 21:56:00
  发帖心情 Post By:2016/9/26 11:34:00


16.3. 日期时间转换
从儒略日数得到 Delta T
/* 历书时 (ET) = 世界时 (UT) + swe_deltat_ex(UT)*/
double swe_deltat_ex(
  double tjd,           /* 儒略日数 in ET/TT */
  int32 ephe_flag,  /* 星历标志 (SEFLG_SWIEPH, SEFLG_JPLEPH, SEFLG_MOSEPH 之一) */
  char *serr);         /* 错误信息或警告 */

/* older function: */
/* 历书时 (ET) = 世界时 (UT) + swe_deltat(UT)*/
double swe_deltat(double tjd);
从年月日时得到儒略日数, 并检查日期是否合法
/*Return value: OK or ERR  */
int swe_date_conversion (
 int y , int m , int d , /* 年, 月, 日 */
      double hour,    /* 小时 (十进制, 带小数) */
      char c,     /* 日历‘g’[格利高里历]|’j’[儒略历] */
double *tjd);   /* 儒略日的目标地址 */
从年月日时得到儒略日数
double swe_julday(
int year, int month, int day, double hour,
int gregflag); /* 公历: 1, 儒略历: 0 */

从儒略日数得到年月日时
void swe_revjul (
 double tjd,  /* 儒略日数 */
 int gregflag, /* 公历: 1, 儒略历: 0 */
 int *year,  /* 年等的目标地址 */
 int *month, int *day, double *hour);
本地时间至 UTC 和 UTC 至本地时间
/* 转换本地时间至 UTC 或 UTC 至本地时间
 *
 * 输入:
 *   iyear ... dsec     日期和时间
 *   d_timezone         时区偏移
 * 输出:
 *   iyear_out ... dsec_out
 *
 * For 时区s east of Greenwich, d_timezone is positive.
 * For 时区s west of Greenwich, d_timezone is negative.
 *
 * For conversion from 本地时间至 UTC, use +d_timezone.
 * For conversion from UTC 至本地时间, use -d_timezone.
 */
void swe_utc_timezone(
        int32 iyear, int32 imonth, int32 iday,
        int32 ihour, int32 imin, double dsec,
        double d_timezone,
        int32 *iyear_out, int32 *imonth_out, int32 *iday_out,
        int32 *ihour_out, int32 *imin_out, double *dsec_out
        )
UTC 至 jd (TT 和 UT1)
/* 输入: 日期和时间(时钟时间), 日历标志.
 * 输出: 一个双精度数组 包含儒略日数 in ET (TT) 和 UT (UT1)
 *             一个错误信息(发生错误)
 * 函数返回 OK 或 ERR.
 */
void swe_utc_to_jd (
 int32 iyear, int32 imonth, int32 iday,
 int32 ihour, int32 imin, double dsec,   /* 注意 : 秒是十进制 */
 gregflag,  /* 公历: 1, 儒略历: 0 */
 dret /* 返回数组, 双精度:
    * dret[0] = 儒略日 in ET (TT)
    * dret[1] = 儒略日 in UT (UT1) */
 serr /* 错误串 */
)
TT (ET1) 至 UTC
/* 输入: 儒略日数 in ET (TT), 日历标志
 * 输出: 年, 月, 日, 时, 分, 秒 in UTC */
void swe_jdet_to_utc (
 double tjd_et, /* 儒略日数 in ET (TT) */
 gregflag,  /* 公历: 1, 儒略历: 0 */
 int32 *iyear, int32 *imonth, int32 *iday,
 int32 *ihour, int32 *imin, double *dsec,   /* 注意 : 秒是十进制 */
)
UTC 至 TT (ET1)
/* 输入: 儒略日数 in UT (UT1), 日历标志
 * 输出: 年, 月, 日, 时, 分, 秒 in UTC */
void swe_jdut1_to_utc (
 double tjd_ut, /* 儒略日数 in ET (TT) */
 gregflag,  /* 公历: 1, 儒略历: 0 */
 int32 *iyear, int32 *imonth, int32 *iday,
 int32 *ihour, int32 *imin, double *dsec,   /* 注意 : 秒是十进制 */
)

得到用于 swe_deltat() 的潮汐加速度
double swe_get_tid_acc(void);
设置用于 swe_deltat() 的潮汐加速度
void swe_set_tid_acc(double t_acc);
时差
/ * 函数返回当地视时和当地平时之间的差值.
e = LAT – LMT.  tjd_et 是历书时 */
int swe_time_equ(double tjd_et, double *e, char *serr);

/* 转换当地平时 (LMT) 到当地视时 (LAT) */
/* tjd_lmt 和 tjd_lat 是一个儒略日数
 * geolon 为地理经度, 其中东经为正,
 * 西经为负*/
int32 swe_lmt_to_lat(double tjd_lmt, double geolon, double *tjd_lat, char *serr);

/* 转换当地视时 (LAT) 到当地平时 (LMT) */
         int32 swe_lat_to_lmt(double tjd_lat, double geolon, double *tjd_lmt, char *serr);


16.4. 初始化, 设置和关闭函数
Set directory path of ephemeris files
void swe_set_ephe_path(char *path);

/* 设置 JPL 星历文件名字 */
void swe_set_jpl_file(char *fname);

/* 关闭 Swiss Ephemeris */
void swe_close(void);

/* 找出你的 Swiss Ephemeris 版本号 */
char *swe_version(char *svers);
/* svers 是一个长255字符的串变量 */

/* 找出 DLL 或可执行文件所在路径 */
char *swe_get_library_path(char *spath);
/* spath是一个长255字符的串变量 */

16.5. 宫计算
恒星时
double swe_sidtime(double tjd_ut);  /* 儒略日数, UT */

double swe_sidtime0(
 double tjd_ut,  /* 儒略日数, UT */
 double eps,  /* 黄赤交角, 单位为角度*/
 double nut); /* 章动, 单位为角度*/

宫方法的名字

char * swe_house_name(
 int hsys,   /* 宫方法, 字符串 PKORCAEVXHTBG 中的一个字母 */
 );

宫头, 上升和中天
int swe_houses(
 double tjd_ut,  /* 儒略日数, UT */
 double geolat,  /* 地理纬度, 角度 */
 double geolon,  /* 地理经度, 角度
     东经为正,
     西经为负,
     北纬为正,
     南纬为负 */
 int hsys,   /* 宫方法, PKRCAV 中的一个字母*/
 double* cusps,  /* 13 个元素的双精度数组 */
 double* ascmc); /* 10 元素双精度数组 */
扩展的宫函数; 要计算 tropical 或恒星位置
int swe_houses_ex(
 double tjd_ut,  /* 儒略日数, UT */
 int32 iflag,   /* 0 或 SEFLG_SIDEREAL 或 SEFLG_RADIANS */
 double geolat,  /* 地理纬度, 单位为角度 */
 double geolon,  /* 地理经度, 单位为角度
     东经为正,
     西经为负,
     北纬为正,
     南纬为负 */
 int hsys,   /* 宫方法, PKRCAV 中的一个字母 */
 double* cusps,  /* 13 个元素的双精度数组 */
 double* ascmc); /* 10 元素双精度数组 */

int swe_houses_armc(
 double armc,  /* ARMC */
 double geolat,  /* 地理纬度, 单位为角度 */
 double eps,  /* 黄赤交角, 单位为角度 */
 int hsys,   /* 宫方法, PKRCAV 中的一个字母*/
 double *cusps,  /* 13 个元素的双精度数组*/
 double *ascmc); /* 10 元素双精度数组 */

得到一个天顶点的宫位置
double swe_house_pos (
 double armc,  /* ARMC */
 double geolat,  /* 地理纬度, 单位为角度
     东经为正,
     西经为负,
     北纬为正,
     南纬为负 */
 double eps,  /* 黄赤交角, 单位为角度 */
 int hsys,   /* 宫方法, PKRCAV 中的一个字母*/
 double *xpin,  /* 2 元素双精度数组: 行星的黄道经度和纬度 */
        char *serr); /* 返回错误或警告信息 */


得到一个星体的高魁林盘位置

double swe_gauquelin_sector(
double tjd_ut,  /* 搜索该时间后 (UT) */
int32 ipl,   /* 行星编号, 如果是行星或月亮 */
char *starname,  /* 恒星名, 如果恒星 */
int32 iflag,  /* 星历标志和 SEFLG_TOPOCTR */
int32 imeth,  /* 方法: 0 = 使用纬度, 1 = 不使用纬度,
   /*              2 = from rise/set, 3 = from rise/set with 折射 */
double *geopos,  /* 三元素双精度数组包含
    * 地理经度, 纬度, 海拔高度 */
double atpress,   /* 大气压力, 仅 imeth=3 时有用;
     * 如果为 0, 使用默认值 1013.25 mbar */
double attemp,   /* 大气温度 单位为摄氏度, 仅在 imeth=3 时使用 */
double *dgsect,  /* 返回高魁林盘位置地址 */
char *serr);  /* 返回错误信息地址 */



16.6. 辅助函数
坐标转换, 从黄道赤道或相反
赤道 -> 黄道 : eps 必须为正
黄道 -> 赤道   : eps 必须为负的 eps, 经度和纬度的单位为角度! */

void swe_cotrans(
double *xpo,  /* 3 元素双精度数组: 要转换的经度, 纬度, 距离; 距离保持不变, 可设置为 1.00 */
 double *xpn,  /* 3元素双精度数组: 经度, 纬度, 距离转换结果 */
 double eps); /* 黄赤交角, 单位为角度. */
位置和速度坐标转换, 从黄道赤道或相反
/ * 赤道 -> 黄道  : eps 必须为正
  黄道 -> 赤道   : eps 必须为负
  eps, 经度, 纬度, and speeds in 经度 and 纬度 are 单位为角度! */
void swe_cotrans_sp(
 double *xpo,  /* 6元素双精度数组, 输入: 经度, 纬度, 距离 and speeds in 经度, lat and 距离 */
 double *xpn,  /* 6元素双精度数组, 在新的坐标系中的位置和速度 */
 double eps); /* 黄赤交角, 单位为角度. */
得到行星名字
char* swe_get_planet_name(
int ipl,    /* 行星编号 */
char* plan_name); /* 行星名地址, 至少20 个字符*/

/* 标准化任何角度到范围0 ... 360 */
double swe_degnorm(double x);

16.7. 其它可能有用的函数
PLACALC, SWISSEPH 的前身, 包含了一系列我们在 SWISSEPH  不再需要的函数. 不过我们再次包含它们到我们的 DLL 中, 因为一些我们软件的用户可能已经采用了它们并使用这些函数在他们的程序中. 但是, 我们给了他们新的名字,与 SWISSEPH 更一致.
PLACALC大量使用厘秒于角度测量; 厘秒是 1/100弧秒. C 类型 CSEC 或 centisec 是32-位整型. CSEC 的使用是因为1988年写 PLACALC 时, 许多 CPU 计算整型变量比浮点计算快得多.
在 Swiss Ephemeris 中我们为所有的角度测量放弃使用厘秒并使用双精度(64-位浮点).
将参数标准化为区间[0..DEG360]
/ * 原函数名: csnorm() */
centisec swe_csnorm(centisec p);
厘秒距离 p1 - p2 标准化为[0..360]
/ * 原函数名: difcsn() */
centisec swe_difcsn(centisec p1, centisec p2);
距离单位为角度
/* 原函数名: difdegn() */
double swe_difdegn (double p1, double p2);
厘秒距离 p1 - p2 标准化为[-180..180]
/* 原函数名: difcs2n() */
centisec swe_difcs2n(centisec p1, centisec p2);

距离单位为角度
/* 原函数名: difdeg2n() */
double swe_difdeg2n(double p1, double p2);
秒舍入, 但29.5959 总是舍
 /* 原函数名: roundsec() */
centisec swe_csroundsec(centisec x);
Double 到 long 带舍入, 无溢出检查
/* 原函数名: d2l() */
long swe_d2l(double x);
星期数
/*星期一 = 0, ... 星期日 = 6  原函数名: day_of_week() */
int swe_day_of_week(double jd);
厘秒 -> 时间串
/* 原函数名: TimeString() */
char * swe_cs2timestr(CSEC t, int sep, AS_BOOL suppressZero, char *a);
厘秒 -> 经度或纬度串
/* 原函数名: LonLatString() */
char * swe_cs2lonlatstr(CSEC t, char pchar, char mchar, char *s);
厘秒 -> 角度串
/* 原函数名: DgreeString() */
char * swe_cs2degstr(CSEC t, char *a);


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hero_hacker
  17楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:56 积分:682 威望:0 精华:1 注册:2010/8/12 21:56:00
  发帖心情 Post By:2016/9/26 11:36:00

17. SWISSEPH DLL
有一个 32 位的 DLL:

swedll32.dll

你可以使用我们的程序 swetest.c 和 swewin.c 作为示例.要编译 swetest 或 swewin 成一个 DLL:

1. 编译器需要以下文件:
swetest.c 或 swewin.c
swedll32.dll
swedll32.lib
(如果你选择隐式链接)
swephexp.h
swedll.h
sweodef.h

2. 定义以下宏(-d):
USE_DLL
3. 编译 swetest.exe 从 swetest.c 和 swedll32.lib.
    编译 swewin.exe 从 swewin.c, swewin.rc, 和 swedll32.lib
我们提供了一些我们用来建立测试示例的项目文件. 您将需要将这些项目文件调整到您的环境中.
我们使用的是 Microsoft Visual C++ 5.0 (32-位). DLL 是用 Microsoft 编译器编译的.
17.1 脑残编译器的 DLL 接口
如果你使用 GFA-Basic 或一些其它脑残编程语言, 问题将会出现在 DLL 接口不支持 8-bit, 32位, double by value 和 VOID 数据或函数类型. 因此, 我们写了一套修正函数. 在修正函数中用 double pointers 代替 doubles, character pointers 代替 characters, 并且用 integers 代替 void. 这些修正函数的名字与它们的原型相同, 但在其末尾加上后缀 ”_d”, 例如 swe_calc_d() 代替了 swe_calc().这些函数的导出定义可以在文件 swedll.h 中找到. 我们在这里不重复他们,以免与前面章节中描述的普通功能混淆. 额外的函数仅是包装函数, 即他们调用内部真正的 DLL 函数,返回相同的结果.

Swiss Ephemeris 版本1.61是支持16位编译器的最后一个版本.

18. 在 Visual Basic 5.0 中使用 DLL

32位 DLL 在 'decorated names' 下面包含了导出函数. 各函数在其名字前面有一下划线, 和一个前缀 @xx,  其中 xx 是调用时的堆栈字节数.

Visual Basic 对 DLL 函数的定义和一些重要标志参数在文件 \sweph\vb\swedecl.txt 中并可以直接插入到一个 VB 程序中.

一个 VB 程序 vbsweph 包含在分发的文件中的目录\sweph\vb 中. 要运行该示例, DLL 文件 swedll32.dll 必须拷贝到 vb 目录或安装到 Windows system 目录.

DLL 函数返回一个串:
一些 DLL 函数返回一个串, 例如
char* swe_get_planet_name(int ipl, char *plname)

此函数复制它的结果到串指针 plname; 调用函数必须提供足够的空间以容纳返回的结果串. 通常在 C 编程中, 函数拷贝返回的串到提供的区域并返回指向该区域的指针作为函数值. 这就允许直接在 C 的 print 语句中使用此函数.

在 VB 中这种类型的函数有三个问题:

1.
串参数 plname 必须在调用前初始化为一个有足够长度的串; 初始值的内容是无关紧要的, 因为它会被调用函数的返回值复盖. 参数类型必须是
ByVal plname as String.

2.
返回的串以一个 NULL 字符结束. 这必须在在 VB 中搜索并且 VB 串长度必须相应地设置. 我们的示例程序演示了如何这样做:

Private Function set_strlen(c$) As String
  i = InStr(c$, Chr$(0))
  c$ = Left(c$, i - 1)
  set_strlen = c$
End Function
plname = String(20,0)
‘ 初始化串的长度为20
swe_get_planet_name(SE_SUN, plname)
plname = set_strlen(plname)

3.
函数值自己是一个指向串的指针. 此函数值不能用于 VB 中, 因为 VB 没有指针这样的数据类型. 在 VB 中, 这样的函数可以定义为为 ”As long” 返回值被忽略, 或者也可以定义为一个 Sub. 我们选择定义所有这样的函数为 ‘Sub‘, 它自动忽略返回值.
Declare Sub swe_get_planet_name (ByVal ipl as Long, ByVal plname as String)

19. 在 Borland Delphi 和 C++ Builder 中使用 DLL
19.1 Delphi 2.0 及以上版本 (32-位)

此节中的信息由 Markus Fabian, Bern, Switzerland 提供.

在 Delphi 2.0 中函数 swe_calc() 的定义大致如下:

xx : 双精度数组 [0..5];
function swe_calc (tjd
: double;    // 儒略日数
                  ipl
: Integer;    // 行星编号
                  iflag     
: Longint;    // 标志位
                  var xx[0]
: double;
                  sErr     
: PChar      // 错误串;
    ) : Longint; stdcall; far; external 'swedll32.dll' Name '_swe_calc@24';

一个几乎完整的声明集是在文件 \sweph\delphi2\swe_d32.pas 中.
一个小的 Delphi 2.0 示例项目也包含在相同目录中(自June 1998发布的版本 1.25 开始). 该示例要求 DLL 文件存在于示例所在目录中.
19.2 Borland C++ Builder
Borland C++ Builder (BCB) 不能理解 Microsoft 库文件 SWEDLL32.LIB 的格式; 当文件用于 BCB 项目时它报告一个 OMF 错误. 用户必须使用 BCB 的实用程序 IMPLIB 创建他自己的 LIB 文件.

使用以下命令创建特殊的 lib 文件在当前目录中:
IMPLIB –f –c swe32bor.lib \sweph\bin\swedll32.dll

在 C++ Builder 项目中以下设置是必须的:

?
菜单 Options->Projects->Directories/Conditionals: 添加条件定义 USE_DLL
?
菜单 Project->Add_to_project: 添加库文件 swe32bor.lib 到你的项目.
?
在项目源代码中, 添加包含文件 "swephexp.h"

在头文件 swedll.h 中 Dllimport 定义必须是
#define DllImport  extern "C" __declspec( dllimport )
这在版本 1.24 及以上版本由 __cplusplus 开关自动提供. 对于较早的版本必须手动设置.


20. 在 Perl 中使用瑞士星历
可以用用 Perl 模块 SwissEph.pm 从 Perl 中运行Swiss Ephemeris. 模块 SwissEph.pm 使用 XSUB (“eXternal SUBroutine”), 它可以从静态或动态库中调用 Swiss Ephemeris函数.

为了从 Perl 中运行 Swiss Ephemeris, 你必须

1.
安装 Swiss Ephemeris. 要么是你从 http://www.astro.com/swisseph 下载的 Swiss Ephemeris DLL 或你下载的 Swiss Ephemeris C 源代码并编译成静态或动态连接库. We built the package on a Linux system and use a shared library of the Swiss Ephemeris functions.

2.
安装 XS 库:
- 解压文件 PerlSwissEph-1.76.00.tar.gz (或最新版本)
   
- 打开文件 Makefile.PL, 并按你的需要修改它. 然后运行它.
   
- 安装

如果你工作在一台 Windows 电脑上并准备使用 Swiss Ephemeris DLL, 你可以在 http://www.astrotexte.ch/sources/SwissEph.zip 学习 Rüdiger Plantiko's Perl 模块的 Swiss Ephemeris 使用. 也有一个 Rüdiger Plantiko 写的德语文档在 http://www.astrotexte.ch/sources/swe_perl.html).

21. C 示例程序

分发的程序包含了用于演示 Swiss Ephemeris DLL 及其功能的示例程序和源代码.

直到版本2.04, 所有示例均由 Microsoft Visual C++ 5.0 编译器(32-位)编译. 这些环境的项目和工作文件都包含在源文件中.

自版本2.05 起, 所有示例程序和 DLL 都是在 Linux 下的 MinGW 下编译的. 64-位的程序在其名字中包含一个 ‘64’ 的串.

目录结构:
Sweph\bin

DLL, LIB 和 EXE 文件
Sweph\src

源文件, 资源文件
sweph\src\swewin32
32位 windows 示例程序, 使用 swedll32.dll
sweph\src\swetest
32位字符模式示例程序
sweph\src\swetest64
64位字符模式示例程序
sweph\src\swete32
32位字符模式示例程序, 使用 swedll32.dll
sweph\src\swete64
64位字符模式示例程序, 使用 swedll64.dll
sweph\src\swedll32.dll
32位 DLL
sweph\src\swedll64.dll
64位 DLL
sweph\src\swedll32.lib

sweph\src\swedll64.lib


你可以在以下环境中运行示例程序:
Swetest.exe
Windows 命令行
Swetest64.exe
Windows 命令行

Swete32.exe
Windows 命令行
Swete64.exe
Windows 命令行
Swewin32.exe
Windows

字符模式的可执行文件需要 DLL
Swete32.exe
Microsoft Visual C++ 项目文件是 \sweph\src\swete32
swetest.c
swedll32.lib
swephexp.h
swedll.h
sweodef.h
定义宏: USE_DLL  DOS32  DOS_DEGREE


swewin32.exe
项目文件是 \sweph\src\swewin32
swewin.c
swedll32.lib
swewin.rc
swewin.h
swephexp.h
swedll.h
sweodef.h
resource.h
定义宏    USE_DLL

示例程序是如何搜索星历文件的:

1.
检查环境变量 SE_EPHE_PATH; 如果它存在就使用它, 如果它的内容无效, 程序失败.
2.
尝试在当前工作目录查找星历文件
3.
尝试在可执行文件所在目录查找星历文件
4.
在以下三个驱动器上查找名为 \SWEPH\EPHE 的目录:
?
可执行文件所在的驱动器
?
当前驱动器
?
驱动器 C:

一旦成功地找到它搜索的第一个星历文件, 它会认为所有需要的星历文件都在该目录中. 这是示例程序的一个功能, 正如你可以在我们的 C 代码中看到的.

DLL 本身有不同的和更简单的机制来搜寻星历文件, 这在前面的函数 swe_set_ephe_path() 中有说明.
21. 源代码分发
始于版本1.26, 完整的 Swiss Ephemeris DLL 源代码包含在我们的程序中. 用户可以选择直接连接 Swiss Ephemeris 代码到他们的程序中. 源代码由 Ansi C 写成并包含以下文件:
大小
日期
文件名
注释
1639

Makefile
unix makefile for library
API interface files



15050
Nov 27 10:56
swephexp.h
SwissEph API include file
14803
Nov 27 10:59
swepcalc.h
Placalc API include file
Internal files



8518
Nov 27 10:06
swedate.c

2673
Nov 27 10:03
swedate.h

8808
Nov 28 19:24
swedll.h

24634
Nov 27 10:07
swehouse.c

2659
Nov 27 10:05
swehouse.h

31279
Nov 27 10:07
swejpl.c

3444
Nov 27 10:05
swejpl.h

38238
Nov 27 10:07
swemmoon.c

2772
Nov 27 10:05
swemosh.h

18687
Nov 27 10:07
swemplan.c

311564
Nov 27 10:07
swemptab.c

7291
Nov 27 10:06
sweodef.h

28680
Nov 27 10:07
swepcalc.c

173758
Nov 27 10:07
sweph.c

12136
Nov 27 10:06
sweph.h

55063
Nov 27 10:07
swephlib.c

4886
Nov 27 10:06
swephlib.h

43421
Nov 28 19:33
swetest.c


在很多情况下用户会在其熟悉的C编译器下用源代码编译一个动态连接库(DLL)或静态库(LIB), 然后在他们的程序中使用编译的库.
如果用户使用 C 编程, 他只需要包含头文件 swephexp.h 到他的程序中; 这将包含 sweodef.h. 从应用程序开发的角度来看,所有其他源文件可以忽略.
22. PLACALC 兼容 API
为了简化从老的 Placalc 应用程序到 Swiss Ephemeris API, 我们创建了头文件由 swepcalc.h 组成的 Placalc 兼容 API. 该头文件替代 Placalc 应用程序中的 ourdef.h, placalc.h, housasp.h 和 astrolib.h. 这样你可以能将 Swiss Ephemeris 连接到你的 Placalc 应用程序中了. Placalc API 没有包含在 SwissEph DLL 中.
所有新程序都直接使用 SwissEph API.
23. 文档文件

以下文件在目录\sweph\doc中

sweph.cdr
sweph.gif
swephin.cdr
swephin.gif
swephprg.doc

编程文档, 一个 MS Word-97 文件
swephprg.rtf


swisseph.doc

Swiss Ephemeris 的一般信息
swisseph.rtf

带有扩展名 .CDR 的文件是带 Swiss Ephemeris 图标的 Corel Draw 7.0 文档.

24. 不同硬件和编译器中的 Swisseph
取决于你使用的硬件和编译器, 行星计算将有稍许差异. 对于经度位置, 经度的差异不会大于0.0001". 速度的显示差异不大于 0.0002弧秒/天.

以下数据显示了 HPUX 与 Pentium II 处理器上的 Linux 之间的最大差异:
平交点, 平远地点:
HPUX PA-Risc 非优化 vs 优化代码:
  差异小于 0.001 弧秒/天

HPUX PA-Risc vs Intel Pentium gcc 非优化
  差异小于 0.001 弧秒/天

Intel Pentium gss 非优化 vs -O9 优化:
平交点, 真交点, 平远地点: 差异小于 0.001 弧秒/天
Osculating Apogee: 差异小于 0.03 弧秒

这种差异源于一个事实,即 Pentium 的浮点运算是以80位精度执行, 而存储的程序变量只有64位精度. 当代码被优化时, 更多的中间结果被保存在处理器的寄存器中, 即他们没有从80位缩短到64位. 当这些结果用于下一个计算时, 结果便略有不同.
在交点和远地点的速度计算中, 间隔位置之间差异参与了计算; 几乎等于数值结果的减法显示内部精度的差异比其他类型的计算更容易. 这些差异对任何可以想象的应用软件没有影响且基本上在 Swiss Ephemeris 的计算限制以内, 他们可以放心地忽略.

25. 调试和跟踪 Swisseph
25.1. 如果你使用 DLL
除了普通的 Swisseph 函数外, 有两个额外的 DLL 允许你跟踪你的 Swisseph 函数调用:
Swetrs32.dll 是用于单任务调试, 即同一时间只有一个程序调用 Swisseph 函数.
调试时会写两个输出文件:
a) swetrace.txt: 报告所有调用过的 Swisseph 函数.
b) swetrace.c: 包含了相当于你的应用程序所作的 Swisseph 调用的 C 代码.
文件结束处的函数 main() 的最后的括号丢失了.
如果你想编译代码, 你必须手动地添加它. 注意这些文件可能会很快地变大,
取决于你在你的应用程序中做了些什么. 输出的限制是每次运行程序 10000 函数调用.
Swetrm32.dll 是多任务, 即允许在同一时间有一个以上的程序调用 Swisseph 函数. 如果在这种情况下你使用单任务 DLL, 所有程序将试图写它们的跟踪输出到相同的文件. Swetrm32.dll 生成的输出文件名包含了调用 DLL 的程序的应用程序的进程标识号, 例如 swetrace_192.c 和 swetrace_192.txt.
记住每个进程创建它自己的输出文件随着时间的推移可能会填满你的磁盘.
为了使用一个跟踪 DLL, 你必须用它替换你的 Swisseph DLL:
a) 保存你的 Swisseph DLL
b) 更名跟踪 DLL 为你的 Swisseph DLL (例如 swedll32.dll)

重要: 如果你从多于一个的线程调用 Swisseph DLL, 可能不能正确工作.

输出示例 swetrace.txt:

swe_deltat: 2451337.870000
0.000757

swe_set_ephe_path: path_in =
path_set = \sweph\ephe\
swe_calc: 2451337.870757
-1
258
23.437404
23.439365
-0.003530
-0.001961
0.000000
0.000000
swe_deltat: 2451337.870000
0.000757

swe_sidtime0: 2451337.870000
sidt = 1.966683
eps = 23.437404
nut = -0.003530

swe_sidtime: 2451337.870000
1.966683

swe_calc: 2451337.870757
0
258
77.142261
-0.000071
1.014989
0.956743
-0.000022
0.000132
swe_get_planet_name: 0
Sun



swetrace.c:
#include "sweodef.h"
#include "swephexp.h"

void main()
{
  double tjd, t, nut, eps; int i, ipl, retc; long iflag;
  double armc, geolat, cusp[12], ascmc[10]; int hsys;
  double xx[6]; long iflgret;
  char s[AS_MAXCH], star[AS_MAXCH], serr[AS_MAXCH];

/*SWE_DELTAT*/
  tjd = 2451337.870000000; t = swe_deltat(tjd);
  printf("swe_deltat: %f\t%f\t\n", tjd, t);

/*SWE_CALC*/
  tjd = 2451337.870757482; ipl = 0; iflag = 258;
  iflgret = swe_calc(tjd, ipl, iflag, xx, serr);
/* xx = 1239992 */

/*SWE_CLOSE*/
  swe_close();

25.2 如果你使用源代码
如果你编译 Swisseph 源代码到你的程序中, 类似的跟踪也是可能的. 为单线程调试使用预处理定义 TRACE=1, 而多线程则用 TRACE=2. 在许多编译器中这样的标志可以用–DTRACE=1 或 /DTRACE=1 来设置.
关于进一步的说明, 参见 21.1.


[此贴子已经被作者于2016-9-28 20:07:27编辑过]


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hero_hacker
  18楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:56 积分:682 威望:0 精华:1 注册:2010/8/12 21:56:00
  发帖心情 Post By:2016/9/26 20:02:00

说明文件大致到此为止了,下面说说如何在 vc6 下编译 Swiss Ephemeris v 2.05
[此贴子已经被作者于2016-9-29 11:41:07编辑过]


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hero_hacker
  19楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:56 积分:682 威望:0 精华:1 注册:2010/8/12 21:56:00
  发帖心情 Post By:2016/9/28 19:17:00

在我的电脑上的 vc6 下编译 sweph205,出现以下编译错误和警告:

--------------------Configuration: swewin32 - Win32 Release--------------------
Compiling resources...
Compiling...
swecl.c
G:\sweph205\src\sweodef.h(212) : error C2632: 'long' followed by 'long' is illegal
swedate.c
G:\sweph205\src\sweodef.h(212) : error C2632: 'long' followed by 'long' is illegal
swehel.c
G:\sweph205\src\sweodef.h(212) : error C2632: 'long' followed by 'long' is illegal
swehouse.c
G:\sweph205\src\sweodef.h(212) : error C2632: 'long' followed by 'long' is illegal
G:\sweph205\src\swehouse.c(1006) : error C2065: 'INFINITY' : undeclared identifier
G:\sweph205\src\swehouse.c(1786) : error C2275: 'AS_BOOL' : illegal use of this type as an expression
        G:\sweph205\src\sweodef.h(219) : see declaration of 'AS_BOOL'
G:\sweph205\src\swehouse.c(1786) : error C2146: syntax error : missing ';' before identifier 'is_above_hor'
G:\sweph205\src\swehouse.c(1786) : error C2065: 'is_above_hor' : undeclared identifier
G:\sweph205\src\swehouse.c(1787) : error C2275: 'AS_BOOL' : illegal use of this type as an expression
        G:\sweph205\src\sweodef.h(219) : see declaration of 'AS_BOOL'
G:\sweph205\src\swehouse.c(1787) : error C2146: syntax error : missing ';' before identifier 'is_invalid'
G:\sweph205\src\swehouse.c(1787) : error C2065: 'is_invalid' : undeclared identifier
G:\sweph205\src\swehouse.c(1788) : error C2275: 'AS_BOOL' : illegal use of this type as an expression
        G:\sweph205\src\sweodef.h(219) : see declaration of 'AS_BOOL'
G:\sweph205\src\swehouse.c(1788) : error C2146: syntax error : missing ';' before identifier 'is_circumpolar'
G:\sweph205\src\swehouse.c(1788) : error C2065: 'is_circumpolar' : undeclared identifier
G:\sweph205\src\swehouse.c(2301) : error C2143: syntax error : missing ';' before 'type'
G:\sweph205\src\swehouse.c(2308) : error C2065: 'ih' : undeclared identifier
swejpl.c
G:\sweph205\src\sweodef.h(212) : error C2632: 'long' followed by 'long' is illegal
G:\sweph205\src\swejpl.c(697) : warning C4013: '_fseeki64' undefined; assuming extern returning int
G:\sweph205\src\swejpl.c(708) : warning C4013: '_ftelli64' undefined; assuming extern returning int
swemmoon.c
G:\sweph205\src\sweodef.h(212) : error C2632: 'long' followed by 'long' is illegal
swemplan.c
G:\sweph205\src\sweodef.h(212) : error C2632: 'long' followed by 'long' is illegal
sweph.c
G:\sweph205\src\sweodef.h(212) : error C2632: 'long' followed by 'long' is illegal
swephlib.c
G:\sweph205\src\sweodef.h(212) : error C2632: 'long' followed by 'long' is illegal
swewin.c
G:\sweph205\src\sweodef.h(212) : error C2632: 'long' followed by 'long' is illegal
G:\sweph205\src\swewin.c(98) : error C2001: newline in constant
Generating Code...
Error executing cl.exe.

swewin32.exe - 23 error(s), 2 warning(s)
-------------------------------------------------------------------------
错误提示1:
G:\sweph205\src\sweodef.h(212) : error C2632: 'long' followed by 'long' is illegal

解决办法:
打开文件 sweodef.h ,定位到212行。
将  typedef long long
int64;
改为typedef __int64
int64;
-------------------------------------------------------------------------
错误提示2:
G:\sweph205\src\swehouse.c(1006) : error C2065: 'INFINITY' : undeclared identifier

解决办法:
打开文件 swehouse.c ,定位到1006行。
将其中的  INFINITY
改为 INT_MAX
-------------------------------------------------------------------------
错误提示3:
G:\sweph205\src\swehouse.c(1786) : error C2275: 'AS_BOOL' : illegal use of this type as an expression

解决办法:
打开文件 swehouse.c ,定位到1786行。
将此处的三行代码:
  AS_BOOL is_above_hor = FALSE;
  AS_BOOL is_invalid = FALSE;
  AS_BOOL is_circumpolar = FALSE;
移到前两行的
  int i, j;
的后面
-------------------------------------------------------------------------
错误提示4:
G:\sweph205\src\swehouse.c(2303) : error C2143: syntax error : missing ';' before 'type'

解决办法:
打开文件 swehouse.c ,定位到2303行。
将此处的代码:
  int ih;
移到前8行的
  double dec = hsp->sundec;
的后面
-------------------------------------------------------------------------
错误提示5:
G:\sweph205\src\swewin.c(98) : error C2001: newline in constant

解决办法:
打开文件 swewin.c ,定位到98行。
将此处的代码:
#define MY_ODEGREE_STRING "?
改为
#define MY_ODEGREE_STRING "°"
-------------------------------------------------------------------------
修改完毕



[此贴子已经被作者于2016-9-29 14:03:56编辑过]


支持(0中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
帅哥哟,离线,有人找我吗?
hero_hacker
  20楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:论坛游民 帖子:56 积分:682 威望:0 精华:1 注册:2010/8/12 21:56:00
  发帖心情 Post By:2016/10/1 12:06:00

例一 月相计算(修正)

void moon_pheno()
{

double dret[20];

double jut,tjd_ut;

int ord[3];

int i=0,j=0,k=0;

int direct=0;

double buffer=0;

char buf[8000];

char s[AS_MAXCH];

double d_timezone=-8;
    int32 iyear_out, imonth_out, iday_out,
        ihour_out, imin_out;

double dsec_out;



strcpy(buf,"");



jday = 0;

jmon = pd.mon;

jyear = pd.year;

jhour = (int)d_timezone;

jmin = 0;

jsec = 0;

jut = jhour + jmin / 60.0 + jsec / 3600.0;



if ((long) pd.year * 10000L + (long) pd.mon * 100L + (long) pd.mday < 15821015L)


gregflag = FALSE;

else


gregflag = TRUE;



tjd_ut = swe_julday(jyear,jmon,jday,jut,gregflag);

tjd = tjd_ut;


for(i=0;i<31;i++)

{


swe_pheno(tjd, SE_MOON, iflag, dret, serr);


if(buffer!=0)


{



if(dret[1]>=buffer)



{




if(direct==-1)




{





direct=1;





break;




}




direct=1;



}



else



{




if(direct==1)




{





direct=-1;





break;




}




direct=-1;



}


}


buffer = dret[1];


tjd++;

}


k=i;

tjd=tjd-2;

i=0;

buffer=0;

direct=0;


while(TRUE)

{


i++;


tjd=tjd+(double)1/1440;


swe_pheno(tjd, SE_MOON, iflag, dret, serr);



if(buffer!=0)


{



if(dret[1]>=buffer)



{




if(direct==-1)




{





ord[j]=i-1;      // 拐点





j++;











swe_revjul(tjd, gregflag, &jyear, &jmon, &jday, &jut);






jut += 0.5 / 3600;





jhour = (int) jut;





jmin = (int) fmod(jut * 60, 60);





jsec = (int) fmod(jut * 3600, 60);






swe_utc_time_zone(






jyear, jmon, jday,






jhour, jmin, jsec,






d_timezone,






&iyear_out, &imonth_out, &iday_out,






&ihour_out, &imin_out, &dsec_out






);






sprintf(s, "朔  %d.%d.%d - %02d:%02d\r\n", iyear_out, imonth_out, iday_out,ihour_out, imin_out);





do_print(buf, s);













i=i+20000;





tjd=tjd+(double)1/1440*20000;




}




direct=1;        // 上升



}



else



{




if(direct==1)




{





ord[j]=i-1; // 拐点





j++;











swe_revjul(tjd, gregflag, &jyear, &jmon, &jday, &jut);





jut += 0.5 / 3600;





jhour = (int) jut;





jmin = (int) fmod(jut * 60, 60);





jsec = (int) fmod(jut * 3600, 60);






swe_utc_time_zone(






jyear, jmon, jday,






jhour, jmin, jsec,






d_timezone,






&iyear_out, &imonth_out, &iday_out,






&ihour_out, &imin_out, &dsec_out






);






sprintf(s, "望  %d.%d.%d - %02d:%02d\r\n", iyear_out, imonth_out, iday_out,ihour_out, imin_out);





do_print(buf, s);











i=i+20000;





tjd=tjd+(double)1/1440*20000;




}




direct=-1;        // 下降



}


}


buffer = dret[1];


if( (k+i/1440)>33 || j==3)



break;

}

MessageBox(0,buf,"",0);
}
/*
  attr[0] = 日地距角 (地-行星-太阳)
  attr[1] = 相 (圆盘被照亮的部分)
  attr[2] = 行星的距角
  attr[3] = 圆盘的视直径
  attr[4] = 视星等

*/
[此贴子已经被作者于2016-10-5 11:04:06编辑过]

支持(2中立(0反对(0单帖管理 | 引用 | 回复 回到顶部
总数 31 上一页 1 2 3 4 下一页

返回版面帖子列表

Swiss Ephemeris 应用程序编程接口(1)








签名