Visual Servoing Platform  version 3.6.1 under development (2024-06-15)
vpImagePoint.h
1 /*
2  * ViSP, open source Visual Servoing Platform software.
3  * Copyright (C) 2005 - 2023 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 _vpImagePoint_h_
41 #define _vpImagePoint_h_
42 
43 #include <visp3/core/vpConfig.h>
44 
45 #include <cmath> // std::fabs
46 #include <ostream>
47 #include <vector>
48 
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 
216  inline vpImagePoint nextInSegment(const vpImagePoint &start, const vpImagePoint &end) const
217  {
218  const double line_slope = (end.get_i() - start.get_i()) / (end.get_j() - start.get_j());
219  if (fabs(end.get_j() - this->j) > fabs(end.get_i() - this->i)) {
220  double j_ = (end.get_j() > this->j ? (this->j + 1) : (this->j - 1));
221 #if ((__cplusplus >= 201103L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L))) // Check if cxx11 or higher
222  return { end.get_i() - (line_slope * (end.get_j() - j_)), j_ };
223 #else
224  return vpImagePoint(end.get_i() - line_slope * (end.get_j() - j_), j_);
225 #endif
226  }
227  else {
228  double i_ = (end.get_i() > this->i ? (this->i + 1) : (this->i - 1));
229 #if ((__cplusplus >= 201103L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L))) // Check if cxx11 or higher
230  return { i_, end.get_j() - ((end.get_i() - i_) / line_slope) };
231 #else
232  return vpImagePoint(i_, end.get_j() - ((end.get_i() - i_) / line_slope));
233 #endif
234  }
235  }
236 
241  {
242  this->i = ip.i;
243  this->j = ip.j;
244  return *this;
245  }
246 
247 #if ((__cplusplus >= 201103L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L))) // Check if cxx11 or higher
251  inline vpImagePoint &operator=(const vpImagePoint &&ip) noexcept
252  {
253  this->i = ip.i;
254  this->j = ip.j;
255  return *this;
256  }
257 #endif
258 
259  vpImagePoint &operator+=(const vpImagePoint &ip);
260 
267  {
268  this->i -= ip.i;
269  this->j -= ip.j;
270  return *this;
271  }
272  vpImagePoint &operator/=(double scale);
273 
278  inline vpImagePoint &operator*=(double scale)
279  {
280  this->i *= scale;
281  this->j *= scale;
282  return *this;
283  }
284 
294  inline void set_i(double ii) { this->i = ii; }
295 
305  inline void set_j(double jj) { this->j = jj; }
306 
316  inline void set_ij(double ii, double jj)
317  {
318  this->i = ii;
319  this->j = jj;
320  }
321 
331  inline void set_u(double u) { j = u; }
332 
342  inline void set_v(double v) { i = v; }
343 
353  inline void set_uv(double u, double v)
354  {
355  this->i = v;
356  this->j = u;
357  }
358 
359  static double distance(const vpImagePoint &iP1, const vpImagePoint &iP2);
360  static vpRect getBBox(const std::vector<vpImagePoint> &ipVec);
361  static double sqrDistance(const vpImagePoint &iP1, const vpImagePoint &iP2);
362 
363  friend VISP_EXPORT bool operator==(const vpImagePoint &ip1, const vpImagePoint &ip2);
364  friend VISP_EXPORT bool operator!=(const vpImagePoint &ip1, const vpImagePoint &ip2);
365  friend VISP_EXPORT vpImagePoint operator+=(const vpImagePoint &ip1, const vpImagePoint &ip2);
366  friend VISP_EXPORT vpImagePoint operator+(const vpImagePoint &ip1, const vpImagePoint &ip2);
367  friend VISP_EXPORT vpImagePoint operator+(const vpImagePoint &ip1, int offset);
368  friend VISP_EXPORT vpImagePoint operator+(const vpImagePoint &ip1, unsigned int offset);
369  friend VISP_EXPORT vpImagePoint operator+(const vpImagePoint &ip1, double offset);
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, double scale);
375  friend VISP_EXPORT vpImagePoint operator/(const vpImagePoint &ip1, double scale);
376  friend VISP_EXPORT std::ostream &operator<<(std::ostream &os, const vpImagePoint &ip);
377 
378 private:
379  double i, j;
380 };
382 #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:305
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:240
void set_ij(double ii, double jj)
Definition: vpImagePoint.h:316
virtual ~vpImagePoint()
Destructor.
Definition: vpImagePoint.h:103
void set_i(double ii)
Definition: vpImagePoint.h:294
vpImagePoint nextInSegment(const vpImagePoint &start, const vpImagePoint &end) const
Definition: vpImagePoint.h:216
double get_u() const
Definition: vpImagePoint.h:136
void set_u(double u)
Definition: vpImagePoint.h:331
void set_uv(double u, double v)
Definition: vpImagePoint.h:353
vpImagePoint & operator*=(double scale)
Definition: vpImagePoint.h:278
vpImagePoint(const vpImagePoint &ip)
Definition: vpImagePoint.h:101
void set_v(double v)
Definition: vpImagePoint.h:342
vpImagePoint & operator-=(const vpImagePoint &ip)
Definition: vpImagePoint.h:266
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
vpMatrix operator*(const double &x, const vpMatrix &A)