13 #ifndef eli_geom_surface_piecewise_capped_surface_creator_hpp
14 #define eli_geom_surface_piecewise_capped_surface_creator_hpp
19 #include "eli/code_eli.hpp"
37 template<
typename data__,
unsigned short dim__,
typename tol__>
87 virtual bool create(piecewise_surface_type &ps)
const
94 piecewise_curve_type edge;
133 data_type tmin(edge.get_t0()), tmax(edge.get_tmax()), tsplit((tmin+tmax)/2);
134 if (tol.approximately_equal(edge.f(tmin), edge.f(tsplit)))
140 piecewise_curve_type first_half, second_half;
141 edge.split(first_half, second_half, tsplit);
142 second_half.reverse();
143 second_half.set_t0(first_half.get_t0());
145 assert(first_half.get_t0()==second_half.get_t0());
146 assert(first_half.get_tmax()==second_half.get_tmax());
151 piecewise_surface_type cap;
156 std::vector<rib_data_type> ribs(2);
157 std::vector<typename general_creator_type::index_type> max_degree(1);
158 general_creator_type gc;
162 ribs[0].set_f(second_half);
163 ribs[1].set_f(first_half);
169 rtn_flag=gc.set_conditions(ribs, max_degree,
false);
177 rtn_flag=gc.create(cap);
190 std::vector<data_type> ucap_param, vcap_param, uparam, vparam,
du,
dv;
191 index_type i, j, icap_mid, umin_offset(0), vmin_offset(0);
194 cap.get_pmap_uv(ucap_param, vcap_param);
196 icap_mid=ucap_param.size()/2;
202 const index_type nucap_patch(icap_mid), nvcap_patch(cap.number_v_patches());
203 u0=ucap_param[icap_mid];
204 du.resize(uparam.size()-1+nucap_patch);
205 for (i=icap_mid; i<static_cast<index_type>(ucap_param.size())-1; ++i)
207 du[i-icap_mid]=ucap_param[i+1]-ucap_param[i];
209 for (i=0; i<static_cast<index_type>(uparam.size())-1; ++i)
211 du[i+nucap_patch]=uparam[i+1]-uparam[i];
215 vparam.resize(2*vcap_param.size()-1);
216 data_type vmid(vcap_param[vcap_param.size()-1]);
217 for (j=0; j<static_cast<index_type>(vcap_param.size()); ++j)
219 vparam[j]=vcap_param[j];
220 vparam[vparam.size()-1-j]=2*vmid-vparam[j];
225 dv.resize(vparam.size()-1);
226 for (j=0; j<static_cast<index_type>(dv.size()); ++j)
228 dv[j]=vparam[j+1]-vparam[j];
235 for (j=0; j<static_cast<index_type>(vparam.size()); ++j)
239 assert(orig_copy.
number_v_patches()==(
static_cast<index_type
>(vparam.size())-1));
242 ps.
init_uv(du.begin(), du.end(), dv.begin(), dv.end(),
u0,
v0);
243 umin_offset=nucap_patch;
246 for (i=0; i<nucap_patch; ++i)
248 for (j=0; j<nvcap_patch; ++j)
250 cap.get(patch, i + nucap_patch, j);
260 for (i=0; i<nucap_patch; ++i)
262 for (j=nvcap_patch; j<static_cast<index_type>(dv.size()); ++j)
264 cap.get(patch, i + nucap_patch, j-nvcap_patch);
274 orig_copy.
get(patch, i, j);
275 ps.
set(patch, i+umin_offset, j+vmin_offset);
287 const index_type nucap_patch(icap_mid), nu_patch(uparam.size()-1), nvcap_patch(cap.number_v_patches());
289 du.resize(uparam.size()-1+nucap_patch);
290 for (i=0; i<static_cast<index_type>(uparam.size())-1; ++i)
292 du[i]=uparam[i+1]-uparam[i];
294 for (i=nu_patch; i<static_cast<index_type>(du.size()); ++i)
296 du[i]=ucap_param[(i-nu_patch)+1]-ucap_param[i-nu_patch];
300 vparam.resize(2*vcap_param.size()-1);
301 data_type vmid(vcap_param[vcap_param.size()-1]);
302 for (j=0; j<static_cast<index_type>(vcap_param.size()); ++j)
304 vparam[j]=vcap_param[j];
305 vparam[vparam.size()-1-j]=2*vmid-vparam[j];
310 dv.resize(vparam.size()-1);
311 for (j=0; j<static_cast<index_type>(dv.size()); ++j)
313 dv[j]=vparam[j+1]-vparam[j];
320 for (j=0; j<static_cast<index_type>(vparam.size()); ++j)
324 assert(orig_copy.
number_v_patches()==(
static_cast<index_type
>(vparam.size())-1));
327 ps.
init_uv(du.begin(), du.end(), dv.begin(), dv.end(),
u0,
v0);
330 for (i=0; i<nucap_patch; ++i)
332 for (j=0; j<nvcap_patch; ++j)
334 cap.get(patch, i, j);
335 ps.
set(patch, i + nu_patch, j);
344 for (i=0; i<nucap_patch; ++i)
346 for (j=nvcap_patch; j<static_cast<index_type>(dv.size()); ++j)
348 cap.get(patch, i, j-nvcap_patch);
349 ps.
set(patch, i + nu_patch, j);
358 orig_copy.
get(patch, i, j);
359 ps.
set(patch, i+umin_offset, j+vmin_offset);
Eigen::Matrix< data_type, 1, dim__ > point_type
Definition: piecewise_creator_base.hpp:37
data__ data_type
Definition: piecewise_creator_base.hpp:36
Definition: piecewise_capped_surface_creator.hpp:46
piecewise_capped_surface_creator(const piecewise_surface_type &os, const data_type &dp, edge_cap_identifier ec)
Definition: piecewise_capped_surface_creator.hpp:61
Definition: piecewise_capped_surface_creator.hpp:43
data_type get_u0() const
Definition: piecewise.hpp:133
void get_uconst_curve(piecewise_curve_type &pwc, const data_type &u) const
Definition: piecewise.hpp:726
error_code get(surface_type &surf, const index_type &ui, const index_type &vi) const
Definition: piecewise.hpp:487
data_type get_umax() const
Definition: piecewise.hpp:139
edge_cap_identifier edge_to_cap
Definition: piecewise_capped_surface_creator.hpp:391
index_type number_v_patches() const
Definition: piecewise.hpp:143
data_type delta_param
Definition: piecewise_capped_surface_creator.hpp:390
Definition: piecewise.hpp:37
Definition: piecewise_creator_base.hpp:33
tol__ tolerance_type
Definition: piecewise_creator_base.hpp:39
Definition: piecewise.hpp:244
Definition: piecewise_general_skinning_surface_creator.hpp:40
piecewise_capped_surface_creator(const piecewise_capped_surface_creator< data_type, dim__, tolerance_type > &gs)
Definition: piecewise_capped_surface_creator.hpp:65
Definition: piecewise_connection_data.hpp:32
bool set_conditions(const piecewise_surface_type &os, const data_type &dp, edge_cap_identifier ec)
Definition: piecewise_capped_surface_creator.hpp:74
Definition: piecewise_capped_surface_creator.hpp:45
base_class_type::index_type index_type
Definition: piecewise_capped_surface_creator.hpp:53
base_class_type::piecewise_surface_type piecewise_surface_type
Definition: piecewise_capped_surface_creator.hpp:55
error_code split_v(const data_type &v_in)
Definition: piecewise.hpp:605
void get_pmap_u(std::vector< data_type > &pmap) const
Definition: piecewise.hpp:189
data_type get_v0() const
Definition: piecewise.hpp:136
piecewise_capped_surface_creator()
Definition: piecewise_capped_surface_creator.hpp:57
base_class_type::tolerance_type tolerance_type
Definition: piecewise_capped_surface_creator.hpp:54
param_container_type dv
Definition: piecewise_creator_base.hpp:185
piecewise_creator_base< data__, dim__, tol__ > base_class_type
Definition: piecewise_capped_surface_creator.hpp:50
index_type number_u_patches() const
Definition: piecewise.hpp:142
data_type v0
Definition: piecewise_creator_base.hpp:186
Definition: piecewise_capped_surface_creator.hpp:44
data_type u0
Definition: piecewise_creator_base.hpp:186
edge_cap_identifier
Definition: piecewise_capped_surface_creator.hpp:41
point_type::Index index_type
Definition: piecewise_creator_base.hpp:38
param_container_type du
Definition: piecewise_creator_base.hpp:185
virtual bool create(piecewise_surface_type &ps) const
Definition: piecewise_capped_surface_creator.hpp:87
void init_uv(const index_type &nsegu, const index_type &nsegv, const data_type &du=1, const data_type &dv=1, const data_type &u0=0, const data_type &v0=0)
Definition: piecewise.hpp:219
void get_vconst_curve(piecewise_curve_type &pwc, const data_type &v) const
Definition: piecewise.hpp:756
data_type get_vmax() const
Definition: piecewise.hpp:140
base_class_type::point_type point_type
Definition: piecewise_capped_surface_creator.hpp:52
base_class_type::data_type data_type
Definition: piecewise_capped_surface_creator.hpp:51
piecewise_surface_type orig_surface
Definition: piecewise_capped_surface_creator.hpp:389
surface__< data__, dim__, tol__ > surface_type
Definition: piecewise.hpp:57
error_code set(const surface_type &surf, const index_type &ui, const index_type &vi)
Definition: piecewise.hpp:509
virtual ~piecewise_capped_surface_creator()
Definition: piecewise_capped_surface_creator.hpp:70
Definition: piecewise_capped_surface_creator.hpp:38
Definition: piecewise_capped_surface_creator.hpp:47