General

Sampling, reduction and extraction

import numpy as np
from pchandler.core import PointCloudData

pcd = PointCloudData(
   xyz=np.random.rand(100, 3),
   numerical_optimization_shift=None,
)

pcd2 = pcd.copy(deep=True)

# Boolean mask: keep points with x > 0.5
mask = pcd.xyz[:, 0] > 0.5

# Sample returns a new object
sample = pcd.sample(mask)

# Reduce modifies in place
pcd.reduce(mask)

# Extract removes the selected points from the object
extracted = pcd2.extract(mask)

Note

The above three methods only accept a vector that corresponds to indexes or boolean mask. If you want to sample with other advanced numpy indexing, you may have to do so directly on the array. You will only get a numpy array in return without scalar field info. xy = pcd.arr[mask, 0:2]

Merging clouds

It’s also easy to merge multiple point clouds together

import numpy as np
from pchandler.core import PointCloudData

a = PointCloudData(np.random.rand(50, 3), numerical_optimization_shift=None)
b = PointCloudData(np.random.rand(75, 3) + 1.0, numerical_optimization_shift=None)

merged = PointCloudData.merge(a, b)

Or as a list of point clouds

import numpy as np
from pchandler.core import PointCloudData

a = PointCloudData(np.random.rand(50, 3), numerical_optimization_shift=None)
b = PointCloudData(np.random.rand(75, 3) + 1.0, numerical_optimization_shift=None)
c = PointCloudData(np.random.rand(100,3), numerical_optimization_shift=None)

all_pcds = [a, b, c]

merged = PointCloudData.merge(*all_pcds)

Spherical Coordinates

Easily accessed from a cached property:

spherical_coordinates = merged.spher
hz_angles = merged.hz
v_angles = merged.v
radius = merged.r

Note

The same access can be gained from the cartesian coordinates via the x, y, z properties.

x = merged.x
y = merged.y
z = merged.z