[uLib Geometry]

- Adds Type combiner.
- change names to image map (WARNING some classess may not be already uploaded)
This commit is contained in:
Andrea Rigoni
2014-11-29 07:25:35 +00:00
parent 41fa82d2ef
commit 891f46d502
27 changed files with 1146 additions and 99 deletions

View File

@@ -63,6 +63,8 @@ private:
};
template < typename T >
class DataVector : public AbstractArray {
public:

View File

@@ -65,6 +65,7 @@ public:
class DataVectorImage : public ImageData {
typedef float ScalarT;
public:
inline void * GetDataPointer(const Id_t id) const {
@@ -81,11 +82,13 @@ public:
m_Data->SetSize(size.prod());
}
// uLibRefMacro(Data,AbstractArray*)
uLibRefMacro(Data,SmartPointer<AbstractArray>)
uLibRefMacro(Scalars,ProgrammableAccessor<double>)
uLibRefMacro(Scalars,ProgrammableAccessor<ScalarT>)
private:
// AbstractArray* m_Data;
SmartPointer<AbstractArray> m_Data;
ProgrammableAccessor<double> m_Scalars;
ProgrammableAccessor<ScalarT> m_Scalars;
};

View File

@@ -113,14 +113,23 @@ public:
inline void PreRotate(const Matrix3f &m) { this->m_T.prerotate(m); }
inline void QuaternionRotate(const Vector4f &q)
{ this->m_T.rotate(Eigen::Quaternion<float>(q)); }
inline void Rotate(const float angle, Vector3f axis)
{
axis.normalize(); // prehaps not necessary ( see eigens )
Eigen::AngleAxisf ax(angle,axis);
this->m_T.rotate(Eigen::Quaternion<float>(ax));
}
inline void EulerYZYRotate(const Vector3f &e) {
inline void Rotate(const Vector3f euler_axis) {
float angle = euler_axis.norm();
Rotate(angle,euler_axis);
}
inline void EulerYZYRotate(const Vector3f &euler_angles) {
Matrix3f mat;
mat = Eigen::AngleAxisf(e.x(), Vector3f::UnitY())
* Eigen::AngleAxisf(e.y(), Vector3f::UnitZ())
* Eigen::AngleAxisf(e.z(), Vector3f::UnitY());
mat = Eigen::AngleAxisf(euler_angles.x(), Vector3f::UnitY())
* Eigen::AngleAxisf(euler_angles.y(), Vector3f::UnitZ())
* Eigen::AngleAxisf(euler_angles.z(), Vector3f::UnitY());
m_T.rotate(mat);
}
@@ -133,8 +142,12 @@ public:
};
typedef Eigen::Quaternion<float> Quaternionf;
typedef Eigen::Quaternion<double> Quaterniond;
}
} // uLib

View File

@@ -9,13 +9,13 @@
//#include "boost/geometry.hpp"
//#include "boost/geometry/geometries/adapted/c_array.hpp"
//#include "boost/geometry/geometries/adapted/boost_array.hpp"
//#include "boost/geometry/geometries/adapted/std_pair_as_segment.hpp"
#include "boost/geometry.hpp"
#include "boost/geometry/geometries/adapted/c_array.hpp"
#include "boost/geometry/geometries/adapted/boost_array.hpp"
#include "boost/geometry/geometries/adapted/std_pair_as_segment.hpp"
//#include "boost/geometry/geometries/register/point.hpp"
//#include "boost/geometry/geometries/register/linestring.hpp"
#include "boost/geometry/geometries/register/point.hpp"
#include "boost/geometry/geometries/register/linestring.hpp"
namespace uLib {
@@ -42,8 +42,8 @@ inline Vector4f HPoint3f(float x, float y, float z) { return Vector4f(x,y,z,1);
inline Vector4f HPoint3f(const Vector4f &v) { return Vector4f(v(0),v(1),v(2),1); }
// this is an example of function imported from eigen //
//using boost::geometry::distance;
// this is an example of function imported from boost //
using boost::geometry::distance;
} // uLib
@@ -51,17 +51,17 @@ inline Vector4f HPoint3f(const Vector4f &v) { return Vector4f(v(0),v(1),v(2),1);
// BOOST GEOMETRY REGISTRATION //
//BOOST_GEOMETRY_REGISTER_POINT_2D(uLib::Vector2i, int, boost::geometry::cs::cartesian, operator()(0), operator()(1))
//BOOST_GEOMETRY_REGISTER_POINT_3D(uLib::Vector3i, int, boost::geometry::cs::cartesian, operator()(0), operator()(1), operator()(2))
//BOOST_GEOMETRY_REGISTER_POINT_3D(uLib::Vector4i, int, boost::geometry::cs::cartesian, operator()(0), operator()(1), operator()(2))
BOOST_GEOMETRY_REGISTER_POINT_2D(uLib::Vector2i, int, boost::geometry::cs::cartesian, operator()(0), operator()(1))
BOOST_GEOMETRY_REGISTER_POINT_3D(uLib::Vector3i, int, boost::geometry::cs::cartesian, operator()(0), operator()(1), operator()(2))
BOOST_GEOMETRY_REGISTER_POINT_3D(uLib::Vector4i, int, boost::geometry::cs::cartesian, operator()(0), operator()(1), operator()(2))
//BOOST_GEOMETRY_REGISTER_POINT_2D(uLib::Vector2f, float, boost::geometry::cs::cartesian, operator()(0), operator()(1))
//BOOST_GEOMETRY_REGISTER_POINT_3D(uLib::Vector3f, float, boost::geometry::cs::cartesian, operator()(0), operator()(1), operator()(2))
//BOOST_GEOMETRY_REGISTER_POINT_3D(uLib::Vector4f, float, boost::geometry::cs::cartesian, operator()(0), operator()(1), operator()(2))
BOOST_GEOMETRY_REGISTER_POINT_2D(uLib::Vector2f, float, boost::geometry::cs::cartesian, operator()(0), operator()(1))
BOOST_GEOMETRY_REGISTER_POINT_3D(uLib::Vector3f, float, boost::geometry::cs::cartesian, operator()(0), operator()(1), operator()(2))
BOOST_GEOMETRY_REGISTER_POINT_3D(uLib::Vector4f, float, boost::geometry::cs::cartesian, operator()(0), operator()(1), operator()(2))
//BOOST_GEOMETRY_REGISTER_POINT_2D(uLib::Vector2d, double, boost::geometry::cs::cartesian, operator()(0), operator()(1))
//BOOST_GEOMETRY_REGISTER_POINT_3D(uLib::Vector3d, double, boost::geometry::cs::cartesian, operator()(0), operator()(1), operator()(2))
//BOOST_GEOMETRY_REGISTER_POINT_3D(uLib::Vector4d, double, boost::geometry::cs::cartesian, operator()(0), operator()(1), operator()(2))
BOOST_GEOMETRY_REGISTER_POINT_2D(uLib::Vector2d, double, boost::geometry::cs::cartesian, operator()(0), operator()(1))
BOOST_GEOMETRY_REGISTER_POINT_3D(uLib::Vector3d, double, boost::geometry::cs::cartesian, operator()(0), operator()(1), operator()(2))
BOOST_GEOMETRY_REGISTER_POINT_3D(uLib::Vector4d, double, boost::geometry::cs::cartesian, operator()(0), operator()(1), operator()(2))

View File

@@ -91,7 +91,7 @@ void VoxRaytracer::RayData::PrintSelf(std::ostream &o)
////////////////////////////////////////////////////////////////////////////////
bool VoxRaytracer::GetEntryPoint(const HLine3f line, Vector4f &pt)
bool VoxRaytracer::GetEntryPoint(const HLine3f line, Vector4f &pt) const
{
Vector4f s = m_Image->GetLocalPoint(line.direction());
pt = m_Image->GetLocalPoint(line.origin());
@@ -140,7 +140,7 @@ bool VoxRaytracer::GetEntryPoint(const HLine3f line, Vector4f &pt)
return false;
}
bool VoxRaytracer::GetExitPoint(const HLine3f line, Vector4f &pt)
bool VoxRaytracer::GetExitPoint(const HLine3f line, Vector4f &pt) const
{
HLine3f out = line;
out.direction() *= -1;

View File

@@ -67,9 +67,9 @@ public:
public:
VoxRaytracer(ImageData &image) : m_Image(&image) {}
bool GetEntryPoint(const HLine3f line, Vector4f &pt);
bool GetEntryPoint(const HLine3f line, Vector4f &pt) const;
bool GetExitPoint(const HLine3f line, Vector4f &pt);
bool GetExitPoint(const HLine3f line, Vector4f &pt) const;
RayData TraceBetweenPoints(const Vector4f &in, const Vector4f &out) const;

View File

@@ -23,8 +23,12 @@
//////////////////////////////////////////////////////////////////////////////*/
#include "testing-prototype.h"
#include "Math/ImageData.h"
#include <Core/Mpl.h>
#include <root/TRandom.h>
using namespace uLib;
@@ -38,7 +42,7 @@ struct MyVoxel {
struct VoxelMean : public MyVoxel {
VoxelMean() {}
void SetValue(const float value) { this->value += value; ++count; }
void SetValue(const float _value) { value += _value; ++count; }
float GetValue() const { return value/count; }
};
}
@@ -48,31 +52,42 @@ struct VoxelMean : public MyVoxel {
int main() {
DataVector<MyVoxel> v;
// DataVector<MyVoxel> v;
DataVectorImage img;
img.Data() = v;
img.Scalars().SetAccessFunctions(&MyVoxel::value);
img.SetDims(Vector3i(3,3,3));
// img.Data() = v;
// img.Scalars().SetAccessFunctions(&MyVoxel::value);
// img.SetDims(Vector3i(3,3,3));
for (int x=0; x<img.GetDims().prod(); ++x){
img.SetValue(x,x);
std::cout << img.UnMap(x).transpose() << " -> " << img.GetValue(x) << "\n";
}
// for (int x=0; x<img.GetDims().prod(); ++x){
// img.SetValue(x,x);
// std::cout << img.UnMap(x).transpose() << " -> " << img.GetValue(x) << "\n";
// }
DataVector<VoxelMean> vm;
Vector<VoxelMean> vm_2;
vm_2.resize(Vector3i(300,300,300).prod());
img.Data() = vm;
img.SetDims(Vector3i(3,3,3));
img.SetDims(Vector3i(300,300,300));
img.Scalars().SetAccessFunctions(&VoxelMean::GetValue,&VoxelMean::SetValue);
// TRandom random;
for(int i=0; i< 100; ++i)
for (int x=0; x<img.GetDims().prod(); ++x){
img.SetValue(x,x);
img.SetValue(x,x+2);
img.SetValue(x,x-1);
std::cout << img.UnMap(x).transpose() << " -> " << img.GetValue(x) << "\n";
// vm.Data()[x].value += 1; vm.Data()[x].count++;
// vm.Data()[x].SetValue(1);
vm_2[x].SetValue(1);
// img.SetValue(x,1);
// boost::bind(&VoxelMean::SetValue,&vm.Data()[x], _1)(1);
// std::cout << img.UnMap(x).transpose() << " -> " << img.GetValue(x) << "\n";
}
// img.ExportToVtk("test.vtk");
}