The programming steps to get a planet’s position # }! A( j# o% k7 H" P6 @8 i) [
To compute a celestial body
- ^$ ]; b; |8 _or point with SWISSEPH, you have to do the following steps (use swetest.c as an example). The details of the functions will be explained in the following chapters.- W+ }+ n% \) ?& O. K
, ~, P; ^( o3 {' c- {5 E
1.
/ [+ e, w$ z! [; M. ~: `0 JSet the directory path of the ephemeris files, e.g.: , N5 K1 ^- k) T6 j! N$ u0 j
8 s. }1 T3 i5 ^+ e% u8 Nswe_set_ephe_path(”C:\\SWEPH\\EPHE”);( c$ m# Y! I/ @+ x
& [5 ^ z! v6 {# B6 p2 B# z7 _, T2..( R" `1 y0 x, @3 h9 J& q. [
From the birth date, compute the Julian day number:8 @: ~" h0 G+ \9 m0 W- K9 r
0 T: d) J0 K( ?. a: R
jul_day_UT = swe_julday(year, month, day, hour, gregflag);" p( Y1 M3 p) J3 W8 w
* O8 _$ |3 _" K. i+ E
3..
t+ n, k' q8 t+ s9 ]8 |6 ZCompute a planet or other bodies:
. N! N: u2 g0 l9 j6 m s- H9 z
4 V6 L* u6 ^; L9 N' M& f; g* _7 Nret_flag = swe_calc_ut(jul_day_UT, planet_no, flag, lon_lat_rad, err_msg);
4 @; j) b$ x4 |6 S
) B2 I; G+ E) {' Bor a fixed star:
, g' e+ u1 {6 A3 A0 O" R y$ t8 y% o
ret_flag = swe_fixstar_ut(star_nam, jul_day_UT, flag, lon_lat_rad, err_msg);
6 L; F1 P' U9 M8 D4 @
2 k' b/ t: ^- \$ \ W/ G' }- H2 g4 Z+ i q
Note:3 n( N8 m& }* ?; e0 p- y$ S# J
W$ m+ g( y, H2 P$ y
The functions swe_calc_ut() and swe_fixstar_ut() were introduced with Swisseph version 1.60.
; O, N) r2 l I+ A4 |1 w2 `" ~5 M3 d& s: V
If you use a Swisseph version older than 1.60 or if you want to work with Ephemeris Time, you have to proceed as follows instead:1 }- C' E. e2 l7 ]0 m0 o
+ s; I# V6 |. X9 J& w8 u; O
' z# X2 l9 o8 R" ^& D9 t2 k; }( uFirst, if necessary, convert Universal Time (UT) to Ephemeris Time (ET):
% d2 p; l( u( H0 V! J3 ~- o1 b" w3 p$ f+ q6 x1 ?5 E7 ~$ w! d
jul_day_ET = jul_day_UT + swe_deltat(jul_day_UT);, z/ H( M$ D: [( Z. {; a( a1 q
8 M, f) h, K5 Z9 C+ j& b7 E7 ]6 n u
Then Compute a planet or other bodies:
6 i' q0 P: |. W& v9 n4 |. g/ ^$ t/ L7 V/ i
ret_flag = swe_calc(jul_day_ET, planet_no, flag, lon_lat_rad, err_msg); ) |9 d5 r! g* q2 }" t# D
* ~8 l3 a# X3 J7 M; Z' q+ [6 Y( O
or a fixed star:
$ }1 j9 W6 `/ U) \
5 ?4 Y5 W8 p4 uret_flag = swe_fixstar(star_nam, jul_day_ET, flag, lon_lat_rad, err_msg);/ ~, o* D7 d7 v$ z, N1 B4 h, ?
' D4 T0 ~ Q$ F2 ~4 a: o" [7 k
5..! _7 `1 K1 h8 L4 Y9 i
At the end of your computations close all files and free memory calling swe_close();
4 J" z# ^, B9 ^1 V1 V " n1 G% _& H; y8 y8 K# Y
Here is a miniature sample program, it is in the source distribution as swemini.c# Z' B6 p- Y% f- [
- k+ ]# d9 C) }: s- |% T, c& u#include "swephexp.h"
$ U7 f4 J# N' y# p8 J+ J& S/* this includes
3 M1 R8 I- P5 ^; N* a( ?* m"sweodef.h" */
$ b- C+ b8 C6 w% q0 ]int main(); s: _6 o5 B4 H& n8 A; u
{8 o3 Z- R9 \5 B s5 S4 C7 c4 m5 r) S- X
" k2 y0 ^# b, M; Q* R
char *sp, sdate[AS_MAXCH], snam[40], serr[AS_MAXCH];' T4 |3 A8 B3 y, B
8 a e1 f- c6 O8 L2 e4 B# w2 X
5 o9 x# i1 ~# e0 X. ~$ M9 ?int jday = 1, jmon = 1, jyear = 2000;$ a8 e; m" f5 E# ^4 ~
9 Z3 T. p1 {* adouble jut = 0.0;: A6 D- t: B9 U
% }3 [, a2 f8 z" c" f
double tjd_ut, te, x2[6];& a: j3 Z" r: n
* o" J2 B6 i3 T G7 M
long iflag, iflgret;$ c: h: v2 i% U5 T4 o- G, l
) f; p: r8 G; `! {
int p;
( ]; } l$ o: M" a' n! N
4 u% O9 h7 s4 y& p, i8 c, tiflag = SEFLG_SPEED;
1 q \; S: ^+ W) L# Q E+ D4 O/ o- f; M/ R1 ^# F
while (TRUE) {8 S; _' D1 t0 G! z* k7 X; n
% z8 D# \" v* D5 Y; J. }$ Wprintf("\nDate (d.m.y) ?");' s! { a- ~# h; Q! W; [! ?+ V
. t. I9 j1 D4 v [
gets(sdate);: C$ v) l5 L* Y5 I4 y6 z
' c! X' a! Y1 M/ F8 k0 F% f
/* stop if a period . is entered */, ]4 t5 L! @% q& a( F
" Z, T! u; o6 e9 O- D
if (*sdate == '.')
" c9 ^' ~' N2 o. P
# p3 f* |4 Q+ ?5 Sreturn OK;
$ p7 u9 ]2 f* L! n* a# m+ V
4 H# _3 v3 _0 W1 Q# V. eif (sscanf (sdate, "%d%*c%d%*c%d", &jday,&jmon,&jyear) < 1) exit(1);- f* ?* u+ Y- @ ]7 i
$ w9 H' i9 X+ n6 ^
5 U0 Z9 M* s0 D( e8 I2 y& b/*% e s$ p0 C' t U+ T
9 L: ^( o7 S2 G* L! b5 \! N* I
( _! W! e4 j7 w* we have day, month and year and convert to Julian day number5 l# u5 _4 e& Z# f' Y; U, A
' Z' H# q' D( |+ [
5 w, T8 I6 M, o; z( ^*/
" d# z6 z' I$ r
& ^+ U3 P- A; O7 ]' _tjd_ut = swe_julday(jyear,jmon,jday,jut,SE_GREG_CAL);2 @- W6 c3 Q' T- H2 G! y6 j8 w, {
5 o& T5 |" d* h/ x) g
7 H/ v5 v8 ?4 G7 V" B# N
) f" i: ~5 S0 W4 d0 A/*
9 V) {# a* R$ R; T3 |+ F) o# {+ Z/ U I( |: J6 q4 \
7 B/ W3 l7 ]+ ]0 _2 {
* compute Ephemeris from Universal by adding delta_t t7 p6 E7 T5 X$ [8 T
/ S1 u! u3 k7 R6 N# E+ T6 U7 y
$ e3 v# T6 D- f _
* not required for Swisseph versions smaller than 1.60, v4 B6 X+ \4 l5 [0 I- P
& U f& Q1 L- P: c M! b: y0 `- y) r( Y9 ~2 i
*/
2 |6 q3 L) S. l9 ~0 a/ k1 D- Y) j! b3 g* t; w
/* te = tjd_ut + swe_deltat(tjd_ut); */
& e6 W) \, F# S+ @7 m' D+ W* K$ |: a
6 d1 k9 |/ S* _5 ~* ^4 ?printf("date: %02d.%02d.%d at 0:00 Universal time\n", jday, jmon, jyear);
O/ G5 _& Z4 W- T% N3 w# x) A( @' N# f0 y1 H* g5 ?6 T" j8 M
printf("planet# P' P, E% Y2 q
\tlongitude\tlatitude\tdistance\tspeed long.\n");) m, S8 w* M0 X5 b$ X& |- c$ Q6 x
% p6 `7 d& W! f$ G0 m4 |
% j7 f1 y$ A; {! H; t/*
0 @) Q& U9 e- i! N
7 {- N! S% J+ s' x7 h/ x- [6 [; W
* a loop over all planets
0 X$ ?% x' z; U5 L( i- e; s
# q/ }1 G) T. a
- l. d) l2 t* n( m*/
* v& F8 l [6 F4 q, m* ?# w; o6 W, Y6 A! {; i
for (p = SE_SUN; p <= SE_CHIRON; p++) {
- K1 y; M- |, |4 T
: y; P- O. j7 G* i9 J7 U1 ]if (p == SE_EARTH) continue;
6 K% e7 @) P2 Y* ]* b6 b$ A6 h0 m" @! n! a; m$ p) }
/*# b! K5 ^% W3 b( O. N" g
- g" E9 m8 b$ a$ P! n/ O
, s8 h8 L' C: f* do the coordinate calculation for this planet p
, N! R5 Q# h4 E1 U( Y6 V6 A4 y9 u. Y, j; D# B+ Z5 ]
. j( l" S6 o2 S) H4 t+ E*/
2 H) G" F. W' T% Y) B/ d, K: u( g9 diflgret = swe_calc_ut(tjd_ut, p, iflag, x2, serr);6 u3 D* Z$ P: c- A$ r
+ F0 H$ H+ ?! L* A( q) o+ G6 J
5 L n2 P M/ k6 s9 T
/* Swisseph versions older than 1.60 require the following # F* K, W/ P, J* J2 o @! ]
" I* @- O. k2 N3 D0 n" M
* statement instead */8 F. J4 z, s& E1 a
/* iflgret = swe_calc(te, p, iflag, x2, serr); */
! l. r9 E1 w( {. \6 P4 O0 b p' p% }8 e8 f- _! d
- F$ W( G/ q) p S1 `
/*$ \+ z- v& @! k" W. D. m3 A
6 O. z8 M, e+ d$ |" K. P0 G% E
% |4 _3 [9 ~- C2 Q! H) F o* if there is a problem, a negative value is returned and an 2 B! X2 F y/ A8 M
4 u8 D& ?5 ?: y) }1 }. [ k( B. n
2 p( S n, J( v9 r4 K- n* error message is in serr.- ^0 i, [ Q( ?0 Z8 o* q' G
5 X/ A% Q/ Q# y4 }( V. f( S
" e: j: h4 c6 ? W*/3 Z4 Z& l0 g* }/ V
" A7 H! v7 k/ Sif (iflgret < 0)
* c5 `( M+ m! n/ y; X* Y% ^$ S$ o, T: F U* R+ f! w$ C
printf("error: %s\n", serr);1 j& o# c2 Q) ~% h4 W8 W4 n/ q
3 C0 {' m& U5 N
* p+ D* J. w8 y& T/*
$ _5 o7 \* P" L- k o$ ?6 D5 `) I* Q& l$ o& o: w, N, b
) |8 v- ]/ W$ w, D# R$ H1 D$ l2 n
* get the name of the planet p
( N9 M% G0 T% i4 ~; v' g$ V( n/ O+ F0 x# |- e
! M0 u# C0 n5 A+ V7 u( \7 @*/
' o- m( N$ O+ R* f- l# p+ D/ b3 N* h- o0 p
swe_get_planet_name(p, snam);! p K" }/ o7 j2 i
; s7 b: k- T7 a9 E8 m! x7 @: T8 [' e/ Q8 \( L& Z
/*! {+ }3 G( ~+ A) c# o5 q7 B) Z
9 W3 R$ z" V- o3 j u* W; y" W
" D% X! Q6 s' M; q4 P. J* print the coordinates
- W! ]& |8 D6 p( ?) h: v$ `8 ]
- F7 k1 u k5 H5 a
, D8 A8 n# u& ~- ]*/( v7 w" I; N6 c' @
3 S# @) m N9 S2 E6 p9 V
printf("%10s\t%11.7f\t%10.7f\t%10.7f\t%10.7f\n",
8 P( @$ W6 ^3 E6 @+ n/ A4 r: V7 F6 @; H
- o4 N% m5 \! [snam, x2[0], x2[1], x2[2], x2[3]);- |# [. A: i5 B: w8 f, N+ s) J
5 k# C! p L/ q: g0 k1 m}
. g a; y" i% \2 `+ V. ]! |- s8 {/ f! c
}
& b. i: G8 A: @" ?5 t% p7 P3 q& A @1 E$ V
return OK;
( S4 o6 M+ i: f6 ~: f+ c. a} |