Visual Servoing Platform version 3.7.0
Loading...
Searching...
No Matches
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
39
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
50class vpRect;
51
80
81class VISP_EXPORT vpImagePoint
82{
83public:
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
263 vpImagePoint &operator+=(const vpImagePoint &ip);
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
382private:
383 double i, j;
384};
385END_VISP_NAMESPACE
386#endif
Class that defines a 2D point in an image. This class is useful for image processing and stores only ...
vpImagePoint & operator-=(const vpImagePoint &ip)
vpImagePoint & operator*=(double scale)
void set_j(double jj)
vpImagePoint & operator=(const vpImagePoint &ip)
double get_j() const
vpImagePoint(double ii, double jj)
void set_ij(double ii, double jj)
virtual ~vpImagePoint()
Destructor.
void set_i(double ii)
vpImagePoint nextInSegment(const vpImagePoint &start, const vpImagePoint &end) const
double get_u() const
void set_u(double u)
void set_uv(double u, double v)
vpImagePoint & operator=(const vpImagePoint &&ip) noexcept
vpImagePoint(const vpImagePoint &ip)
void set_v(double v)
bool inSegment(const vpImagePoint &start, const vpImagePoint &end) const
double get_i() const
double get_v() const
Defines a rectangle in the plane.
Definition vpRect.h:79