Branch data Line data Source code
1 : : //- Class: TDOctreeRefEdge
2 : : //- Description: Tool data for storing additional information needed for generating line source entities.
3 : : //- Owner: W. R. Quadors
4 : : //- Checked by:
5 : : //- Version:
6 : : #include "TDOctreeRefEdge.hpp"
7 : : #include "CubitDefines.h"
8 : : #include "ToolData.hpp"
9 : : #include "MemoryManager.hpp"
10 : : #include "DLIList.hpp"
11 : : #include "CastTo.hpp"
12 : : #include "RefEdge.hpp"
13 : : #include "GMem.hpp"
14 : :
15 : :
16 : :
17 : : // Constructor
18 : 0 : TDOctreeRefEdge::TDOctreeRefEdge(){
19 [ # # ][ # # ]: 0 : resultPointData = new GMem;
20 : 0 : visit = CUBIT_FALSE;
21 : 0 : }
22 : :
23 : :
24 : : // Distructor
25 : 0 : TDOctreeRefEdge::~TDOctreeRefEdge(){
26 [ # # ]: 0 : clean_gpoint_list();
27 : : //PRINT_INFO("Inside ~TDOctreeRefEdge\n");
28 [ # # ]: 0 : }
29 : :
30 : 0 : void TDOctreeRefEdge::clean_gpoint_list(){
31 [ # # ]: 0 : delete resultPointData;
32 : 0 : }
33 : :
34 : : //-------------------------------------------------------------------------
35 : : // Purpose : To create TDOctreeRefEdge to MRefFace
36 : : //
37 : : // Special Notes :
38 : : //
39 : : // Creator : W R Quadros
40 : : //
41 : : // Creation Date : 07/03
42 : : //-------------------------------------------------------------------------
43 : 0 : CubitStatus TDOctreeRefEdge::add_td( RefEdge *mref_edge )
44 : : {
45 : : ToolData *td;
46 : 0 : td = mref_edge->get_TD(&TDOctreeRefEdge::is_td_skl_mref_edge);
47 [ # # ]: 0 : if ( td == NULL )
48 : : {
49 [ # # ]: 0 : TDOctreeRefEdge *td_gm = new TDOctreeRefEdge;
50 : 0 : mref_edge->add_TD( td_gm);
51 : 0 : td_gm->set_mref_edge( mref_edge );
52 : : }
53 : : else
54 : : {
55 [ # # ]: 0 : TDOctreeRefEdge *td_gm = CAST_TO(td, TDOctreeRefEdge);
56 : 0 : td_gm->set_mref_edge( mref_edge );
57 : : }
58 : 0 : return CUBIT_SUCCESS;
59 : : }
60 : :
61 : : //-------------------------------------------------------------------------
62 : : // Purpose : get the TDOctreeRefEdge for a RefEdge
63 : : //
64 : : // Special Notes :
65 : : //
66 : : // Creator : W R Quadros
67 : : //
68 : : // Creation Date : 07/03
69 : : //-------------------------------------------------------------------------
70 : 0 : TDOctreeRefEdge* TDOctreeRefEdge::get_td( RefEdge *mref_edge )
71 : : {
72 : : ToolData *td;
73 : 0 : td = mref_edge->get_TD(&TDOctreeRefEdge::is_td_skl_mref_edge);
74 [ # # ]: 0 : if ( td != NULL )
75 : : {
76 [ # # ]: 0 : TDOctreeRefEdge *td_gm = CAST_TO(td, TDOctreeRefEdge);
77 : 0 : return td_gm;
78 : : }
79 : 0 : return (TDOctreeRefEdge*) NULL;
80 : : }
81 : :
82 : : // curve decimating function
83 : : // takes in points to decimate based on an angle_tolerance in degrees
84 : : // and puts results into the result point data
85 : 0 : void TDOctreeRefEdge::decimate_curve_points_for_source_entity(GMem& point_data, double angle_tolerance, GMem& result_point_data)
86 : : {
87 : : // pointListCount instead of point_data.point_list_size() (they are different)
88 : 0 : int num_pre_points = point_data.pointListCount;
89 : :
90 : : // only decimate if we have more than 2 points
91 [ # # ]: 0 : if(num_pre_points <= 2)
92 : : {
93 : 0 : result_point_data = point_data;
94 : 0 : return;
95 : : }
96 : :
97 : : // get threshold value
98 : 0 : const double threshold = cos( DEGREES_TO_RADIANS(angle_tolerance) );
99 : :
100 : : // mark array for what to keep and throw
101 : 0 : char* mark_array = new char[num_pre_points];
102 : : // zero means keep the point, non-zero means remove the point
103 : 0 : memset(mark_array, 0, num_pre_points);
104 : :
105 : 0 : int num_points_to_keep = 2; // initialize to keep start and end points
106 : :
107 : : int i;
108 : 0 : GPoint* point_data_array = point_data.point_list();
109 : : // initialize first point
110 : 0 : GPoint* pre_point = &(point_data_array[0]);
111 : : // traverse all but start and end points
112 [ # # ]: 0 : for(i=1; i<(num_pre_points-1); i++)
113 : : {
114 : :
115 : : // create two vectors
116 : : // one from i-1 to i and another from i to i+1
117 : 0 : GPoint* point = &(point_data_array[i]);
118 : 0 : GPoint* next_point = &(point_data_array[i+1]);
119 : :
120 : : CubitVector v1(CubitVector(pre_point->x, pre_point->y, pre_point->z),
121 [ # # ][ # # ]: 0 : CubitVector(point->x, point->y, point->z));
[ # # ]
122 [ # # ]: 0 : v1.normalize();
123 : :
124 : : CubitVector v2(CubitVector(point->x, point->y, point->z),
125 [ # # ][ # # ]: 0 : CubitVector(next_point->x, next_point->y, next_point->z));
[ # # ]
126 [ # # ]: 0 : v2.normalize();
127 : :
128 : : // compute whether to keep the point
129 [ # # ]: 0 : double dot_product = v1 % v2;
130 : :
131 : 0 : bool keep = dot_product > threshold ? false : true;
132 : :
133 : : // if keep
134 [ # # ]: 0 : if(keep)
135 : : {
136 : 0 : num_points_to_keep++;
137 : 0 : pre_point = point;
138 : : }
139 : : // if not keep
140 : : else
141 : : {
142 : 0 : mark_array[i] = 1;
143 : : }
144 : : }
145 : :
146 : : // make a new GPoint array
147 [ # # ]: 0 : GPoint* new_point_list = new GPoint[num_points_to_keep];
148 : 0 : int new_point_list_count = 0;
149 : : // copy points to keep into the new array
150 [ # # ]: 0 : for(i=0; i<num_pre_points; i++)
151 : : {
152 [ # # ]: 0 : if(mark_array[i] == 0)
153 : : {
154 : 0 : new_point_list[new_point_list_count] = point_data_array[i];
155 : 0 : new_point_list_count++;
156 : : }
157 : : }
158 : :
159 [ # # ]: 0 : delete [] mark_array;
160 : :
161 [ # # ]: 0 : assert(new_point_list_count == num_points_to_keep);
162 : : //printf("reduced points from %i to %i\n", num_pre_points, num_points_to_keep);
163 : :
164 : : // put data into the result gmem
165 : 0 : result_point_data.replace_point_list(new_point_list, new_point_list_count, new_point_list_count);
166 : 0 : result_point_data.points_consolidated(CUBIT_TRUE);
167 : : }
168 : :
169 : 0 : CubitBoolean TDOctreeRefEdge::generate_gpoint_list( double decimation_ang )
170 : : {
171 : : // get facets from cgm
172 [ # # ]: 0 : GMem point_data;
173 [ # # ]: 0 : refEdge->get_graphics( point_data );
174 : : // decimate the facets to the resolution we want
175 : :
176 [ # # ]: 0 : TDOctreeRefEdge::decimate_curve_points_for_source_entity( point_data, decimation_ang, *resultPointData);
177 : :
178 [ # # ]: 0 : return CUBIT_TRUE;
179 : : }
180 : :
181 : :
182 : :
183 : : //======================================================================
184 : : // Description: return curvature at a point on the edge
185 : : // Author: sjowen
186 : : // Modified: W R Quadros
187 : : // Date: 01/2005
188 : : //======================================================================
189 : 0 : CubitBoolean TDOctreeRefEdge::find_curve_curvature_using_three_points(CubitVector point_a, CubitVector point_b, CubitVector point_c, CubitVector &curvature ){
190 : :
191 : :
192 [ # # ][ # # ]: 0 : CubitVector vec_ba, vec_bc;
193 : :
194 [ # # ][ # # ]: 0 : vec_ba = point_a - point_b;
195 [ # # ][ # # ]: 0 : vec_bc = point_c - point_b;
196 : :
197 : : // Squares of lengths of the edges incident to `a'.
198 [ # # ]: 0 : double ba_length = vec_ba.length_squared();
199 [ # # ]: 0 : double bc_length = vec_bc.length_squared();
200 : :
201 : : // Cross product of these edges.
202 : : // (Take your chances with floating-point roundoff.)
203 [ # # ]: 0 : CubitVector cross = vec_ba * vec_bc;
204 : :
205 : : // Calculate the denominator of the formulae.
206 [ # # ]: 0 : double denominator = 0.5 / (cross % cross);
207 [ # # ]: 0 : assert(denominator != 0.0);
208 : :
209 : : // Calculate offset (from `a') of circumcenter.
210 [ # # ][ # # ]: 0 : CubitVector circle_center = (ba_length * vec_bc - bc_length * vec_ba) * cross;
[ # # ][ # # ]
211 [ # # ]: 0 : circle_center *= denominator;
212 : :
213 : : //store radius
214 [ # # ]: 0 : double radius = circle_center.length();
215 [ # # ]: 0 : circle_center.normalize();
216 [ # # ]: 0 : circle_center /= radius;
217 : :
218 [ # # ]: 0 : curvature = circle_center;
219 : 0 : return CUBIT_TRUE;
220 [ + - ][ + - ]: 6540 : }
221 : :
222 : : // EOF
223 : :
224 : :
225 : :
|