cloudTransformTool.cpp
Go to the documentation of this file.
00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00039 
00040 #include <algorithm>
00041 #include <math.h>
00042 #include <pcl/apps/point_cloud_editor/common.h>
00043 #include <pcl/apps/point_cloud_editor/cloudTransformTool.h>
00044 #include <pcl/apps/point_cloud_editor/cloud.h>
00045 
00046 const float DEG_2_RADS = M_PI / 180.0f;
00047 
00048 const float CloudTransformTool::DEFAULT_SCALE_FACTOR_ = 1.14;
00049 const float CloudTransformTool::DEFAULT_TRANSLATE_FACTOR_ = 0.001f;
00050 
00051 
00052 CloudTransformTool::CloudTransformTool (CloudPtr cloud_ptr)
00053   : cloud_ptr_(cloud_ptr), x_(0), y_(0), scale_factor_(DEFAULT_SCALE_FACTOR_),
00054     translate_factor_(DEFAULT_TRANSLATE_FACTOR_)
00055 {
00056   setIdentity(transform_matrix_);
00057 }
00058 
00059 CloudTransformTool::~CloudTransformTool ()
00060 {
00061 }
00062 
00063 void
00064 CloudTransformTool::start (int x, int y, BitMask, BitMask)
00065 {
00066   x_ = x;
00067   y_ = y;
00068     
00069   trackball_.start(x, y);
00070 }
00071 
00072 void
00073 CloudTransformTool::update (int x, int y, BitMask modifiers, BitMask buttons)
00074 {
00075   if (!cloud_ptr_)
00076     return;
00077   if (!(buttons & LEFT))
00078     return;
00079     
00080   float transform[MATRIX_SIZE];
00081     
00082   int dx = (x - x_);
00083   int dy = (y - y_);
00084   if (dx == 0 && dy == 0)
00085     return;
00086   trackball_.update(x, y);
00087   if (modifiers & CTRL)
00088     getTranslateMatrix(dx, dy, transform);
00089   else if (modifiers & ALT)
00090     getZTranslateMatrix(dy, transform);
00091   else if (modifiers & SHFT)
00092     getScaleMatrix(dy, transform);
00093   else
00094     trackball_.getRotationMatrix(transform);
00095 
00096   cloud_ptr_ -> multMatrix(transform);
00097 
00098   x_ = x;
00099   y_ = y;
00100 }
00101 
00102 void
00103 CloudTransformTool::getTranslateMatrix (int dx, int dy, float* matrix)
00104 {
00105   setIdentity(matrix);
00106   float scale = 1.0f / cloud_ptr_-> getScalingFactor();
00107   matrix[12] = float(dx) * translate_factor_ * scale;
00108   matrix[13] = float(-dy) * translate_factor_ * scale;
00109 }
00110 
00111 void
00112 CloudTransformTool::getZTranslateMatrix (int dy, float* matrix)
00113 {
00114   setIdentity(matrix);
00115   matrix[14] = float(dy) * translate_factor_ / cloud_ptr_-> getScalingFactor();
00116 }
00117 
00118 void
00119 CloudTransformTool::getScaleMatrix (int dy, float* matrix)
00120 {
00121   setIdentity(matrix);
00122   float scale = dy > 0 ? scale_factor_ : 1.0 / scale_factor_;
00123   for (unsigned int i = 0; i < MATRIX_SIZE-1; i+=MATRIX_SIZE_DIM+1)
00124     matrix[i] = scale;
00125 }
00126 


pcl
Author(s): Open Perception
autogenerated on Wed Aug 26 2015 15:22:46