Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : SegmentedCurve.hpp
3 : : //
4 : : // Purpose :
5 : : //
6 : : // Special Notes :
7 : : //
8 : : // Creator : Jason Kraftcheck
9 : : //
10 : : // Creation Date : 04/18/02
11 : : //-------------------------------------------------------------------------
12 : :
13 : : #ifndef SEGMENTED_CURVE_HPP
14 : : #define SEGMENTED_CURVE_HPP
15 : :
16 : : #include "PartitionCurve.hpp"
17 : : #include "PartitionLoop.hpp"
18 : : #include "VGArray.hpp"
19 : :
20 : : class PartitionSurface;
21 : : class PartitionLump;
22 : : class CubitSimpleAttrib;
23 : : class CubitTransformMatrix;
24 : :
25 : : class SegmentedCurve : public PartitionCurve
26 : : {
27 : : public:
28 : :
29 : : PartitionCurve* split( double param );
30 : : CubitStatus combine( PartitionCurve* dead_curve );
31 : :
32 : : static SegmentedCurve* construct( const CubitSimpleAttrib& attrib,
33 : : PartitionEntity* parent );
34 : :
35 : : SegmentedCurve( PartitionSurface* owning_surf, DLIList<CubitVector*>& segments );
36 : : SegmentedCurve( PartitionLump* owning_vol, DLIList<CubitVector*>& segments );
37 : :
38 : : virtual ~SegmentedCurve( );
39 : :
40 : : CubitBoolean is_linear( );
41 : :
42 : : virtual CubitStatus save( CubitSimpleAttrib& attrib );
43 : :
44 : : virtual CubitStatus get_point_direction( CubitVector& origin,
45 : : CubitVector& direction );
46 : :
47 : : virtual CubitStatus get_center_radius( CubitVector& center, double& radius );
48 : :
49 : : virtual double length_from_u( double param1, double param2 );
50 : :
51 : : virtual CubitBoolean is_periodic( double& period);
52 : : CubitBoolean is_periodic() const;
53 : :
54 : : virtual CubitBoolean get_param_range( double& lower_bound,
55 : : double& upper_bound );
56 : :
57 : : virtual CubitStatus closest_point(
58 : : CubitVector const& location,
59 : : CubitVector& closest_location,
60 : : CubitVector* tangent_ptr = NULL,
61 : : CubitVector* curvature_ptr = NULL,
62 : : double* param = NULL);
63 : :
64 : : virtual CubitStatus closest_point_trimmed(
65 : : CubitVector const& from_pt, CubitVector& result_pt );
66 : :
67 : :
68 : : virtual double u_from_position (const CubitVector& position);
69 : :
70 : : virtual CubitStatus position_from_u (double u_value,
71 : : CubitVector& position);
72 : :
73 : : virtual double u_from_arc_length ( double param, double length );
74 : :
75 : : virtual CubitBoolean is_position_on( const CubitVector &position );
76 : :
77 : 0 : virtual double start_param(){ return 0.0; }
78 : 0 : virtual double end_param(){ return point_count() - 1; }
79 : :
80 : : virtual CubitBox bounding_box() const;
81 : :
82 : : virtual double measure();
83 : :
84 : : virtual CubitStatus get_segments( DLIList<CubitVector*>& points );
85 : :
86 : : virtual CubitStatus get_interior_extrema( DLIList<CubitVector*>& points,
87 : : CubitSense& return_sense );
88 : :
89 : : virtual int point_count() const;
90 : :
91 : : virtual CubitBoolean G1_discontinuous( double param,
92 : : CubitVector* minus_tangent = NULL,
93 : : CubitVector* plus_tangent = NULL );
94 : :
95 : : CubitPointContainment point_containment( const CubitVector& vect );
96 : :
97 : : CubitStatus get_graphics( GMem& result,
98 : : double angle_tolerance=0,
99 : : double distance_tolerance=0,
100 : : double max_edge_length=0);
101 : :
102 : : void reverse_sense();
103 : :
104 : : virtual void print_debug_info( const char* prefix, bool pss = true ) const;
105 : :
106 : :
107 : : virtual void transform( const CubitTransformMatrix& );
108 : :
109 : : //R CubitStatus
110 : : //O- true or false if spline is rational or not.
111 : : //O- the degree of this spline
112 : : //O- the control points
113 : : //O- If rational, weight for each control point
114 : : //O- whether underlying spline is reversed
115 : : virtual CubitStatus get_spline_params( bool &rational,
116 : : int °ree,
117 : : DLIList<CubitVector> &cntrl_pts,
118 : : DLIList<double> &cntrl_pt_weights,
119 : : DLIList<double> &knots,
120 : : bool &spline_is_reversed
121 : : ) const;
122 : : //R CubitStatus
123 : : //O- center - ellipse center point
124 : : //O- normal - normal of the plane of the ellipse
125 : : //O- major_axis - major axis of the ellipse
126 : : //O- radius_ratio - ratio of the length of the major to minor axis.
127 : : virtual CubitStatus get_ellipse_params( CubitVector ¢er,
128 : : CubitVector &normal,
129 : : CubitVector &major_axis,
130 : : double &radius_ratio ) const;
131 : : protected:
132 : :
133 : : int segment_from_u( double& u );
134 : : // Return the index of the segment corresponding to the
135 : : // passed parameter value, and change the passed double
136 : : // to be a parameter on the segment. Returns -1 to
137 : : // indicate an invalid parameter value.
138 : :
139 : : int closest_segment( CubitVector const& location,
140 : : double* fraction_on_segment = NULL,
141 : : CubitVector* closest_pt = NULL );
142 : : //Find the segment of the curve closest to the passed location.
143 : : //The return value is the index of the start point of the
144 : : //segment. Optional values passed back are the fraction along
145 : : //the segment at which the passed location was closest, and the
146 : : //corresponding position.
147 : :
148 : : static double closest_point_on_segment(
149 : : const CubitVector& segment_base,
150 : : const CubitVector& segment_direction,
151 : : const CubitVector& from_position );
152 : : //Find the closest location on a bounded segment defined by
153 : : //segment_base and segment_direction to from_position. The
154 : : //return value is the fraction along segment_direction from
155 : : //segment_base. Or a parameter value in the range [0,1], where
156 : : //zero is segment_base, and 1 is segment_base+segment_direction.
157 : :
158 : : double segment_length( int segment_no ) const;
159 : :
160 : : CubitVector position( int index ) const;
161 : :
162 : : void normalize_periodic_parameter( double& u );
163 : :
164 : : private:
165 : : SegmentedCurve( PartitionEntity* owning_vol,
166 : : const CubitSimpleAttrib& attrib,
167 : : DLIList<int>& pass_back_vertex_conn );
168 : :
169 : : SegmentedCurve( SegmentedCurve* split_from, int num_points );
170 : :
171 : : VGArray<CubitVector> point_list;
172 : : };
173 : :
174 : : #endif
|