Visual Servoing Platform  version 3.6.1 under development (2024-03-18)
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 
34 #ifndef _vpImagePoint_h_
35 #define _vpImagePoint_h_
36 
43 #include <visp3/core/vpConfig.h>
44 
45 #include <cmath> // std::fabs
46 #include <limits> // numeric_limits
47 #include <ostream>
48 #include <vector>
49 
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  return ((end.get_j() >= start.get_j() && end.get_j() >= this->j && this->j >= start.get_j()) ||
165  (end.get_j() <= start.get_j() && end.get_j() <= this->j && this->j <= start.get_j())) &&
166  ((end.get_i() >= start.get_i() && end.get_i() >= this->i && this->i >= start.get_i()) ||
167  (end.get_i() <= start.get_i() && end.get_i() <= this->i && this->i <= start.get_i()));
168  }
169 
215  inline vpImagePoint nextInSegment(const vpImagePoint &start, const vpImagePoint &end) const
216  {
217  const double line_slope = (end.get_i() - start.get_i()) / (end.get_j() - start.get_j());
218  if (fabs(end.get_j() - this->j) > fabs(end.get_i() - this->i)) {
219  double j_ = (end.get_j() > this->j ? this->j + 1 : this->j - 1);
220 #if ((__cplusplus >= 201103L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L))) // Check if cxx11 or higher
221  return { end.get_i() - line_slope * (end.get_j() - j_), j_ };
222 #else
223  return vpImagePoint(end.get_i() - line_slope * (end.get_j() - j_), j_);
224 #endif
225  }
226  else {
227  double i_ = (end.get_i() > this->i ? this->i + 1 : this->i - 1);
228 #if ((__cplusplus >= 201103L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L))) // Check if cxx11 or higher
229  return { i_, end.get_j() - ((end.get_i() - i_) / line_slope) };
230 #else
231  return vpImagePoint(i_, end.get_j() - ((end.get_i() - i_) / line_slope));
232 #endif
233  }
234  }
235 
240  {
241  this->i = ip.i;
242  this->j = ip.j;
243  return *this;
244  }
245 
246 #if ((__cplusplus >= 201103L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 201103L))) // Check if cxx11 or higher
250  inline vpImagePoint &operator=(const vpImagePoint &&ip) noexcept
251  {
252  this->i = ip.i;
253  this->j = ip.j;
254  return *this;
255  }
256 #endif
257 
259 
266  {
267  this->i -= ip.i;
268  this->j -= ip.j;
269  return *this;
270  }
271  vpImagePoint &operator/=(double scale);
272 
277  inline vpImagePoint &operator*=(double scale)
278  {
279  this->i *= scale;
280  this->j *= scale;
281  return *this;
282  }
283 
293  inline void set_i(double ii) { this->i = ii; }
294 
304  inline void set_j(double jj) { this->j = jj; }
305 
315  inline void set_ij(double ii, double jj)
316  {
317  this->i = ii;
318  this->j = jj;
319  }
320 
330  inline void set_u(double u) { j = u; }
331 
341  inline void set_v(double v) { i = v; }
342 
352  inline void set_uv(double u, double v)
353  {
354  this->i = v;
355  this->j = u;
356  }
357 
358  static double distance(const vpImagePoint &iP1, const vpImagePoint &iP2);
359  static vpRect getBBox(const std::vector<vpImagePoint> &ipVec);
360  static double sqrDistance(const vpImagePoint &iP1, const vpImagePoint &iP2);
361 
362  friend VISP_EXPORT bool operator==(const vpImagePoint &ip1, const vpImagePoint &ip2);
363  friend VISP_EXPORT bool operator!=(const vpImagePoint &ip1, const vpImagePoint &ip2);
364  friend VISP_EXPORT vpImagePoint 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, int offset);
367  friend VISP_EXPORT vpImagePoint operator+(const vpImagePoint &ip1, unsigned int offset);
368  friend VISP_EXPORT vpImagePoint operator+(const vpImagePoint &ip1, double offset);
369  friend VISP_EXPORT vpImagePoint operator-(const vpImagePoint &ip1, const vpImagePoint &ip2);
370  friend VISP_EXPORT vpImagePoint operator-(const vpImagePoint &ip1, int offset);
371  friend VISP_EXPORT vpImagePoint operator-(const vpImagePoint &ip1, unsigned int offset);
372  friend VISP_EXPORT vpImagePoint operator-(const vpImagePoint &ip1, double offset);
373  friend VISP_EXPORT vpImagePoint operator*(const vpImagePoint &ip1, double scale);
374  friend VISP_EXPORT vpImagePoint operator/(const vpImagePoint &ip1, double scale);
375  friend VISP_EXPORT std::ostream &operator<<(std::ostream &os, const vpImagePoint &ip);
376 
377 private:
378  double i, j;
379 };
380 
381 #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:304
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:239
void set_ij(double ii, double jj)
Definition: vpImagePoint.h:315
virtual ~vpImagePoint()
Destructor.
Definition: vpImagePoint.h:103
void set_i(double ii)
Definition: vpImagePoint.h:293
vpImagePoint nextInSegment(const vpImagePoint &start, const vpImagePoint &end) const
Definition: vpImagePoint.h:215
double get_u() const
Definition: vpImagePoint.h:136
void set_u(double u)
Definition: vpImagePoint.h:330
void set_uv(double u, double v)
Definition: vpImagePoint.h:352
vpImagePoint & operator*=(double scale)
Definition: vpImagePoint.h:277
vpImagePoint(const vpImagePoint &ip)
Definition: vpImagePoint.h:101
void set_v(double v)
Definition: vpImagePoint.h:341
vpImagePoint & operator-=(const vpImagePoint &ip)
Definition: vpImagePoint.h:265
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:76
std::vector< char > & operator+=(std::vector< char > &lhs, const T rhs)
Definition: vpIoTools.h:139
vpMatrix operator*(const double &x, const vpMatrix &A)