13 #ifndef eli_geom_surface_piecewise_general_skinning_surface_creator_hpp
14 #define eli_geom_surface_piecewise_general_skinning_surface_creator_hpp
20 #include "eli/code_eli.hpp"
39 template<
typename data__,
unsigned short dim__,
typename tol__>
83 bool set_conditions(
const std::vector<rib_data_type> &rbs,
const std::vector<index_type> &maxd,
bool cl=
false)
85 index_type i, j, nsegs(static_cast<index_type>(maxd.size())), nribs(rbs.size());
88 if (!cl && (nribs!=(nsegs+1)))
90 if (cl && (nribs!=nsegs))
96 if (rbs[0].use_left_fp() || rbs[0].use_left_fpp() || rbs[0].get_continuity()!=
rib_data_type::C0)
100 if (rbs[nsegs].use_right_fp() || rbs[nsegs].use_right_fpp() || rbs[nsegs].get_continuity()!=
rib_data_type::C0)
107 data_type v_start(rbs[0].get_t0()), v_end(rbs[0].get_tmax());
109 for (i=0; i<nribs; ++i)
111 if (!rbs[i].check_state())
113 if (!tol.approximately_equal(rbs[i].get_t0(), v_start) || !tol.approximately_equal(rbs[i].get_tmax(), v_end))
118 auto comp = [&tol](
const data_type &x1,
const data_type &x2)->
bool
120 return tol.approximately_less_than(x1, x2);
123 std::vector<data_type> joints;
124 data_type t0(rbs[0].get_t0()), tmax(rbs[0].get_tmax());
126 rbs[0].get_joints(std::back_inserter(joints));
127 for (i=1; i<nribs; ++i)
130 if (!tol.approximately_equal(rbs[i].get_t0(), t0) || !tol.approximately_equal(rbs[i].get_tmax(), tmax))
136 std::vector<data_type> rjoints, jts_out;
137 rbs[i].get_joints(std::back_inserter(rjoints));
140 std::set_union(joints.begin(), joints.end(), rjoints.begin(), rjoints.end(), std::back_inserter(jts_out), comp);
141 std::swap(joints, jts_out);
145 index_type njoints(static_cast<index_type>(joints.size()));
150 for (j=0; j<(njoints-1); ++j)
152 this->
set_dv(joints[j+1]-joints[j], j);
165 virtual bool create(piecewise_surface_type &ps)
const
170 std::vector<index_type> seg_degree(nribs-1);
171 std::vector<rib_data_type> rib_states(
ribs);
184 std::vector<data_type> joints(njoints);
185 std::vector<index_type> max_jdegs(njoints-1,0);
188 for (j=0; j<(njoints-1); ++j)
193 for (i=0; i<nribs; ++i)
195 std::vector<index_type> jdegs;
196 rib_states[i].split(joints.begin(), joints.end(), std::back_inserter(jdegs));
197 for (j=0; j<(njoints-1); ++j)
199 if (jdegs[j]>max_jdegs[j])
201 max_jdegs[j]=jdegs[j];
207 for (i=0; i<nribs; ++i)
209 rib_states[i].promote(max_jdegs.begin(), max_jdegs.end());
213 index_type u, v, nu(nribs-1), nv(njoints-1);
225 typedef typename piecewise_curve_type::curve_type curve_type;
227 std::vector<typename piecewise_curve_creator_type::joint_data> joints(nu+1);
228 piecewise_curve_creator_type gc;
229 piecewise_curve_type c;
231 std::vector<surface_type> surfs(nu);
233 for (j=0; j<=max_jdegs[v]; ++j)
236 for (u=0; u<=nu; ++u)
240 joints[u].set_continuity(static_cast<typename piecewise_curve_creator_type::joint_continuity>(rib_states[u].get_continuity()));
242 rib_states[u].get_f().get(jcrv, v);
243 joints[u].set_f(jcrv.get_control_point(j));
244 if (rib_states[u].use_left_fp())
246 rib_states[u].get_left_fp().get(jcrv, v);
247 joints[u].set_left_fp(jcrv.get_control_point(j));
249 if (rib_states[u].use_right_fp())
251 rib_states[u].get_right_fp().get(jcrv, v);
252 joints[u].set_right_fp(jcrv.get_control_point(j));
254 if (rib_states[u].use_left_fpp())
256 rib_states[u].get_left_fpp().get(jcrv, v);
257 joints[u].set_left_fpp(jcrv.get_control_point(j));
259 if (rib_states[u].use_right_fpp())
261 rib_states[u].get_right_fpp().get(jcrv, v);
262 joints[u].set_right_fpp(jcrv.get_control_point(j));
274 gc.set_t0(this->
get_u0());
279 rtn_flag=gc.create(c);
295 surfs[u].resize(crv.degree(), max_jdegs[v]);
298 for (i=0; i<=crv.degree(); ++i)
300 surfs[u].set_control_point(crv.get_control_point(i), i, j);
309 ec=ps.
set(surfs[u], u, v);
322 std::vector<rib_data_type>
ribs;
piecewise_general_skinning_surface_creator()
Definition: piecewise_general_skinning_surface_creator.hpp:52
void set_open()
Definition: piecewise_general_skinning_surface_creator.hpp:72
Eigen::Matrix< data_type, 1, dim__ > point_type
Definition: piecewise_creator_base.hpp:37
piecewise_general_skinning_surface_creator(const data_type &uu0, const data_type &vv0)
Definition: piecewise_general_skinning_surface_creator.hpp:57
index_type get_number_u_segments() const
Definition: piecewise_creator_base.hpp:51
connection_data< data_type, dim__, tolerance_type > rib_data_type
Definition: piecewise_general_skinning_surface_creator.hpp:50
data__ data_type
Definition: piecewise_creator_base.hpp:36
bool closed
Definition: piecewise_general_skinning_surface_creator.hpp:324
Definition: piecewise_connection_data.hpp:46
data_type get_u0() const
Definition: piecewise_creator_base.hpp:61
data_type get_v0() const
Definition: piecewise_creator_base.hpp:62
void set_initial_u(const data_type &uu0)
Definition: piecewise_creator_base.hpp:166
void set_du(const data_type &duu, const index_type &i)
Definition: piecewise_creator_base.hpp:169
bool is_open() const
Definition: piecewise_general_skinning_surface_creator.hpp:74
param_iterator dv_begin() const
Definition: piecewise_creator_base.hpp:95
Definition: piecewise.hpp:37
void set_u0(const data_type &uu0)
Definition: piecewise_general_skinning_surface_creator.hpp:76
piecewise_creator_base< data__, dim__, tol__ > base_class_type
Definition: piecewise_general_skinning_surface_creator.hpp:43
Definition: piecewise_creator_base.hpp:33
tol__ tolerance_type
Definition: piecewise_creator_base.hpp:39
Definition: piecewise.hpp:244
param_iterator du_end() const
Definition: piecewise_creator_base.hpp:94
Definition: piecewise_general_skinning_surface_creator.hpp:40
param_iterator du_begin() const
Definition: piecewise_creator_base.hpp:93
bool set_conditions(const std::vector< rib_data_type > &rbs, const std::vector< index_type > &maxd, bool cl=false)
Definition: piecewise_general_skinning_surface_creator.hpp:83
Definition: piecewise_general_creator.hpp:36
void set_segment_du(const data_type &duu, const index_type &i)
Definition: piecewise_general_skinning_surface_creator.hpp:78
Definition: piecewise_connection_data.hpp:32
void set_number_v_segments(const index_type &ns)
Definition: piecewise_creator_base.hpp:106
index_type get_number_v_segments() const
Definition: piecewise_creator_base.hpp:56
void set_dv(const data_type &dvv, const index_type &j)
Definition: piecewise_creator_base.hpp:176
void clear()
Definition: piecewise.hpp:478
error_code
Definition: piecewise.hpp:69
base_class_type::piecewise_surface_type piecewise_surface_type
Definition: piecewise_general_skinning_surface_creator.hpp:48
base_class_type::data_type data_type
Definition: piecewise_general_skinning_surface_creator.hpp:44
base_class_type::point_type point_type
Definition: piecewise_general_skinning_surface_creator.hpp:45
std::vector< rib_data_type > ribs
Definition: piecewise_general_skinning_surface_creator.hpp:322
param_iterator dv_end() const
Definition: piecewise_creator_base.hpp:96
void set_closed()
Definition: piecewise_general_skinning_surface_creator.hpp:71
Definition: piecewise.hpp:71
void set_number_u_segments(const index_type &ns)
Definition: piecewise_creator_base.hpp:98
point_type::Index index_type
Definition: piecewise_creator_base.hpp:38
void set_initial_v(const data_type &vv0)
Definition: piecewise_creator_base.hpp:167
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
base_class_type::index_type index_type
Definition: piecewise_general_skinning_surface_creator.hpp:46
std::vector< index_type > max_degree
Definition: piecewise_general_skinning_surface_creator.hpp:323
bool is_closed() const
Definition: piecewise_general_skinning_surface_creator.hpp:73
base_class_type::tolerance_type tolerance_type
Definition: piecewise_general_skinning_surface_creator.hpp:47
virtual ~piecewise_general_skinning_surface_creator()
Definition: piecewise_general_skinning_surface_creator.hpp:67
piecewise_general_skinning_surface_creator(const piecewise_general_skinning_surface_creator< data_type, dim__, tolerance_type > &gs)
Definition: piecewise_general_skinning_surface_creator.hpp:62
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 bool create(piecewise_surface_type &ps) const
Definition: piecewise_general_skinning_surface_creator.hpp:165
data_type get_segment_dv(const index_type &i) const
Definition: piecewise_creator_base.hpp:75
data_type get_segment_du(const index_type &i) const
Definition: piecewise_creator_base.hpp:64