CppNCorr
C++ ncorr Digital Image Correlation engine
Loading...
Searching...
No Matches
Disp2D.h
Go to the documentation of this file.
1/*
2 * File: Disp2D.h
3 * Author: justin
4 *
5 * Created on May 12, 2015, 12:36 PM
6 */
7
8#ifndef DISP2D_H
9#define DISP2D_H
10
11#include "Array2D.h"
12#include "Image2D.h"
13#include "ROI2D.h"
14#include "Data2D.h"
15
16namespace ncorr {
17
18namespace details {
19 class Disp2D_nlinfo_interpolator;
20}
21
22class Disp2D final {
23// ---------------------------------------------------------------------------//
24// Disp2D is a class for 2D displacements. -----------------------------------//
25// ---------------------------------------------------------------------------//
26public:
29 typedef details::Disp2D_nlinfo_interpolator nlinfo_interpolator;
30
31 // Rule of 5 and destructor ----------------------------------------------//
32 Disp2D() noexcept = default;
33 Disp2D(const Disp2D&) = default;
34 Disp2D(Disp2D&&) noexcept = default;
35 Disp2D& operator=(const Disp2D&) = default;
36 Disp2D& operator=(Disp2D&&) = default;
37 ~Disp2D() noexcept = default;
38
39 // Additional constructors -----------------------------------------------//
40 // Constructor with explicit correlation coefficient
41 Disp2D(Array2D<double> v, Array2D<double> u, Array2D<double> cc, const ROI2D &roi, difference_type scalefactor) : // r-value
42 v(std::move(v), roi, scalefactor), u(std::move(u), roi, scalefactor), cc(std::move(cc), roi, scalefactor) { }
43
44 // Constructor without correlation - creates zeros array by default
45 Disp2D(Array2D<double> v, Array2D<double> u, const ROI2D &roi, difference_type scalefactor) : // r-value
46 v(std::move(v), roi, scalefactor), u(std::move(u), roi, scalefactor),
47 cc(Array2D<double>(this->v.data_height(), this->v.data_width()), roi, scalefactor) {
48 // Correlation initialized to zeros by default Array2D constructor
49 }
50
51 // Static factory methods ------------------------------------------------//
52 static Disp2D load(std::ifstream&);
53
54 // Operators interface ---------------------------------------------------//
55 friend std::ostream& operator<<(std::ostream&, const Disp2D&);
56 friend void imshow(const Disp2D&, difference_type delay);
57 friend bool isequal(const Disp2D&, const Disp2D&);
58 friend void save(const Disp2D&, std::ofstream&);
59
60 // Access ----------------------------------------------------------------//
61 // Note that Disp2D is immutable, so all access is const.
62 difference_type data_height() const { return v.data_height(); }
63 difference_type data_width() const { return v.data_width(); }
64 const Data2D& get_v() const { return v; }
65 const Data2D& get_u() const { return u; }
66 const Data2D& get_cc() const { return cc; } // Access correlation coefficient
67 const ROI2D& get_roi() const { return v.get_roi(); }
69
70 // Interpolator ----------------------------------------------------------//
72
73 // Utility ---------------------------------------------------------------//
74 std::string size_string() const { return v.size_string(); }
75 std::string size_2D_string() const { return v.size_2D_string(); }
76
77private:
78 Data2D v; // Immutable - Data2D has pointer semantics
79 Data2D u; // Immutable - Data2D has pointer semantics
80 Data2D cc; // Immutable - Correlation coefficient field
81};
82
83namespace details {
84 class Disp2D_nlinfo_interpolator final {
85 public:
86 typedef Disp2D::difference_type difference_type;
87 typedef Disp2D::coords coords;
88
89 friend Disp2D;
90
91 // Rule of 5 and destructor --------------------------------------//
92 Disp2D_nlinfo_interpolator() noexcept = default;
93 Disp2D_nlinfo_interpolator(const Disp2D_nlinfo_interpolator&) = default;
94 Disp2D_nlinfo_interpolator(Disp2D_nlinfo_interpolator&&) = default;
95 Disp2D_nlinfo_interpolator& operator=(const Disp2D_nlinfo_interpolator&) = default;
96 Disp2D_nlinfo_interpolator& operator=(Disp2D_nlinfo_interpolator&&) = default;
97 ~Disp2D_nlinfo_interpolator() noexcept = default;
98
99 // Additional Constructors ---------------------------------------//
100 Disp2D_nlinfo_interpolator(const Disp2D &disp, difference_type region_idx, INTERP interp_type) :
101 v_interp(disp.get_v().get_nlinfo_interpolator(region_idx,interp_type)),
102 u_interp(disp.get_u().get_nlinfo_interpolator(region_idx,interp_type)),
103 cc_interp(disp.get_cc().get_nlinfo_interpolator(region_idx,interp_type)) { }
104
105 // Access methods ------------------------------------------------//
106 std::pair<double,double> operator()(double p1, double p2) const { return { v_interp(p1,p2), u_interp(p1,p2) }; }
107 double get_cc(double p1, double p2) const { return cc_interp(p1, p2); } // Get interpolated correlation
108 std::pair<const Array2D<double>&,const Array2D<double>&> first_order(double p1, double p2) const { return { v_interp.first_order(p1,p2), u_interp.first_order(p1,p2) }; }
109
110 private:
111 Data2D::nlinfo_interpolator v_interp; // must have copy of interpolator
112 Data2D::nlinfo_interpolator u_interp; // must have copy of interpolator
113 Data2D::nlinfo_interpolator cc_interp; // must have copy of interpolator for correlation
114 };
115}
116
117}
118
119#endif /* DISP2D_H */
120
details::Data2D_nlinfo_interpolator nlinfo_interpolator
Definition Data2D.h:35
const ROI2D & get_roi() const
Definition Data2D.h:65
difference_type get_scalefactor() const
Definition Data2D.h:66
std::ptrdiff_t difference_type
Definition Data2D.h:33
difference_type data_width() const
Definition Data2D.h:63
std::string size_string() const
Definition Data2D.h:72
std::pair< difference_type, difference_type > coords
Definition Data2D.h:34
difference_type data_height() const
Definition Data2D.h:62
std::string size_2D_string() const
Definition Data2D.h:73
friend void imshow(const Disp2D &, difference_type delay)
Definition Disp2D.cpp:38
std::string size_2D_string() const
Definition Disp2D.h:75
Data2D::difference_type difference_type
Definition Disp2D.h:27
friend void save(const Disp2D &, std::ofstream &)
Definition Disp2D.cpp:50
std::string size_string() const
Definition Disp2D.h:74
difference_type data_width() const
Definition Disp2D.h:63
friend std::ostream & operator<<(std::ostream &, const Disp2D &)
Definition Disp2D.cpp:30
static Disp2D load(std::ifstream &)
Definition Disp2D.cpp:13
difference_type get_scalefactor() const
Definition Disp2D.h:68
Disp2D() noexcept=default
Data2D::coords coords
Definition Disp2D.h:28
friend bool isequal(const Disp2D &, const Disp2D &)
Definition Disp2D.cpp:46
const Data2D & get_u() const
Definition Disp2D.h:65
difference_type data_height() const
Definition Disp2D.h:62
nlinfo_interpolator get_nlinfo_interpolator(difference_type, INTERP) const
Definition Disp2D.cpp:58
const ROI2D & get_roi() const
Definition Disp2D.h:67
details::Disp2D_nlinfo_interpolator nlinfo_interpolator
Definition Disp2D.h:29
const Data2D & get_v() const
Definition Disp2D.h:64
Disp2D(Array2D< double > v, Array2D< double > u, const ROI2D &roi, difference_type scalefactor)
Definition Disp2D.h:45
const Data2D & get_cc() const
Definition Disp2D.h:66
INTERP
Definition Array2D.h:77