From b387581d4f89bf96906c9c95b18022da2268618d Mon Sep 17 00:00:00 2001 From: ozantonkal Date: Mon, 17 Jun 2013 16:32:52 +0200 Subject: [PATCH] initial refactoring --- modules/viz/src/q/shapes.h | 11 ++++++- modules/viz/src/shapes.cpp | 65 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/modules/viz/src/q/shapes.h b/modules/viz/src/q/shapes.h index 3ff63750d5..9233ec45f0 100644 --- a/modules/viz/src/q/shapes.h +++ b/modules/viz/src/q/shapes.h @@ -8,7 +8,16 @@ namespace temp_viz { CV_EXPORTS vtkSmartPointer createLine (const cv::Point3f& pt1, const cv::Point3f& pt2); CV_EXPORTS vtkSmartPointer createSphere (const cv::Point3f ¢er, float radius, int sphere_resolution = 10); - + CV_EXPORTS vtkSmartPointer createCylinder (const Point3f& pt_on_axis, const Point3f& axis_direction, double radius, int numsides = 30); + CV_EXPORTS vtkSmartPointer createPlane (const Vec4f& coefs); + CV_EXPORTS vtkSmartPointer createPlane (const Vec4f& coefs, const Point3f& pt); + CV_EXPORTS vtkSmartPointer create2DCircle (const Point3f& pt, double radius); + CV_EXPORTS vtkSmartPointer createCube(const Point3f& pt_min, const Point3f& pt_max); +// CV_EXPORTS vtkSmartPointer createCube (const Point3f& pt, const Quaternionf& qt, ); +// CV_EXPORTS vtkSmartPointer createCube (const Eigen::Vector3f &translation, const Eigen::Quaternionf &rotation, double width, double height, double depth); +// CV_EXPORTS vtkSmartPointer createCube (double x_min, double x_max, double y_min, double y_max, double z_min, double z_max); +// +// /** \brief Create a cylinder shape from a set of model coefficients. * \param[in] coefficients the model coefficients (point_on_axis, axis_direction, radius) * \param[in] numsides (optional) the number of sides used for rendering the cylinder diff --git a/modules/viz/src/shapes.cpp b/modules/viz/src/shapes.cpp index 955cf38839..baa4cbde31 100644 --- a/modules/viz/src/shapes.cpp +++ b/modules/viz/src/shapes.cpp @@ -5,6 +5,71 @@ inline float rad2deg (float alpha) inline double rad2deg (double alpha){return (alpha * 57.29578);} +vtkSmartPointer temp_viz::createCylinder (const cv::Point3f& pt_on_axis, const cv::Point3f& axis_direction, double radius, int numsides) +{ + const cv::Point3f pt2 = pt_on_axis + axis_direction; + vtkSmartPointer line = vtkSmartPointer::New (); + line->SetPoint1 (pt_on_axis.x, pt_on_axis.y, pt_on_axis.z); + line->SetPoint2 (pt2.x, pt2.y, pt2.z); + + vtkSmartPointer tuber = vtkSmartPointer::New (); + tuber->SetInputConnection (line->GetOutputPort ()); + tuber->SetRadius (radius); + tuber->SetNumberOfSides (numsides); + return (tuber->GetOutput ()); +} + +vtkSmartPointer temp_viz::createPlane (const cv::Vec4f& coefs) +{ + vtkSmartPointer plane = vtkSmartPointer::New (); + plane->SetNormal (coefs[0], coefs[1], coefs[2]); + double norm = cv::norm (cv::Vec3f (coefs[0], coefs[1], coefs[2])); + plane->Push (-coefs[3] / norm); + return (plane->GetOutput ()); +} + +vtkSmartPointer temp_viz::createPlane(const cv::Vec4f& coefs, const cv::Point3f& pt) +{ + vtkSmartPointer plane = vtkSmartPointer::New (); + cv::Point3f coefs3 (coefs[0], coefs[1], coefs[2]); + double norm_sqr = 1.0 / coefs3.dot (coefs3); + plane->SetNormal (coefs[0], coefs[1], coefs[2]); + + double t = coefs3.dot (pt) + coefs[3]; + cv::Vec3f p_center; + p_center = pt - coefs3 * t * norm_sqr; + plane->SetCenter (p_center[0], p_center[1], p_center[2]); + + return (plane->GetOutput ()); +} + +vtkSmartPointer temp_viz::create2DCircle (const cv::Point3f& pt, double radius) +{ + vtkSmartPointer disk = vtkSmartPointer::New (); + // Maybe the resolution should be lower e.g. 50 or 25 + disk->SetCircumferentialResolution (100); + disk->SetInnerRadius (radius - 0.001); + disk->SetOuterRadius (radius + 0.001); + disk->SetCircumferentialResolution (20); + + // Set the circle origin + vtkSmartPointer t = vtkSmartPointer::New (); + t->Identity (); + t->Translate (pt.x, pt.y, pt.z); + + vtkSmartPointer tf = vtkSmartPointer::New (); + tf->SetTransform (t); + tf->SetInputConnection (disk->GetOutputPort ()); + + return (tf->GetOutput ()); +} + +vtkSmartPointer temp_viz::createCube(const cv::Point3f& pt_min, const cv::Point3f& pt_max) +{ + vtkSmartPointer cube = vtkSmartPointer::New (); + cube->SetBounds (pt_min.x, pt_max.x, pt_min.y, pt_max.y, pt_min.z, pt_max.z); + return (cube->GetOutput ()); +} //////////////////////////////////////////////////////////////////////////////////////////// vtkSmartPointer temp_viz::createCylinder (const temp_viz::ModelCoefficients &coefficients, int numsides)