Basilisk CFD
Adaptive Cartesian mesh PDE framework
Loading...
Searching...
No Matches
distance_point_ellipse.h
Go to the documentation of this file.
1/** @file distance_point_ellipse.h
2 */
3/**
4# Distance from a point to an ellipse
5
6See section 2.9 of
7[DistancePointEllipseEllipsoid.pdf](https://www.geometrictools.com/Documentation/DistancePointEllipseEllipsoid.pdf). */
8
9static double RobustLength (double v0, double v1)
10{
11 return fabs(v0) > fabs(v1) ?
12 fabs(v0)*sqrt(1. + sq(v1/v0)) :
13 fabs(v1)*sqrt(1. + sq(v0/v1));
14}
15
16static double GetRoot (double r0, double z0, double z1, double g)
17{
18 double n0 = r0*z0 ;
19 double s0 = z1 - 1., s1 = g < 0. ? 0. : RobustLength (n0, z1) - 1.;
20 double s = 0.;
21 for (int i = 0 ; i < 100; ++i) {
22 s = (s0 + s1)/2.;
23 if (s == s0 || s == s1 ) break;
24 double ratio0 = n0/(s + r0), ratio1 = z1/(s + 1.) ;
25 g = sq (ratio0) + sq (ratio1) - 1.;
26 if (g > 0.) s0 = s;
27 else if (g < 0.) s1 = s;
28 else break;
29 }
30 return s ;
31}
32
33double DistancePointEllipse (double e0, double e1, double y0, double y1,
34 double * x0, double * x1)
35{
36 bool sym0 = false, sym1 = false;
37 if (y0 < 0.)
38 y0 = - y0, sym0 = true;
39 if (y1 < 0.)
40 y1 = - y1, sym1 = true;
41
42 double distance ;
43 if (y1 > 0.) {
44 if (y0 > 0.) {
45 double z0 = y0/e0, z1 = y1/e1, g = sq(z0) + sq(z1) - 1.;
46 if (g != 0.) {
47 double r0 = sq(e0/e1), sbar = GetRoot (r0, z0, z1, g);
48 *x0 = r0*y0/(sbar + r0);
49 *x1 = y1/(sbar + 1.);
50 distance = sqrt (sq(*x0 - y0) + sq(*x1 - y1));
51 }
52 else {
53 *x0 = y0;
54 *x1 = y1;
55 distance = 0.;
56 }
57 }
58 else {
59 // y0 == 0
60 *x0 = 0.;
61 *x1 = e1;
62 distance = fabs(y1 - e1);
63 }
64 }
65 else {
66 // y1 == 0
67 double numer0 = e0*y0, denom0 = sq(e0) - sq(e1);
68 if (numer0 < denom0) {
69 double xde0 = numer0/denom0;
70 *x0 = e0*xde0;
71 *x1 = e1*sqrt(1. - xde0*xde0);
72 distance = sqrt(sq(*x0 - y0) + sq(*x1));
73 }
74 else {
75 *x0 = e0;
76 *x1 = 0.;
77 distance = fabs(y0 - e0);
78 }
79 }
80
81 if (sym0) *x0 = - *x0;
82 if (sym1) *x1 = - *x1;
83
84 return sign(sq(y0/e0) + sq(y1/e1) - 1.)*distance;
85}
vector g[]
We store the combined pressure gradient and acceleration field in g*.
Definition all-mach.h:65
int x
Definition common.h:76
static number sq(number x)
Definition common.h:11
static int sign(number x)
Definition common.h:13
trace void distance(scalar d, coord *p)
Definition distance.h:459
static double GetRoot(double r0, double z0, double z1, double g)
static double RobustLength(double v0, double v1)
double DistancePointEllipse(double e0, double e1, double y0, double y1, double *x0, double *x1)
scalar s
Definition embed-tree.h:56
scalar int i
Definition embed.h:74
y1
Definition embed.h:394