File Coverage

lib/Astro/Montenbruck/Ephemeris/Planet/Venus.pm
Criterion Covered Total %
statement 94 94 100.0
branch n/a
condition n/a
subroutine 11 11 100.0
pod 2 2 100.0
total 107 107 100.0


line stmt bran cond sub pod time code
1             package Astro::Montenbruck::Ephemeris::Planet::Venus;
2              
3 3     3   1886 use strict;
  3         9  
  3         97  
4 3     3   17 use warnings;
  3         6  
  3         98  
5              
6 3     3   16 use base qw/Astro::Montenbruck::Ephemeris::Planet/;
  3         8  
  3         260  
7 3     3   22 use Math::Trig qw/:pi/;
  3         6  
  3         451  
8              
9 3     3   449 use Astro::Montenbruck::Ephemeris::Pert qw /pert/;
  3         6  
  3         160  
10 3     3   21 use Astro::Montenbruck::MathUtils qw /frac ARCS/;
  3         7  
  3         165  
11 3     3   32 use Astro::Montenbruck::Ephemeris::Planet qw/$VE/;
  3         6  
  3         3268  
12              
13             our $VERSION = 0.01;
14              
15             sub new {
16 8     8 1 19 my $class = shift;
17 8         47 $class->SUPER::new( id => $VE );
18             }
19              
20             # Venus heliocentric position
21             sub heliocentric {
22 8     8 1 20 my ( $self, $t ) = @_;
23              
24             # mean anomalies of planets in [rad]
25 8         24 my $m1 = pi2 * frac( 0.4861431 + 415.2018375 * $t );
26 8         22 my $m2 = pi2 * frac( 0.1400197 + 162.5494552 * $t );
27 8         22 my $m3 = pi2 * frac( 0.9944153 + 99.9982208 * $t );
28 8         24 my $m4 = pi2 * frac( 0.0556297 + 53.1674631 * $t );
29 8         20 my $m5 = pi2 * frac( 0.0567028 + 8.4305083 * $t );
30 8         22 my $m6 = pi2 * frac( 0.8830539 + 3.3947206 * $t );
31              
32 8         20 my ( $dl, $dr, $db ) = ( 0, 0, 0 ); # Corrections in longitude ["]
33 8     336   33 my $pert_cb = sub { $dl += $_[0]; $dr += $_[1]; $db += $_[2] };
  336         503  
  336         451  
  336         567  
34              
35             # Perturbations by Mercury
36 8         40 my $term = pert(
37             T => $t,
38             M => $m2,
39             m => $m1,
40             I_min => 1,
41             I_max => 5,
42             i_min => -2,
43             i_max => -1,
44             callback => $pert_cb
45             );
46              
47 8         33 $term->( 1, -1, 0, 0.00, 0.00, 0.06, -0.09, 0.01, 0.00 );
48 8         30 $term->( 2, -1, 0, 0.25, -0.09, -0.09, -0.27, 0.00, 0.00 );
49 8         27 $term->( 4, -2, 0, -0.07, -0.08, -0.14, 0.14, -0.01, -0.01 );
50 8         27 $term->( 5, -2, 0, -0.35, 0.08, 0.02, 0.09, 0.00, 0.00 );
51              
52             # Keplerian motion and perturbations by the Earth
53 8         20 $term = pert(
54             T => $t,
55             M => $m2,
56             m => $m3,
57             I_min => 1,
58             I_max => 8,
59             i_min => -8,
60             i_max => 0,
61             callback => $pert_cb
62             );
63              
64 8         37 $term->( 1, 0, 0, 2.37, 2793.23, -4899.07, 0.11, 9995.27, 7027.22 );
65 8         29 $term->( 1, 0, 1, 0.10, -19.65, 34.40, 0.22, 64.95, -86.10 );
66 8         26 $term->( 1, 0, 2, 0.06, 0.04, -0.07, 0.11, -0.55, -0.07 );
67 8         25 $term->( 2, 0, 0, -170.42, 73.13, -16.59, 0.00, 67.71, 47.56 );
68 8         26 $term->( 2, 0, 1, 0.93, 2.91, 0.23, 0.00, -0.03, -0.92 );
69 8         24 $term->( 3, 0, 0, -2.31, 0.90, -0.08, 0.00, 0.04, 2.09 );
70 8         27 $term->( 1, -1, 0, -2.38, -4.27, 3.27, -1.82, 0.00, 0.00 );
71 8         31 $term->( 1, -2, 0, 0.09, 0.00, -0.08, 0.05, -0.02, -0.25 );
72 8         28 $term->( 2, -2, 0, -9.57, -5.93, 8.57, -13.83, -0.01, -0.01 );
73 8         32 $term->( 2, -3, 0, -2.47, -2.40, 0.83, -0.95, 0.16, 0.24 );
74 8         30 $term->( 3, -2, 0, -0.09, -0.05, 0.08, -0.13, -0.28, 0.12 );
75 8         25 $term->( 3, -3, 0, 7.12, 0.32, -0.62, 13.76, -0.07, 0.01 );
76 8         24 $term->( 3, -4, 0, -0.65, -0.17, 0.18, -0.73, 0.10, 0.05 );
77 8         25 $term->( 3, -5, 0, -1.08, -0.95, -0.17, 0.22, -0.03, -0.03 );
78 8         47 $term->( 4, -3, 0, 0.06, 0.00, -0.01, 0.08, 0.14, -0.18 );
79 8         27 $term->( 4, -4, 0, 0.93, -0.46, 1.06, 2.13, -0.01, 0.01 );
80 8         26 $term->( 4, -5, 0, -1.53, 0.38, -0.64, -2.54, 0.27, 0.00 );
81 8         24 $term->( 4, -6, 0, -0.17, -0.05, 0.03, -0.11, 0.02, 0.00 );
82 8         24 $term->( 5, -5, 0, 0.18, -0.28, 0.71, 0.47, -0.02, 0.04 );
83 8         23 $term->( 5, -6, 0, 0.15, -0.14, 0.30, 0.31, -0.04, 0.03 );
84 8         28 $term->( 5, -7, 0, -0.08, 0.02, -0.03, -0.11, 0.01, 0.00 );
85 8         30 $term->( 5, -8, 0, -0.23, 0.00, 0.01, -0.04, 0.00, 0.00 );
86 8         29 $term->( 6, -6, 0, 0.01, -0.14, 0.39, 0.04, 0.00, -0.01 );
87 8         28 $term->( 6, -7, 0, 0.02, -0.05, 0.12, 0.04, -0.01, 0.01 );
88 8         30 $term->( 6, -8, 0, 0.10, -0.10, 0.19, 0.19, -0.02, 0.02 );
89 8         34 $term->( 7, -7, 0, -0.03, -0.06, 0.18, -0.08, 0.00, 0.00 );
90 8         42 $term->( 8, -8, 0, -0.03, -0.02, 0.06, -0.08, 0.00, 0.00 );
91              
92             # Perturbations by Mars
93 8         36 $term = pert(
94             T => $t,
95             M => $m2,
96             m => $m4,
97             I_min => 1,
98             I_max => 2,
99             i_min => -3,
100             i_max => -2,
101             callback => $pert_cb
102             );
103              
104 8         55 $term->( 1, -3, 0, -0.65, 1.02, -0.04, -0.02, -0.02, 0.00 );
105 8         46 $term->( 2, -2, 0, -0.05, 0.04, -0.09, -0.10, 0.00, 0.00 );
106 8         28 $term->( 2, -3, 0, -0.50, 0.45, -0.79, -0.89, 0.01, 0.03 );
107              
108             # Perturbations by Venus
109 8         35 $term = pert(
110             T => $t,
111             M => $m2,
112             m => $m5,
113             I_min => 0,
114             I_max => 3,
115             i_min => -3,
116             i_max => -1,
117             callback => $pert_cb
118             );
119              
120 8         43 $term->( 0, -1, 0, -0.05, 1.56, 0.16, 0.04, -0.08, -0.04 );
121 8         33 $term->( 1, -1, 0, -2.62, 1.40, -2.35, -4.40, 0.02, 0.03 );
122 8         34 $term->( 1, -2, 0, -0.47, -0.08, 0.12, -0.76, 0.04, -0.18 );
123 8         31 $term->( 2, -2, 0, -0.73, -0.51, 1.27, -1.82, -0.01, 0.01 );
124 8         27 $term->( 2, -3, 0, -0.14, -0.10, 0.25, -0.34, 0.00, 0.00 );
125 8         23 $term->( 3, -3, 0, -0.01, 0.04, -0.11, -0.02, 0.00, 0.00 );
126              
127             # Perturbations by Saturn
128 8         25 $term = pert(
129             T => $t,
130             M => $m2,
131             m => $m6,
132             I_min => 0,
133             I_max => 1,
134             i_min => -1,
135             i_max => -1,
136             callback => $pert_cb
137             );
138              
139 8         35 $term->( 0, -1, 0, 0.00, 0.21, 0.00, 0.00, 0.00, -0.01 );
140 8         33 $term->( 1, -1, 0, -0.11, -0.14, 0.24, -0.20, 0.01, 0.00 );
141              
142             # Ecliptic coordinates ([rad],[AU])
143 8         28 $dl +=
144             +2.74 * sin( pi2 * ( 0.0764 + 0.4174 * $t ) ) +
145             0.27 * sin( pi2 * ( 0.9201 + 0.3307 * $t ) );
146 8         16 $dl += +1.9 + 1.8 * $t;
147              
148 8         34 my $l =
149             pi2 *
150             frac( 0.3654783 + $m2 / pi2 +
151             ( ( 5071.2 + 1.1 * $t ) * $t + $dl ) / 1296.0e3 );
152 8         18 my $r = 0.7233482 - 0.0000002 * $t + $dr * 1.0e-6;
153 8         21 my $b = ( -67.70 + ( 0.04 + 0.01 * $t ) * $t + $db ) / ARCS;
154              
155 8         67 $l, $b, $r;
156             }
157              
158             # Intermediate variables for calculating geocentric positions.
159             sub _lbr_geo {
160 8     8   18 my ( $self, $t ) = @_;
161              
162 8         25 my $m = pi2 * frac( 0.1400197 + 162.5494552 * $t );
163 8         19 my $dl = 280.00 + 3.79 * cos($m);
164 8         17 my $dr = 1.37 * sin($m);
165 8         18 my $db = 9.54 * cos($m) - 13.57 * sin($m);
166              
167 8         24 $dl, $db, $dr;
168             }
169              
170             1;
171              
172             __END__
173              
174             =pod
175              
176             =encoding UTF-8
177              
178             =head1 NAME
179              
180             Astro::Montenbruck::Ephemeris::Planet::Venus - Venus.
181              
182             =head1 SYNOPSIS
183              
184             use Astro::Montenbruck::Ephemeris::Planet::Venus;
185             my $planet = Astro::Montenbruck::Ephemeris::Planet::Venus->new();
186             my @geo = $planet->position($t); # apparent geocentric ecliptical coordinates
187              
188             =head1 DESCRIPTION
189              
190             Child class of L<Astro::Montenbruck::Ephemeris::Planet>, responsible for calculating
191             B<Venus> position.
192              
193             =head1 METHODS
194              
195             =head2 Astro::Montenbruck::Ephemeris::Planet::Venus->new
196              
197             Constructor.
198              
199             =head2 $self->heliocentric($t)
200              
201             See description in L<Astro::Montenbruck::Ephemeris::Planet>.
202              
203             =head1 AUTHOR
204              
205             Sergey Krushinsky, C<< <krushi at cpan.org> >>
206              
207             =head1 COPYRIGHT AND LICENSE
208              
209             Copyright (C) 2009-2019 by Sergey Krushinsky
210              
211             This library is free software; you can redistribute it and/or modify
212             it under the same terms as Perl itself.
213              
214             =cut