38 #include <boost/math/special_functions/asinh.hpp>
73 out <<
"[MeasureOfStraightLines]";
96 if ( ( b0 == 0 ) && ( b1 == 0 ) )
99 if ( ( a0 == 0 ) && ( a1 == 0 ) )
102 double delta = ( a0*b1 - a1*b0 );
105 return delta * ( 1.0/ ( 1.0 + sqrt ( 1 + pow ( a1,2 ) ) ) );
107 return delta * ( ( -1.0 + sqrt ( 1.0 + pow ( a0,2 ) ) ) /pow ( a0,2 ) );
111 return delta * ( ( a0 - a1 + sqrt ( 1 + pow ( a0,2 ) ) *a1 - a0*sqrt ( 1 + pow ( a1,2 ) ) ) / ( pow ( a0,2 ) *a1 - a0*pow ( a1,2 ) ) );
114 return delta * a1/ ( a0* ( 1 + pow ( a1,2 ) + sqrt ( 1 + pow ( a1,2 ) ) ) );
141 const std::vector<double> &b)
145 ASSERT(a.size() == b.size());
147 for (
unsigned int i=0 ; i < a.size() ; i++)
149 measure += computeMeasureEdge ( a[i], b[i],
150 a[ ( i+1 ) % a.size()],b[ ( i+1 ) %a.size()] );
165 const std::vector<double> &b)
170 ASSERT(a.size() == b.size());
172 for (
unsigned int i=0 ; i < a.size() ; i++)
174 measure += computeMeasureEdge( a[i], b[i],
175 a[ ( i+1 ) % a.size()],b[ ( i+1 ) %a.size()] );
176 C_a += computeCentroidEdge_a ( a[i], b[i],
177 a[ ( i+1 ) % a.size()],b[ ( i+1 ) %a.size()] );
192 const std::vector<double> &b)
197 ASSERT(a.size() == b.size());
199 for (
unsigned int i=0 ; i < a.size() ; i++)
201 measure += computeMeasureEdge( a[i], b[i],
202 a[ ( i+1 ) % a.size()],b[ ( i+1 ) %a.size()] );
203 C_b += computeCentroidEdge_b ( a[i], b[i],
204 a[ ( i+1 ) % a.size()],b[ ( i+1 ) %a.size()] );
221 val = ( ( -1.0* ( sqrt ( 1.0 + pow ( x1,2 ) ) *x2 ) + x1*sqrt ( 1 + pow ( x2,2 ) ) ) * ( pow ( y1,2 ) - pow ( y2,2 ) ) ) / ( 2.0*sqrt ( ( 1.0 + pow ( x1,2 ) ) * ( 1.0 + pow ( x2,2 ) ) ) );
248 unsigned int nb_step;
261 nb_step = (
unsigned int ) floor ( fabs ( a1-a0 ) /myEpsilon );
262 double slope = ( b1-b0 ) / ( a1-a0 );
263 double decal = b1 - ( b1-b0 ) / ( a1-a0 ) *a1;
266 return __computeCentroidSquare_b ( a0, 0, a1, b0 );
268 for (
unsigned int i=0; i < nb_step ; i++ )
270 y2 = ( b1-b0 ) / ( a1-a0 ) * ( a0+ ( i+1 ) *myEpsilon ) + decal;
272 measure += __computeCentroidSquare_b ( a0+i*myEpsilon, 0, a0+ ( i+1 ) *myEpsilon, y2 );
274 measure += __computeCentroidSquare_b ( a0+i*myEpsilon, y2, a0+ ( i+1 ) *myEpsilon, 0 );
287 int signe = sign ( a0*b1 - a1*b0 );
290 double m_A0A1=0, m_0A0=0, m_0A1=0;
291 if ( ( b0 != 0 ) && ( a0 != 0 ) )
292 m_0A0 = __computeCentroidEdgeApprox_b ( 0,0,a0,b0 );
293 if ( ( b1 != 0 ) && ( a1 != 0 ) )
294 m_0A1 = __computeCentroidEdgeApprox_b ( 0,0,a1,b1 );
296 m_A0A1 = __computeCentroidEdgeApprox_b ( a0,b0,a1,b1 );
300 ASSERT ( m_A0A1>=0 );
304 double det = ( a1 * ( b0 - b1 ) - b1* ( a0 - a1 ) );
306 measure = m_0A0 + m_A0A1 - m_0A1;
308 measure = m_0A1 - m_0A0 - m_A0A1;
312 double det = ( a0 * ( b1 - b0 ) - b0* ( a1 - a0 ) );
314 measure = m_0A1 + m_A0A1 - m_0A0;
316 measure = m_0A0 - m_0A1 - m_A0A1;
318 ASSERT ( measure>=0 );
319 return signe*measure;
330 double delta= ( a0*b1 - a1*b0 );
332 if ( ( b0 == 0 ) && ( b1 == 0 ) )
334 if ( ( a0 == 0 ) && ( a1 == 0 ) )
338 return delta* ( a1* ( ( -2 + sqrt ( 1 + a1*a1 ) ) *b0 + 2*b1 ) + ( b0 - 2*b1 ) *boost::math::asinh ( a1 ) ) / ( 2*a1*a1*a1 );
340 return delta* ( a0* ( 2*b0 + ( -2 + sqrt ( 1 + a0*a0 ) ) *b1 ) + ( -2*b0 + b1 ) *boost::math::asinh ( a0 ) ) / ( 2*a0*a0*a0 );
343 return delta* ( ( - ( ( a1* ( b0 + a1* ( -a1 + sqrt ( 1 + pow ( a1,-2 ) ) *sqrt ( 1 + pow ( a1,2 ) ) ) *
344 b1 ) ) /sqrt ( 1.0 + pow ( a1,2 ) ) ) + ( b0 + b1 ) *boost::math::asinh ( a1 ) ) /
345 ( 2.*pow ( a1,3 ) ) );
347 return __computeCentroidTriApprox_b ( a0,b0,a1,b1 );
359 double delta= ( a0*b1 - a1*b0 );
361 if ( ( b0 == 0 ) && ( b1 == 0 ) )
363 if ( ( a0 == 0 ) && ( a1 == 0 ) )
367 return delta* ( a1 - boost::math::asinh ( a1 ) ) / ( a1*a1 );
369 return delta* ( a0 - boost::math::asinh ( a0 ) ) / ( a0*a0 );
372 return delta* ( ( -sqrt ( 1 + pow ( a1,-2 ) ) - 1.0/ ( a1*sqrt ( 1 + pow ( a1,2 ) ) ) + a1/sqrt ( 1 + pow ( a1,2 ) ) +
373 ( 2*boost::math::asinh ( a1 ) ) /pow ( a1,2 ) ) /2. );
375 return delta* ( ( - ( a1*boost::math::asinh ( a0 ) ) + a0*boost::math::asinh ( a1 ) ) / ( a0* ( a0 - a1 ) *a1 ) );
395 object.selfDisplay( out );