PhysicsBasedAnimationToolkit 0.0.10
Cross-platform C++20 library of algorithms and data structures commonly used in computer graphics research on physically-based simulation.
Loading...
Searching...
No Matches
DistanceQueries.h
Go to the documentation of this file.
1
10
11#ifndef PBAT_GEOMETRY_DISTANCEQUERIES_H
12#define PBAT_GEOMETRY_DISTANCEQUERIES_H
13
14#include "ClosestPointQueries.h"
15#include "OverlapQueries.h"
16#include "pbat/HostDevice.h"
18
19#include <algorithm>
20
21namespace pbat {
22namespace geometry {
26namespace DistanceQueries {
27
28namespace mini = math::linalg::mini;
29
42template <
43 mini::CMatrix TMatrixL1,
44 mini::CMatrix TMatrixU1,
45 mini::CMatrix TMatrixL2,
46 mini::CMatrix TMatrixU2>
47PBAT_HOST_DEVICE auto AxisAlignedBoundingBoxes(
48 TMatrixL1 const& L1,
49 TMatrixU1 const& U1,
50 TMatrixL2 const& L2,
51 TMatrixU2 const& U2) -> typename TMatrixL1::ScalarType;
52
63template <mini::CMatrix TMatrixP, mini::CMatrix TMatrixL, mini::CMatrix TMatrixU>
64PBAT_HOST_DEVICE auto
65PointAxisAlignedBoundingBox(TMatrixP const& P, TMatrixL const& L, TMatrixU const& U) ->
66 typename TMatrixP::ScalarType;
67
80template <
81 mini::CMatrix TMatrixP,
82 mini::CMatrix TMatrixA,
83 mini::CMatrix TMatrixB,
84 mini::CMatrix TMatrixC>
85PBAT_HOST_DEVICE auto
86PointTriangle(TMatrixP const& P, TMatrixA const& A, TMatrixB const& B, TMatrixC const& C) ->
87 typename TMatrixP::ScalarType;
88
103template <
104 mini::CMatrix TMatrixP,
105 mini::CMatrix TMatrixA,
106 mini::CMatrix TMatrixB,
107 mini::CMatrix TMatrixC,
108 mini::CMatrix TMatrixD>
109PBAT_HOST_DEVICE auto PointTetrahedron(
110 TMatrixP const& P,
111 TMatrixA const& A,
112 TMatrixB const& B,
113 TMatrixC const& C,
114 TMatrixD const& D) -> typename TMatrixP::ScalarType;
115
126template <mini::CMatrix TMatrixX, mini::CMatrix TMatrixP, mini::CMatrix TMatrixN>
127PBAT_HOST_DEVICE auto PointPlane(TMatrixX const& X, TMatrixP const& P, TMatrixN const& n) ->
128 typename TMatrixX::ScalarType;
129
142template <
143 mini::CMatrix TMatrixX,
144 mini::CMatrix TMatrixA,
145 mini::CMatrix TMatrixB,
146 mini::CMatrix TMatrixC>
147PBAT_HOST_DEVICE auto
148PointPlane(TMatrixX const& X, TMatrixA const& A, TMatrixB const& B, TMatrixC const& C) ->
149 typename TMatrixX::ScalarType;
150
164template <
165 mini::CMatrix TMatrixX,
166 mini::CMatrix TMatrixA,
167 mini::CMatrix TMatrixB,
168 mini::CMatrix TMatrixC>
169PBAT_HOST_DEVICE auto SphereTriangle(
170 TMatrixX const& X,
171 typename TMatrixX::ScalarType R,
172 TMatrixA const& A,
173 TMatrixB const& B,
174 TMatrixC const& C) -> typename TMatrixX::ScalarType;
175
176template <
177 mini::CMatrix TMatrixL1,
178 mini::CMatrix TMatrixU1,
179 mini::CMatrix TMatrixL2,
180 mini::CMatrix TMatrixU2>
181PBAT_HOST_DEVICE auto AxisAlignedBoundingBoxes(
182 TMatrixL1 const& L1,
183 TMatrixU1 const& U1,
184 TMatrixL2 const& L2,
185 TMatrixU2 const& U2) -> typename TMatrixL1::ScalarType
186{
187 using ScalarType = typename TMatrixL1::ScalarType;
188 auto constexpr kDims = TMatrixL1::kRows;
189 mini::SVector<ScalarType, kDims> LI = Max(L1, L2);
190 mini::SVector<ScalarType, kDims> UI = Min(U1, U2);
191 auto LGU = LI > UI;
192 mini::SVector<ScalarType, kDims> DI = LI - UI;
193 ScalarType d2 = Dot(Cast<ScalarType>(LGU), Squared(DI));
194 return d2;
195}
196
197template <mini::CMatrix TMatrixP, mini::CMatrix TMatrixL, mini::CMatrix TMatrixU>
198PBAT_HOST_DEVICE auto
199PointAxisAlignedBoundingBox(TMatrixP const& P, TMatrixL const& L, TMatrixU const& U) ->
200 typename TMatrixP::ScalarType
201{
202 // If point is inside AABB, then distance is 0.
203 bool const bIsInsideBox = OverlapQueries::PointAxisAlignedBoundingBox(P, L, U);
204 if (bIsInsideBox)
205 return 0.;
206 // Otherwise compute distance to boundary
208 return SquaredNorm(P - CP);
209}
210
211template <
212 mini::CMatrix TMatrixP,
213 mini::CMatrix TMatrixA,
214 mini::CMatrix TMatrixB,
215 mini::CMatrix TMatrixC>
216PBAT_HOST_DEVICE auto
217PointTriangle(TMatrixP const& P, TMatrixA const& A, TMatrixB const& B, TMatrixC const& C) ->
218 typename TMatrixP::ScalarType
219{
220 auto const PP = ClosestPointQueries::PointInTriangle(P, A, B, C);
221 return SquaredNorm(P - PP);
222}
223
224template <
225 mini::CMatrix TMatrixP,
226 mini::CMatrix TMatrixA,
227 mini::CMatrix TMatrixB,
228 mini::CMatrix TMatrixC,
229 mini::CMatrix TMatrixD>
230PBAT_HOST_DEVICE auto PointTetrahedron(
231 TMatrixP const& P,
232 TMatrixA const& A,
233 TMatrixB const& B,
234 TMatrixC const& C,
235 TMatrixD const& D) -> typename TMatrixP::ScalarType
236{
237 bool const bPointInTetrahedron = OverlapQueries::PointTetrahedron3D(P, A, B, C, D);
238 if (bPointInTetrahedron)
239 return 0.;
240
241 using ScalarType = typename TMatrixP::ScalarType;
242 mini::SVector<ScalarType, 4> sd{
243 PointTriangle(P, A, B, D),
244 PointTriangle(P, B, C, D),
245 PointTriangle(P, C, A, D),
246 PointTriangle(P, A, C, B)};
247 ScalarType const min = Min(sd);
248 return min;
249}
250
251template <mini::CMatrix TMatrixX, mini::CMatrix TMatrixP, mini::CMatrix TMatrixN>
252PBAT_HOST_DEVICE auto PointPlane(TMatrixX const& X, TMatrixP const& P, TMatrixN const& n) ->
253 typename TMatrixX::ScalarType
254{
255 return Dot(X - P, n);
256}
257
258template <
259 mini::CMatrix TMatrixX,
260 mini::CMatrix TMatrixA,
261 mini::CMatrix TMatrixB,
262 mini::CMatrix TMatrixC>
263PBAT_HOST_DEVICE auto
264PointPlane(TMatrixX const& X, TMatrixA const& A, TMatrixB const& B, TMatrixC const& C) ->
265 typename TMatrixX::ScalarType
266{
267 auto const n = Cross(B - A, C - A);
268 return PointPlane(X, A, n);
269}
270
271template <
272 mini::CMatrix TMatrixX,
273 mini::CMatrix TMatrixA,
274 mini::CMatrix TMatrixB,
275 mini::CMatrix TMatrixC>
276PBAT_HOST_DEVICE auto SphereTriangle(
277 TMatrixX const& X,
278 typename TMatrixX::ScalarType R,
279 TMatrixA const& A,
280 TMatrixB const& B,
281 TMatrixC const& C) -> typename TMatrixX::ScalarType
282{
283 auto const sd2c = PointTriangle(X, A, B, C);
284 return sd2c - R * R;
285}
286
287} // namespace DistanceQueries
288} // namespace geometry
289} // namespace pbat
290
291#endif // PBAT_GEOMETRY_DISTANCEQUERIES_H
This file contains functions to answer closest point queries.
This file includes all the mini linear algebra headers.
This file contains functions to answer overlap queries.
PBAT_HOST_DEVICE auto PointOnAxisAlignedBoundingBox(TMatrixX const &X, TMatrixL const &L, TMatrixU const &U) -> mini::SVector< typename TMatrixX::ScalarType, TMatrixX::kRows >
Obtain the point on the axis-aligned bounding box (AABB) defined by the lower and upper corners close...
Definition ClosestPointQueries.h:280
PBAT_HOST_DEVICE auto PointInTriangle(TMatrixP const &P, TMatrixA const &A, TMatrixB const &B, TMatrixC const &C) -> mini::SVector< typename TMatrixP::ScalarType, TMatrixP::kRows >
Obtain the point on the triangle ABC closest to the point P.
Definition ClosestPointQueries.h:384
This namespace contains functions to answer distance queries.
Definition DistanceQueries.h:26
PBAT_HOST_DEVICE auto AxisAlignedBoundingBoxes(TMatrixL1 const &L1, TMatrixU1 const &U1, TMatrixL2 const &L2, TMatrixU2 const &U2) -> typename TMatrixL1::ScalarType
Obtain squared distance between 2 axis-aligned bounding boxes.
Definition DistanceQueries.h:181
PBAT_HOST_DEVICE auto SphereTriangle(TMatrixX const &X, typename TMatrixX::ScalarType R, TMatrixA const &A, TMatrixB const &B, TMatrixC const &C) -> typename TMatrixX::ScalarType
Obtains the squared distance between sphere (X,R) and triangle ABC.
Definition DistanceQueries.h:276
PBAT_HOST_DEVICE auto PointTetrahedron(TMatrixP const &P, TMatrixA const &A, TMatrixB const &B, TMatrixC const &C, TMatrixD const &D) -> typename TMatrixP::ScalarType
Obtain squared distance between point P and tetrahedron ABCD.
Definition DistanceQueries.h:230
PBAT_HOST_DEVICE auto PointTriangle(TMatrixP const &P, TMatrixA const &A, TMatrixB const &B, TMatrixC const &C) -> typename TMatrixP::ScalarType
Obtain squared distance between point P and triangle ABC.
Definition DistanceQueries.h:217
PBAT_HOST_DEVICE auto PointAxisAlignedBoundingBox(TMatrixP const &P, TMatrixL const &L, TMatrixU const &U) -> typename TMatrixP::ScalarType
Obtain squared distance between point P and axis-aligned box (L,U)
Definition DistanceQueries.h:199
PBAT_HOST_DEVICE auto PointPlane(TMatrixX const &X, TMatrixP const &P, TMatrixN const &n) -> typename TMatrixX::ScalarType
Obtains the signed distance of X w.r.t. plane (P,n)
Definition DistanceQueries.h:252
PBAT_HOST_DEVICE bool PointTetrahedron3D(TMatrixP const &P, TMatrixA const &A, TMatrixB const &B, TMatrixC const &C, TMatrixD const &D)
Checks if point P is contained in tetrahedron ABCD, in at least 3D.
Definition OverlapQueries.h:562
PBAT_HOST_DEVICE bool PointAxisAlignedBoundingBox(TMatrixP const &P, TMatrixL const &L, TMatrixU const &U)
Tests for overlap between point P and axis-aligned bounding box (L,U)
Definition OverlapQueries.h:536
Geometric queries, quantities and data structures.
Definition AabbKdTreeHierarchy.h:23
Mini linear algebra related functionality.
Definition Assign.h:12
The main namespace of the library.
Definition Aliases.h:15