Go to the documentation of this file.
48 _data.erase(_data.begin(), _data.end());
55 add_xyz(PN_stdfloat t,
const LVecBase3 &xyz) {
67 add_hpr(PN_stdfloat t,
const LVecBase3 &hpr) {
79 add_xyz_hpr(PN_stdfloat t,
const LVecBase3 &xyz,
const LVecBase3 &hpr) {
102 nassertr(n >= 0 && n < (
int)_data.size(), 0.0f);
111 nassertr(n >= 0 && n < (
int)_data.size(), LVecBase3::zero());
112 return _data[n]._xyz;
120 nassertr(n >= 0 && n < (
int)_data.size(), LVecBase3::zero());
121 return _data[n]._hpr;
130 nassertr(n >= 0 && n < (
int)_data.size(), LVecBase3::zero());
131 return _data[n]._tangent;
140 begin = std::max(0, std::min((
int)_data.size(), begin));
141 end = std::max(0, std::min((
int)_data.size(), end));
143 nassertv(begin <= end);
145 _data.erase(_data.begin() + begin, _data.begin() + end);
155 nassertv(curves !=
nullptr);
161 for (i = 0; i < count; i++) {
162 t = max_t * (PN_stdfloat)i / (PN_stdfloat)(count-1);
163 if (curves->
evaluate(t, dp._xyz, dp._hpr)) {
187 LVecBase3 last(0.0f, 0.0f, 0.0f);
188 LVecBase3 net(0.0f, 0.0f, 0.0f);
190 for (di = _data.begin(); di != _data.end(); ++di) {
192 for (i = 0; i < 3; i++) {
193 (*di)._hpr[i] += net[i];
195 while (((*di)._hpr[i] - last[i]) > 180.0f) {
196 (*di)._hpr[i] -= 360.0f;
200 while (((*di)._hpr[i] - last[i]) < -180.0f) {
201 (*di)._hpr[i] += 360.0f;
205 last[i] = (*di)._hpr[i];
216 sort(_data.begin(), _data.end());
227 PN_stdfloat count = factor;
230 for (in = 0; in < (int)_data.size()-1; in++) {
231 if (count >= factor) {
232 _data[out] = _data[in];
239 _data[out] = _data.back();
242 _data.erase(_data.begin() + out, _data.end());
257 (_data.front()._xyz.almost_equal(_data.back()._xyz, 0.001f));
259 }
else if (_got_hpr) {
261 (_data.front()._hpr.almost_equal(_data.back()._hpr, 0.001f));
265 int len = _data.size();
270 for (i = 1; i < len-1; i++) {
272 (_data[i+1]._xyz - _data[i-1]._xyz) * scale /
273 (_data[i+1]._t - _data[i-1]._t);
277 for (i = 1; i < len-1; i++) {
278 _data[i]._hpr_tangent =
279 (_data[i+1]._hpr - _data[i-1]._hpr) * scale /
280 (_data[i+1]._t - _data[i-1]._t);
287 _data[0]._tangent = _data[len-1]._tangent =
288 (_data[1]._xyz - _data[len-2]._xyz) * scale /
289 ((_data[1]._t - _data[0]._t) + (_data[len-1]._t - _data[len-2]._t));
292 _data[0]._tangent = _data[len-1]._tangent =
293 (_data[1]._hpr - _data[len-2]._hpr) * scale /
294 ((_data[1]._t - _data[0]._t) + (_data[len-1]._t - _data[len-2]._t));
300 (_data[1]._xyz - _data[0]._xyz) * scale /
301 ((_data[1]._t - _data[0]._t) * 2.0f);
302 _data[len-1]._tangent =
303 (_data[len-1]._xyz - _data[len-2]._xyz) * scale /
304 ((_data[len-1]._t - _data[len-2]._t) * 2.0f);
308 (_data[1]._hpr - _data[0]._hpr) * scale /
309 ((_data[1]._t - _data[0]._t) * 2.0f);
310 _data[len-1]._tangent =
311 (_data[len-1]._hpr - _data[len-2]._hpr) * scale /
312 ((_data[len-1]._t - _data[len-2]._t) * 2.0f);
321 make_hermite()
const {
326 result->add_curve(hc);
329 Data::const_iterator di;
330 for (di = _data.begin(); di != _data.end(); ++di) {
341 result->add_curve(hc);
344 Data::const_iterator di;
345 for (di = _data.begin(); di != _data.end(); ++di) {
369 for (
int c = 0; c < num_curves; c++) {
371 result->add_curve(nc);
380 assert(nc->get_order() == 4);
381 assert(num_knots > 0);
391 PN_stdfloat k1, k2 = nc->
get_knot(num_knots-1);
392 const PN_stdfloat one_third = 1.0f/3.0f;
393 for (i = 3; i < num_knots - 4; i += 3) {
396 nc->
set_knot(i, (k1 + k1 + k2) * one_third);
397 nc->
set_knot(i+1, (k1 + k2 + k2) * one_third);
414 output(std::ostream &out)
const {
415 out <<
"CurveFitter, " << _data.size() <<
" samples.\n";
422 write(std::ostream &out)
const {
423 out <<
"CurveFitter, " << _data.size() <<
" samples:\n";
424 Data::const_iterator di;
425 for (di = _data.begin(); di != _data.end(); ++di) {
426 out <<
" " << (*di) <<
"\n";
virtual bool recompute()
Recalculates the curve basis according to the latest position of the CV's, knots, etc.
PN_stdfloat get_sample_t(int n) const
Returns the parametric value of the nth sample added.
A Nonuniform Rational B-Spline.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
void desample(PN_stdfloat factor)
Removes sample points in order to reduce the complexity of a sampled curve.
virtual int get_num_knots() const
Returns the number of knots on the curve.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
bool set_cv_type(int n, int type)
Changes the given CV's continuity type.
void set_curve_type(int type)
Sets the flag indicating the use to which the curve is intended to be put.
get_hpr_curve
Returns the first HPR curve in the collection, if any, or NULL if there are none.
A parametric curve defined by a sequence of control vertices, each with an in and out tangent.
int get_num_samples() const
Returns the number of sample points that have been added.
bool set_cv_in(int n, PN_stdfloat x, PN_stdfloat y, PN_stdfloat z)
Changes the given CV's in tangent.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
This is a set of zero or more ParametricCurves, which may or may not be related.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
TypeHandle is the identifier used to differentiate C++ class types.
void compute_tangents(PN_stdfloat scale)
Once a set of points has been built, and prior to calling MakeHermite() or MakeNurbs(),...
get_xyz_curve
Returns the first XYZ curve in the collection, if any, or NULL if there are none.
void wrap_hpr()
Resets each HPR data point so that the maximum delta between any two consecutive points is 180 degree...
LVecBase3 get_sample_tangent(int n) const
Returns the tangent associated with the nth sample added.
void add_xyz_hpr(PN_stdfloat t, const LVecBase3 &xyz, const LVecBase3 &hpr)
Adds a single sample xyz & hpr simultaneously.
LVecBase3 get_sample_hpr(int n) const
Returns the orientation of the nth sample added.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
int insert_cv(PN_stdfloat t)
Inserts a new CV at the given parametric point along the curve.
void add_hpr(PN_stdfloat t, const LVecBase3 &hpr)
Adds a single sample hpr.
void add_xyz(PN_stdfloat t, const LVecBase3 &xyz)
Adds a single sample xyz.
LVecBase3 get_sample_xyz(int n) const
Returns the point in space of the nth sample added.
virtual PN_stdfloat get_knot(int n) const
Retrieves the value of the indicated knot.
bool set_cv_out(int n, PN_stdfloat x, PN_stdfloat y, PN_stdfloat z)
Changes the given CV's out tangent.
void sort_points()
Sorts all the data points in order by parametric time, in case they were added in an incorrect order.
get_max_t
Returns the maximum T value associated with the *last* curve in the collection.
bool set_cv_point(int n, PN_stdfloat x, PN_stdfloat y, PN_stdfloat z)
Changes the given CV's position.
void sample(ParametricCurveCollection *curves, int count)
Generates a series of data points by sampling the given curve (or xyz/hpr curves) the indicated numbe...
void remove_samples(int begin, int end)
Eliminates all samples from index begin, up to but not including index end, from the database.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
bool evaluate(PN_stdfloat t, LVecBase3 &xyz, LVecBase3 &hpr) const
Computes the position and rotation represented by the first XYZ and HPR curves in the collection at t...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
get_num_curves
Returns the number of ParametricCurves in the collection.
void reset()
Removes all the data points previously added to the CurveFitter, and initializes it for a new curve.
virtual bool set_knot(int n, PN_stdfloat t)
Sets the value of the indicated knot.