-
Notifications
You must be signed in to change notification settings - Fork 0
/
animation_example.py
109 lines (80 loc) · 3.55 KB
/
animation_example.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
"""
animation_example.py:
- a python module, which shows an example use of projekt_anarres.py
(C) 2013 Ida-Sofia Skyman (skymandr@fripost.org)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see [0].
This module contains functions for gettiang azimuthal views centered on
arbitrary meridians from an equirectangular map, and for making and saving
frames for an animation based on such views
For more information on the different projections and options, please see
the documentation for projekt_anarres.py!
------
[0]: http://www.gnu.org/licenses/gpl-3.0.html
"""
# Initial imports:
import projekt_anarres as p
import numpy as np
import matplotlib.pyplot as plt
import string
# Provided functions:
def make_animation(the_map='templates/grid_double.png', saveas="animated",
frames=64, padding=10, padwith=0, R=256,
azikind='orthographic'):
"""
Fuction for creating frames in an animation of a rotating planet.
"""
map_image = plt.imread(the_map)
while len(map_image.shape) > 2:
map_image = map_image.mean(-1)
for n in xrange(frames):
meridian = 90.0 + 360.0 * n / frames
parallel = 90.0
hemisphere = get_hemisphere(map_image, meridian, parallel,
R, azikind, padwith)
plt.imsave("{0}_{1}.png".format(saveas, string.zfill(n,
np.ceil(np.log10(frames)).astype(np.int))), hemisphere,
cmap=plt.cm.gray)
def get_hemisphere(map_image, meridian=90.0, parallel=90.0, R=256,
azikind='orthographic', padwith=0):
"""
Function for getting an azimuthal view from a rectangular projection,
centred on a particular meridian and parallel.
(This function is also implemented in projekt_anarres.py.)
"""
map_image = np.r_[map_image, np.flipud(
np.c_[map_image[1:, map_image.shape[1] / 2:],
map_image[1:, : map_image.shape[1] / 2]])]
meridian_coord = (np.round(
map_image.shape[1] * meridian / 360.0))\
.astype(np.int)
min_meridian = (np.ceil(
map_image.shape[1] * ((meridian - 90.0)) / 360.0))\
.astype(np.int)
max_meridian = (np.ceil(
map_image.shape[1] * ((meridian + 90.0)) / 360.0))\
.astype(np.int)
parallel_coord = (np.round(
map_image.shape[0] * parallel / 360.0))\
.astype(np.int)
min_parallel = (np.ceil(
map_image.shape[0] * ((parallel - 90.0)) / 360.0))\
.astype(np.int)
max_parallel = (np.ceil(
map_image.shape[0] * ((parallel + 90.0)) / 360.0))\
.astype(np.int)
Y, X = np.mgrid[min_parallel: max_parallel, min_meridian: max_meridian]
X %= map_image.shape[1]
Y %= map_image.shape[0]
rectangular = map_image[(Y, X)]
old_hemi, new_hemi = \
p.really_make_azi_projection(rectangular, R, azikind, padwith)
return new_hemi