8 double GetRoot (
double r0,
double z0,
double z1,
double g)
10 const int maxIter = 100;
13 double s1 = ( g < 0 ? 0 : sqrt(n0*n0+z1*z1) - 1 ) ;
15 for (
int i = 0; i < maxIter; ++i ){
16 if (i == (maxIter - 1)) std::cout<<
"distance point ellipse algorithm did not converge."<<std::endl;
18 if ( s == s0 || s == s1 ) {
break; }
19 double ratio0 = n0 /( s + r0 );
20 double ratio1 = z1 /( s + 1 );
21 g = ratio0*ratio0 + ratio1*ratio1 - 1 ;
22 if (g > 0) {s0 = s;}
else if (g < 0) {s1 = s ;}
else {break ;}
27 double GetRoot(
double r0,
double r1,
double z0,
double z1,
double z2,
double g)
29 const int maxIter = 100;
33 double s1 = (g < 0 ? 0 : sqrt(n0*n0 + n1*n1 + z2*z2) - 1) ;
35 for(
int i = 0 ; i < maxIter ; ++i )
37 if (i == (maxIter - 1)) std::cout<<
"distance point ellipse algorithm did not converge."<<std::endl;
39 if ( s == s0 || s == s1 ) {
break; }
40 double ratio0 = n0 / ( s + r0 );
41 double ratio1 = n1 / ( s + r1 );
42 double ratio2 = z2 / ( s + 1 );
43 g = ratio0*ratio0 + ratio1*ratio1 +ratio2*ratio2 - 1;
44 if ( g > 0 ) { s0 = s ;}
45 else if ( g < 0 ) { s1 = s ; }
51 double DistancePointEllipse(
double e0,
double e1,
double y0,
double y1,
double& x0,
double& x1)
58 double g = z0*z0+z1*z1 - 1;
60 double r0 = (e0/e1)*(e0/e1);
61 double sbar = GetRoot(r0 , z0 , z1 , g);
62 x0 = r0 * y0 /( sbar + r0 );
63 x1 = y1 /( sbar + 1 );
64 distance = sqrt( (x0-y0)*(x0-y0) + (x1-y1)*(x1-y1) );
72 {x0 = 0 ; x1 = e1 ; distance = abs( y1 - e1 );}
74 double numer0 = e0*y0 , denom0 = e0*e0 - e1*e1;
75 if ( numer0 < denom0 ){
76 double xde0 = numer0/denom0;
77 x0 = e0*xde0 ; x1 = e1*sqrt(1 - xde0*xde0 );
78 distance = sqrt( (x0-y0)*(x0-y0) + x1*x1 );
82 distance = abs( y0 - e0 );
88 double DistancePointEllipsoid(
double e0,
double e1,
double e2,
double y0,
double y1,
double y2,
double& x0,
double& x1,
double& x2)
100 double g = z0*z0 + z1*z1 + z2*z2 - 1 ;
103 double r0 = (e0/e2)*(e0/e2);
104 double r1 = (e1/e2)*(e1/e2);
105 double sbar = GetRoot ( r0 , r1 , z0 , z1 , z2 , g );
106 x0 = r0 *y0 / ( sbar + r0 );
107 x1 = r1 *y1 / ( sbar + r1 );
108 x2 = y2 / ( sbar + 1 );
109 distance = sqrt( (x0 - y0)*(x0 - y0) + (x1 - y1)*(x1 - y1) + (x2 - y2)*(x2 - y2));
122 distance = DistancePointEllipse( e1 , e2 , y1 , y2, x1, x2);
130 distance = DistancePointEllipse( e0 , e2 , y0 , y2, x0, x2);
137 distance = abs(y2 - e2);
143 double denom0 = e0*e0 - e2*e2;
144 double denom1 = e1*e1 - e2*e2;
145 double numer0 = e0*y0;
146 double numer1 = e1*y1;
147 bool computed =
false;
148 if((numer0 < denom0) && (numer1 < denom1))
150 double xde0 = numer0/denom0;
151 double xde1 = numer1/denom1 ;
152 double xde0sqr = xde0 *xde0;
153 double xde1sqr = xde1 * xde1 ;
154 double discr = 1 - xde0sqr - xde1sqr;
160 distance = sqrt((x0 - y0)*(x0 - y0) + (x1 - y1)*(x1 - y1) + x2*x2);
167 distance = DistancePointEllipse(e0 , e1 , y0 , y1, x0, x1);
173 constexpr
unsigned int factorial(
unsigned int x)
175 unsigned int fact = 1;
176 for(
int i = 1; i < (x + 1); i++) fact = fact*i;
179 constexpr
unsigned int minter_lp_degree_one_num_coeffs(
unsigned int dims,
unsigned int poly_degree)
181 return(factorial(dims + poly_degree)/(factorial(dims)*factorial(poly_degree)));
184 int return_sign(
double phi)
186 if (phi > 0)
return 1;
187 if (phi < 0)
return -1;
191 double randMinusOneToOne()
193 double temp = rand() / (RAND_MAX + 1.0);
195 return(2.0*temp - 1.0);