def _in_volume_convex(points, volume, remote_instance=None, approximate=False, ignore_axis=[]):
""" Uses scipy to test if points are within a given CATMAID volume.
The idea is to test if adding the point to the cloud would change the
convex hull.
"""
if remote_instance is None:
if 'remote_instance' in sys.modules:
remote_instance = sys.modules['remote_instance']
elif 'remote_instance' in globals():
remote_instance = globals()['remote_instance']
if type(volume) == type(str()):
volume = fetch.get_volume(volume, remote_instance)
verts = volume['vertices']
if not approximate:
intact_hull = ConvexHull(verts)
intact_verts = list(intact_hull.vertices)
if isinstance(points, list):
points = np.array(points)
elif isinstance(points, pd.DataFrame):
points = points.to_matrix()
return [list(ConvexHull(np.append(verts, list([p]), axis=0)).vertices) == intact_verts for p in points]
else:
bbox = [(min([v[0] for v in verts]), max([v[0] for v in verts])),
(min([v[1] for v in verts]), max([v[1] for v in verts])),
(min([v[2] for v in verts]), max([v[2] for v in verts]))
]
for a in ignore_axis:
bbox[a] = (float('-inf'), float('inf'))
return [False not in [bbox[0][0] < p.x < bbox[0][1], bbox[1][0] < p.y < bbox[1][1], bbox[2][0] < p.z < bbox[2][1], ] for p in points]
评论列表
文章目录