line - cylinder intersection

Equation for line (cartesian)

Equation for cylinder (cartesian)

Assumed to be centred at 0, the coordinate system origin.

0=-1 + \frac{y^{2}}{b^{2}} + \frac{x^{2}}{a^{2}}

Intersection solutions

Parametric solution (t). Solutions were derived automatically using sympy.

Points in cartesian coordinates (x, y, z)

C Code
x = x0 + (-pow(a, 2)*k*y0 - pow(b, 2)*x0 + sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(k, 2) + pow(b, 2) - pow(k, 2)*pow(x0, 2) + 2*k*x0*y0 - pow(y0, 2))))/(pow(a, 2)*pow(k, 2) + pow(b, 2));
y = k*(-pow(a, 2)*k*y0 - pow(b, 2)*x0 + sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(k, 2) + pow(b, 2) - pow(k, 2)*pow(x0, 2) + 2*k*x0*y0 - pow(y0, 2))))/(pow(a, 2)*pow(k, 2) + pow(b, 2)) + y0;
z = l*(-pow(a, 2)*k*y0 - pow(b, 2)*x0 + sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(k, 2) + pow(b, 2) - pow(k, 2)*pow(x0, 2) + 2*k*x0*y0 - pow(y0, 2))))/(pow(a, 2)*pow(k, 2) + pow(b, 2)) + z0;
x = x0 - (pow(a, 2)*k*y0 + pow(b, 2)*x0 + sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(k, 2) + pow(b, 2) - pow(k, 2)*pow(x0, 2) + 2*k*x0*y0 - pow(y0, 2))))/(pow(a, 2)*pow(k, 2) + pow(b, 2));
y = -k*(pow(a, 2)*k*y0 + pow(b, 2)*x0 + sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(k, 2) + pow(b, 2) - pow(k, 2)*pow(x0, 2) + 2*k*x0*y0 - pow(y0, 2))))/(pow(a, 2)*pow(k, 2) + pow(b, 2)) + y0;
z = -l*(pow(a, 2)*k*y0 + pow(b, 2)*x0 + sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(k, 2) + pow(b, 2) - pow(k, 2)*pow(x0, 2) + 2*k*x0*y0 - pow(y0, 2))))/(pow(a, 2)*pow(k, 2) + pow(b, 2)) + z0;

Distance inside

Distance between crossing points.

2 \left\lvert{\frac{1}{a^{2} k^{2} + b^{2}} \sqrt{a^{2} b^{2} \left(a^{2} k^{2} + b^{2} - k^{2} x_{0}^{2} + 2 k x_{0} y_{0} - y_{0}^{2}\right)}}\right\rvert

C Code

sol1 = (-pow(a, 2)*k*y0 - pow(b, 2)*x0 + sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(k, 2) + pow(b, 2) - pow(k, 2)*pow(x0, 2) + 2*k*x0*y0 - pow(y0, 2))))/(pow(a, 2)*pow(k, 2) + pow(b, 2));
sol2 = -(pow(a, 2)*k*y0 + pow(b, 2)*x0 + sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(k, 2) + pow(b, 2) - pow(k, 2)*pow(x0, 2) + 2*k*x0*y0 - pow(y0, 2))))/(pow(a, 2)*pow(k, 2) + pow(b, 2));
distance = 2*fabs(sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(k, 2) + pow(b, 2) - pow(k, 2)*pow(x0, 2) + 2*k*x0*y0 - pow(y0, 2)))/(pow(a, 2)*pow(k, 2) + pow(b, 2)));

Equation for line (spherical)

Equation for cylinder (cartesian)

Assumed to be centred at 0, the coordinate system origin.

0=-1 + \frac{y^{2}}{b^{2}} + \frac{x^{2}}{a^{2}}

Intersection solutions

Parametric solution (t). Solutions were derived automatically using sympy.

Points in cartesian coordinates (x, y, z)

C Code
x = x0 + (sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2) - pow(x0, 2)*pow(sin(phi), 2) + x0*y0*sin(2*phi) - pow(y0, 2)*pow(cos(phi), 2))*pow(sin(theta), 2)) - (pow(a, 2)*y0*sin(phi) + pow(b, 2)*x0*cos(phi))*sin(theta))*cos(phi)/((pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2))*sin(theta));
y = y0 + (sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2) - pow(x0, 2)*pow(sin(phi), 2) + x0*y0*sin(2*phi) - pow(y0, 2)*pow(cos(phi), 2))*pow(sin(theta), 2)) - (pow(a, 2)*y0*sin(phi) + pow(b, 2)*x0*cos(phi))*sin(theta))*sin(phi)/((pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2))*sin(theta));
z = z0 + (sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2) - pow(x0, 2)*pow(sin(phi), 2) + x0*y0*sin(2*phi) - pow(y0, 2)*pow(cos(phi), 2))*pow(sin(theta), 2)) - (pow(a, 2)*y0*sin(phi) + pow(b, 2)*x0*cos(phi))*sin(theta))*cos(theta)/((pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2))*pow(sin(theta), 2));
x = x0 - (sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2) - pow(x0, 2)*pow(sin(phi), 2) + x0*y0*sin(2*phi) - pow(y0, 2)*pow(cos(phi), 2))*pow(sin(theta), 2)) + (pow(a, 2)*y0*sin(phi) + pow(b, 2)*x0*cos(phi))*sin(theta))*cos(phi)/((pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2))*sin(theta));
y = y0 - (sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2) - pow(x0, 2)*pow(sin(phi), 2) + x0*y0*sin(2*phi) - pow(y0, 2)*pow(cos(phi), 2))*pow(sin(theta), 2)) + (pow(a, 2)*y0*sin(phi) + pow(b, 2)*x0*cos(phi))*sin(theta))*sin(phi)/((pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2))*sin(theta));
z = z0 - (sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2) - pow(x0, 2)*pow(sin(phi), 2) + x0*y0*sin(2*phi) - pow(y0, 2)*pow(cos(phi), 2))*pow(sin(theta), 2)) + (pow(a, 2)*y0*sin(phi) + pow(b, 2)*x0*cos(phi))*sin(theta))*cos(theta)/((pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2))*pow(sin(theta), 2));

Distance inside

Distance between crossing points.

2 \left\lvert{\frac{1}{\left(a^{2} \sin^{2}{\left (\phi \right )} + b^{2} \cos^{2}{\left (\phi \right )}\right) \sin^{2}{\left (\theta \right )}} \sqrt{a^{2} b^{2} \left(a^{2} \sin^{2}{\left (\phi \right )} + b^{2} \cos^{2}{\left (\phi \right )} - x_{0}^{2} \sin^{2}{\left (\phi \right )} + x_{0} y_{0} \sin{\left (2 \phi \right )} - y_{0}^{2} \cos^{2}{\left (\phi \right )}\right) \sin^{2}{\left (\theta \right )}}}\right\rvert

C Code

sol1 = (sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2) - pow(x0, 2)*pow(sin(phi), 2) + x0*y0*sin(2*phi) - pow(y0, 2)*pow(cos(phi), 2))*pow(sin(theta), 2)) - (pow(a, 2)*y0*sin(phi) + pow(b, 2)*x0*cos(phi))*sin(theta))/((pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2))*pow(sin(theta), 2));
sol2 = -(sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2) - pow(x0, 2)*pow(sin(phi), 2) + x0*y0*sin(2*phi) - pow(y0, 2)*pow(cos(phi), 2))*pow(sin(theta), 2)) + (pow(a, 2)*y0*sin(phi) + pow(b, 2)*x0*cos(phi))*sin(theta))/((pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2))*pow(sin(theta), 2));
distance = 2*fabs(sqrt(pow(a, 2)*pow(b, 2)*(pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2) - pow(x0, 2)*pow(sin(phi), 2) + x0*y0*sin(2*phi) - pow(y0, 2)*pow(cos(phi), 2))*pow(sin(theta), 2))/((pow(a, 2)*pow(sin(phi), 2) + pow(b, 2)*pow(cos(phi), 2))*pow(sin(theta), 2)));


By Johannes Buchner | Source code: https://github.com/JohannesBuchner/intersection | Open a issue or pull request if you would like somthing added