Line and Cylinder intersection

10 views (last 30 days)
Aldo
Aldo on 26 Jun 2017
I have an expression for a "line- to sphere intersection" that works:
a = 1 + Ax^2 + Ay^2
b = 2*(-zs + Ax*(Bx-xs) + Ay*(By-ys))
c = zs^2 + (Bx-xs)^2 + (By - ys)^2 - R^2
This is part of a code in Matlab, and works fine. It is derived from substituting
(x=Ax*z+Bx, y=Ay*z+By) into:
((x-xs)^2+(y-ys)^2+(z-zs)^2 = R
I am now trying to do the same for a cylinder, by substituting(x=Ax*z+Bx, y=Ay*z+By) into: (x-xs)^2+(y-ys)^2 = R
Ending up with:
a = Ax^2+Ay^2;
b = 2*Ax*Bx - 2*Ax*xs + 2*Ay*By - 2*Ay*ys;
c = -2*Bx*xs - 2*By*ys + Bx^2 + By^2 + xs^2+ys^2 - R^2;
This doesn't seem to work. Can anyone tell me if something seems off with the math or logic?
This is the equations I used for the line:
x=Ax*z+Bx, y=Ay*z+By (I solved for z)
This is basically the .m-file that make up the intersection(sphere):
function [r1v,a2v] = lens_vec(s1,r1,a1v,r0v,v1,v2,direk,mirror_skew)
%Find intersection and refraction:
% s1 - sphere center (z-value)
% r1 - sphere radius
% a1v - unit vector defining direction of ray
% r0v - starting point of ray
% v1 - speed of sound, material 1
% v2 - speed of sound, material 2
% direk - choose croosing, direk==0 to the right of s1, direk==1, to the
% left of s1
xs = 0.0000; ys=mirror_skew; zs=s1; % center of sphere
R = r1; % radius of sphere
%.......Define parameters for x and y coordinate of straight line (Ax,Bx),
%.......(Ay, By)
if a1v(1) ~= 0
Ax = a1v(1)/a1v(3);
else
Ax = 0;
end
if a1v(2) ~= 0
Ay = a1v(2)/a1v(3);
else
Ay = 0;
end
Bx = r0v(1)- Ax*r0v(3);
By = r0v(2)- Ay*r0v(3);
% Intersection straight line and sphere:
a = 1 + Ax^2 + Ay^2;
b = 2*(-zs + Ax*(Bx-xs) + Ay*(By-ys));
c = zs^2 + (Bx-xs)^2 + (By - ys)^2 - R^2;
z1 = (-b + sqrt(b^2 - 4*a*c))/(2*a); x1 = Ax*z1+Bx; y1 = Ay*z1+By;
z2 = (-b - sqrt(b^2 - 4*a*c))/(2*a); x2 = Ax*z2+Bx; y2 = Ay*z2+By;
% (After this comes a section on Snell's law and refraction code)
So basically, I just need a set of expressions that does the job for a cylinder instead of a sphere. At least, this is what I'm thinking. I am not sure if this will work.
Any comments at all would be greatly appreciated!

Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!