Program Listing for File Util.hpp

Return to documentation for file (include/lvr2/util/Util.hpp)

/*
 * Util.hpp
 *
 *  @date 30.10.2018
 *  @author Alexander Loehr (aloehr@uos.de)
 */

#ifndef LVR2_UTIL_HPP
#define LVR2_UTIL_HPP

#include <vector>
#include <boost/shared_array.hpp>

#include "lvr2/types/MatrixTypes.hpp"
#include "lvr2/types/PointBuffer.hpp"
#include "lvr2/geometry/BaseVector.hpp"
#include "lvr2/geometry/Matrix4.hpp"


namespace lvr2
{

using VecUChar = BaseVector<unsigned char>;

class Util
{
public:

    static int getSpectralChannel(int wavelength, PointBufferPtr p, int fallback = -1);

    static int getSpectralWavelength(int channel, PointBufferPtr p, int fallback = -1);

    static float wavelengthPerChannel(PointBufferPtr p);

    template<typename T>
    static boost::shared_array<T> convert_vector_to_shared_array(std::vector<T> source)
    {
        boost::shared_array<T> ret = boost::shared_array<T>( new T[source.size()] );
        std::copy(source.begin(), source.end(), ret.get());

        return ret;
    }

    template <typename BaseVecT>
    static Matrix4<BaseVecT> riegl_to_slam6d_transform(const Matrix4<BaseVecT> &in)
    {
        Matrix4<BaseVecT> ret;

        ret[0] = in[5];
        ret[1] = -in[9];
        ret[2] = -in[1];
        ret[3] = -in[13];
        ret[4] = -in[6];
        ret[5] = in[10];
        ret[6] = in[2];
        ret[7] = in[14];
        ret[8] = -in[4];
        ret[9] = in[8];
        ret[10] = in[0];
        ret[11] = in[12];
        ret[12] = -100*in[7];
        ret[13] = 100*in[11];
        ret[14] = 100*in[3];
        ret[15] = in[15];

        return ret;
    }

    template <typename T>
    Transform<T> slam6d_to_riegl_transform(const Transform<T> &mat)
    {
        T* in = mat.data();
        T* ret[16];
        ret[0] = in[10];
        ret[1] = -in[2];
        ret[2] = in[6];
        ret[3] = in[14]/100.0;
        ret[4] = -in[8];
        ret[5] = in[0];
        ret[6] = -in[4];
        ret[7] = -in[12]/100.0;
        ret[8] = in[9];
        ret[9] = -in[1];
        ret[10] = in[5];
        ret[11] = in[13]/100.0;
        ret[12] = in[11];
        ret[13] = -in[3];
        ret[14] = in[7];
        ret[15] = in[15];

        return Eigen::Map<Eigen::Matrix<T, 4, 4, Eigen::RowMajor> >(ret);
    }

    template <typename ValueType>
    static BaseVector<ValueType> slam6d_to_riegl_point(const BaseVector<ValueType> &in)
    {
        return {
            in.z   / (ValueType) 100.0,
            - in.x / (ValueType) 100.0,
            in.y   / (ValueType) 100.0
        };
    }



    template <typename ValueType>
    static ValueType deg_to_rad(ValueType deg)
    {
        return M_PI / 180.0 * deg;
    }

    template <typename ValueType>
    static ValueType rad_to_deg(ValueType rad)
    {
        return rad * 180 / M_PI;
    }

    struct ColorVecCompare
    {

        bool operator() (const VecUChar& lhs, const VecUChar& rhs) const
        {
            return (lhs.x < rhs.x) ||
                   (lhs.x == rhs.x && lhs.y < rhs.y) ||
                   (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z < rhs.z);
        }
    };

    template <typename BaseVecT>
    [[nodiscard]]
    static inline Vector3<typename BaseVecT::CoordType> to_eigen(const BaseVecT& vec) noexcept
    {
        return Vector3<typename BaseVecT::CoordType>(
            vec[0],
            vec[1],
            vec[2]
        );
    }
};

} // namespace lvr2

#endif