AGX Dynamics 2.41.1.2
Loading...
Searching...
No Matches
Spline.h
Go to the documentation of this file.
1/*
2Copyright 2007-2025. Algoryx Simulation AB.
3
4All AGX source code, intellectual property, documentation, sample code,
5tutorials, scene files and technical white papers, are copyrighted, proprietary
6and confidential material of Algoryx Simulation AB. You may not download, read,
7store, distribute, publish, copy or otherwise disseminate, use or expose this
8material unless having a written signed agreement with Algoryx Simulation AB, or having been
9advised so by Algoryx Simulation AB for a time limited evaluation, or having purchased a
10valid commercial license from Algoryx Simulation AB.
11
12Algoryx Simulation AB disclaims all responsibilities for loss or damage caused
13from using this software, unless otherwise stated in written agreements with
14Algoryx Simulation AB.
15*/
16#pragma once
17
18
19#include <agx/agx.h>
21#include <agx/Referenced.h>
23#include <agx/Vec3.h>
24#include <agx/AffineMatrix4x4.h>
25
26namespace agxUtil {
27
32 {
36 public:
37 class Tangent : public agx::Vec3
38 {
39 public:
41 : agx::Vec3() {}
42 Tangent( const agx::Vec3& v )
43 : agx::Vec3( v ) {}
44 };
45
49 class Point : public agx::Vec3
50 {
51 public:
55
63 Point(const agx::Vec3& p=agx::Vec3(), agx::Real t= DEFAULT_TENSION, agx::Real stretch=DEFAULT_STRETCH, agx::Real curvature=DEFAULT_CURVATURE)
64 : agx::Vec3(p), m_tension(t), m_stretch(stretch), m_curvature(curvature) {}
65
67 inline agx::Real getTension() const { return m_tension; }
68
70 inline void setTension(agx::Real tension) { m_tension = tension; }
71
73 inline agx::Real getStretch() const { return m_stretch; }
74
76 inline agx::Real getCurvature() const { return m_curvature; }
77
78 private:
79 agx::Real m_tension;
80 agx::Real m_stretch;
81 agx::Real m_curvature;
82 };
83
86
87 public:
88
91
99 void add(const agx::Vec3& point, agx::Real tension = Point::DEFAULT_TENSION, agx::Real stretch = Point::DEFAULT_STRETCH, agx::Real curvature = Point::DEFAULT_CURVATURE);
100
105 virtual Point evaluate( size_t index, agx::Real t ) const = 0;
106
110 inline size_t getNumPoints() const { return m_points.size(); }
111
115 inline PointVector& getPoints() { return m_points; }
116
117#ifndef SWIG
121 inline const PointVector& getPoints() const { return m_points; }
122#endif
123
127 virtual Tangent getTangent(size_t /*index*/, agx::Real /*t*/) const { return Tangent(); }
128
133 virtual inline agx::Real getTension(size_t index, agx::Real time) const;
134
138 virtual void updateTangents() = 0;
139
143 virtual void clear();
144
146
147 void store(agxStream::OutputArchive& out) const override;
149
150 protected:
151 virtual ~Spline() {}
152
153 protected:
156 };
157
159
160
161 inline agx::Real Spline::getTension(size_t index, agx::Real time) const
162 {
163 if (index + 1 == m_points.size())
164 return m_points.back().getTension();
165
166 time = agx::clamp(time, agx::Real(0), agx::Real(1));
167 if (agx::equalsZero(time))
168 return m_points[index].getTension();
169 else if (agx::equivalent(time, agx::Real(1), agx::RealEpsilon))
170 return m_points[index + 1].getTension();
171 else
172 return (1 - time) * m_points[index].getTension() + time * m_points[index + 1].getTension();
173 }
174
175
181 {
182 public:
183
184 // Default constructor
186
190 virtual Point evaluate( size_t index, agx::Real t ) const override;
191
195 void updateTangents() override;
196
197 Tangent getTangent(size_t index, agx::Real t) const override;
198
200
201
202 protected:
203 virtual ~CubicSpline() {}
204
205 private:
206 agx::AffineMatrix4x4 m_matrix;
207 };
208
210
216 {
217 public:
219
223 virtual Point evaluate( size_t index, agx::Real t ) const override;
224
228 void updateTangents() override;
229
230 Tangent getTangent(size_t index, agx::Real t) const override;
231
233
234
235 protected:
236 virtual ~CardinalSpline() {}
237 };
238
240
246 {
247 public:
249
253 virtual Point evaluate(size_t index, agx::Real t) const override;
254
258 void updateTangents() override;
259
260 Tangent getTangent(size_t index, agx::Real t) const override;
261
263
264
265 protected:
267 };
268
270
276 {
277 public:
279
283 virtual Point evaluate(size_t index, agx::Real t) const override;
284
288 void updateTangents() override;
289
290 Tangent getTangent(size_t index, agx::Real t) const override;
291
293
294
295 protected:
297
300
301 private:
302 agx::Real m_alpha;
303 };
304
306
311 {
312 public:
314
318 virtual Point evaluate(size_t index, agx::Real t) const override;
319
323 void updateTangents() override;
324
325 Tangent getTangent(size_t index, agx::Real t) const override;
326
328
329
330 protected:
331 virtual ~BSpline() {}
332 };
333
335
340 {
341 public:
343
347 virtual Point evaluate(size_t index, agx::Real t) const override;
348
352 virtual void updateTangents() override;
353
354 Tangent getTangent(size_t index, agx::Real t) const override;
355
357
358
359 protected:
363 };
364
366
371 {
372 public:
374
378 virtual Point evaluate(size_t index, agx::Real t) const override;
379
383 void updateTangents() override;
384
385 Tangent getTangent(size_t index, agx::Real t) const override;
386
388
389
390 protected:
391 virtual ~HermiteSpline() {}
394 };
395
397}
398
#define AGXSTREAM_DECLARE_SERIALIZABLE(T)
Use this in a Serializable class to add the required methods Important: Use full namespace in the dec...
Definition: Serializable.h:208
#define AGXPHYSICS_EXPORT
Class for reading a binary stream of serialized data.
Definition: InputArchive.h:51
Class for writing serialized data in binary format to a stream.
Definition: OutputArchive.h:57
This class is an abstract base class for all classes that can be stored and retrieved from an Archive...
Definition: Serializable.h:45
https://en.wikipedia.org/wiki/B-spline
Definition: Spline.h:311
virtual ~BSpline()
Definition: Spline.h:331
void updateTangents() override
Compute tangents given current set of points.
Tangent getTangent(size_t index, agx::Real t) const override
virtual Point evaluate(size_t index, agx::Real t) const override
https://en.wikipedia.org/wiki/Centripetal_Catmull%E2%80%93Rom_spline
Definition: Spline.h:340
virtual Point evaluate(size_t index, agx::Real t) const override
virtual void updateTangents() override
Compute tangents given current set of points.
ParameterizedCatmullRomSplineRef m_catmull
Definition: Spline.h:361
virtual ~CPCatmullRomBSpline()
Definition: Spline.h:360
Tangent getTangent(size_t index, agx::Real t) const override
A Spline constructed of piecewise third-order polynomials which pass through a set of control points.
Definition: Spline.h:216
virtual ~CardinalSpline()
Definition: Spline.h:236
virtual Point evaluate(size_t index, agx::Real t) const override
Tangent getTangent(size_t index, agx::Real t) const override
void updateTangents() override
Compute tangents given current set of points.
A Spline constructed of piecewise third-order polynomials which pass through a set of control points.
Definition: Spline.h:181
virtual Point evaluate(size_t index, agx::Real t) const override
void updateTangents() override
Compute tangents given current set of points.
Tangent getTangent(size_t index, agx::Real t) const override
virtual ~CubicSpline()
Definition: Spline.h:203
https://en.wikipedia.org/wiki/Hermite_spline
Definition: Spline.h:371
void updateTangents() override
Compute tangents given current set of points.
BSplineRef m_bspline
Definition: Spline.h:393
ParameterizedCatmullRomSplineRef m_catmull
Definition: Spline.h:392
virtual Point evaluate(size_t index, agx::Real t) const override
Tangent getTangent(size_t index, agx::Real t) const override
virtual ~HermiteSpline()
Definition: Spline.h:391
A Spline constructed of piecewise third-order polynomials which pass through a set of control points.
Definition: Spline.h:246
virtual Point evaluate(size_t index, agx::Real t) const override
Tangent getTangent(size_t index, agx::Real t) const override
void updateTangents() override
Compute tangents given current set of points.
Special case of a cardinal spline.
Definition: Spline.h:276
void updateTangents() override
Compute tangents given current set of points.
ParameterizedCatmullRomSpline()
Used only for restoring purposes.
Tangent getTangent(size_t index, agx::Real t) const override
ParameterizedCatmullRomSpline(agx::Real alpha)
virtual Point evaluate(size_t index, agx::Real t) const override
Point class for storing 3D point, tension, stretch and curvature.
Definition: Spline.h:50
static AGXPHYSICS_EXPORT const agx::Real DEFAULT_CURVATURE
Definition: Spline.h:54
static AGXPHYSICS_EXPORT const double DEFAULT_TENSION
Definition: Spline.h:52
agx::Real getStretch() const
Definition: Spline.h:73
agx::Real getTension() const
Definition: Spline.h:67
Point(const agx::Vec3 &p=agx::Vec3(), agx::Real t=DEFAULT_TENSION, agx::Real stretch=DEFAULT_STRETCH, agx::Real curvature=DEFAULT_CURVATURE)
Create a spline point from a point p, tension t and stretch stretch.
Definition: Spline.h:63
agx::Real getCurvature() const
Definition: Spline.h:76
static AGXPHYSICS_EXPORT const agx::Real DEFAULT_STRETCH
Definition: Spline.h:53
void setTension(agx::Real tension)
Set the tension (N) in the point.
Definition: Spline.h:70
Tangent(const agx::Vec3 &v)
Definition: Spline.h:42
Base class for splines.
Definition: Spline.h:32
size_t getNumPoints() const
Definition: Spline.h:110
AGXSTREAM_DECLARE_ABSTRACT_SERIALIZABLE(agxUtil::Spline)
virtual Tangent getTangent(size_t, agx::Real) const
Definition: Spline.h:127
TangentVector m_tangents
Definition: Spline.h:155
PointVector m_points
Definition: Spline.h:154
Spline()
Default constructor.
agx::Vector< Point > PointVector
Definition: Spline.h:85
void restore(agxStream::InputArchive &in) override
PointVector & getPoints()
Definition: Spline.h:115
virtual void clear()
Clears control points and tangents.
virtual void updateTangents()=0
All control points are added, computes the tangents.
agx::Vector< Tangent > TangentVector
Definition: Spline.h:84
virtual Point evaluate(size_t index, agx::Real t) const =0
Interpolate from point with index index a time t forward (0 <= t <= 1)
virtual ~Spline()
Definition: Spline.h:151
void add(const agx::Vec3 &point, agx::Real tension=Point::DEFAULT_TENSION, agx::Real stretch=Point::DEFAULT_STRETCH, agx::Real curvature=Point::DEFAULT_CURVATURE)
Add point to the control points given tension (1 max, 0 min) and stretch.
void store(agxStream::OutputArchive &out) const override
const PointVector & getPoints() const
Definition: Spline.h:121
virtual agx::Real getTension(size_t index, agx::Real time) const
Linear interpolate of tension from point at index.
Definition: Spline.h:161
size_t size() const
Definition: Container.h:134
Base class providing referencing counted objects.
Definition: Referenced.h:120
T & back() const
Definition: agx/Vector.h:707
The agxUtil namespace contain classes and methods for utility functionality.
agx::ref_ptr< NonUniformCardinalSpline > NonUniformCardinalSplineRef
Definition: Spline.h:269
agx::ref_ptr< CubicSpline > CubicSplineRef
Definition: Spline.h:209
agx::ref_ptr< Spline > SplineRef
Definition: Spline.h:158
agx::ref_ptr< BSpline > BSplineRef
Definition: Spline.h:334
agx::ref_ptr< HermiteSpline > HermiteSplineRef
Definition: Spline.h:396
agx::ref_ptr< CPCatmullRomBSpline > CPCatmullRomBSplineRef
Definition: Spline.h:365
agx::ref_ptr< CardinalSpline > CardinalSplineRef
Definition: Spline.h:239
agx::ref_ptr< ParameterizedCatmullRomSpline > ParameterizedCatmullRomSplineRef
Definition: Spline.h:305
The agx namespace contains the dynamics/math part of the AGX Dynamics API.
T1 clamp(T1 v, T2 minimum, T3 maximum)
Definition: Math.h:318
AGXCORE_EXPORT const Real RealEpsilon
AGXPHYSICS_EXPORT agx::Bool equalsZero(const agx::AddedMassInteraction::Matrix6x6 &matrix, agx::Real eps=agx::RealEpsilon)
double Real
Definition: Real.h:42
AGXPHYSICS_EXPORT agx::Bool equivalent(const agx::AddedMassInteraction::Matrix6x6 &lhs, const agx::AddedMassInteraction::Matrix6x6 &rhs, agx::Real eps=agx::RealEpsilon)