1. The programming steps to get a planet’s position 7 K# S1 _9 P& P9 ]5 H
To compute a celestial body: h, r: J3 R0 k8 d8 x& {
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.
% W6 Z( _* Z3 }7 O
- v8 v7 C9 p3 _% m0 F1.
& {6 r% L9 k' W6 f& m1 N% S1 t6 ySet the directory path of the ephemeris files, e.g.: 0 ?& R% p& }. o; }" E3 W. V1 a. A2 C
: b7 ]8 {: L. z& t6 ]6 `/ q
swe_set_ephe_path(”C:\\SWEPH\\EPHE”);% ~5 h, x- F: S* G) Z8 K# n
2 P( P) `$ b5 c0 r2..) @ ^# z, E9 L9 m$ E: {# t
From the birth date, compute the Julian day number:
2 G# Z+ [/ k- S" S" W0 n* G3 Z l. z
jul_day_UT = swe_julday(year, month, day, hour, gregflag);9 }5 a; Z( H r; ~* \, i8 [! U# p3 s
' S d4 l+ B2 n0 t& ]4 z! q: z3..
, [7 a, ]) @' i2 bCompute a planet or other bodies:
( F/ A( @! v% V
, ^) V# ]( @$ tret_flag = swe_calc_ut(jul_day_UT, planet_no, flag, lon_lat_rad, err_msg); 3 y- T- F" x9 l5 N( I8 C2 q
9 N* P4 q) l j/ q3 S4 u
or a fixed star:
) `: V6 o" |: p5 U# `5 [
9 I }& b+ ?' K8 u, h4 qret_flag = swe_fixstar_ut(star_nam, jul_day_UT, flag, lon_lat_rad, err_msg);' v( [ L6 q6 m
2 {( z! v8 O. {5 H* H3 [' v; ?+ t W9 D
Note:
/ ?1 c5 @- e& T/ Y9 E" k% k
) m- ~; `$ e2 i h3 I2 iThe functions swe_calc_ut() and swe_fixstar_ut() were introduced with Swisseph version 1.60.
7 ^6 q; T8 x( u7 O6 {- i9 w! E8 L7 g& O7 ^! ]
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:
7 w( B3 f" _' X+ i0 T4 k9 L
7 |2 O+ V3 c9 H5 E* R1 f9 x9 p* n9 k' j! s- n
First, if necessary, convert Universal Time (UT) to Ephemeris Time (ET):
% w0 }7 {) k3 U. ?9 l z& S! m$ O/ X% U7 i: ?% s' F
jul_day_ET = jul_day_UT + swe_deltat(jul_day_UT);( P- {- l& M! W$ b, S; H( |
1 r$ T$ |7 W. [6 I# s
( Q' e; T$ r' w9 M. ^' ?
Then Compute a planet or other bodies:/ D1 r; U; c- r& J% }, d% I8 N
' X% W' w5 Q* }. z |3 ?; wret_flag = swe_calc(jul_day_ET, planet_no, flag, lon_lat_rad, err_msg); & _* O( m7 E3 r% C) D( e) j
. p/ m4 u: F7 k( {3 T, A" qor a fixed star:
1 e! L' ~5 t/ F% K% i5 ^! y, @9 _; d) O6 A: S. U
ret_flag = swe_fixstar(star_nam, jul_day_ET, flag, lon_lat_rad, err_msg);
& L' G, Q: O7 I. D3 I5 Z& T6 V
5 u- w R5 p) J) ?4 Y( j) P, e7 d6 t) S5..
3 u/ v; f( z6 `At the end of your computations close all files and free memory calling swe_close();; X7 _* I6 g. ~9 A
' {8 F/ u% G, y8 ^2 e: b) dHere is a miniature sample program, it is in the source distribution as swemini.c' h8 x! b4 d T5 e0 N8 z4 x) f. |
0 e. }# n& J4 m5 H' R, E
#include "swephexp.h"
% G/ c2 e+ E* I8 F- U, v1 U/* this includes; Q6 D8 H8 w* e% h: g# H8 e6 V: `
"sweodef.h" */# J9 K g0 W! `$ h$ m
int main()9 X% j+ P6 r1 N
{) C( {9 f' c3 |
* f1 T! ~: W( @% O$ f
char *sp, sdate[AS_MAXCH], snam[40], serr[AS_MAXCH];& g6 t3 z4 p! w
; H3 [* d( w( p. d; B% L* J% q0 T& I2 e6 K5 w0 W: x
int jday = 1, jmon = 1, jyear = 2000;, k+ w# A& k+ R! I1 c0 i
$ i, p; d3 H1 L8 x' F3 g; K- zdouble jut = 0.0;" e8 u1 E- w n" E+ p0 o9 ^
/ [9 J: @; f5 F2 W2 f/ H$ j
double tjd_ut, te, x2[6];* @2 _6 u0 Z2 K- w
( u% z1 q# _4 O, ?
long iflag, iflgret;
' [* H' i8 @2 [ ]$ o7 s% T# x2 O" U: Z6 W& @, C( F
int p;4 U* G0 U. x* Z, X
% P7 A/ W/ G: S& _; I. g7 t8 ]iflag = SEFLG_SPEED;6 h( n+ H& ` S/ `
' Y7 P: D3 y2 l3 V& u7 l; j6 m( zwhile (TRUE) {
& N# d$ U9 H- ^4 {" b
# n8 v9 ]/ S; K$ `0 s" g5 V; rprintf("\nDate (d.m.y) ?");
/ f+ e! B$ P9 A- j- C9 K, `/ G
& k, }, j6 @1 `8 r5 ygets(sdate);1 i. S! l$ \: L) L
3 b' S& N* _4 `/ Q2 a/* stop if a period . is entered */1 U1 G9 f- e4 i& S+ a
8 _) n( D- ~; q3 a2 h7 h
if (*sdate == '.') % v& _! l3 W, H. ]0 f
& ?, n5 a* V/ m0 }return OK;
' P8 @4 m. ~. I( H% ]. f& }3 S' P) Q0 w. R
if (sscanf (sdate, "%d%*c%d%*c%d", &jday,&jmon,&jyear) < 1) exit(1);# W& h+ M, r- t1 t8 u" n- P7 _) j5 _
- I" B: L1 } x+ h- Y( l1 F
/ D& H$ w& l, _0 ?' K* b/*
/ W! p% P# }; `0 Q
, ] `7 P5 @0 K; O
. `; n5 r3 M) l# s* we have day, month and year and convert to Julian day number' o: o6 |" s! s' ~9 @+ d* O
7 r+ \8 N' c- k- K0 i! h- [5 F# Q, [' \1 \) m1 D, X7 f
*// [8 @ Z9 j& b A3 f$ ]
% {$ j, P, P/ i% k: xtjd_ut = swe_julday(jyear,jmon,jday,jut,SE_GREG_CAL);1 l' W1 H; m; Q' Q# x- D
% S% ?' o; _5 f7 L* y, w
^/ O6 M9 Z" ~- I. w% r! n! W
7 U L3 w5 v9 T9 _7 f. {/*
& s K/ d2 A r4 x
1 g. C% L. j9 X& X: n5 R: }5 v0 b* g/ p
* compute Ephemeris from Universal by adding delta_t
2 F# r A8 A8 h3 }7 P& i# ^, s
& L5 l1 X) h0 H9 x. |) C3 V) e" ?& `1 ^# g* K, Q- e6 }0 c% m
* not required for Swisseph versions smaller than 1.604 b9 @+ a2 V6 g
+ t7 t: V! t) f5 ?: ~- q
1 t! w7 _) m. a7 `/ r( Q
*/5 n6 y3 m6 [, C% [$ S
% M4 L, {) ~, C. u1 D. }/* te = tjd_ut + swe_deltat(tjd_ut); */* c* o) |3 l) [" z2 P9 V: o
- @9 q- f& p% ?( Fprintf("date: %02d.%02d.%d at 0:00 Universal time\n", jday, jmon, jyear);
7 p: ` t% Z4 b7 c0 y
5 B; s& O2 v$ F. Vprintf("planet3 k) Z' g- @ l0 r+ _8 k7 O' L
\tlongitude\tlatitude\tdistance\tspeed long.\n");
6 x+ F2 J. D+ E; c4 w2 |" A# s) j4 y1 r+ v5 N e4 |: }6 I
$ P' W- ]5 |& S! M( C/*
, P6 T+ T6 D& [ ]1 i; z3 b' c$ N* V7 O! i! h
+ o; f- w1 I' t0 K% f
* a loop over all planets( M9 u( G$ |: x7 r
2 n% i) j/ J6 ^0 N5 h# ^0 i9 A
" X8 H5 g0 _6 s3 P9 H
*/& A1 E* b7 H& J- n: {' {, D z
: P ~: S: ]( y$ G1 j
for (p = SE_SUN; p <= SE_CHIRON; p++) {
3 i+ E& Q2 E: H) d R, } L; Z6 V* X ~. z
if (p == SE_EARTH) continue;1 N3 a9 k3 _4 I
* Y5 S3 ~( d7 F+ H3 {' X/*
4 B# q; J! k/ c' D6 R
# P5 d- d8 i d1 q V: E. K* ?; p: c* b5 }; X0 f* N( N' |
* do the coordinate calculation for this planet p" t7 X! `1 f4 }" P7 ~& f
1 K5 |% t- ?$ y# D/ X+ i: q) s
0 U5 m% _; F# O) _ V( d: @7 c
*/" D, G+ v4 S. A
iflgret = swe_calc_ut(tjd_ut, p, iflag, x2, serr);8 z" k) _" ~9 w1 c$ x+ K# d0 C
7 j9 j: d# h/ k7 [
" r5 d' J* O% i& a/* Swisseph versions older than 1.60 require the following 1 J) I i+ A" H- A& O8 Q: P- [
- r" l! c! G! f: h2 k p( N% H
* statement instead */2 |& J6 P9 h: Y/ c7 d9 s
/* iflgret = swe_calc(te, p, iflag, x2, serr); */
7 |7 b w- O9 h4 x, j) c& X# B' o6 p! F3 w
7 N2 l- i# @4 C3 c* V+ ]/*
9 i6 f2 m- k% h. K. b# S( u' b; e4 q
0 P& {# M, {9 @- b
! Z9 N( ]- e7 T$ c& d" [* if there is a problem, a negative value is returned and an
/ c" p6 ]0 B# v; ?% i7 J7 t2 O- }! H+ Q" X* E; V# V
: T4 C- [( d6 A C+ r( T* error message is in serr.) b. i$ u; k# P4 _
) [) \7 }; A) o1 P X A1 _0 ~
8 ~) r p5 t8 J7 m9 S! \
*/
3 L+ T( X2 h, y, ?8 ~* b% P& K% X: K) Z/ K' p+ h
if (iflgret < 0)
5 W; v0 ]2 p% H! f( @" L/ A5 O* U( h% w6 L! i" L
printf("error: %s\n", serr);3 @( h W5 I) E9 ~3 z% A+ C
- a- p. W( l) f/ V% f- a2 z
- ]1 a' H! }! O) W- c' Q/*! E& t# I! A; |! ~7 }
5 i: m$ u/ i6 h1 e1 K0 O
: }; D: ?9 d2 L) L4 Y5 n' Z3 x
* get the name of the planet p$ d5 j' M( |6 _' |; z6 }& Y: ?8 x% o. b
; _0 ^+ D: H* H/ g! Y. J" }- `
9 v; C1 q( e* F*/- R8 ]- H, c6 p. E6 A$ [9 U4 Z, Z, |
, ?- u" V( x8 t6 R2 H( q- Kswe_get_planet_name(p, snam);) C. ~0 f, f/ R
9 }/ Z9 F* F# F M. {3 |; x$ P, ^+ X1 ^! E, `! i7 [- ?
/*4 J2 u& X) g7 q, d* Y
( b/ N! @7 ]. ~+ z9 ]$ p2 W. ~2 F4 @: s+ p" y
* print the coordinates
& `: P" T& |( O5 B9 _, y# Y3 \* e2 ?# T* ? u5 {
& p. @, G! h* B, ` n*/7 q2 q' D( A# x& D/ j+ s X$ [
' c, m `+ R1 b6 d' g# Dprintf("%10s\t%11.7f\t%10.7f\t%10.7f\t%10.7f\n",
2 I6 }( {: o! ~! _3 T
. f! [, J4 v9 M1 g3 Z3 ^) i
, _: }7 V% t+ q& n2 t; z) F. u8 zsnam, x2[0], x2[1], x2[2], x2[3]);7 i4 c2 A$ C# S' R' x- G$ {, r
8 w4 U; R1 F4 m" [% \
}1 i; d6 I, E, g( X; e# [
8 |# a7 u" O! m: ~ A: l6 P
}
+ }& b; T/ v3 C) C. s+ V5 X9 X$ J( d5 i3 w( ~" c
return OK;7 Z3 m3 G6 I; o. y" B+ T
} |