Mercurial > hg > orthanc-stone
annotate Framework/Toolbox/GeometryToolbox.h @ 156:441cfe8e7440 wasm
fill matrix
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 08 Feb 2018 15:22:35 +0100 |
parents | c5044bbfc303 |
children | 2309e8d86efe |
rev | line source |
---|---|
0 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
135
e2fe9352f240
upgrade to year 2018
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
5 * Copyright (C) 2017-2018 Osimis S.A., Belgium |
0 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
47 | 8 * modify it under the terms of the GNU Affero General Public License |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
0 | 11 * |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
47 | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
0 | 18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 **/ | |
20 | |
21 | |
22 #pragma once | |
23 | |
66 | 24 // Patch for ublas in Boost 1.64.0 |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
25 // https://github.com/dealii/dealii/issues/4302 |
66 | 26 #include <boost/version.hpp> |
65
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
27 #if BOOST_VERSION >= 106300 // or 64, need to check |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
28 # include <boost/serialization/array_wrapper.hpp> |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
29 #endif |
885932a893de
OrthancFrameLayerSource
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
47
diff
changeset
|
30 |
144
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
31 #include <Core/DicomFormat/DicomMap.h> |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
32 |
140
2115530d3703
OrientedBoundingBox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
135
diff
changeset
|
33 #include <boost/numeric/ublas/matrix.hpp> |
0 | 34 #include <boost/numeric/ublas/vector.hpp> |
144
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
35 #include <cassert> |
0 | 36 |
37 namespace OrthancStone | |
38 { | |
140
2115530d3703
OrientedBoundingBox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
135
diff
changeset
|
39 typedef boost::numeric::ublas::matrix<double> Matrix; |
0 | 40 typedef boost::numeric::ublas::vector<double> Vector; |
41 | |
42 namespace GeometryToolbox | |
43 { | |
44 void Print(const Vector& v); | |
45 | |
150 | 46 void Print(const Matrix& m); |
47 | |
0 | 48 bool ParseVector(Vector& target, |
32 | 49 const std::string& s); |
50 | |
51 bool ParseVector(Vector& target, | |
118
a4d0b6c82b29
using Orthanc::DicomMap instead of OrthancPlugins::DicomDatasetReader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
113
diff
changeset
|
52 const Orthanc::DicomMap& dataset, |
a4d0b6c82b29
using Orthanc::DicomMap instead of OrthancPlugins::DicomDatasetReader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
113
diff
changeset
|
53 const Orthanc::DicomTag& tag); |
0 | 54 |
55 void AssignVector(Vector& v, | |
56 double v1, | |
57 double v2); | |
58 | |
59 void AssignVector(Vector& v, | |
60 double v1, | |
61 double v2, | |
62 double v3); | |
63 | |
64 inline bool IsNear(double x, | |
65 double y, | |
66 double threshold) | |
67 { | |
68 return fabs(x - y) < threshold; | |
69 } | |
70 | |
71 bool IsNear(double x, | |
72 double y); | |
73 | |
74 inline bool IsCloseToZero(double x) | |
75 { | |
76 return IsNear(x, 0.0); | |
77 } | |
78 | |
79 void NormalizeVector(Vector& u); | |
80 | |
81 void CrossProduct(Vector& result, | |
82 const Vector& u, | |
83 const Vector& v); | |
84 | |
85 void ProjectPointOntoPlane(Vector& result, | |
86 const Vector& point, | |
87 const Vector& planeNormal, | |
88 const Vector& planeOrigin); | |
89 | |
90 bool IsParallel(const Vector& u, | |
91 const Vector& v); | |
92 | |
93 bool IsParallelOrOpposite(bool& isOpposite, | |
94 const Vector& u, | |
95 const Vector& v); | |
96 | |
97 bool IntersectTwoPlanes(Vector& p, | |
98 Vector& direction, | |
99 const Vector& origin1, | |
100 const Vector& normal1, | |
101 const Vector& origin2, | |
102 const Vector& normal2); | |
103 | |
104 bool ClipLineToRectangle(double& x1, // Coordinates of the clipped line (out) | |
105 double& y1, | |
106 double& x2, | |
107 double& y2, | |
108 const double ax, // Two points defining the line (in) | |
109 const double ay, | |
110 const double bx, | |
111 const double by, | |
112 const double& xmin, // Coordinates of the rectangle (in) | |
113 const double& ymin, | |
114 const double& xmax, | |
115 const double& ymax); | |
32 | 116 |
117 void GetPixelSpacing(double& spacingX, | |
118 double& spacingY, | |
118
a4d0b6c82b29
using Orthanc::DicomMap instead of OrthancPlugins::DicomDatasetReader
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
113
diff
changeset
|
119 const Orthanc::DicomMap& dicom); |
122
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
118
diff
changeset
|
120 |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
118
diff
changeset
|
121 inline double ProjectAlongNormal(const Vector& point, |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
118
diff
changeset
|
122 const Vector& normal) |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
118
diff
changeset
|
123 { |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
118
diff
changeset
|
124 return boost::numeric::ublas::inner_prod(point, normal); |
e3433dabfb8d
refactoring DicomStructureSet
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
118
diff
changeset
|
125 } |
140
2115530d3703
OrientedBoundingBox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
135
diff
changeset
|
126 |
2115530d3703
OrientedBoundingBox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
135
diff
changeset
|
127 Matrix CreateRotationMatrixAlongX(double a); |
2115530d3703
OrientedBoundingBox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
135
diff
changeset
|
128 |
2115530d3703
OrientedBoundingBox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
135
diff
changeset
|
129 Matrix CreateRotationMatrixAlongY(double a); |
2115530d3703
OrientedBoundingBox
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
135
diff
changeset
|
130 |
144
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
131 Matrix CreateRotationMatrixAlongZ(double a); |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
132 |
151
c5044bbfc303
CoordinateSystem3D::IntersectSegment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
150
diff
changeset
|
133 bool IntersectPlaneAndSegment(Vector& p, |
c5044bbfc303
CoordinateSystem3D::IntersectSegment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
150
diff
changeset
|
134 const Vector& normal, |
c5044bbfc303
CoordinateSystem3D::IntersectSegment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
150
diff
changeset
|
135 double d, |
c5044bbfc303
CoordinateSystem3D::IntersectSegment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
150
diff
changeset
|
136 const Vector& edgeFrom, |
c5044bbfc303
CoordinateSystem3D::IntersectSegment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
150
diff
changeset
|
137 const Vector& edgeTo); |
c5044bbfc303
CoordinateSystem3D::IntersectSegment()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
150
diff
changeset
|
138 |
156 | 139 void FillMatrix(Matrix& target, |
140 size_t rows, | |
141 size_t columns, | |
142 const double values[]); | |
143 | |
144 void FillVector(Vector& target, | |
145 size_t size, | |
146 const double values[]); | |
147 | |
148 void Convert(Matrix& target, | |
149 const Vector& source); | |
150 | |
144
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
151 inline float ComputeBilinearInterpolationInternal(float x, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
152 float y, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
153 float f00, // source(x, y) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
154 float f01, // source(x + 1, y) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
155 float f10, // source(x, y + 1) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
156 float f11); // source(x + 1, y + 1) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
157 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
158 inline float ComputeBilinearInterpolation(float x, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
159 float y, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
160 float f00, // source(x, y) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
161 float f01, // source(x + 1, y) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
162 float f10, // source(x, y + 1) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
163 float f11); // source(x + 1, y + 1) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
164 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
165 inline float ComputeTrilinearInterpolation(float x, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
166 float y, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
167 float z, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
168 float f000, // source(x, y, z) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
169 float f001, // source(x + 1, y, z) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
170 float f010, // source(x, y + 1, z) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
171 float f011, // source(x + 1, y + 1, z) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
172 float f100, // source(x, y, z + 1) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
173 float f101, // source(x + 1, y, z + 1) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
174 float f110, // source(x, y + 1, z + 1) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
175 float f111); // source(x + 1, y + 1, z + 1) |
0 | 176 }; |
177 } | |
144
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
178 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
179 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
180 float OrthancStone::GeometryToolbox::ComputeBilinearInterpolationInternal(float x, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
181 float y, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
182 float f00, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
183 float f01, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
184 float f10, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
185 float f11) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
186 { |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
187 // This function works on fractional parts |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
188 assert(x >= 0 && y >= 0 && x < 1 && y < 1); |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
189 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
190 // https://en.wikipedia.org/wiki/Bilinear_interpolation#Unit_square |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
191 return f00 * (1 - x) * (1 - y) + f01 * x * (1 - y) + f10 * (1 - x) * y + f11 * x * y; |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
192 } |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
193 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
194 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
195 float OrthancStone::GeometryToolbox::ComputeBilinearInterpolation(float x, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
196 float y, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
197 float f00, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
198 float f01, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
199 float f10, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
200 float f11) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
201 { |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
202 assert(x >= 0 && y >= 0); |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
203 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
204 // Compute the fractional part of (x,y) (this is the "floor()" |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
205 // operation on positive integers) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
206 float xx = x - static_cast<float>(static_cast<int>(x)); |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
207 float yy = y - static_cast<float>(static_cast<int>(y)); |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
208 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
209 return ComputeBilinearInterpolationInternal(xx, yy, f00, f01, f10, f11); |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
210 } |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
211 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
212 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
213 float OrthancStone::GeometryToolbox::ComputeTrilinearInterpolation(float x, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
214 float y, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
215 float z, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
216 float f000, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
217 float f001, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
218 float f010, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
219 float f011, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
220 float f100, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
221 float f101, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
222 float f110, |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
223 float f111) |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
224 { |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
225 assert(x >= 0 && y >= 0 && z >= 0); |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
226 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
227 float xx = x - static_cast<float>(static_cast<int>(x)); |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
228 float yy = y - static_cast<float>(static_cast<int>(y)); |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
229 float zz = z - static_cast<float>(static_cast<int>(z)); |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
230 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
231 // "In practice, a trilinear interpolation is identical to two |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
232 // bilinear interpolation combined with a linear interpolation" |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
233 // https://en.wikipedia.org/wiki/Trilinear_interpolation#Method |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
234 float a = ComputeBilinearInterpolationInternal(xx, yy, f000, f001, f010, f011); |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
235 float b = ComputeBilinearInterpolationInternal(xx, yy, f100, f101, f110, f111); |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
236 |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
237 return (1 - zz) * a + zz * b; |
9b83f30fc1c0
bilinear and trilinear interpolation
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
140
diff
changeset
|
238 } |