13 #ifndef eli_geom_intersect_minimum_distance_surface_hpp
14 #define eli_geom_intersect_minimum_distance_surface_hpp
21 #include "eli/code_eli.hpp"
37 template <
typename surface__>
41 typename surface__::point_type
pt;
42 typedef typename Eigen::Matrix<typename surface__::data_type, 2, 1>
vec;
46 typename surface__::data_type uu(u[0]), vv(u[1]);
49 typename surface__::data_type umin, umax, vmin, vmax;
50 ps->get_parameter_min(umin,vmin);
51 ps->get_parameter_max(umax,vmax);
55 std::cout <<
"Minimum distance surface g_functor, u less than minimum. uu: " << uu <<
" umin: " << umin << std::endl;
60 std::cout <<
"Minimum distance surface g_functor, u greater than maximum. uu: " << uu <<
" uamx: " << umax << std::endl;
66 std::cout <<
"Minimum distance surface g_functor, v less than minimum. vv: " << vv <<
" vmin: " << vmin << std::endl;
71 std::cout <<
"Minimum distance surface g_functor, v greater than maximum. vv: " << vv <<
" vmax: " << vmax << std::endl;
75 assert((uu>=umin) && (uu<=umax));
76 assert((vv>=vmin) && (vv<=vmax));
78 uu=std::min(std::max(uu, static_cast<typename surface__::data_type>(umin)), static_cast<typename surface__::data_type>(umax));
79 vv=std::min(std::max(vv, static_cast<typename surface__::data_type>(vmin)), static_cast<typename surface__::data_type>(vmax));
81 typename surface__::point_type tmp;
84 rtn(0)=tmp.dot(ps->f_u(uu, vv));
85 rtn(1)=tmp.dot(ps->f_v(uu, vv));
90 template <
typename surface__>
94 typename surface__::point_type
pt;
95 typedef typename Eigen::Matrix<typename surface__::data_type, 2, 1>
vec;
96 typedef typename Eigen::Matrix<typename surface__::data_type, 2, 2>
mat;
100 typename surface__::data_type uu(u[0]), vv(u[1]);
103 typename surface__::data_type umin, umax, vmin, vmax;
104 ps->get_parameter_min(umin,vmin);
105 ps->get_parameter_max(umax,vmax);
109 std::cout <<
"Minimum distance surface gp_functor, u less than minimum. uu: " << uu <<
" umin: " << umin << std::endl;
114 std::cout <<
"Minimum distance surface gp_functor, u greater than maximum. uu: " << uu <<
" uamx: " << umax << std::endl;
120 std::cout <<
"Minimum distance surface gp_functor, v less than minimum. vv: " << vv <<
" vmin: " << vmin << std::endl;
125 std::cout <<
"Minimum distance surface gp_functor, v greater than maximum. vv: " << vv <<
" vmax: " << vmax << std::endl;
129 assert((uu>=umin) && (uu<=umax));
130 assert((vv>=vmin) && (vv<=vmax));
132 uu=std::min(std::max(uu, static_cast<typename surface__::data_type>(umin)), static_cast<typename surface__::data_type>(umax));
133 vv=std::min(std::max(vv, static_cast<typename surface__::data_type>(vmin)), static_cast<typename surface__::data_type>(vmax));
135 typename surface__::point_type tmp, Su, Sv, Suu, Suv, Svv;
137 tmp=ps->f(uu, vv)-
pt;
140 Suu=ps->f_uu(uu, vv);
141 Suv=ps->f_uv(uu, vv);
142 Svv=ps->f_vv(uu, vv);
144 rtn(0,0)=Su.dot(Su)+tmp.dot(Suu);
145 rtn(0,1)=Su.dot(Sv)+tmp.dot(Suv);
147 rtn(1,1)=Sv.dot(Sv)+tmp.dot(Svv);
156 template<
typename surface__>
157 typename surface__::data_type
minimum_distance(
typename surface__::data_type &u,
typename surface__::data_type &v,
const surface__ &s,
const typename surface__::point_type &pt,
158 const typename surface__::data_type &u0,
const typename surface__::data_type &v0)
161 nonlinear_solver_type nrm;
164 typename surface__::data_type dist0, dist;
165 typename surface__::tolerance_type tol;
167 typename surface__::data_type umin, umax, vmin, vmax;
168 s.get_parameter_min(umin,vmin);
169 s.get_parameter_max(umax,vmax);
178 nrm.set_absolute_tolerance(tol.get_absolute_tolerance());
179 nrm.set_max_iteration(20);
180 nrm.set_norm_type(nonlinear_solver_type::max_norm);
183 nrm.set_lower_condition(0, umin, nonlinear_solver_type::NRC_EXCLUSIVE);
184 nrm.set_upper_condition(0, umax, nonlinear_solver_type::NRC_EXCLUSIVE);
188 nrm.set_periodic_condition(0, umin, umax);
192 nrm.set_lower_condition(1, vmin, nonlinear_solver_type::NRC_EXCLUSIVE);
193 nrm.set_upper_condition(1, vmax, nonlinear_solver_type::NRC_EXCLUSIVE);
197 nrm.set_periodic_condition(1, vmin, vmax);
201 typename nonlinear_solver_type::solution_matrix uinit, rhs, ans;
205 nrm.set_initial_guess(uinit);
210 nrm.find_root(ans, g, gp, rhs);
216 assert((u>=umin) && (u<=umax));
217 assert((v>=vmin) && (v<=vmax));
242 template<
typename surface__>
243 typename surface__::data_type
minimum_distance(
typename surface__::data_type &u,
typename surface__::data_type &v,
const surface__ &s,
const typename surface__::point_type &pt)
245 typename surface__::tolerance_type tol;
248 typename surface__::data_type dist, uu, vv, dd;
250 typename surface__::data_type umin, umax, vmin, vmax, uspan, vspan;
251 s.get_parameter_min(umin,vmin);
252 s.get_parameter_max(umax,vmax);
256 typename surface__::index_type i, j, nu, nv;
257 typename surface__::data_type du, dv;
283 dist = std::numeric_limits<typename surface__::data_type>::max();
284 for (i = 0; i < nu; i++)
287 for (j = 0; j < nv; j++)
313 if ((uu>=umin) && (uu<=umax) && (vv>=vmin) && (vv<=vmax))
327 typename surface__::curve_type bc;
328 if(u<=(umin+std::abs(umin)*2*std::numeric_limits<typename surface__::data_type>::epsilon()))
330 s.get_uconst_curve(bc, umin);
341 if(u>=(umax-std::abs(umax)*2*std::numeric_limits<typename surface__::data_type>::epsilon()))
343 s.get_uconst_curve(bc, umax);
354 if(v<=(vmin+std::abs(vmin)*2*std::numeric_limits<typename surface__::data_type>::epsilon()))
356 s.get_vconst_curve(bc, vmin);
367 if(v>=(vmax-std::abs(vmax)*2*std::numeric_limits<typename surface__::data_type>::epsilon()))
369 s.get_vconst_curve(bc, vmax);
391 template<
template<
typename,
unsigned short,
typename>
class surface__,
typename data__,
unsigned short dim__,
typename tol__ >
399 typedef typename piecewise_type::surface_type surface_type;
400 typedef typename piecewise_type::index_type index_type;
401 typedef typename piecewise_type::data_type data_type;
402 typedef typename piecewise_type::bounding_box_type bounding_box_type;
404 typedef typename piecewise_type::keymap_type keymap_type;
405 typedef typename keymap_type::const_iterator keyit;
407 typedef std::pair<keyit, keyit> itpair;
408 typedef std::vector< std::pair<data_type, itpair > > dvec;
413 for(keyit uit = ps.
ukey.key.begin(); uit != ps.
ukey.key.end(); ++uit)
415 for(keyit vit = ps.
vkey.key.begin(); vit != ps.
vkey.key.end(); ++vit)
417 index_type uk = uit->second;
418 index_type vk = vit->second;
420 surface_type s = ps.
patches[uk][vk];
422 bounding_box_type bb_local;
423 s.get_bounding_box(bb_local);
428 minbbdist.push_back(std::make_pair(dbbmin, std::make_pair(uit, vit)));
434 std::sort( minbbdist.begin(), minbbdist.end(), pairfirstcompare<data_type, itpair > );
438 data_type dist(std::numeric_limits<data_type>::max());
440 typename dvec::const_iterator it;
441 for (it=minbbdist.begin(); it!=minbbdist.end(); ++it)
444 if(it->first < dist )
446 itpair itp = it->second;
447 keyit uit = itp.first;
448 keyit vit = itp.second;
450 index_type uk = uit->second;
451 index_type vk = vit->second;
453 surface_type s = ps.
patches[uk][vk];
460 data_type du(ps.
ukey.get_delta_parm(uit));
461 data_type dv(ps.
vkey.get_delta_parm(vit));
463 data_type ustart(uit->first);
464 data_type vstart(vit->first);
surface_type::point_type point_type
Definition: piecewise.hpp:59
curve::piecewise< curve1__, data1__, dim1__, tol1__ >::data_type minimum_distance(typename curve::piecewise< curve1__, data1__, dim1__, tol1__ >::data_type &t, const curve::piecewise< curve1__, data1__, dim1__, tol1__ > &pc, const typename curve::piecewise< curve1__, data1__, dim1__, tol1__ >::point_type &pt)
Derived1__::Scalar distance(const Eigen::MatrixBase< Derived1__ > &p1, const Eigen::MatrixBase< Derived2__ > &p2)
Definition: distance.hpp:33
Eigen::Matrix< typename surface__::data_type, 2, 1 > vec
Definition: minimum_distance_surface.hpp:95
surface__::point_type pt
Definition: minimum_distance_surface.hpp:41
const surface__ * ps
Definition: minimum_distance_surface.hpp:40
data__ data_type
Definition: piecewise.hpp:66
Definition: newton_raphson_constrained_system_method.hpp:30
Eigen::Matrix< typename surface__::data_type, 2, 2 > mat
Definition: minimum_distance_surface.hpp:96
Definition: piecewise.hpp:37
const surface__ * ps
Definition: minimum_distance_surface.hpp:93
parameter_key ukey
Definition: piecewise.hpp:1495
Eigen::Matrix< typename surface__::data_type, 2, 1 > vec
Definition: minimum_distance_surface.hpp:42
surface__::point_type pt
Definition: minimum_distance_surface.hpp:94
mat operator()(const vec &u) const
Definition: minimum_distance_surface.hpp:98
patch_collection_type patches
Definition: piecewise.hpp:1492
vec operator()(const vec &u) const
Definition: minimum_distance_surface.hpp:44
parameter_key vkey
Definition: piecewise.hpp:1495
Definition: minimum_distance_surface.hpp:38
Definition: minimum_distance_surface.hpp:91