13 #ifndef eli_geom_surface_curvature_hpp
14 #define eli_geom_surface_curvature_hpp
19 #include "eli/code_eli.hpp"
29 template<
typename surface__>
30 void calculate_surface_terms(
typename surface__::data_type &e,
typename surface__::data_type &f,
typename surface__::data_type &g,
31 typename surface__::data_type &ee,
typename surface__::data_type &ff,
typename surface__::data_type &gg,
32 const surface__ &s,
const typename surface__::data_type &u,
const typename surface__::data_type &v)
34 typename surface__::point_type Su, Sv, Suu, Suv, Svv, n;
37 if (Su.innerSize()==2)
47 else if (Su.innerSize()!=3)
69 assert((ee*gg-ff*ff)>=0);
70 assert(std::abs(1-std::sqrt(ee*gg-ff*ff)/Su.cross(Sv).norm())<1e-4);
73 template<
typename surface__>
75 typename surface__::point_type &kmax_dir,
typename surface__::point_type &kmin_dir,
typename surface__::point_type &n,
76 const surface__ &s,
const typename surface__::data_type &u,
const typename surface__::data_type &v,
bool calc_dir)
78 typename surface__::data_type H, K, tmp;
81 assert(s.degree_u()>0);
82 assert(s.degree_v()>0);
85 assert((u>=0) && (u<=1));
86 assert((v>=0) && (v<=1));
89 typename surface__::data_type e, f, g, ee, ff, gg;
97 kmax=std::numeric_limits<typename surface__::data_type>::max();
98 kmin=std::numeric_limits<typename surface__::data_type>::max();
103 H=(e*gg-2*f*ff+g*ee)/(2*tmp);
109 tmp=std::sqrt(H*H-K);
114 typename surface__::tolerance_type tol;
115 if ((tmp<1e-5) && (tmp/std::max(e*e*gg*gg, std::max(f*f*ff*ff, g*g*ee*ee))<tol.get_relative_tolerance()))
125 typename surface__::point_type Su, Sv;
126 typename surface__::data_type lambda_max, lambda_min;
137 kmin_dir=n.cross(kmax_dir);
148 lambda_max=-(f-kmax*ff)/tmp;
149 kmax_dir=Su+lambda_max*Sv;
159 lambda_min=-(f-kmin*ff)/tmp;
160 kmin_dir=Su+lambda_min*Sv;
163 kmax_dir.normalize();
164 kmin_dir.normalize();
167 tmp=n.cross(kmax_dir).dot(kmin_dir);
172 assert(std::abs(1-std::abs(tmp))<0.001);
177 template<
typename surface__>
178 void mean_curvature(
typename surface__::data_type &k,
const surface__ &s,
const typename surface__::data_type &u,
const typename surface__::data_type &v)
181 assert(s.degree_u()>0);
182 assert(s.degree_v()>0);
185 assert((u>=0) && (u<=1));
186 assert((v>=0) && (v<=1));
189 typename surface__::data_type e, f, g, ee, ff, gg;
194 typename surface__::data_type tmp;
198 k=std::numeric_limits<typename surface__::data_type>::max();
202 k=(e*gg-2*f*ff+g*ee)/(2*tmp);
205 template<
typename surface__>
206 void gaussian_curvature(
typename surface__::data_type &k,
const surface__ &s,
const typename surface__::data_type &u,
const typename surface__::data_type &v)
209 assert(s.degree_u()>0);
210 assert(s.degree_v()>0);
213 assert((u>=0) && (u<=1));
214 assert((v>=0) && (v<=1));
217 typename surface__::data_type e, f, g, ee, ff, gg;
222 typename surface__::data_type tmp;
226 k=std::numeric_limits<typename surface__::data_type>::max();
233 template<
typename surface__>
234 void principal_curvature(
typename surface__::data_type &kmax,
typename surface__::data_type &kmin,
const surface__ &s,
const typename surface__::data_type &u,
const typename surface__::data_type &v)
236 typename surface__::point_type kmax_dir, kmin_dir, n;
240 template<
typename surface__>
242 typename surface__::point_type &kmax_dir,
typename surface__::point_type &kmin_dir,
typename surface__::point_type &n,
243 const surface__ &s,
const typename surface__::data_type &u,
const typename surface__::data_type &v)
void gaussian_curvature(typename surface__::data_type &k, const surface__ &s, const typename surface__::data_type &u, const typename surface__::data_type &v)
Definition: curvature.hpp:206
void principal_curvature_calc(typename surface__::data_type &kmax, typename surface__::data_type &kmin, typename surface__::point_type &kmax_dir, typename surface__::point_type &kmin_dir, typename surface__::point_type &n, const surface__ &s, const typename surface__::data_type &u, const typename surface__::data_type &v, bool calc_dir)
Definition: curvature.hpp:74
void principal_curvature(typename surface__::data_type &kmax, typename surface__::data_type &kmin, const surface__ &s, const typename surface__::data_type &u, const typename surface__::data_type &v)
Definition: curvature.hpp:234
void mean_curvature(typename surface__::data_type &k, const surface__ &s, const typename surface__::data_type &u, const typename surface__::data_type &v)
Definition: curvature.hpp:178
void calculate_surface_terms(typename surface__::data_type &e, typename surface__::data_type &f, typename surface__::data_type &g, typename surface__::data_type &ee, typename surface__::data_type &ff, typename surface__::data_type &gg, const surface__ &s, const typename surface__::data_type &u, const typename surface__::data_type &v)
Definition: curvature.hpp:30