diff --git a/voxec.h b/voxec.h index 857ebf6..e3ce9a8 100644 --- a/voxec.h +++ b/voxec.h @@ -2471,6 +2471,9 @@ class op_normal_estimate : public voxel_operation { Eigen::MatrixXf points = Eigen::Map(coords.data(), 3, coords.size() / 3).transpose(); + // Eigen::RowVector3f it_as_vec((*it).get(0), (*it).get(1), (*it).get(2)); + // Eigen::MatrixXf centered = points.rowwise() - it_as_vec; + Eigen::MatrixXf centered = points.rowwise() - points.colwise().mean(); Eigen::MatrixXf cov = centered.adjoint() * centered; Eigen::SelfAdjointEigenSolver eig(cov); diff --git a/wrap/wrapper.i b/wrap/wrapper.i index 77d6e10..a9e24ff 100644 --- a/wrap/wrapper.i +++ b/wrap/wrapper.i @@ -64,6 +64,19 @@ uint32_t v; $self->Get(ijk, &v); return PyLong_FromLong(v); + } else if ($self->value_bits() == sizeof(normal_and_curvature) * 8) { + normal_and_curvature_t::storage_type v; + $self->Get(ijk, &v); + if (!v) { + return SWIG_Py_Void(); + } else { + auto vf = v.convert(); + auto tup = PyTuple_New(4); + for (size_t i = 0; i < 4; ++i) { + PyTuple_SetItem(tup, i, PyFloat_FromDouble(vf.nxyz_curv[i])); + } + return tup; + } } else { throw std::runtime_error("Unsupported"); }