Source code for raytraverse.mapper.maskedplanmapper
# -*- coding: utf-8 -*-
# Copyright (c) 2019 Stephen Wasilewski
# =======================================================================
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
# =======================================================================
import numpy as np
from raytraverse.mapper.planmapper import PlanMapper
[docs]
class MaskedPlanMapper(PlanMapper):
"""translate between world positions on a horizontal plane and
normalized UV space for a given view angle. pixel projection yields a
parallel plan projection
Parameters
----------
pm: raytraverse.mapper.PlanMapper
the source mapper to copy
valid: np.array
a list of valid points used to make a mask, grid cells not represented
by one of valid will be masked
level: int, optional
the level at which to grid the valid candidates
"""
def __init__(self, pm, valid, level):
self.rotation = pm.rotation
self.ptres = pm.ptres
self._bbox = pm.bbox
self._sf = pm._sf
self._path = pm._path
self._zheight = pm._zheight
self._candidates = pm._candidates
super(PlanMapper, self).__init__(name=pm.name, sf=self._sf,
bbox=self.bbox, dxyz=pm.dxyz,
jitterrate=pm.jitterrate)
self._mask = None
self._maskshape = None
self.update_mask(valid, level)
[docs]
def update_mask(self, valid, level):
self._maskshape = self.shape(level)
uv = self.xyz2uv(valid)
self._mask = np.unique(self.uv2idx(uv, self._maskshape))
[docs]
def in_view_uv(self, uv, indices=True, usemask=True):
if not usemask:
return super().in_view_uv(uv, indices)
path = self._path
uvs = uv.reshape(-1, 2)
result = np.empty((len(path), uvs.shape[0]), bool)
for i, p in enumerate(path):
result[i] = p.contains_points(uvs)
idx = self.uv2idx(uvs, self._maskshape)
mask = np.logical_and(np.any(result, 0), np.isin(idx, self._mask))
if indices:
return np.unravel_index(np.arange(mask.size)[mask],
uv.shape[:-1])
else:
return mask