Panda3D
Classes | Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes
PiecewiseCurve Class Reference

A PiecewiseCurve is a curve made up of several curve segments, connected in a head-to-tail fashion. More...

#include "piecewiseCurve.h"

Inheritance diagram for PiecewiseCurve:
ParametricCurve PandaNode TypedWritable Namable LinkedListNode ReferenceCount TypedObject MemoryBase MemoryBase MemoryBase HermiteCurve NurbsCurve

List of all members.

Classes

class  Curveseg

Public Member Functions

virtual bool adjust_point (PN_stdfloat t, PN_stdfloat px, PN_stdfloat py, PN_stdfloat pz)
 Recomputes the curve such that it passes through the point (px, py, pz) at time t, but keeps the same tangent value at that point.
virtual bool adjust_pt (PN_stdfloat t, PN_stdfloat px, PN_stdfloat py, PN_stdfloat pz, PN_stdfloat tx, PN_stdfloat ty, PN_stdfloat tz)
 Recomputes the curve such that it passes through the point (px, py, pz) with the tangent (tx, ty, tz).
virtual bool adjust_tangent (PN_stdfloat t, PN_stdfloat tx, PN_stdfloat ty, PN_stdfloat tz)
 Recomputes the curve such that it has the tangent (tx, ty, tz) at time t, but keeps the same position at the point.
virtual TypeHandle force_init_type ()
virtual bool get_2ndtangent (PN_stdfloat t, LVecBase3 &tangent2) const
 Returns the tangent of the first derivative of the curve at the point t.
virtual bool get_bezier_segs (BezierSegs &bz_segs) const
 Fills up the indicated vector with a list of BezierSeg structs that describe the curve.
ParametricCurveget_curveseg (int ti)
 Returns the curve segment corresponding to the given index.
virtual PN_stdfloat get_max_t () const
 Returns the upper bound of t for the entire curve.
int get_num_segs () const
 Returns the number of curve segments that make up the Piecewise curve.
virtual bool get_point (PN_stdfloat t, LVecBase3 &point) const
 Returns the point of the curve at a given parametric point t.
virtual bool get_pt (PN_stdfloat t, LVecBase3 &point, LVecBase3 &tangent) const
 Simultaneously returns the point and tangent of the curve at a given parametric point t.
virtual bool get_tangent (PN_stdfloat t, LVecBase3 &tangent) const
 Returns the tangent of the curve at a given parametric point t.
PN_stdfloat get_tend (int ti) const
 Returns the parametric end of the given segment of the curve.
PN_stdfloat get_tlength (int ti) const
 Returns the parametric length of the given segment of the curve.
PN_stdfloat get_tstart (int ti) const
 Returns the parametric start of the given segment of the curve.
virtual TypeHandle get_type () const
bool insert_curveseg (int ti, ParametricCurve *seg, PN_stdfloat tlength)
 Inserts a new curve segment at the indicated index.
virtual bool is_valid () const
 Returns true if the curve is defined.
void make_nurbs (int order, int num_cvs, const PN_stdfloat knots[], const LVecBase4 cvs[])
 Defines the curve as a general NURBS curve.
virtual bool rebuild_curveseg (int rtype0, PN_stdfloat t0, const LVecBase4 &v0, int rtype1, PN_stdfloat t1, const LVecBase4 &v1, int rtype2, PN_stdfloat t2, const LVecBase4 &v2, int rtype3, PN_stdfloat t3, const LVecBase4 &v3)
 Rebuilds the current curve segment (as selected by the most recent call to find_curve()) according to the specified properties (see CubicCurveseg::compute_seg).
void remove_all_curvesegs ()
 Removes all curve segments from the curve.
bool remove_curveseg (int ti)
 Removes the given curve segment from the curve and frees it.
bool set_tlength (int ti, PN_stdfloat tlength)
 Sets the parametric length of the given segment of the curve.

Static Public Member Functions

static TypeHandle get_class_type ()
static void init_type ()

Protected Member Functions

virtual int complete_pointers (TypedWritable **plist, BamReader *manager)
 Takes in a vector of pointes to TypedWritable objects that correspond to all the requests for pointers that this object made to BamReader.
PN_stdfloat current_seg_range (PN_stdfloat t) const
 Returns a number in the range [0,1], representing the conversion of t into the current segment's coordinate system (the segment last returned by find_curve).
void fillin (DatagramIterator &scan, BamReader *manager)
 Function that reads out of the datagram (or asks manager to read) all of the data that is needed to re-create this object and stores it in the appropiate place.
bool find_curve (const ParametricCurve *&curve, PN_stdfloat &t) const
 Finds the curve corresponding to the given value of t.
virtual void write_datagram (BamWriter *manager, Datagram &me)
 Function to write the important information in the particular object to a Datagram.

Protected Attributes

int _last_ti
pvector< Curveseg_segs

Detailed Description

A PiecewiseCurve is a curve made up of several curve segments, connected in a head-to-tail fashion.

The length of each curve segment in parametric space is definable.

Definition at line 30 of file piecewiseCurve.h.


Member Function Documentation

bool PiecewiseCurve::adjust_point ( PN_stdfloat  t,
PN_stdfloat  px,
PN_stdfloat  py,
PN_stdfloat  pz 
) [virtual]

Recomputes the curve such that it passes through the point (px, py, pz) at time t, but keeps the same tangent value at that point.

Reimplemented from ParametricCurve.

Definition at line 132 of file piecewiseCurve.cxx.

References find_curve(), and rebuild_curveseg().

bool PiecewiseCurve::adjust_pt ( PN_stdfloat  t,
PN_stdfloat  px,
PN_stdfloat  py,
PN_stdfloat  pz,
PN_stdfloat  tx,
PN_stdfloat  ty,
PN_stdfloat  tz 
) [virtual]

Recomputes the curve such that it passes through the point (px, py, pz) with the tangent (tx, ty, tz).

Reimplemented from ParametricCurve.

Definition at line 187 of file piecewiseCurve.cxx.

References find_curve(), and rebuild_curveseg().

bool PiecewiseCurve::adjust_tangent ( PN_stdfloat  t,
PN_stdfloat  tx,
PN_stdfloat  ty,
PN_stdfloat  tz 
) [virtual]

Recomputes the curve such that it has the tangent (tx, ty, tz) at time t, but keeps the same position at the point.

Reimplemented from ParametricCurve.

Definition at line 163 of file piecewiseCurve.cxx.

References find_curve(), and rebuild_curveseg().

int PiecewiseCurve::complete_pointers ( TypedWritable **  plist,
BamReader manager 
) [protected, virtual]

Takes in a vector of pointes to TypedWritable objects that correspond to all the requests for pointers that this object made to BamReader.

Reimplemented from TypedWritable.

Definition at line 626 of file piecewiseCurve.cxx.

PN_stdfloat PiecewiseCurve::current_seg_range ( PN_stdfloat  t) const [protected]

Returns a number in the range [0,1], representing the conversion of t into the current segment's coordinate system (the segment last returned by find_curve).

This operation is already performed automatically on the t passed into find_seg; this function is useful only to adjust a different value into the same range.

It is an error to call this function if find_curve() has not yet been called, or if find_curve() returned false from its previous call.

Definition at line 558 of file piecewiseCurve.cxx.

void PiecewiseCurve::fillin ( DatagramIterator scan,
BamReader manager 
) [protected, virtual]

Function that reads out of the datagram (or asks manager to read) all of the data that is needed to re-create this object and stores it in the appropiate place.

Reimplemented from ParametricCurve.

Reimplemented in HermiteCurve, and NurbsCurve.

Definition at line 603 of file piecewiseCurve.cxx.

References DatagramIterator::get_float64(), DatagramIterator::get_uint32(), and BamReader::read_pointer().

Referenced by HermiteCurve::fillin(), and RopeNode::fillin().

bool PiecewiseCurve::find_curve ( const ParametricCurve *&  curve,
PN_stdfloat &  t 
) const [protected]

Finds the curve corresponding to the given value of t.

If t is inside the curve's defined range, sets curve to the appropriate segment, translates t to [0,1] to index into the segment's coordinate system, and returns true. If t is outside the curve's defined range, sets curve to the nearest segment and t to the nearest point on this segment, and returns false.

Definition at line 463 of file piecewiseCurve.cxx.

Referenced by adjust_point(), adjust_pt(), adjust_tangent(), get_2ndtangent(), get_point(), get_pt(), and get_tangent().

bool PiecewiseCurve::get_2ndtangent ( PN_stdfloat  t,
LVecBase3 tangent2 
) const [virtual]

Returns the tangent of the first derivative of the curve at the point t.

Implements ParametricCurve.

Definition at line 116 of file piecewiseCurve.cxx.

References find_curve().

bool PiecewiseCurve::get_bezier_segs ( BezierSegs &  bz_segs) const [virtual]

Fills up the indicated vector with a list of BezierSeg structs that describe the curve.

This assumes the curve is a PiecewiseCurve of CubicCurvesegs. Returns true if successful, false otherwise.

Reimplemented from ParametricCurve.

Definition at line 417 of file piecewiseCurve.cxx.

Returns the curve segment corresponding to the given index.

Reimplemented in HermiteCurve, and NurbsCurve.

Definition at line 240 of file piecewiseCurve.cxx.

PN_stdfloat PiecewiseCurve::get_max_t ( ) const [virtual]

Returns the upper bound of t for the entire curve.

The curve is defined in the range 0.0f <= t <= get_max_t().

Reimplemented from ParametricCurve.

Definition at line 67 of file piecewiseCurve.cxx.

Referenced by insert_curveseg().

Returns the number of curve segments that make up the Piecewise curve.

Definition at line 229 of file piecewiseCurve.cxx.

Referenced by make_nurbs().

bool PiecewiseCurve::get_point ( PN_stdfloat  t,
LVecBase3 point 
) const [virtual]

Returns the point of the curve at a given parametric point t.

Returns true if t is in the valid range 0.0f <= t <= get_max_t(); if t is outside this range, sets point to the value of the curve at the beginning or end (whichever is nearer) and returns false.

Implements ParametricCurve.

Definition at line 82 of file piecewiseCurve.cxx.

References find_curve().

bool PiecewiseCurve::get_pt ( PN_stdfloat  t,
LVecBase3 point,
LVecBase3 tangent 
) const [virtual]

Simultaneously returns the point and tangent of the curve at a given parametric point t.

Implements ParametricCurve.

Definition at line 213 of file piecewiseCurve.cxx.

References find_curve().

bool PiecewiseCurve::get_tangent ( PN_stdfloat  t,
LVecBase3 tangent 
) const [virtual]

Returns the tangent of the curve at a given parametric point t.

Implements ParametricCurve.

Definition at line 100 of file piecewiseCurve.cxx.

References find_curve().

PN_stdfloat PiecewiseCurve::get_tend ( int  ti) const

Returns the parametric end of the given segment of the curve.

Definition at line 350 of file piecewiseCurve.cxx.

PN_stdfloat PiecewiseCurve::get_tlength ( int  ti) const

Returns the parametric length of the given segment of the curve.

Definition at line 326 of file piecewiseCurve.cxx.

Referenced by remove_curveseg(), and set_tlength().

PN_stdfloat PiecewiseCurve::get_tstart ( int  ti) const

Returns the parametric start of the given segment of the curve.

Definition at line 338 of file piecewiseCurve.cxx.

bool PiecewiseCurve::insert_curveseg ( int  ti,
ParametricCurve seg,
PN_stdfloat  tlength 
)

Inserts a new curve segment at the indicated index.

The curve segment must have been allocated via new; it will be freed using delete when it is removed or the PiecewiseCurve destructs.

If the curve segment is not inserted at the end, its tlength is subtracted from that of the following segment, so that the overall length of the curve is not changed.

Definition at line 260 of file piecewiseCurve.cxx.

References get_max_t().

Referenced by make_nurbs(), and NurbsCurve::recompute().

bool PiecewiseCurve::is_valid ( ) const [virtual]

Returns true if the curve is defined.

In the case of a PiecewiseCurve, this means we have at least one segment.

Reimplemented from ParametricCurve.

Definition at line 55 of file piecewiseCurve.cxx.

void PiecewiseCurve::make_nurbs ( int  order,
int  num_cvs,
const PN_stdfloat  knots[],
const LVecBase4  cvs[] 
)

Defines the curve as a general NURBS curve.

The order is the degree plus one and must be 1, 2, 3, or 4; cvs is an array of num_cvs points each with a homogeneous coordinate; knots is an array of num_cvs+order knot values.

This creates the individual curve segments and sets up the basis matrices, but does not store the CV's or knot values so the curve shape is not later modifiable.

Definition at line 391 of file piecewiseCurve.cxx.

References get_num_segs(), insert_curveseg(), and remove_all_curvesegs().

bool PiecewiseCurve::rebuild_curveseg ( int  rtype0,
PN_stdfloat  t0,
const LVecBase4 v0,
int  rtype1,
PN_stdfloat  t1,
const LVecBase4 v1,
int  rtype2,
PN_stdfloat  t2,
const LVecBase4 v2,
int  rtype3,
PN_stdfloat  t3,
const LVecBase4 v3 
) [virtual]

Rebuilds the current curve segment (as selected by the most recent call to find_curve()) according to the specified properties (see CubicCurveseg::compute_seg).

Returns true if possible, false if something goes horribly wrong.

Reimplemented in HermiteCurve, and NurbsCurve.

Definition at line 442 of file piecewiseCurve.cxx.

Referenced by adjust_point(), adjust_pt(), and adjust_tangent().

Removes all curve segments from the curve.

Definition at line 314 of file piecewiseCurve.cxx.

Referenced by make_nurbs().

Removes the given curve segment from the curve and frees it.

Returns true if the segment was defined, false otherwise.

Definition at line 289 of file piecewiseCurve.cxx.

References get_tlength().

bool PiecewiseCurve::set_tlength ( int  ti,
PN_stdfloat  tlength 
)

Sets the parametric length of the given segment of the curve.

The length of the following segment is lengthened by the corresponding amount to keep the overall length of the curve the same.

Definition at line 365 of file piecewiseCurve.cxx.

References get_tlength().

void PiecewiseCurve::write_datagram ( BamWriter manager,
Datagram me 
) [protected, virtual]

Function to write the important information in the particular object to a Datagram.

Reimplemented from ParametricCurve.

Reimplemented in HermiteCurve, and NurbsCurve.

Definition at line 580 of file piecewiseCurve.cxx.

References Datagram::add_float64(), Datagram::add_uint32(), and BamWriter::write_pointer().

Referenced by HermiteCurve::write_datagram(), and RopeNode::write_datagram().


The documentation for this class was generated from the following files:
 All Classes Functions Variables Enumerations