cgma
|
#include <Curve.hpp>
Public Types | |
typedef TBPoint | ChildType |
Public Member Functions | |
Curve () | |
virtual | ~Curve () |
virtual CubitSense | relative_sense (Curve *other_curve) |
virtual CubitStatus | get_point_direction (CubitVector &origin, CubitVector &direction) |
virtual CubitStatus | get_center_radius (CubitVector ¢er, double &radius)=0 |
virtual double | length_from_u (double parameter1, double parameter2)=0 |
virtual double | get_arc_length () |
virtual double | get_arc_length (const CubitVector &point1, const CubitVector &point2) |
virtual double | get_arc_length (const CubitVector &point1, const int which_end) |
virtual CubitVector | center_point () |
virtual CubitStatus | mid_point (const CubitVector &point1, const CubitVector &point2, CubitVector &mid_point) |
virtual CubitStatus | mid_point (CubitVector &mid_point) |
virtual CubitStatus | position_from_fraction (const double fraction_along_curve, CubitVector &output_position) |
virtual CubitBoolean | is_periodic (double &period)=0 |
virtual CubitBoolean | get_param_range (double &lower_bound, double &upper_bound)=0 |
virtual CubitStatus | get_interior_extrema (DLIList< CubitVector * > &interior_points, CubitSense &return_sense)=0 |
virtual CubitStatus | closest_point (CubitVector const &location, CubitVector &closest_location, CubitVector *tangent_ptr=NULL, CubitVector *curvature_ptr=NULL, double *param=NULL)=0 |
virtual CubitStatus | closest_point_trimmed (CubitVector const &from_pt, CubitVector &result_pt) |
virtual CubitPointContainment | point_containment (const CubitVector &point)=0 |
virtual double | u_from_position (const CubitVector &input_position)=0 |
virtual CubitStatus | position_from_u (double u_value, CubitVector &output_position)=0 |
virtual double | u_from_arc_length (double root_param, double arc_length)=0 |
virtual CubitBoolean | is_position_on (const CubitVector &test_position)=0 |
virtual GeometryType | geometry_type () |
virtual double | start_param ()=0 |
virtual double | end_param ()=0 |
virtual CubitStatus | point_from_arc_length (double root_param, const double arc_length, CubitVector &new_point) |
virtual CubitStatus | point_from_arc_length (const CubitVector &root_point, double const arc_length, CubitVector &new_point) |
virtual CubitBoolean | is_tolerant () |
virtual CubitBoolean | G1_discontinuous (double u, CubitVector *minus_tangent=NULL, CubitVector *plus_tangent=NULL) |
virtual CubitStatus | get_spline_params (bool &rational, int °ree, DLIList< CubitVector > &cntrl_pts, DLIList< double > &cntrl_pt_weights, DLIList< double > &knots, bool &spline_is_reversed) const =0 |
virtual CubitStatus | get_ellipse_params (CubitVector ¢er, CubitVector &normal, CubitVector &major_axis, double &radius_ratio) const =0 |
typedef TBPoint Curve::ChildType |
Curve::Curve | ( | ) |
Curve::~Curve | ( | ) | [virtual] |
CubitVector Curve::center_point | ( | ) | [inline, virtual] |
Definition at line 417 of file Curve.hpp.
{ double s_param = start_param(); double length = 0.5 * measure(); double param2 = u_from_arc_length(s_param, length); CubitVector center; position_from_u(param2, center); return center; }
virtual CubitStatus Curve::closest_point | ( | CubitVector const & | location, |
CubitVector & | closest_location, | ||
CubitVector * | tangent_ptr = NULL , |
||
CubitVector * | curvature_ptr = NULL , |
||
double * | param = NULL |
||
) | [pure virtual] |
Implemented in FacetCurve, OCCCurve, CompositeCurve, PartPTCurve, SegmentedCurve, and SubCurve.
CubitStatus Curve::closest_point_trimmed | ( | CubitVector const & | from_pt, |
CubitVector & | result_pt | ||
) | [virtual] |
Reimplemented in CompositeCurve, and SegmentedCurve.
Definition at line 203 of file Curve.cpp.
{ // Get the untrimmed point double param; if ( !closest_point(from_pt, result, NULL, NULL, ¶m) ) return CUBIT_FAILURE; double param_range = 0.0; double period, start_param, end_param; // Get whether periodic CubitBoolean is_per = this->is_periodic(period); // Get the parameter range get_param_range( start_param, end_param ); // Make sure the start_param is lower than end_param. if (start_param > end_param) { // use param_range as temp param_range = start_param; start_param = end_param; end_param = param_range; } param_range = end_param - start_param; // If the Curve does not loop onto itself... if( is_per == CUBIT_FALSE || param_range < period) { // If not within parameter range, return // the the closest endpoint CubitVector start, end; position_from_u( start_param, start ); position_from_u( end_param, end ); if( (param < start_param) || (param > end_param) ) { result = ( (start - result).length_squared() < (end - result).length_squared() ) ? start : end ; } else { double tmp_dist_sq = (from_pt - result).length_squared(); if( (start-from_pt).length_squared() < tmp_dist_sq ) result = start; else if( (end-from_pt).length_squared() < tmp_dist_sq ) result = end; } } return CUBIT_SUCCESS; }
virtual double Curve::end_param | ( | ) | [pure virtual] |
Implemented in OCCCurve, FacetCurve, CompositeCurve, SegmentedCurve, PartPTCurve, and SubCurve.
CubitBoolean Curve::G1_discontinuous | ( | double | u, |
CubitVector * | minus_tangent = NULL , |
||
CubitVector * | plus_tangent = NULL |
||
) | [virtual] |
Reimplemented in OCCCurve, FacetCurve, CompositeCurve, SegmentedCurve, PartPTCurve, and SubCurve.
Definition at line 267 of file Curve.cpp.
{ double start_param, end_param; if( ! get_param_range( start_param, end_param ) ) return CUBIT_FALSE; //if the curve is not parametric, just return false. if( start_param > end_param ) { double tmp = start_param; start_param = end_param; end_param = tmp; } double u_minus = (2 * CUBIT_RESABS); double u_plus = u_minus; //can't be C1 discontinous at an end point! if( ((u - u_minus) < start_param) || ((u + u_plus) > end_param) ) return CUBIT_FALSE; CubitVector position; position_from_u( u, position ); const double res_abs_sqr = CUBIT_RESABS * CUBIT_RESABS; CubitVector minus_position, minus_tangent; position_from_u( u - u_minus, minus_position ); double u_minus2 = u_from_position( minus_position ); minus_tangent = position - minus_position; while( ((u - u_minus2) > (u - CUBIT_RESABS)) || (minus_tangent.length_squared() < res_abs_sqr) ) { u_minus *= 10.; //can't be C1 discontinous at an end point! if( (u - u_minus) < start_param ) return CUBIT_FALSE; position_from_u( u - u_minus, minus_position ); u_minus2 = u_from_position( minus_position ); minus_tangent = position - minus_position; } CubitVector plus_position, plus_tangent; position_from_u( u + u_plus, plus_position ); double u_plus2 = u_from_position( plus_position ); plus_tangent = plus_position - position; while( ((u + u_plus2) < (u + CUBIT_RESABS)) || ((position - plus_position).length_squared() < res_abs_sqr) ) { u_plus *= 10.; //can't be C1 discontinous at an end point! if( (u + u_plus) > end_param ) return CUBIT_FALSE; position_from_u( u + u_plus, plus_position ); u_plus2 = u_from_position( plus_position ); plus_tangent = plus_position - position; } plus_tangent.normalize(); minus_tangent.normalize(); if( (plus_tangent * minus_tangent).length_squared() > (2 * res_abs_sqr) ) { if( plus_tangent_r ) *plus_tangent_r = plus_tangent; if( minus_tangent_r ) * minus_tangent_r = minus_tangent; return CUBIT_TRUE; } return CUBIT_FALSE; }
virtual GeometryType Curve::geometry_type | ( | ) | [inline, virtual] |
Implements GeometryEntity.
Reimplemented in OCCCurve, FacetCurve, CompositeCurve, PartPTCurve, and SubCurve.
Definition at line 300 of file Curve.hpp.
{return UNDEFINED_CURVE_TYPE;};
double Curve::get_arc_length | ( | ) | [inline, virtual] |
double Curve::get_arc_length | ( | const CubitVector & | point1, |
const CubitVector & | point2 | ||
) | [inline, virtual] |
Definition at line 396 of file Curve.hpp.
{ double param1 = u_from_position(point1); double param2 = u_from_position(point2); return fabs(length_from_u(param1, param2)); }
double Curve::get_arc_length | ( | const CubitVector & | point1, |
const int | which_end | ||
) | [inline, virtual] |
Definition at line 405 of file Curve.hpp.
{ double param1 = u_from_position(point1); double param2; if (which_end == 0) param2 = start_param(); else param2 = end_param(); return fabs(length_from_u(param1, param2)); }
CubitStatus Curve::get_center_radius | ( | CubitVector & | center, |
double & | radius | ||
) | [pure virtual] |
Implemented in OCCCurve, FacetCurve, CompositeCurve, PartPTCurve, SubCurve, and SegmentedCurve.
Definition at line 80 of file Curve.cpp.
{ CubitVector start_pos, closest_pos; if ( position_from_u(start_param(), start_pos) && closest_point(start_pos, closest_pos, 0, &c) ) { r = c.length(); if (r > CUBIT_RESABS) { r = 1.0 / r; c *= r * r; c += closest_pos; return CUBIT_SUCCESS; } } return CUBIT_FAILURE; }
virtual CubitStatus Curve::get_ellipse_params | ( | CubitVector & | center, |
CubitVector & | normal, | ||
CubitVector & | major_axis, | ||
double & | radius_ratio | ||
) | const [pure virtual] |
Implemented in FacetCurve, OCCCurve, CompositeCurve, SegmentedCurve, PartPTCurve, and SubCurve.
virtual CubitStatus Curve::get_interior_extrema | ( | DLIList< CubitVector * > & | interior_points, |
CubitSense & | return_sense | ||
) | [pure virtual] |
Implemented in FacetCurve, OCCCurve, CompositeCurve, SegmentedCurve, PartPTCurve, and SubCurve.
virtual CubitBoolean Curve::get_param_range | ( | double & | lower_bound, |
double & | upper_bound | ||
) | [pure virtual] |
Implemented in FacetCurve, OCCCurve, CompositeCurve, PartPTCurve, SubCurve, and SegmentedCurve.
CubitStatus Curve::get_point_direction | ( | CubitVector & | origin, |
CubitVector & | direction | ||
) | [virtual] |
Reimplemented in OCCCurve, FacetCurve, CompositeCurve, and SegmentedCurve.
Definition at line 74 of file Curve.cpp.
{ return CUBIT_FAILURE; }
virtual CubitStatus Curve::get_spline_params | ( | bool & | rational, |
int & | degree, | ||
DLIList< CubitVector > & | cntrl_pts, | ||
DLIList< double > & | cntrl_pt_weights, | ||
DLIList< double > & | knots, | ||
bool & | spline_is_reversed | ||
) | const [pure virtual] |
Implemented in FacetCurve, OCCCurve, CompositeCurve, SegmentedCurve, PartPTCurve, and SubCurve.
virtual CubitBoolean Curve::is_periodic | ( | double & | period | ) | [pure virtual] |
Implemented in FacetCurve, OCCCurve, CompositeCurve, PartPTCurve, SubCurve, and SegmentedCurve.
virtual CubitBoolean Curve::is_position_on | ( | const CubitVector & | test_position | ) | [pure virtual] |
Implemented in OCCCurve, FacetCurve, CompositeCurve, SegmentedCurve, PartPTCurve, and SubCurve.
virtual CubitBoolean Curve::is_tolerant | ( | ) | [inline, virtual] |
Definition at line 331 of file Curve.hpp.
{ return CUBIT_FALSE; };
virtual double Curve::length_from_u | ( | double | parameter1, |
double | parameter2 | ||
) | [pure virtual] |
Implemented in FacetCurve, OCCCurve, CompositeCurve, PartPTCurve, SubCurve, and SegmentedCurve.
CubitStatus Curve::mid_point | ( | const CubitVector & | point1, |
const CubitVector & | point2, | ||
CubitVector & | mid_point | ||
) | [inline, virtual] |
Definition at line 447 of file Curve.hpp.
{ double param1 = u_from_position(point1); double param2 = u_from_position(point2); param1 = 0.5 * (param1 + param2); return position_from_u(param1, midpoint); }
CubitStatus Curve::mid_point | ( | CubitVector & | mid_point | ) | [inline, virtual] |
Definition at line 428 of file Curve.hpp.
{ double param1 = 0.5 * (start_param() + end_param()); return position_from_u(param1, midpoint); }
virtual CubitPointContainment Curve::point_containment | ( | const CubitVector & | point | ) | [pure virtual] |
Implemented in OCCCurve, FacetCurve, CompositeCurve, SegmentedCurve, PartPTCurve, and SubCurve.
CubitStatus Curve::point_from_arc_length | ( | double | root_param, |
const double | arc_length, | ||
CubitVector & | new_point | ||
) | [virtual] |
Definition at line 136 of file Curve.cpp.
{ double low_param = start_param(); double high_param = end_param(); if (high_param < low_param) { double temp = high_param; high_param = low_param; low_param = temp; } // Comment: The way we handle points not on the bounded curve is // different for periodic and non-periodic curves! // Periodic curves leave the parameter off of the curve, // while non-periodic curves move the point to the closest // endpoint. Just an observation! // Adjust the parameter for periodic curves double periodic_param; if ( is_periodic( periodic_param )) { while (root_param < low_param) root_param += periodic_param; while (root_param > high_param) root_param -= periodic_param; // If you're moving in the positive direction and // you're almost at the start point... if (fabs( this->end_param() - root_param ) <= CUBIT_RESABS && arc_length > 0.0 ) { //the root param should be switched with the start param. root_param = this->start_param(); } // If you're moving in the negative direction and // you're almost at the end point... else if (fabs( this->start_param() - root_param ) <= CUBIT_RESABS && arc_length < 0.0 ) { root_param = this->end_param(); } } else if ( root_param < (low_param + CUBIT_RESABS) ) root_param = low_param; else if ( root_param > (high_param - CUBIT_RESABS) ) root_param = high_param; // Get the parameter value of the new point double new_param = this->u_from_arc_length( root_param, arc_length ); // Now get the coordinates (in world space) representing this parameter // value return this->position_from_u(new_param, new_point); }
CubitStatus Curve::point_from_arc_length | ( | const CubitVector & | root_point, |
double const | arc_length, | ||
CubitVector & | new_point | ||
) | [virtual] |
Definition at line 112 of file Curve.cpp.
{ // Get the parameter value of the root point double root_param = u_from_position( root_point ); return point_from_arc_length(root_param, arc_length, new_point); }
CubitStatus Curve::position_from_fraction | ( | const double | fraction_along_curve, |
CubitVector & | output_position | ||
) | [inline, virtual] |
Definition at line 436 of file Curve.hpp.
{ CubitStatus result = CUBIT_FAILURE; double param_1 = start_param() + fraction_along_curve * (end_param() - start_param() ); result = position_from_u( param_1, output_position ); return result; }
virtual CubitStatus Curve::position_from_u | ( | double | u_value, |
CubitVector & | output_position | ||
) | [pure virtual] |
Implemented in OCCCurve, FacetCurve, CompositeCurve, PartPTCurve, SegmentedCurve, and SubCurve.
CubitSense Curve::relative_sense | ( | Curve * | other_curve | ) | [virtual] |
Definition at line 58 of file Curve.cpp.
{ CubitVector center, junk, this_tangent, other_tangent; double start, end; if (!get_param_range(start,end) || !position_from_u(0.5*(start+end), center) || !closest_point(center, junk, &this_tangent) || !other_curve->closest_point(center, junk, &other_tangent)) return CUBIT_UNKNOWN; double dot = this_tangent % other_tangent; return dot == 0.0 ? CUBIT_UNKNOWN : dot > 0. ? CUBIT_FORWARD : CUBIT_REVERSED; }
virtual double Curve::start_param | ( | ) | [pure virtual] |
Implemented in OCCCurve, FacetCurve, CompositeCurve, SegmentedCurve, PartPTCurve, and SubCurve.
virtual double Curve::u_from_arc_length | ( | double | root_param, |
double | arc_length | ||
) | [pure virtual] |
Implemented in OCCCurve, FacetCurve, CompositeCurve, PartPTCurve, SegmentedCurve, and SubCurve.
virtual double Curve::u_from_position | ( | const CubitVector & | input_position | ) | [pure virtual] |
Implemented in OCCCurve, FacetCurve, CompositeCurve, PartPTCurve, SubCurve, and SegmentedCurve.