cgma
|
#include <SubCurve.hpp>
Public Member Functions | |
PartitionCurve * | split (double param) |
CubitStatus | combine (PartitionCurve *dead_curve) |
SubCurve (Curve *curve_ptr) | |
SubCurve (SubCurve *curve_ptr, double start_param) | |
~SubCurve () | |
Curve * | real_curve () const |
int | num_partitions () const |
void | get_all_partitions (DLIList< TopologyBridge * > &curves) const |
CubitStatus | get_graphics (GMem &result, double angle_tolerance=0, double distance_tolernace=0, double max_edge_length=0) |
void | reverse_sense () |
virtual CubitStatus | save (CubitSimpleAttrib &) |
CubitBox | bounding_box () const |
double | measure () |
GeometryType | geometry_type () |
CubitStatus | closest_point (CubitVector const &from, CubitVector &closest, CubitVector *tangent=0, CubitVector *curvature=0, double *param=0) |
CubitPointContainment | point_containment (const CubitVector &point) |
CubitBoolean | is_position_on (const CubitVector &position) |
CubitBoolean | G1_discontinuous (double u, CubitVector *minus_tangent=0, CubitVector *plus_tangent=0) |
CubitStatus | get_interior_extrema (DLIList< CubitVector * > &points, CubitSense &sense) |
CubitStatus | get_center_radius (CubitVector ¢er, double &radius) |
CubitBoolean | get_param_range (double &lower, double &upper) |
double | start_param () |
double | end_param () |
CubitBoolean | is_periodic (double &period) |
double | length_from_u (double u1, double u2) |
double | u_from_position (const CubitVector &position) |
CubitStatus | position_from_u (double u, CubitVector &result) |
double | u_from_arc_length (double root, double length) |
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 |
virtual CubitStatus | get_ellipse_params (CubitVector ¢er, CubitVector &normal, CubitVector &major_axis, double &radius_ratio) const |
Private Member Functions | |
void | fixup_periodic_param (double ¶m) const |
CubitBoolean | get_ordered_param_range (double &lower, double &upper) |
Private Attributes | |
double | startParam |
double | endParam |
Definition at line 18 of file SubCurve.hpp.
SubCurve::SubCurve | ( | Curve * | curve_ptr | ) |
Definition at line 38 of file SubCurve.cpp.
{ assert( dynamic_cast<SubEntitySet*>(curve_ptr->owner()) == 0 ); new SubEntitySet( curve_ptr, this ); startParam = curve_ptr->start_param(); endParam = curve_ptr->end_param(); double period; if( fabs( startParam - endParam ) < CUBIT_RESABS ) { if( ! curve_ptr->is_periodic( period ) ) { assert( 0 ); } endParam = startParam + period ; } if( curve_ptr->bridge_sense() != this->bridge_sense() ) reverse_bridge_sense(); }
SubCurve::SubCurve | ( | SubCurve * | curve_ptr, |
double | start_param | ||
) |
Definition at line 61 of file SubCurve.cpp.
{ split_from->sub_entity_set().add_partition( this, split_from ); endParam = split_from->endParam; startParam = split_from->endParam = start; if( CUBIT_REVERSED == split_from->bridge_sense() ) this->reverse_bridge_sense(); }
Definition at line 72 of file SubCurve.cpp.
{ }
CubitBox SubCurve::bounding_box | ( | void | ) | const [virtual] |
Implements PartitionEntity.
Definition at line 88 of file SubCurve.cpp.
{ /* CubitVector start, end; SubCurve* me = (SubCurve*)this; me->position_from_u( me->start_param(), start ); me->position_from_u( me-> end_param(), end ); CubitBox box( start, end ); DLIList<CubitVector*> extrema; CubitSense sense; me->get_interior_extrema( extrema, sense ); if( sense == CUBIT_REVERSED ) extrema.reverse(); while( extrema.size() ) { CubitVector* v = extrema.pop(); box |= *v; delete v; } */ return dynamic_cast<Curve*>(partitioned_entity())->bounding_box(); }
CubitStatus SubCurve::closest_point | ( | CubitVector const & | from, |
CubitVector & | closest, | ||
CubitVector * | tangent = 0 , |
||
CubitVector * | curvature = 0 , |
||
double * | param = 0 |
||
) | [virtual] |
Implements Curve.
Definition at line 122 of file SubCurve.cpp.
{ double u; CubitStatus result = real_curve()->closest_point( from, closest, tangent, curvature, &u ); if( param ) *param = u; // Snap position to the ends of the SubCurve if // necessary. if(result) { double lower, upper; double period; // If curve is periodic we first need to see if our location // can be mapped to the subcurve range just by adding or // subtracting multiples of the period. If no then we // will snap it to one of the ends. int is_per = is_periodic(period); // Get the param range of the SubCurve (will probably // be different from that of the underlying real curve). get_ordered_param_range(lower, upper); // If we are past the low end... if(u < lower) { // Adjust for periodic curve. if(is_per) { double tmp_u = u; while(tmp_u < upper + GEOMETRY_RESABS) { tmp_u += period; if(tmp_u > lower - GEOMETRY_RESABS && tmp_u < upper + GEOMETRY_RESABS) { u = tmp_u; } } } // If the value of u was not adjusted because // of a periodic curve go ahead and snap to // the lower bound. if(u < lower) { u = lower; } // Update the position we will return. position_from_u(u, closest); } // If we are past the high end... else if(u > upper) { // Adjust for periodic curve. if(is_per) { double tmp_u = u; while(tmp_u > upper - GEOMETRY_RESABS) { tmp_u -= period; if(tmp_u > lower - GEOMETRY_RESABS && tmp_u < upper + GEOMETRY_RESABS) { u = tmp_u; } } } // If the value of u was not adjusted because // of a periodic curve go ahead and snap to // the upper bound. if(u > upper) { u = upper; } // Update the position we will return. position_from_u(u, closest); } } if( result && tangent ) { CubitVector start, end; if( !position_from_u( start_param(), start ) || !position_from_u( end_param(), end ) ) return CUBIT_FAILURE; double ds = (start - from).length_squared(); double de = (end - from).length_squared(); const double rsq = GEOMETRY_RESABS * GEOMETRY_RESABS; if( ds < rsq && G1_discontinuous( u, &end, &start ) ) *tangent = start; else if( de < rsq && G1_discontinuous( u, &end, &start ) ) *tangent = end; } return result; }
CubitStatus SubCurve::combine | ( | PartitionCurve * | dead_curve | ) | [virtual] |
Implements PartitionCurve.
Definition at line 18 of file SubCurve.cpp.
{ SubCurve* curve = dynamic_cast<SubCurve*>(dead_curve); if( !curve || curve->real_curve() != this->real_curve() ) return CUBIT_FAILURE; double dse = fabs(start_param() - dead_curve->end_param()); double des = fabs(end_param() - dead_curve->start_param()); if( des <= dse ) endParam = curve->endParam; else startParam = curve->startParam; return CUBIT_SUCCESS; }
double SubCurve::end_param | ( | ) | [virtual] |
void SubCurve::fixup_periodic_param | ( | double & | param | ) | const [private] |
Definition at line 403 of file SubCurve.cpp.
{ double period; if( ! real_curve()->is_periodic(period) ) return; assert(period > GEOMETRY_RESABS); double start, end; if ( startParam < endParam ) { start = startParam; end = endParam; } else { start = endParam; end = startParam; } if( fabs( start-param ) < GEOMETRY_RESABS ) param = start; if( fabs( end-param ) < GEOMETRY_RESABS ) param = end; while ( param > end ) param -= period; while ( param < start ) param += period; }
CubitBoolean SubCurve::G1_discontinuous | ( | double | u, |
CubitVector * | minus_tangent = 0 , |
||
CubitVector * | plus_tangent = 0 |
||
) | [virtual] |
Reimplemented from Curve.
Definition at line 259 of file SubCurve.cpp.
{ double lower, upper; get_ordered_param_range( lower, upper ); if( param <= lower || param >= upper ) return CUBIT_FALSE; CubitVector pos, start, end; if( !position_from_u( lower, start ) || !position_from_u( upper, end ) || !position_from_u( param, pos ) ) assert(0); double ds = (pos - start).length_squared(); double de = (pos - end ).length_squared(); const double grs = GEOMETRY_RESABS * GEOMETRY_RESABS; if( ds < grs || de < grs ) return CUBIT_FALSE; return real_curve()->G1_discontinuous( param, minus_tan, plus_tan ); }
GeometryType SubCurve::geometry_type | ( | ) | [virtual] |
Reimplemented from Curve.
Definition at line 117 of file SubCurve.cpp.
{ return real_curve()->geometry_type(); }
void SubCurve::get_all_partitions | ( | DLIList< TopologyBridge * > & | curves | ) | const |
Definition at line 83 of file SubCurve.cpp.
{ sub_entity_set().get_owners(curves); }
CubitStatus SubCurve::get_center_radius | ( | CubitVector & | center, |
double & | radius | ||
) | [virtual] |
Implements Curve.
Definition at line 345 of file SubCurve.cpp.
{ return real_curve()->get_center_radius(center,radius); }
CubitStatus SubCurve::get_ellipse_params | ( | CubitVector & | center, |
CubitVector & | normal, | ||
CubitVector & | major_axis, | ||
double & | radius_ratio | ||
) | const [virtual] |
Implements Curve.
Definition at line 570 of file SubCurve.cpp.
{ PRINT_ERROR("Currently, Cubit is unable to determine ellipse parameters for SubCurves.\n"); return CUBIT_FAILURE; }
CubitStatus SubCurve::get_graphics | ( | GMem & | result, |
double | angle_tolerance = 0 , |
||
double | distance_tolernace = 0 , |
||
double | max_edge_length = 0 |
||
) | [virtual] |
Implements PartitionCurve.
Definition at line 430 of file SubCurve.cpp.
{ if (POINT_CURVE_TYPE == this->geometry_type()) { result.pointListCount = 0; return CUBIT_SUCCESS; } int i; if( !real_curve()->get_geometry_query_engine()-> get_graphics( real_curve(), &result, angle_tolerance, distance_tolerance, max_edge_length ) ) return CUBIT_FAILURE; if (0 == result.pointListCount) return CUBIT_FAILURE; double lo, hi, start_param, end_param; get_ordered_param_range( lo, hi ); get_param_range(start_param, end_param); DLIList<double> param_list( result.pointListCount ); // don't use first and last points -- this avoids projection // close to a seam on a periodic curve. The projection can // jump the seam and cause endpoints of the curve to incorrectly // fall inside the parameter range causing extra segments to be drawn for( i = 1; i < result.pointListCount-1; i++ ) { CubitVector v( result.point_list()[i].x, result.point_list()[i].y, result.point_list()[i].z ); double u = real_curve()->u_from_position( v ); if( (u >= lo) && (u <= hi) ) param_list.append( u ); } CubitVector start_pt, end_pt; position_from_u( start_param, start_pt ); position_from_u( end_param, end_pt ); bool append_start = true, append_end = true; if( param_list.size() > 0 ) { CubitVector first_pt, last_pt; param_list.last(); position_from_u( param_list.get(), last_pt ); param_list.reset(); position_from_u( param_list.get(), first_pt ); double d1 = (start_pt - first_pt).length_squared(); double d2 = (start_pt - last_pt ).length_squared(); double d4 = ( end_pt - first_pt).length_squared(); double d3 = ( end_pt - last_pt ).length_squared(); double forward = d1 + d3; double reverse = d2 + d4; if( reverse < forward ) { CubitVector tmp( start_pt ); start_pt = end_pt; end_pt = tmp; d1 = d2; d3 = d4; } if( d1 < (GEOMETRY_RESABS*GEOMETRY_RESABS) ) append_start = false; if( d3 < (GEOMETRY_RESABS*GEOMETRY_RESABS) ) append_end = false; } int index = 0; result.allocate_polylines( param_list.size() + 1 ); if( append_start ) { result.point_list()[index].x = (float)(start_pt.x()); result.point_list()[index].y = (float)(start_pt.y()); result.point_list()[index].z = (float)(start_pt.z()); index++; } param_list.reset(); CubitVector position; for( i = param_list.size(); i--; ) { position_from_u( param_list.get_and_step(), position ); result.point_list()[index].x = (float)(position.x()); result.point_list()[index].y = (float)(position.y()); result.point_list()[index].z = (float)(position.z()); index++; } if( append_end ) { result.point_list()[index].x = (float)(end_pt.x()); result.point_list()[index].y = (float)(end_pt.y()); result.point_list()[index].z = (float)(end_pt.z()); index++; } result.pointListCount = index; return CUBIT_SUCCESS; }
CubitStatus SubCurve::get_interior_extrema | ( | DLIList< CubitVector * > & | points, |
CubitSense & | sense | ||
) | [virtual] |
Implements Curve.
Definition at line 283 of file SubCurve.cpp.
{ assert( !points.size() ); double lower, upper; get_ordered_param_range( lower, upper ); CubitVector start, end; if( ! real_curve()->position_from_u( lower, start ) || ! real_curve()->position_from_u( upper, end ) ) return CUBIT_FAILURE; DLIList<CubitVector*> list; if( ! real_curve()->get_interior_extrema( list, sense ) ) return CUBIT_FAILURE; if( list.size() == 0 ) return CUBIT_SUCCESS; list.last(); double param = real_curve()->u_from_position( *list.get() ); while( (param <= lower) || (param >= upper) ) { delete list.pop(); if( list.size() == 0 ) return CUBIT_SUCCESS; list.last(); param = real_curve()->u_from_position( *list.get() ); } double ds = (*list.get() - start).length_squared(); double de = (*list.get() = end ).length_squared(); const double grs = GEOMETRY_RESABS * GEOMETRY_RESABS; if( ds < grs || de < grs ) { delete list.pop(); if( list.size() == 0 ) return CUBIT_SUCCESS; list.last(); param = real_curve()->u_from_position( *list.get() ); } while( (param > lower) && (param < upper) ) { points.append( list.pop() ); if( list.size() == 0 ) break; list.last(); param = real_curve()->u_from_position( *list.get() ); } while( list.size() ) delete list.pop(); if( sense == CUBIT_FORWARD ) sense = CUBIT_REVERSED; else if( sense == CUBIT_REVERSED ) sense = CUBIT_FORWARD; return CUBIT_SUCCESS; }
CubitBoolean SubCurve::get_ordered_param_range | ( | double & | lower, |
double & | upper | ||
) | [private] |
Definition at line 356 of file SubCurve.cpp.
{ if( startParam < endParam ) { lower = startParam; upper = endParam; } else { lower = endParam; upper = startParam; } return CUBIT_TRUE; }
CubitBoolean SubCurve::get_param_range | ( | double & | lower, |
double & | upper | ||
) | [virtual] |
Implements Curve.
Definition at line 349 of file SubCurve.cpp.
{ lower = startParam; upper = endParam; return CUBIT_TRUE; }
CubitStatus SubCurve::get_spline_params | ( | bool & | rational, |
int & | degree, | ||
DLIList< CubitVector > & | cntrl_pts, | ||
DLIList< double > & | cntrl_pt_weights, | ||
DLIList< double > & | knots, | ||
bool & | spline_is_reversed | ||
) | const [virtual] |
Implements Curve.
Definition at line 556 of file SubCurve.cpp.
{ PRINT_ERROR("Currently, Cubit is unable to determine spline parameters for SubCurves.\n"); return CUBIT_FAILURE; }
CubitBoolean SubCurve::is_periodic | ( | double & | period | ) | [virtual] |
Implements Curve.
Definition at line 376 of file SubCurve.cpp.
{ return real_curve()->is_periodic( period ); }
CubitBoolean SubCurve::is_position_on | ( | const CubitVector & | position | ) | [virtual] |
Implements Curve.
Definition at line 254 of file SubCurve.cpp.
{ return real_curve()->is_position_on( position ); }
double SubCurve::length_from_u | ( | double | u1, |
double | u2 | ||
) | [virtual] |
Implements Curve.
Definition at line 381 of file SubCurve.cpp.
{ return real_curve()->length_from_u( u1, u2 ); }
double SubCurve::measure | ( | ) | [virtual] |
Implements GeometryEntity.
Definition at line 112 of file SubCurve.cpp.
{ return fabs(real_curve()->length_from_u( startParam, endParam )); }
int SubCurve::num_partitions | ( | ) | const |
Definition at line 76 of file SubCurve.cpp.
{ DLIList<TopologyBridge*> tmp; get_all_partitions( tmp ); return tmp.size(); }
CubitPointContainment SubCurve::point_containment | ( | const CubitVector & | point | ) | [virtual] |
Implements Curve.
Definition at line 226 of file SubCurve.cpp.
{ CubitPointContainment cpc = real_curve()->point_containment( point ); if( (cpc == CUBIT_PNT_INSIDE) || (cpc == CUBIT_PNT_ON) || (cpc == CUBIT_PNT_BOUNDARY) ) { double u = real_curve()->u_from_position( point ); double lower, upper; get_ordered_param_range( lower, upper ); if( u < lower || u > upper ) cpc = CUBIT_PNT_OFF; } if( (cpc == CUBIT_PNT_INSIDE) || (cpc == CUBIT_PNT_ON) ) { CubitVector start, end; position_from_u( start_param(), start ); position_from_u( end_param(), end ); if( (point-start).length_squared() < GEOMETRY_RESABS*GEOMETRY_RESABS || (point-end ).length_squared() < GEOMETRY_RESABS*GEOMETRY_RESABS ) { cpc = CUBIT_PNT_BOUNDARY; } } return cpc; }
CubitStatus SubCurve::position_from_u | ( | double | u, |
CubitVector & | result | ||
) | [virtual] |
Implements Curve.
Definition at line 393 of file SubCurve.cpp.
{ return real_curve()->position_from_u( u, p ); }
Curve * SubCurve::real_curve | ( | ) | const [inline] |
Definition at line 104 of file SubCurve.hpp.
{ return dynamic_cast<Curve*>(partitioned_entity()); }
void SubCurve::reverse_sense | ( | ) | [virtual] |
Implements PartitionEntity.
Definition at line 537 of file SubCurve.cpp.
{ reverse_point_order(); if( owner() ) owner()->notify_reversed(this); }
CubitStatus SubCurve::save | ( | CubitSimpleAttrib & | attrib | ) | [virtual] |
Implements PartitionEntity.
Definition at line 544 of file SubCurve.cpp.
{ int id = sub_entity_set().get_id(this); if( id <= 0 ) return CUBIT_FAILURE; DLIList<int> end_points(4); get_save_topology(end_points); return sub_entity_set().save_geometry( id, 1, 0, 0, &end_points, 0, attrib ); }
PartitionCurve * SubCurve::split | ( | double | param | ) | [virtual] |
Implements PartitionCurve.
Definition at line 5 of file SubCurve.cpp.
{ if( startParam <= endParam ) { if( (param <= startParam) || (param >= endParam) ) return 0; } else if( (param >= startParam) || (param <= endParam) ) return 0; return new SubCurve( this, param ); }
double SubCurve::start_param | ( | ) | [virtual] |
double SubCurve::u_from_arc_length | ( | double | root, |
double | length | ||
) | [virtual] |
Implements Curve.
Definition at line 398 of file SubCurve.cpp.
{ return real_curve()->u_from_arc_length( root, length ); }
double SubCurve::u_from_position | ( | const CubitVector & | position | ) | [virtual] |
Implements Curve.
Definition at line 386 of file SubCurve.cpp.
{ double result = real_curve()->u_from_position( p ); fixup_periodic_param(result); return result; }
double SubCurve::endParam [private] |
Definition at line 101 of file SubCurve.hpp.
double SubCurve::startParam [private] |
Definition at line 101 of file SubCurve.hpp.