Branch data Line data Source code
1 : : //- Class: CurveFacetEvalTool
2 : : //- Description: The CurveFacetEvalTool is a general purpose tool that uses a set
3 : : //- of facets to determine certain geometry computations. This
4 : : //- class can be used to define a curve or do fast bounding box
5 : : //- calculations, or determine point inside or outside.
6 : : //- Assumptions: It is assumed/required that the facets be continuous through
7 : : //- the set. In other words they must shared nodes and be conected
8 : : //- through each other. The algorithms assume, for efficient searching,
9 : : //- that from one facet, you can get to any other facet in the set.
10 : : //- Owner: Steven J. Owen
11 : : //- Checked by:
12 : :
13 : : #ifndef CURVE_FACET_EVAL_TOOL_HPP
14 : : #define CURVE_FACET_EVAL_TOOL_HPP
15 : :
16 : : #include "DLIList.hpp"
17 : : #include <map>
18 : :
19 : : class CubitBox;
20 : : class CubitPoint;
21 : : class CubitVector;
22 : : class FacetEvalTool;
23 : : class CubitFacetEdge;
24 : : class FacetCurve;
25 : :
26 : : class CurveFacetEvalTool
27 : : {
28 : : private:
29 : : int toolID;
30 : : int interpOrder;
31 : : //- interpolation order 0=linear, 1=gradient, 2=quadratic,
32 : : // 3=least_squares, 4=spline
33 : : DLIList<CubitFacetEdge*> myEdgeList;
34 : : DLIList<CubitPoint*> myPointList;
35 : : CubitBox *myBBox;
36 : : FacetEvalTool *surfFacetEvalTool;
37 : : double facetLength;
38 : : CubitSense curvSense;
39 : : CubitBoolean goodCurveData;
40 : : int output_id;
41 : :
42 : : void draw_edges(int color = -1);
43 : : void draw_edge(CubitFacetEdge *edge, int color);
44 : : void draw_line(CubitVector &begin, CubitVector &end, int color = -1);
45 : : void draw_location(CubitVector &loc, int color = -1 );
46 : :
47 : : void destroy_facets();
48 : : //- Destroys the facets, and points.
49 : :
50 : : CubitStatus get_segments_from_loops(
51 : : DLIList<DLIList<CubitFacetEdge*>*> *facet_loop_list,
52 : : CubitVector &start, CubitVector &end,
53 : : DLIList<CubitFacetEdge*> &edge_list,
54 : : DLIList<CubitPoint*> &point_list,
55 : : CubitSense owrts );
56 : : CubitStatus get_segments_from_loops(
57 : : DLIList<DLIList<CubitFacetEdge*>*> *facet_loop_list,
58 : : CubitPoint *start_pt, CubitPoint *end_pt,
59 : : DLIList<CubitFacetEdge*> &edge_list,
60 : : DLIList<CubitPoint*> &point_list,
61 : : CubitSense owrts );
62 : : // generate a list of edges and points from the loop list
63 : : // for this curve
64 : :
65 : : CubitStatus get_segments_from_positions(
66 : : std::vector<CubitVector> &positions,
67 : : CubitVector &start_pt,
68 : : DLIList<CubitFacetEdge*> &edge_list,
69 : : DLIList<CubitPoint*> &point_list );
70 : : // generate a list of edges and points from the loop list
71 : : // for this curve
72 : :
73 : : /*
74 : : CubitStatus project_to_facet_edge(CubitVector &this_point,
75 : : CubitVector &closest_point,
76 : : CubitVector *tangent_ptr,
77 : : CubitVector *curvature_ptr,
78 : : double *param,
79 : : int *outside );
80 : :
81 : : // project to the facet edge
82 : : CubitStatus project_to_linear_facet_edge(CubitVector &this_point,
83 : : CubitVector &closest_point,
84 : : CubitVector *tangent_ptr,
85 : : CubitVector *curvature_ptr,
86 : : double *param,
87 : : int *outside );
88 : : // same as above except assumes linear representation AND
89 : : // surfFacetEvalTool does notexist
90 : : */
91 : : // evaluates a fractional length onto a Bezier edge
92 : : CubitStatus evaluate_bezier_edge(CubitFacetEdge *edge,
93 : : int index0,
94 : : int index1,
95 : : double fraction,
96 : : CubitVector &location_on_curve,
97 : : double *tangent);
98 : :
99 : : // projects a point onto a Bezier edge
100 : : CubitStatus project_to_bezier_edge(CubitFacetEdge *edge,
101 : : CubitVector &point, CubitVector &projected_point,
102 : : double *tangent, double *tval);
103 : :
104 : : double u_on_facet_edge( CubitFacetEdge *edge_at_pt,
105 : : CubitVector pt );
106 : : // return the u param on the facet curve given a point on the
107 : : // curve and the facet edge it is on
108 : :
109 : : // CubitStatus project_to_edge_line( CubitFacetEdge *edge,
110 : : // CubitVector &this_point,
111 : : // CubitVector &pt_on_edge,
112 : : // double &dist_to_edge );
113 : : // project to the line defined by the edge
114 : :
115 : : CubitStatus fix_point_edge_order();
116 : :
117 : : CubitSense find_curv_sense( CubitPoint *start_ptr );
118 : : CubitSense find_curv_sense( CubitVector &start );
119 : :
120 : : public:
121 : :
122 : : CurveFacetEvalTool();
123 : : ~CurveFacetEvalTool();
124 : :
125 : : // Called immediately after the constructor to initialize the data.
126 : : CubitStatus initialize( DLIList<CubitFacetEdge*> &edge_list,
127 : : DLIList<CubitPoint*> &point_list,
128 : : FacetEvalTool* surf_eval = NULL);
129 : : CubitStatus initialize( FacetEvalTool *surf_eval_tool,
130 : : CubitPoint *start_point,
131 : : CubitPoint *end_point,
132 : : CubitSense orientation );
133 : : CubitStatus initialize( FacetEvalTool *surf_eval_tool,
134 : : CubitVector &start,
135 : : CubitVector &end,
136 : : CubitSense orientation );
137 : : CubitStatus initialize( FacetEvalTool *surf_eval_tool,
138 : : CubitVector &start,
139 : : std::vector<CubitVector> &positions );
140 : :
141 : : CubitStatus save(FILE *fp);
142 : : // save to a cubit file
143 : : CubitStatus restore(FILE *fp,
144 : : unsigned int endian,
145 : : int num_edges,
146 : : int num_points,
147 : : CubitFacetEdge **edges,
148 : : CubitPoint **points,
149 : : int num_fets,
150 : : FacetEvalTool **fet_list);
151 : :
152 : 924 : int get_output_id() { return output_id; }
153 : 462 : void set_output_id( int id ) { output_id = id; }
154 : :
155 : : CubitBox bounding_box();
156 : : //- Returns the bounding box for the set of facetedges (based on the points
157 : : //- used in the faceted set.
158 : :
159 : : CubitStatus closest_point(CubitVector &this_point,
160 : : CubitVector &closest_point_ptr,
161 : : CubitVector *normal_ptr = NULL,
162 : : CubitVector *curvature_ptr = NULL,
163 : : double *param = NULL);
164 : : //- Finds the closest point from the vector (this_point) to the
165 : : //- set of facets that lies on the set of facets. If the point
166 : : //- lies outside this set, the closest point will be on the plane
167 : : //- of the closest facet. The closest_point is set to be that point.
168 : :
169 : : // replace del_pnt with keep_pnt in point list
170 : : CubitBoolean replace_point( CubitPoint *del_pnt, CubitPoint *keep_pnt );
171 : :
172 : : CubitBoolean replace_facets( DLIList< CubitFacetEdge *> &curv_edges );
173 : :
174 : : void remove_facets( DLIList<CubitFacetEdge*> &facet_edges);
175 : :
176 : : CubitStatus position_from_fraction( double fraction, // between 0 and 1
177 : : CubitVector &location_on_curve );
178 : : //- computes the location on the curve based on a fraction of the
179 : : //- distance along the curve and the RefEdge sense
180 : :
181 : : double u_from_arc_length( double root_param, double arc_length );
182 : : double length_from_u ( double root_param, double end_param );
183 : :
184 : 2156 : double length() { return facetLength; };
185 : : //- return the length of the facet edges
186 : :
187 : : CubitSense sense() { return curvSense; };
188 : : //- return the sense of the curve
189 : :
190 : 924 : void get_facets(DLIList<CubitFacetEdge*>& facet_list)
191 : 924 : { facet_list += myEdgeList; }
192 : : // append the edge facets for this curve onto facet_list
193 : 0 : void get_points(DLIList<CubitPoint*>& point_list)
194 : 0 : { point_list += myPointList; }
195 : : // apend the points for this curve onto point_list
196 : :
197 : : FacetEvalTool *get_surf_eval_tool() { return surfFacetEvalTool; }
198 : : void set_facet_eval_tool(FacetEvalTool *surf_eval_tool_ptr)
199 : : { surfFacetEvalTool = surf_eval_tool_ptr;}
200 : : // get and set the associated surface facet eval tool
201 : :
202 : : void set_length();
203 : : // initialize the curve length
204 : :
205 : 0 : CubitBoolean has_good_curve_data(){return goodCurveData;}
206 : :
207 : : void debug_draw_facet_edges(int color = -1 );
208 : :
209 : :
210 : : };
211 : :
212 : : #endif // CURVE_FACET_EVAL_TOOL_HPP
213 : :
214 : :
|