Visual Servoing Platform  version 3.6.1 under development (2024-12-04)
vpImagePoint.h
1 /*
2  * ViSP, open source Visual Servoing Platform software.
3  * Copyright (C) 2005 - 2024 by Inria. All rights reserved.
4  *
5  * This software is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  * See the file LICENSE.txt at the root directory of this source
10  * distribution for additional information about the GNU GPL.
11  *
12  * For using ViSP with software that can not be combined with the GNU
13  * GPL, please contact Inria about acquiring a ViSP Professional
14  * Edition License.
15  *
16  * See https://visp.inria.fr for more information.
17  *
18  * This software was developed at:
19  * Inria Rennes - Bretagne Atlantique
20  * Campus Universitaire de Beaulieu
21  * 35042 Rennes Cedex
22  * France
23  *
24  * If you have questions regarding the use of this file, please contact
25  * Inria at visp@inria.fr
26  *
27  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
28  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
29  *
30  * Description:
31  * 2D point useful for image processing
32  */
33 
40 #ifndef VP_IMAGE_POINT_H
41 #define VP_IMAGE_POINT_H
42 
43 #include <visp3/core/vpConfig.h>
44 
45 #include <cmath> // std::fabs
46 #include <ostream>
47 #include <vector>
48 
49 BEGIN_VISP_NAMESPACE
50 class vpRect;
51 
81 class VISP_EXPORT vpImagePoint
82 {
83 public:
88  inline vpImagePoint() : i(0), j(0) { }
93  inline vpImagePoint(double ii, double jj) : i(ii), j(jj) { }
101  inline vpImagePoint(const vpImagePoint &ip) : i(ip.i), j(ip.j) { }
103  inline virtual ~vpImagePoint() { }
104 
114  inline double get_i() const { return i; }
115 
125  inline double get_j() const { return j; }
126 
136  inline double get_u() const { return j; }
137 
147  inline double get_v() const { return i; }
148 
149  bool inRectangle(const vpRect &rect) const;
150 
162  inline bool inSegment(const vpImagePoint &start, const vpImagePoint &end) const
163  {
164  bool cond11 = ((end.get_j() >= start.get_j()) && (end.get_j() >= this->j) && (this->j >= start.get_j()));
165  bool cond12 = ((end.get_j() <= start.get_j()) && (end.get_j() <= this->j) && (this->j <= start.get_j()));
166  bool cond21 = ((end.get_i() >= start.get_i()) && (end.get_i() >= this->i) && (this->i >= start.get_i()));
167  bool cond22 = ((end.get_i() <= start.get_i()) && (end.get_i() <= this->i) && (this->i <= start.get_i()));
168  return (cond11 || cond12) && (cond21 || cond22);
169  }
170 
220  inline vpImagePoint nextInSegment(const vpImagePoint &start, const vpImagePoint &end) const
221  {
222  const double line_slope = (end.get_i() - start.get_i()) / (end.get_j() - start.get_j());
223  if (fabs(end.get_j() - this->j) > fabs(end.get_i() - this->i)) {
224  double j_ = (end.get_j() > this->j ? (this->j + 1) : (this->j - 1));
225 #if ((__cplusplus >= 201103L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L))) // Check if cxx11 or higher
226  return { end.get_i() - (line_slope * (end.get_j() - j_)), j_ };
227 #else
228  return vpImagePoint(end.get_i() - (line_slope * (end.get_j() - j_)), j_);
229 #endif
230  }
231  else {
232  double i_ = (end.get_i() > this->i ? (this->i + 1) : (this->i - 1));
233 #if ((__cplusplus >= 201103L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L))) // Check if cxx11 or higher
234  return { i_, end.get_j() - ((end.get_i() - i_) / line_slope) };
235 #else
236  return vpImagePoint(i_, end.get_j() - ((end.get_i() - i_) / line_slope));
237 #endif
238  }
239  }
240 
245  {
246  this->i = ip.i;
247  this->j = ip.j;
248  return *this;
249  }
250 
251 #if ((__cplusplus >= 201103L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L))) // Check if cxx11 or higher
255  inline vpImagePoint &operator=(const vpImagePoint &&ip) noexcept
256  {
257  this->i = ip.i;
258  this->j = ip.j;
259  return *this;
260  }
261 #endif
262 
264 
271  {
272  this->i -= ip.i;
273  this->j -= ip.j;
274  return *this;
275  }
276  vpImagePoint &operator/=(double scale);
277 
282  inline vpImagePoint &operator*=(double scale)
283  {
284  this->i *= scale;
285  this->j *= scale;
286  return *this;
287  }
288 
298  inline void set_i(double ii) { this->i = ii; }
299 
309  inline void set_j(double jj) { this->j = jj; }
310 
320  inline void set_ij(double ii, double jj)
321  {
322  this->i = ii;
323  this->j = jj;
324  }
325 
335  inline void set_u(double u) { j = u; }
336 
346  inline void set_v(double v) { i = v; }
347 
357  inline void set_uv(double u, double v)
358  {
359  this->i = v;
360  this->j = u;
361  }
362 
363  static double distance(const vpImagePoint &iP1, const vpImagePoint &iP2);
364  static vpRect getBBox(const std::vector<vpImagePoint> &ipVec);
365  static double sqrDistance(const vpImagePoint &iP1, const vpImagePoint &iP2);
366 
367  friend VISP_EXPORT bool operator==(const vpImagePoint &ip1, const vpImagePoint &ip2);
368  friend VISP_EXPORT bool operator!=(const vpImagePoint &ip1, const vpImagePoint &ip2);
369  friend VISP_EXPORT vpImagePoint operator+=(const vpImagePoint &ip1, const vpImagePoint &ip2);
370  friend VISP_EXPORT vpImagePoint operator+(const vpImagePoint &ip1, const vpImagePoint &ip2);
371  friend VISP_EXPORT vpImagePoint operator+(const vpImagePoint &ip1, int offset);
372  friend VISP_EXPORT vpImagePoint operator+(const vpImagePoint &ip1, unsigned int offset);
373  friend VISP_EXPORT vpImagePoint operator+(const vpImagePoint &ip1, double offset);
374  friend VISP_EXPORT vpImagePoint operator-(const vpImagePoint &ip1, const vpImagePoint &ip2);
375  friend VISP_EXPORT vpImagePoint operator-(const vpImagePoint &ip1, int offset);
376  friend VISP_EXPORT vpImagePoint operator-(const vpImagePoint &ip1, unsigned int offset);
377  friend VISP_EXPORT vpImagePoint operator-(const vpImagePoint &ip1, double offset);
378  friend VISP_EXPORT vpImagePoint operator*(const vpImagePoint &ip1, double scale);
379  friend VISP_EXPORT vpImagePoint operator/(const vpImagePoint &ip1, double scale);
380  friend VISP_EXPORT std::ostream &operator<<(std::ostream &os, const vpImagePoint &ip);
381 
382 private:
383  double i, j;
384 };
385 END_VISP_NAMESPACE
386 #endif
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
Definition: vpImagePoint.h:82
void set_j(double jj)
Definition: vpImagePoint.h:309
double get_j() const
Definition: vpImagePoint.h:125
vpImagePoint(double ii, double jj)
Definition: vpImagePoint.h:93
vpImagePoint & operator=(const vpImagePoint &ip)
Definition: vpImagePoint.h:244
void set_ij(double ii, double jj)
Definition: vpImagePoint.h:320
virtual ~vpImagePoint()
Destructor.
Definition: vpImagePoint.h:103
void set_i(double ii)
Definition: vpImagePoint.h:298
vpImagePoint nextInSegment(const vpImagePoint &start, const vpImagePoint &end) const
Definition: vpImagePoint.h:220
double get_u() const
Definition: vpImagePoint.h:136
void set_u(double u)
Definition: vpImagePoint.h:335
void set_uv(double u, double v)
Definition: vpImagePoint.h:357
vpImagePoint & operator*=(double scale)
Definition: vpImagePoint.h:282
vpImagePoint(const vpImagePoint &ip)
Definition: vpImagePoint.h:101
void set_v(double v)
Definition: vpImagePoint.h:346
vpImagePoint & operator-=(const vpImagePoint &ip)
Definition: vpImagePoint.h:270
bool inSegment(const vpImagePoint &start, const vpImagePoint &end) const
Definition: vpImagePoint.h:162
double get_i() const
Definition: vpImagePoint.h:114
double get_v() const
Definition: vpImagePoint.h:147
Defines a rectangle in the plane.
Definition: vpRect.h:79
std::vector< char > & operator+=(std::vector< char > &lhs, const T rhs)
Definition: vpIoTools.h:141
vpMatrix operator*(const double &x, const vpMatrix &A)