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
00036
00037
00038
00039
00040 #ifndef PCL_COMMON_POINT_OPERATORS_H
00041 #define PCL_COMMON_POINT_OPERATORS_H
00042
00043 #include <pcl/point_types.h>
00044
00045 namespace pcl
00046 {
00047 namespace common
00048 {
00053
00054 template <typename PointT> inline PointT
00055 operator+ (const PointT& lhs, const PointT& rhs)
00056 {
00057 PointT result = lhs;
00058 result.getVector3fMap () += rhs.getVector3fMap ();
00059 return (result);
00060 }
00062 template <typename PointT> inline PointT
00063 operator- (const PointT& lhs, const PointT& rhs)
00064 {
00065 PointT result = lhs;
00066 result.getVector3fMap () -= rhs.getVector3fMap ();
00067 return (result);
00068 }
00070 template <typename PointT> inline PointT
00071 operator* (const float& scalar, const PointT& p)
00072 {
00073 PointT result = p;
00074 result.getVector3fMap () *= scalar;
00075 return (result);
00076 }
00078 template <typename PointT> inline PointT
00079 operator* (const PointT& p, const float& scalar)
00080 {
00081 PointT result = p;
00082 result.getVector3fMap () *= scalar;
00083 return (result);
00084 }
00086 template <typename PointT> inline PointT
00087 operator/ (const float& scalar, const PointT& p)
00088 {
00089 PointT result = p;
00090 result.getVector3fMap () /= scalar;
00091 return (result);
00092 }
00094 template <typename PointT> inline PointT
00095 operator/ (const PointT& p, const float& scalar)
00096 {
00097 PointT result = p;
00098 result.getVector3fMap () /= scalar;
00099 return (result);
00100 }
00102 template <typename PointT> inline PointT&
00103 operator+= (PointT& lhs, const PointT& rhs)
00104 {
00105 lhs.getVector3fMap () += rhs.getVector3fMap ();
00106 return (lhs);
00107 }
00109 template <typename PointT> inline PointT&
00110 operator-= (PointT& lhs, const PointT& rhs)
00111 {
00112 lhs.getVector3fMap () -= rhs.getVector3fMap ();
00113 return (lhs);
00114 }
00116 template <typename PointT> inline PointT&
00117 operator*= (PointT& p, const float& scalar)
00118 {
00119 p.getVector3fMap () *= scalar;
00120 return (PointT ());
00121 }
00123 template <typename PointT> inline PointT&
00124 operator/= (PointT& p, const float& scalar)
00125 {
00126 p.getVector3fMap () /= scalar;
00127 return (p);
00128 }
00129
00131 template <> inline pcl::PointXYZI
00132 operator+ (const pcl::PointXYZI& lhs, const pcl::PointXYZI& rhs)
00133 {
00134 pcl::PointXYZI result = lhs;
00135 result.getVector3fMap () += rhs.getVector3fMap ();
00136 result.intensity += rhs.intensity;
00137 return (result);
00138 }
00140 template <> inline pcl::PointXYZI
00141 operator- (const pcl::PointXYZI& lhs, const pcl::PointXYZI& rhs)
00142 {
00143 pcl::PointXYZI result = lhs;
00144 result.getVector3fMap () -= rhs.getVector3fMap ();
00145 result.intensity -= rhs.intensity;
00146 return (result);
00147 }
00149 template <> inline pcl::PointXYZI
00150 operator* (const float& scalar, const pcl::PointXYZI& p)
00151 {
00152 pcl::PointXYZI result = p;
00153 result.getVector3fMap () *= scalar;
00154 result.intensity *= scalar;
00155 return (result);
00156 }
00158 template <> inline pcl::PointXYZI
00159 operator* (const pcl::PointXYZI& p, const float& scalar)
00160 {
00161 pcl::PointXYZI result = p;
00162 result.getVector3fMap () *= scalar;
00163 result.intensity *= scalar;
00164 return (result);
00165 }
00167 template <> inline pcl::PointXYZI&
00168 operator+= (pcl::PointXYZI& lhs, const pcl::PointXYZI& rhs)
00169 {
00170 lhs.getVector3fMap () += rhs.getVector3fMap ();
00171 lhs.intensity += rhs.intensity;
00172 return (lhs);
00173 }
00175 template <> inline pcl::PointXYZI&
00176 operator-= (pcl::PointXYZI& lhs, const pcl::PointXYZI& rhs)
00177 {
00178 lhs.getVector3fMap () -= rhs.getVector3fMap ();
00179 lhs.intensity -= rhs.intensity;
00180 return (lhs);
00181 }
00183 template <> inline pcl::PointXYZI&
00184 operator*= (pcl::PointXYZI& lhs, const float& scalar)
00185 {
00186 lhs.getVector3fMap () *= scalar;
00187 lhs.intensity *= scalar;
00188 return (lhs);
00189 }
00190 template <> inline pcl::PointXYZINormal
00191 operator+ (const pcl::PointXYZINormal& lhs, const pcl::PointXYZINormal& rhs)
00192 {
00193 pcl::PointXYZINormal result = lhs;
00194 result.getVector3fMap () += rhs.getVector3fMap ();
00195 result.getNormalVector3fMap () += rhs.getNormalVector3fMap ();
00196 result.intensity += rhs.intensity;
00197 result.curvature += rhs.curvature;
00198 return (result);
00199 }
00200
00201 template <> inline pcl::PointXYZINormal
00202 operator- (const pcl::PointXYZINormal& lhs, const pcl::PointXYZINormal& rhs)
00203 {
00204 pcl::PointXYZINormal result = lhs;
00205 result.getVector3fMap () -= rhs.getVector3fMap ();
00206 result.getNormalVector3fMap () -= rhs.getNormalVector3fMap ();
00207 result.intensity -= rhs.intensity;
00208 result.curvature -= rhs.curvature;
00209 return (result);
00210 }
00211
00212 template <> inline pcl::PointXYZINormal&
00213 operator+= (pcl::PointXYZINormal& lhs, const pcl::PointXYZINormal& rhs)
00214 {
00215 lhs.getVector3fMap () += rhs.getVector3fMap ();
00216 lhs.getNormalVector3fMap () += rhs.getNormalVector3fMap ();
00217 lhs.intensity += rhs.intensity;
00218 lhs.curvature += rhs.curvature;
00219 return (lhs);
00220 }
00221
00222 template <> inline pcl::PointXYZINormal&
00223 operator-= (pcl::PointXYZINormal& lhs, const pcl::PointXYZINormal& rhs)
00224 {
00225 lhs.getVector3fMap () -= rhs.getVector3fMap ();
00226 lhs.getNormalVector3fMap () -= rhs.getNormalVector3fMap ();
00227 lhs.intensity-= rhs.intensity;
00228 lhs.curvature-= rhs.curvature;
00229 return (lhs);
00230 }
00231
00232 template <> inline pcl::PointXYZINormal&
00233 operator*= (pcl::PointXYZINormal& lhs, const float& scalar)
00234 {
00235 lhs.getVector3fMap () *= scalar;
00236 lhs.getNormalVector3fMap () *= scalar;
00237 lhs.intensity *= scalar;
00238 lhs.curvature *= scalar;
00239 return (lhs);
00240 }
00241
00242 template <> inline pcl::PointXYZINormal
00243 operator* (const float& scalar, const pcl::PointXYZINormal& p)
00244 {
00245 pcl::PointXYZINormal result = p;
00246 result.getVector3fMap () *= scalar;
00247 result.getNormalVector3fMap () *= scalar;
00248 result.intensity *= scalar;
00249 result.curvature *= scalar;
00250 return (result);
00251 }
00252
00253 template <> inline pcl::PointXYZINormal
00254 operator* (const pcl::PointXYZINormal& p, const float& scalar)
00255 {
00256 return (operator* (scalar, p));
00257 }
00258
00260 template <> inline pcl::Normal
00261 operator+ (const pcl::Normal& lhs, const pcl::Normal& rhs)
00262 {
00263 pcl::Normal result = lhs;
00264 result.getNormalVector3fMap () += rhs.getNormalVector3fMap ();
00265 result.curvature += rhs.curvature;
00266 return (result);
00267 }
00269 template <> inline pcl::Normal
00270 operator- (const pcl::Normal& lhs, const pcl::Normal& rhs)
00271 {
00272 pcl::Normal result = lhs;
00273 result.getNormalVector3fMap () -= rhs.getNormalVector3fMap ();
00274 result.curvature -= rhs.curvature;
00275 return (result);
00276 }
00278 template <> inline pcl::Normal
00279 operator* (const float& scalar, const pcl::Normal& p)
00280 {
00281 pcl::Normal result = p;
00282 result.getNormalVector3fMap () *= scalar;
00283 result.curvature *= scalar;
00284 return (result);
00285 }
00287 template <> inline pcl::Normal
00288 operator* (const pcl::Normal& p, const float& scalar)
00289 {
00290 pcl::Normal result = p;
00291 result.getNormalVector3fMap () *= scalar;
00292 result.curvature *= scalar;
00293 return (result);
00294 }
00296 template <> inline pcl::Normal&
00297 operator+= (pcl::Normal& lhs, const pcl::Normal& rhs)
00298 {
00299 lhs.getNormalVector3fMap () += rhs.getNormalVector3fMap ();
00300 lhs.curvature += rhs.curvature;
00301 return (lhs);
00302 }
00304 template <> inline pcl::Normal&
00305 operator-= (pcl::Normal& lhs, const pcl::Normal& rhs)
00306 {
00307 lhs.getNormalVector3fMap () -= rhs.getNormalVector3fMap ();
00308 lhs.curvature -= rhs.curvature;
00309 return (lhs);
00310 }
00312 template <> inline pcl::Normal&
00313 operator*= (pcl::Normal& lhs, const float& scalar)
00314 {
00315 lhs.getNormalVector3fMap () *= scalar;
00316 lhs.curvature *= scalar;
00317 return (lhs);
00318 }
00319
00321 template <> inline pcl::PointXYZRGB
00322 operator+ (const pcl::PointXYZRGB& lhs, const pcl::PointXYZRGB& rhs)
00323 {
00324 pcl::PointXYZRGB result;
00325 result.getVector3fMap () = lhs.getVector3fMap ();
00326 result.getVector3fMap () += rhs.getVector3fMap ();
00327 result.r = static_cast<uint8_t> (lhs.r + rhs.r);
00328 result.g = static_cast<uint8_t> (lhs.g + rhs.g);
00329 result.b = static_cast<uint8_t> (lhs.b + rhs.b);
00330 return (result);
00331 }
00333 template <> inline pcl::PointXYZRGB
00334 operator- (const pcl::PointXYZRGB& lhs, const pcl::PointXYZRGB& rhs)
00335 {
00336 pcl::PointXYZRGB result;
00337 result.getVector3fMap () = lhs.getVector3fMap ();
00338 result.getVector3fMap () -= rhs.getVector3fMap ();
00339 result.r = static_cast<uint8_t> (lhs.r - rhs.r);
00340 result.g = static_cast<uint8_t> (lhs.g - rhs.g);
00341 result.b = static_cast<uint8_t> (lhs.b - rhs.b);
00342 return (result);
00343 }
00344
00345 template <> inline pcl::PointXYZRGB
00346 operator* (const float& scalar, const pcl::PointXYZRGB& p)
00347 {
00348 pcl::PointXYZRGB result;
00349 result.getVector3fMap () = p.getVector3fMap ();
00350 result.getVector3fMap () *= scalar;
00351 result.r = static_cast<uint8_t> (scalar * p.r);
00352 result.g = static_cast<uint8_t> (scalar * p.g);
00353 result.b = static_cast<uint8_t> (scalar * p.b);
00354 return (result);
00355 }
00356
00357 template <> inline pcl::PointXYZRGB
00358 operator* (const pcl::PointXYZRGB& p, const float& scalar)
00359 {
00360 pcl::PointXYZRGB result;
00361 result.getVector3fMap () = p.getVector3fMap ();
00362 result.getVector3fMap () *= scalar;
00363 result.r = static_cast<uint8_t> (scalar * p.r);
00364 result.g = static_cast<uint8_t> (scalar * p.g);
00365 result.b = static_cast<uint8_t> (scalar * p.b);
00366 return (result);
00367 }
00368
00369 template <> inline pcl::PointXYZRGB&
00370 operator+= (pcl::PointXYZRGB& lhs, const pcl::PointXYZRGB& rhs)
00371 {
00372 lhs.getVector3fMap () += rhs.getVector3fMap ();
00373 lhs.r = static_cast<uint8_t> (lhs.r + rhs.r);
00374 lhs.g = static_cast<uint8_t> (lhs.g + rhs.g);
00375 lhs.b = static_cast<uint8_t> (lhs.b + rhs.b);
00376 return (lhs);
00377 }
00378
00379 template <> inline pcl::PointXYZRGB&
00380 operator-= (pcl::PointXYZRGB& lhs, const pcl::PointXYZRGB& rhs)
00381 {
00382 lhs.getVector3fMap () -= rhs.getVector3fMap ();
00383 lhs.r = static_cast<uint8_t> (lhs.r - rhs.r);
00384 lhs.g = static_cast<uint8_t> (lhs.g - rhs.g);
00385 lhs.b = static_cast<uint8_t> (lhs.b - rhs.b);
00386 return (lhs);
00387 }
00388
00389 template <> inline pcl::PointXYZRGB&
00390 operator*= (pcl::PointXYZRGB& lhs, const float& scalar)
00391 {
00392 lhs.getVector3fMap () *= scalar;
00393 lhs.r = static_cast<uint8_t> (lhs.r * scalar);
00394 lhs.g = static_cast<uint8_t> (lhs.g * scalar);
00395 lhs.b = static_cast<uint8_t> (lhs.b * scalar);
00396 return (lhs);
00397 }
00398
00400 template <> inline pcl::PointXYZRGBA
00401 operator+ (const pcl::PointXYZRGBA& lhs, const pcl::PointXYZRGBA& rhs)
00402 {
00403 pcl::PointXYZRGBA result;
00404 result.getVector3fMap () = lhs.getVector3fMap ();
00405 result.getVector3fMap () += rhs.getVector3fMap ();
00406 result.r = static_cast<uint8_t> (lhs.r + rhs.r);
00407 result.g = static_cast<uint8_t> (lhs.g + rhs.g);
00408 result.b = static_cast<uint8_t> (lhs.b + rhs.b);
00409 return (result);
00410 }
00412 template <> inline pcl::PointXYZRGBA
00413 operator- (const pcl::PointXYZRGBA& lhs, const pcl::PointXYZRGBA& rhs)
00414 {
00415 pcl::PointXYZRGBA result;
00416 result.getVector3fMap () = lhs.getVector3fMap ();
00417 result.getVector3fMap () -= rhs.getVector3fMap ();
00418 result.r = static_cast<uint8_t> (lhs.r - rhs.r);
00419 result.g = static_cast<uint8_t> (lhs.g - rhs.g);
00420 result.b = static_cast<uint8_t> (lhs.b - rhs.b);
00421 return (result);
00422 }
00423
00424 template <> inline pcl::PointXYZRGBA
00425 operator* (const float& scalar, const pcl::PointXYZRGBA& p)
00426 {
00427 pcl::PointXYZRGBA result;
00428 result.getVector3fMap () = p.getVector3fMap ();
00429 result.getVector3fMap () *= scalar;
00430 result.r = static_cast<uint8_t> (scalar * p.r);
00431 result.g = static_cast<uint8_t> (scalar * p.g);
00432 result.b = static_cast<uint8_t> (scalar * p.b);
00433 return (result);
00434 }
00435
00436 template <> inline pcl::PointXYZRGBA
00437 operator* (const pcl::PointXYZRGBA& p, const float& scalar)
00438 {
00439 pcl::PointXYZRGBA result;
00440 result.getVector3fMap () = p.getVector3fMap ();
00441 result.getVector3fMap () *= scalar;
00442 result.r = static_cast<uint8_t> (scalar * p.r);
00443 result.g = static_cast<uint8_t> (scalar * p.g);
00444 result.b = static_cast<uint8_t> (scalar * p.b);
00445 return (result);
00446 }
00447
00448 template <> inline pcl::PointXYZRGBA&
00449 operator+= (pcl::PointXYZRGBA& lhs, const pcl::PointXYZRGBA& rhs)
00450 {
00451 lhs.getVector3fMap () += rhs.getVector3fMap ();
00452 lhs.r = static_cast<uint8_t> (lhs.r + rhs.r);
00453 lhs.g = static_cast<uint8_t> (lhs.g + rhs.g);
00454 lhs.b = static_cast<uint8_t> (lhs.b + rhs.b);
00455 return (lhs);
00456 }
00457
00458 template <> inline pcl::PointXYZRGBA&
00459 operator-= (pcl::PointXYZRGBA& lhs, const pcl::PointXYZRGBA& rhs)
00460 {
00461 lhs.getVector3fMap () -= rhs.getVector3fMap ();
00462 lhs.r = static_cast<uint8_t> (lhs.r - rhs.r);
00463 lhs.g = static_cast<uint8_t> (lhs.g - rhs.g);
00464 lhs.b = static_cast<uint8_t> (lhs.b - rhs.b);
00465 return (lhs);
00466 }
00467
00468 template <> inline pcl::PointXYZRGBA&
00469 operator*= (pcl::PointXYZRGBA& lhs, const float& scalar)
00470 {
00471 lhs.getVector3fMap () *= scalar;
00472 lhs.r = static_cast<uint8_t> (lhs.r * scalar);
00473 lhs.g = static_cast<uint8_t> (lhs.g * scalar);
00474 lhs.b = static_cast<uint8_t> (lhs.b * scalar);
00475 return (lhs);
00476 }
00477
00479 template <> inline pcl::RGB
00480 operator+ (const pcl::RGB& lhs, const pcl::RGB& rhs)
00481 {
00482 pcl::RGB result;
00483 result.r = static_cast<uint8_t> (lhs.r + rhs.r);
00484 result.g = static_cast<uint8_t> (lhs.g + rhs.g);
00485 result.b = static_cast<uint8_t> (lhs.b + rhs.b);
00486 return (result);
00487 }
00489 template <> inline pcl::RGB
00490 operator- (const pcl::RGB& lhs, const pcl::RGB& rhs)
00491 {
00492 pcl::RGB result;
00493 result.r = static_cast<uint8_t> (lhs.r - rhs.r);
00494 result.g = static_cast<uint8_t> (lhs.g - rhs.g);
00495 result.b = static_cast<uint8_t> (lhs.b - rhs.b);
00496 return (result);
00497 }
00498
00499 template <> inline pcl::RGB
00500 operator* (const float& scalar, const pcl::RGB& p)
00501 {
00502 pcl::RGB result;
00503 result.r = static_cast<uint8_t> (scalar * p.r);
00504 result.g = static_cast<uint8_t> (scalar * p.g);
00505 result.b = static_cast<uint8_t> (scalar * p.b);
00506 return (result);
00507 }
00508
00509 template <> inline pcl::RGB
00510 operator* (const pcl::RGB& p, const float& scalar)
00511 {
00512 pcl::RGB result;
00513 result.r = static_cast<uint8_t> (scalar * p.r);
00514 result.g = static_cast<uint8_t> (scalar * p.g);
00515 result.b = static_cast<uint8_t> (scalar * p.b);
00516 return (result);
00517 }
00518
00519 template <> inline pcl::RGB&
00520 operator+= (pcl::RGB& lhs, const pcl::RGB& rhs)
00521 {
00522 lhs.r = static_cast<uint8_t> (lhs.r + rhs.r);
00523 lhs.g = static_cast<uint8_t> (lhs.g + rhs.g);
00524 lhs.b = static_cast<uint8_t> (lhs.b + rhs.b);
00525 return (lhs);
00526 }
00527
00528 template <> inline pcl::RGB&
00529 operator-= (pcl::RGB& lhs, const pcl::RGB& rhs)
00530 {
00531 lhs.r = static_cast<uint8_t> (lhs.r - rhs.r);
00532 lhs.g = static_cast<uint8_t> (lhs.g - rhs.g);
00533 lhs.b = static_cast<uint8_t> (lhs.b - rhs.b);
00534 return (lhs);
00535 }
00536
00537 template <> inline pcl::RGB&
00538 operator*= (pcl::RGB& lhs, const float& scalar)
00539 {
00540 lhs.r = static_cast<uint8_t> (lhs.r * scalar);
00541 lhs.g = static_cast<uint8_t> (lhs.g * scalar);
00542 lhs.b = static_cast<uint8_t> (lhs.b * scalar);
00543 return (lhs);
00544 }
00545 }
00546 }
00547
00548 #endif