diff --git a/doc/source/tutorials/index.rst b/doc/source/tutorials/index.rst index 5bd7cf63d3f4ddad18aeda8e50273b2e6568a483..719a9a33df75788345396cfd88a661a7baa1b0e1 100644 --- a/doc/source/tutorials/index.rst +++ b/doc/source/tutorials/index.rst @@ -42,7 +42,7 @@ Tutorials .. container:: descr - .. figure:: /tutorials/database.jpeg + .. figure:: /tutorials/examples/database.svg :target: database.html :doc:`/tutorials/database` @@ -50,7 +50,7 @@ Tutorials .. container:: descr - .. figure:: /tutorials/renderimage.svg + .. figure:: /tutorials/examples/renderimage.svg :target: renderimage.html :doc:`/tutorials/renderimage` diff --git a/navipy/__init__.py b/navipy/__init__.py index 9c66ee80b65d7488f53dd330799b206e620f0829..d1a86f5360ce71170998de25cef1ec913c89700b 100644 --- a/navipy/__init__.py +++ b/navipy/__init__.py @@ -38,6 +38,7 @@ An agent using an average skyline homing vector, could be build as follow """ from navipy.database import DataBaseLoad +import numpy as np class Bunch: diff --git a/navipy/comparing/__init__.py b/navipy/comparing/__init__.py index 934ef27fb63a682b96064aaadaea12b71754653e..7d32eaadc2e720b744212fd09d1fd2402671808d 100644 --- a/navipy/comparing/__init__.py +++ b/navipy/comparing/__init__.py @@ -2,8 +2,7 @@ Comparing """ import numpy as np -from navipy.processing.tools import is_ibpc, is_obpc -from navipy.processing.tools import check_scene +from navipy.scene import is_ibpc, is_obpc, check_scene def simple_imagediff(current, memory): diff --git a/navipy/comparing/test.py b/navipy/comparing/test.py index 7770aa46493072404e44960c6ce6d0f356f3e2d3..03df852834d84984f6fbd04d7d898d4f0c32cd60 100644 --- a/navipy/comparing/test.py +++ b/navipy/comparing/test.py @@ -2,7 +2,7 @@ import unittest import numpy as np import navipy.database as database import navipy.comparing as comparing -from navipy.processing.tools import is_numeric_array +from navipy.scene import is_numeric_array import pkg_resources diff --git a/navipy/database/__init__.py b/navipy/database/__init__.py index 1a3d7b6b325baef3e2972fb5becb397cc01fb6e9..511d66b173e16ae32e39156f5f38a852e332a632 100644 --- a/navipy/database/__init__.py +++ b/navipy/database/__init__.py @@ -8,7 +8,7 @@ import pandas as pd import sqlite3 import io import warnings -import navipy.processing.tools as tools +from navipy.scene import is_numeric_array def adapt_array(arr): @@ -528,7 +528,7 @@ class DataBaseSave(DataBase): if image.shape[2] != len(self.channels): raise Exception('image channels number differs from\ given channel number') - if not tools.is_numeric_array(image): + if not is_numeric_array(image): raise TypeError('scene is of non numeric type') normed_im = np.zeros(image.shape, dtype=dtype) maxval_nim = np.iinfo(normed_im.dtype).max diff --git a/navipy/maths/__init__.py b/navipy/maths/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/navipy/maths/coordinates.py b/navipy/maths/coordinates.py new file mode 100644 index 0000000000000000000000000000000000000000..e670d9e8d6f80aa74f66929aeb28b599ea63b3b8 --- /dev/null +++ b/navipy/maths/coordinates.py @@ -0,0 +1,23 @@ +""" + Conversion between coordinates systems +""" +import numpy as np + + +def cartesian_to_spherical(x, y, z): + radius = np.sqrt(x**2 + y**2 + z**2) + elevation = np.arctan2(z, np.sqrt(x**2 + y**2)) + azimuth = np.arctan2(y, x) + spherical = np.zeros_like(x) + spherical = np.tile(spherical[..., np.newaxis], (3,)) + return elevation, azimuth, radius + + +def spherical_to_cartesian(elevation, azimuth, radius=1): + cartesian = np.zeros_like(elevation) + cartesian = np.tile(cartesian[..., np.newaxis], (3,)) + x = np.cos(elevation) * np.cos(azimuth) + y = np.cos(elevation) * np.sin(azimuth) + z = np.sin(elevation) + cartesian = radius * cartesian + return x, y, z diff --git a/navipy/processing/constants.py b/navipy/processing/constants.py deleted file mode 100644 index b2570be93b5c89e30db43b797d4f15476d8a8625..0000000000000000000000000000000000000000 --- a/navipy/processing/constants.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -Define some constant -""" - -__spherical_indeces__ = {'elevation': 0, - 'azimuth': 1, - 'radius': 2} -__cartesian_indeces__ = {'x': 0, - 'y': 1, - 'z': 2} -__ibpc_indeces__ = {'elevation': 0, - 'azimuth': 1, - 'channel': 2, - 'component': 3} -__obpc_indeces__ = {'ommatidia': 0, - 'channel': 1, - 'component': 2} -__eye_indeces__ = {'elevation': 0, - 'azimuth': 1, - 'component': 2} -__ommadia_indeces__ = {'ommatidia': 0, - 'component': 1} diff --git a/navipy/processing/pcode.py b/navipy/processing/pcode.py index 8a6d038853abdfd896271fdfb0fc0d993a52159e..8ed0ead6aae61fcd727dd7a30bf0fd211f42bd55 100644 --- a/navipy/processing/pcode.py +++ b/navipy/processing/pcode.py @@ -3,14 +3,15 @@ place code derived from scene """ import numpy as np from scipy.ndimage import maximum_filter, minimum_filter -from .constants import __spherical_indeces__ -from .constants import __ibpc_indeces__ -from .constants import __obpc_indeces__ -from .tools import is_ibpc -from .tools import is_obpc -from .tools import spherical_to_cartesian -from .tools import check_scene -from .tools import check_viewing_direction +from navipy.scene import __spherical_indeces__ +from navipy.scene import __cartesian_indeces__ +from navipy.scene import __ibpc_indeces__ +from navipy.scene import __obpc_indeces__ +from navipy.scene import is_ibpc +from navipy.scene import is_obpc +from navipy.maths.coordinates import spherical_to_cartesian +from navipy.scene import check_scene +from navipy.scene import check_viewing_direction def skyline(scene): @@ -132,7 +133,13 @@ def pcv(place_code, viewing_directions): should be 1'.format(place_code.shape[component_dim])) elevation = viewing_directions[..., __spherical_indeces__['elevation']] azimuth = viewing_directions[..., __spherical_indeces__['azimuth']] - unscaled_lv = spherical_to_cartesian(elevation, azimuth, radius=1) + x, y, z = spherical_to_cartesian(elevation, azimuth, radius=1) + unscaled_lv = np.zeros((viewing_directions.shape[0], + viewing_directions.shape[1], + 3)) + unscaled_lv[..., __cartesian_indeces__['x']] = x + unscaled_lv[..., __cartesian_indeces__['y']] = y + unscaled_lv[..., __cartesian_indeces__['z']] = z scaled_lv = np.zeros_like(place_code) # (3,) -> (1,1,3) or (1,1,1,3) see numpy.tile scaled_lv = np.tile(scaled_lv, (unscaled_lv.shape[-1],)) diff --git a/navipy/processing/test.py b/navipy/processing/test.py index 1722cae04be61dd17d64ff6ec233d390628f535e..ff13c23084fe5212967bd6bf97cfe752e5bc212a 100644 --- a/navipy/processing/test.py +++ b/navipy/processing/test.py @@ -4,7 +4,7 @@ import numpy as np import pandas as pd import navipy.database as database import navipy.processing.pcode as pcode -from navipy.processing.tools import is_numeric_array +from navipy.scene import is_numeric_array import pkg_resources diff --git a/navipy/processing/tools.py b/navipy/scene.py similarity index 82% rename from navipy/processing/tools.py rename to navipy/scene.py index 42e0cc8de33ee128ce9353d095412b1f32fbc87a..8b422615f484e259c096335102bfe65812257f11 100644 --- a/navipy/processing/tools.py +++ b/navipy/scene.py @@ -1,11 +1,32 @@ -from .constants import __ibpc_indeces__ -from .constants import __spherical_indeces__ -from .constants import __cartesian_indeces__ -from .constants import __obpc_indeces__ -from .constants import __eye_indeces__ +""" + Define what a scene is +""" import numpy as np +# +# Define constants +# +__spherical_indeces__ = {'elevation': 0, + 'azimuth': 1, + 'radius': 2} +__cartesian_indeces__ = {'x': 0, + 'y': 1, + 'z': 2} +__ibpc_indeces__ = {'elevation': 0, + 'azimuth': 1, + 'channel': 2, + 'component': 3} +__obpc_indeces__ = {'ommatidia': 0, + 'channel': 1, + 'component': 2} +__eye_indeces__ = {'elevation': 0, + 'azimuth': 1, + 'component': 2} +__ommadia_indeces__ = {'ommatidia': 0, + 'component': 1} + + def check_scene(scene): if is_ibpc(scene): # print("normal") @@ -139,27 +160,3 @@ def ibs_to_obs(scene, eye_map): eye_map.shape[__ibpc_indeces__['component']]) ommatidia_map = eye_map.reshape(omm_size) return (obs_scene, ommatidia_map) - - -def cartesian_to_spherical(x, y, z): - radius = np.sqrt(x**2 + y**2 + z**2) - elevation = np.arctan2(z, np.sqrt(x**2 + y**2)) - azimuth = np.arctan2(y, x) - spherical = np.zeros_like(x) - spherical = np.tile(spherical[..., np.newaxis], (3,)) - spherical[..., __spherical_indeces__['elevation']] = elevation - spherical[..., __spherical_indeces__['azimuth']] = azimuth - spherical[..., __spherical_indeces__['radius']] = radius - return spherical - - -def spherical_to_cartesian(elevation, azimuth, radius=1): - cartesian = np.zeros_like(elevation) - cartesian = np.tile(cartesian[..., np.newaxis], (3,)) - cartesian[..., __cartesian_indeces__['x']] = np.cos( - elevation) * np.cos(azimuth) - cartesian[..., __cartesian_indeces__['y']] = np.cos( - elevation) * np.sin(azimuth) - cartesian[..., __cartesian_indeces__['z']] = np.sin(elevation) - cartesian = radius * cartesian - return cartesian